람다이~1

AWS lambda 를 통해 이미지 리사이즈 서버 만들기(Node.js)

AWS Lambda 는 이벤트 에 응답하여 코드를 실행 하고 해당 코드에 필요한 컴퓨터 리소스를 자동으로 관리하는 컴퓨터 이다. lambda를 통해 서버에 대한 걱정없이 코드를 실행할 수 있다

이번 실습에서 AWS S3도 활용을 할것인데, S3은 Simple Storage Service의 줄임말로 아마존 웹 서비스에서 제공하는 온라인 스토리지 웹 서비스이다. S3는 웹 서비스 인터페이스를 통해 스토리지를 제공한다 . S3는 모든 타입에 대한 내구성 높은 개체 스토리지 서비스

그리고 또 하나 AWS API GATEWAY도 사용 할 것인데, API란 resource와 method의 집합으로 운영체제나 데이터베이스 관리 시스템과 같은 시스템 프로그램과 통신할 때 사용되는 것으로 API GATEWAY는 API Endpoint를 단일화하고 API 관리를 쉽게 할 수 있드아

준비물 : AWS ID (프리티어 1년 기간 남은걸로) , 편집기(atom , 아무거나) , NPM(요건 inessential) , Post Man

그리고 지역 설정할 때 무조건 아시아 태평양(서울) 로 설정

총 2부로 실습을 해볼 것인데

1부 Lambda With S3

  1. S3 버켓 생성
  2. 람다 함수 생성
  3. 람다 와 S3를 트리거 후 이미지 리사이즈 실습

2부 Lambda With API GATEWAY

  1. 새로운 람다 함수 생성
  2. API GATEWAY 에서 API 발급 , 배포
  3. Post Man을 통해

1부

AWS 홈페이지에 접속, 로그인을 한 후 서비스 에서 S3를 들어갑니다 들어갑니다

2018-02-09 11 54 52

 

그다음으로 원본 이미지가 저장 될 (1)S3 스토리지Lambda에서 (1)S3 스토리지에 원본 이미지가 저장(이벤트)된 것에 대하여 응답하고 리사이즈한 이미지를 저장할 (2)S3 스토리지를 하나 더 만듭니다.

 

2018-02-09 12 05 34

여기서 버킷은 S3 스토리지에 저장하는 모든 타입의 정보에 대한 컨테이너로

아이스버킷 챌린지에서 얼음이 든 양동이를 뒤집어 쓰던 IT업계 들의 CEO들이 기억나실텐데 , 거기서 나온 그 '양동이'가 바로 버킷 입니다. 파일을 담는 폴더의 개념으로 생각하시면 됩니다.

리전은 위와 같이 하시되, 이름은 원본이 저장될 버킷이 'abc'라고 가정 한다면 , 리사이즈 된 이미지가 저장될 버킷은 'abc-resized'로 해주시면 되겠습니다. -resized를 붙이시면 됩니다

2018-02-09 12 08 05

 

그 다음 S3에 원본이 저장될 버킷에 들어 가신 후 업로드 될 폴더를 만들어야 하는데, 이름을 images 라고 하겠습니다.

2018-02-09 12 16 19

 

이제 Lambda 함수를 생성하러 고고씽

일단 서비스에서 Lambda를 들어갑니다.

2018-02-09 12 18 48

 

오른쪽 위에 함수 생성을 누른 후 이름은 각자 알맞게 작성 후 런타임은 현재 Node.js 6.10 버전을 제공 하고 있어 이걸로 선택하고, 역할은 사용자 지정 역할 생성으로 들어간 뒤 lambda_basic_execution으로 주는데, 이것은 Lambda가 어디에 접근 할수 있는지에 대한 권한으로 나중에 다시 IAM 서비스를 통해 다시 설정 할 것이다.

 

2018-02-09 12 25 54

 

함수를 생성 했으면, Event가 들어왓을 때 Lambda에서 실행할 코드를 작성해야 하는데, 코드를 여기다 올리겠습니다. 편집기 Atom에서 새로운 폴더를 하나 만들어 index.js파일을 만들어 이 소스코드를 저장하겠습니다. 그리고 Node.js에서 AWS에 접근하기 위해서는 aws-sdk 모듈을 사용해야 하는데, Lambda의 Node.js 런타임에 이 모듈이 이미 설치가 되어있고, 필요한 모듈은 Npm으로 직접 설치하여 압축한 후 Lambda에 올리면 되겠습니다. 이 코드를 요약해서 설명하자면, origin 버킷에 이미지를 저장할 경우, 이미지를 리사이즈 하여 -resized 버킷에 저장합니다.

위에 터미널에서 NPM으로 필요한 모듈을 설치

 

2018-02-09 1 18 27

이미 세개의 파일을 압축 후 Lambda에 zip파일 형태로 업로드 하면 됨

2018-02-09 1 19 33

밑에 보면 기본 설정 카테고리가 있는데, 제한시간을 10초로 지정

 

함수를 생성 했으면, 이제 Lambda에다 trigger를 설정할 것인데,

여기서 trigger란 어떤 Action 이나 Event가 발생 하였을 때 자동으로 처리하는 프로세스 입니다.

여기서 우리가 해야 할 것은 S3 스토리지에 이미지가 저장 될 때, 이미지가 저장 된 event를 보고 Lambda가 다른 S3 스토리지에 리사이즈 된 이미지를 저장 하는 코드를 실행 할 것입니다.

2018-02-09 1 20 48

왼쪽 목록 중 S3선택 후

 

2018-02-09 1 20 55

접두사는 S3에 만든 images 폴더 이며 위와같이 설정하고 추가하면 됨

그리고 저장을 해주면 되겠습니다.

 

그리고 마지막으로 해야 하는게 , Lambda에게 S3에 접근 할 권한을 부여해야하는데 이것은 IAM을 통해 권한을 만든 후 , Lambda에게 설정을 할 수 있습니다.

2018-02-09 1 29 46

 

2018-02-09 1 30 11

 

2018-02-09 1 30 30

 

2018-02-09 1 30 48

 

2018-02-09 1 31 42

IAM 들어간 후 왼쪽 목록에 역할을 클릭 후 서비스에서 Lambda를 선택 한 후 AdministratorAccess를 선택하는데, 이는 Lambda에게 모든 AWS service에 접근할 수 있는 권한을 뜻합니다. 이렇게 역할을 만든 후, 서비스에서 Lambda로 다시 돌아와 lambda_basic_execution에서 방금 만든 역할로 바꾸고, 저장 하면 되겠습니다

 

2018-02-09 1 36 04

 

이제 실행을 해볼것인데, 동작원리를 위에서 계속 언급한것 처럼 , S3 origin 버킷에 이미지를 Upload 하는 Event를 할 경우, Lambda에서 trigger하여 S3 origin 버킷에 이벤트가 발생 했을경우, index.js의 코드를 실행하여, S3 resized 버킷에 리사이즈 된 이미지를 저장합니다.

 

이제 S3에 이미지를 저장하는 Event를 해보겠습니다.

S3 origin 버킷으로 들어가 처음에 만든 images 폴더에 png형식의 사진을 업로드 하겠습니다.

2018-02-09 1 38 47

 

2018-02-09 1 39 01

위에 두 사진을 비교해 보면, S3 resize 버킷에 크기가 리사이즈된 이미지가 저장된 걸 볼 수 있습니다.

 


2부

API GATEWAY를 통해 API를 발급 받고, Post Man으로 발급 받은 api를 통해 람다에 접근하여 , S3 origin 버킷에 이미지를 저장 후, S3 resize 버킷에 이미지를 저장해보겠습니다.

 

일단 새로운 람다 함수를 생성합니다. 처음 방법과 다 똑같이 만들돼, 역할은 아까 모든 접근을 허용하는 역할을 만들었는데, 그 역할을 그대로 사용하겠습니다.(사용자 지정 X , 기존 역할 O)

 

Lambda에서 실행할 코드는 요거 인데

const originBucket = '/images' 이 부분에서 origin 버킷 이름을 자기 걸로 수정하면 됩니다.

또한 필요한 NPM 모듈을 설치해주면 됩니다.

 

이제 API GATEWAY에서 API를 발급받을 건데, 서비스에서 API GATEWAY를 들어갑니다.

요약해서 짧게 설명하면 API발급 -> 리소스 생성(post 방식) -> 메소드 생성

서서서2018-02-09 1 56 37

API를 생성 후 작업에서 리소스 생성을 선택 한 후 , 리소스 이름을 upload 로 설정 후 생성합니다.

2018-02-09 2 00 35

 

2018-02-09 2 02 42

upload를 클릭 후 왼쪽 목록에서 설정으로 들어 간 후

 

2018-02-09 2 02 26

이진 미디어 형식을 다음과 같이 추가합니다. multipart/form-data

마무리로 Save Changes

이진 미디어 형식이란 API GATEWAY에서 이미지가 들어오면 자동으로 이미지 변환 처리를 해주는 걸 뜻합니다.

 

그 다음 메소드 생성 후 post 방식으로 이미지를 보낼 것이기 때문에 post로 설정 후 다음과 같이 설정합니다.

2018-02-09 2 12 31

리전에서 ap-northeast-2 를 선택한 이유는 아시아 태평양(서울)이 여기에 해당하기 때문

함수는 2부 처음에 만들었던 람다 함수를 넣으면 된다

 

아까 만든 메소드에서 Post를 클릭 후 오른쪽 위에 있는 통합 요청을 클릭

2018-02-09 2 18 10

 

2018-02-09 2 18 58

 

밑에 내려보면 본문 매핑 템플릿이 있는데 , 요청 본문 패스스루란 데이터를 어떻게 받아올지 정의 하는 것으로 multipart/form-data로 설정 하고 템플릿 생성에서 메서드 요청 패스스루를 선택 한후 저장 하면된다. 템플릿 생성은 AWS 자체에서 만들어 준다.

 

이제 마지막으로 API를 배포하면 되는데 , 리소스나 메소드를 생성한것 처럼 생성을 눌러 api 배포를 선택한다

2018-02-09 2 38 58

 

생성하게 되면 URL 호출이 뜨면서

https://{restapi_id}.execute-api.{region}.amazonaws.com/{stage_name}/

이런 형식이 쭈루룩 써있을텐데,

여기서 {restapi_id}는 API 식별자이고, {region}은 API 배포 리전이고, {stage_name}은 API 배포의 단계 이름

이 URL을 통해 API를 호출 할 수 있게 된다.

 

이제 Lambda에서 만든 API를 trigger를 통해 설정하면된다.

2018-02-09 2 27 00

 

2018-02-09 2 27 05

 

마지막으로 Post Man을 통해 API url을 통해 이미지를 보내 보겠드아.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

미니게임지옥

프로젝트 이름

미니 게임 지옥 (Java GUI AWT)

 

프로젝트 개요

프로젝트 설명

Java AWT으로 구현한 게임 프로젝트 입니다.

 

프로젝트 기획

CLI가 아닌 GUI를 통해 이용할 수 있는 간단한 프로그램 구현 및 프로그래밍 연습을 위한 프로젝트

프로젝트 환경

개발 환경

jdk 1.8

 

실행 환경

Mac OS | Window OS | jre 1.8

 

프로그래밍 언어

Java 1.8

 

라이브러리

AWT

 

프로젝트 예시

준비된 예시 종류

imageYoutube Video imageGithub Repository

 

유튜브 영상

미니게임지옥 링크

깃허브

깃허브 링크

프로젝트 특징

Thread

프로젝트를 진행하면서, 다른 두개의 일을 동시에 진행 해야하는 것이 있었다.

게임 플레이를 하면서 동시에 경과시간이 계속 흐르는 것과 또 하나는 배경의 눈이 계속 떨어져야 하는데, 이를 Thread를 통해 쉽게 구현할수 있었음.

 

페인팅 이벤트

Java AWT 환경에서 처음에 가장 오해하기 쉬운 부분 중 하나가 바로 페인팅 프로세스이다. 과거 한참 AWT 파고 있던 본인도 마찬가지의 실수를 범한 것이기도 하다.

Java 의 GUI 근간을 형성하는 Component 위에 원하는 형태를 그리려면 paint(Graphics) 메소드를 오버라이딩하여 원하는 것을 그려야 한다는 점은 익히 잘 알고 있으리라 생각한다. (update 메소드 및 Canvas 등에 대해서는 여기선 별도로 언급하지 않겠다) 그리고 이렇게 구현된 paint(Graphics) 메소드 및 컴포넌트의 기본적인 형태를 그리는 작업이 컴포넌트를 그려야만 하는 여러 가지 상황, 혹은 사용자의 요청에 의해서 수행된다는 것 역시도 기본적인 AWT 에 대한 지식이 있다면 잘 알고 있으리라 생각한다. 중요한 점은 이 페인팅 작업이 이벤트 큐잉을 통하여 처리되는 방식이라는 것이고, 이에 대해 제대로 이해하지 못하고 코딩을 수행할 경우 여러 가지 예상치 못한 결과를 가져오게 된다.

흔히 컴포넌트를 다시 그리는 작업을 수행할 때 사용되는 repaint() 메소드가 이러한 문제를 발생시키는 좋은 예이다. repaint() 를 호출하면 즉시 컴포넌트를 다시 그릴 것이라고 간주하고 이후 처리하게 코딩하는 경우가 많은데 실제로는 그렇게 동작하지 않으므로 난감한 상황에 이르는 경우가 많다.

이의 동작은 실제로는 아래와 같다.

img

즉 repaint() 메소드를 호출하면, 즉시 페인팅 작업을 수행하는 것이 아니라, 페인트 이벤트 발생으로 취급, AWT 이벤트 큐에 페인트 이벤트를 집어넣고 종료시킨다. 그리고 이벤트 큐에 먼저 얹어져 있던 이벤트들이 차곡차곡 처리되고 난 다음 비로소 페인트 이벤트가 수행되고, 이에 따라 해당 컴포넌트의 paint(Graphics) 메소드가 호출되는 것이다.

이런 이벤트 큐 형식으로 처리되기 때문에, repaint() 호출이 AWT 이벤트 처리기와 동일한 스레드, 즉 이벤트 핸들러로부터 동작되는 코드 흐름이었다면 해당 이벤트 핸들러로 시작된 코드 흐름이 완전히 종료되기 전까지는 절대 페인팅 이벤트가 처리되지 않을 것이므로, repaint() 호출 직후에 무슨 짓을 해도 paint(Graphics) 가 바로 호출되게 할 수는 없다. 이에 대해서는 아래의 그림을 참조하자

img

repaint() 의 호출이 이벤트 핸들 코드 흐름이 아닌 다른 스레드라 할 지라도 위의 구조로 인해 repaint() 와 실제로 paint(Graphics) 간의 거리를 확정하기 어렵고, 많은 경우 둘간의 간극은 꽤 느린 편이므로 repaint() 호출 직후에 뭔가 코드를 써 넣는다고 하더라도 paint(Graphics) 호출 뒤에 실행될 가능성은 매우 낮다.

따라서 이런 이벤트 처리 시퀀스와 독립적으로 페인팅 작업을 수행하려 한다면, 다른 메소드를 호출해야 한다. 이를 위해 제공되는 것이 바로 paintImmediately() 이다. 이 메소드는 호출하면 메소드 명칭 그대로 '즉시' 페인팅을 수행한다.

'Portfolio' 카테고리의 다른 글

ITHRer (IT분야에서 취업하는 사람들)  (0) 2019.04.26
ITHRer

프로젝트 이름

ITHRer - (IT + Human Resources + er)

(IT분야 에서 취업하는 사람들)

 

프로젝트 개요

프로젝트 설명

Spring Framework를 이용한 Server 개발 및 mvc 와 디자인 패턴 적용

아마존의 EC2, RDS를 활용한 클라우드 서비스 공부

Kakao Open i builder를 활용한 간단한 챗봇 구현

Websocket를 활용한 채팅 구현 및 폴링, 롱폴링 등에 대한 이해

 

프로젝트 기획

특정 분야로 제한된 정보로 사용자에게 양질의 정보를 제공

프로젝트 환경

개발 환경

jdk 1.8 | STS | AWS | Kakao i open builder | Oracle

 

실행 환경

Mac OS | Window OS | jre 1.8 | Google Chrome

 

프로그래밍 언어

Java 1.8 | HTML5 | JSP | JavaScript

 

프로젝트 예시

준비된 예시 종류

imageGithub Repository

 

깃허브

깃허브 링크

프로젝트 특징

팀프로젝트로 진행하면서 본인이 맡은 부분에 대한 정리를 말씀드리겠습니다.

 

EC2 , RDS

프로젝트를 진행하면서 대부분 서버를 로컬에서 수행했지만, 이번 프로젝트에서는 클라우드 서비스 AWS를 활용

Ubuntu 환경의 EC2를 활용했으며 이에 따라 기본적인 linux에 대한 복습 및 공부

그리고 로컬과 달리 FTP를 사용해야 하는 경우가 있어서 이 때 FileZilla를 활용

또한 디버깅 할 때, STS에서 Logger를 활용하여 Console에서 간단하게 확인을 했다면, EC2에서는 tomcat에서 catalina에서 로그 확인을 통해 디버깅을 해야했는데, 이 때 로그가 축적되어 감당하기 힘든 크기가 되어, 이를 하루 단위로 로그를 나누던가 다른 방법으론 주기적으로 로그를 초기화 해주는 조치가 필요

 

스케줄링

스케줄링의 사용법은 대표적으로 3가지

  1. 쿼츠
  2. xml에서 설정
  3. 어노테이션에서 스케줄러사용

그 중 가장 간단한 사용방법인 3번을 선택했고, 리눅스와 동일한 방법인 cron양식으로 설정하면 됨.

익명게시판의 경우 3일이 지난 게시물들을 자동으로 삭제해야하기 때문에 스케줄러를 사용하여 관리자가 직접 처리하지 않아도 되기 때문에 편리

image

 

챗봇

이번에 'Kakao i 오픈빌더'를 이용할 수 있는 기회가 있어 카카오 플러스친구를 활용하여

완벽하진 않지만, 챗봇을 만들어 보았다.

준비물 - STS + Kakao i openbuilder + kakao 플러스친구 관리자 계정 + EC2

자세한 내용은 링크를 통해 정리한 내용을 확인

카카오 아이 오픈빌더 + Java Spring 정리한 것!

image

 

JSP WebSocket (채팅 구현)

WebSocket을 이용해 유저간의 채팅을 구현한 부분인 것이였던 것입니다.

흐름

  1. 서버는 Socket 생성 후 Server Socket으로 등록 합니다. 이를 바인딩 이라고 합니다.

    그 다음 클라이언트의 접속 요청을 받기 위한 설정을 하는데 이를 listen 이라 칭합니다.

  2. 그 후 서버는 Server Socket은 클라이언트의 접속 요청을 하염없이 기다리는 것이였답니다. 이를 accept 상태라고 합니다

  3. 클라이언트 쪽에서 채팅을 마구마구 즐기기 위해 Socket을 만들고, WebServetEnd 포인트로 접근 을 요청합니다. 이 때 책 읽는 사람들은 TCP로 연결이 되는데 , TCP연결을 하기 위해선 3 way handshake를 해야합니다. 알맞게 연결이 되면 , 서버는 와 클라이언트는 서로 read/write 할 수 있고, 서로 물고 뜯고 마구마구 엉망진창이 될 수 있던 것입니다.

    이 때 서버는 또한 새로운 클라이언트의 접근을 확인할 수 있는 accept 상태인 것을 알고 계시면 됩니다.

    (여기서 ajax를 통해서도 채팅을 구현할 수 있는데, 웹소켓과 ajax로 채팅을 구현할 때 생기는 차이점을 설명드리자면, ajax로 채팅을 구현할 경우, 클라이언트가 서버쪽에 요청을 보내고 , 막 명령을 시킬 수 있는 것에서 끝나지만, WebSocket으로 구현 할 경우, 클라이언트가 서버쪽에 요청을 할 수 있는건 물론이고 , 서버쪽에서도 클라이언트를 부를 수 있다는것이 차이점입니다.

 

위에 내용에서 면접에 정말 많이 나오는 내용

  1. TCP / UDP 통신 차이

  2. 3 way handshake & 4 way handshake

  3. http / https 차이

image

이 쪽 소스는 웹소켓 통신할 때 쓰는 기본적인 소스인데 , onOpen 과 onClose 즉 클라이언트의 접속과 연결해제 할 때 onMessage를 호출 하는데 이 때 chat_user_CNT를 같이 보내 , 현재 이용자의 수를 모든 클라이언트들에게 쫙 보냅니다.

header.jsp를 보시면 서버쪽에 접근하기 위해 클라이언트 쪽에서 소켓을 만드는걸 보실 수 있습니다. 바로 요놈

url에 대한 부분은 스크린샷을 참고하삼

image

 

onOpen 부분은 클라이언트가 연결에 성공했을 때 실행

onMessage 부분은 서버에서 클라이언트에게 메시지를 보낼 때

send 부분은 클라이언트에서 서버로 메시지를 보내는 메소드 였던 것이였던 것입니다

BroadSocket.java

 

header.jsp

 

그외 내용 (링크)

JSP 중복 로그인 (세션바인딩리스너) 정리

'Portfolio' 카테고리의 다른 글

미니게임지옥 (Java awt)  (0) 2019.04.26
JSP중~1

JSP 중복 로그인 (세션 바인딩 리스너)

중복 로그인을 회피하기 위해 HttpSessionBindingListener 인터페이스를 구현했습니다

Session Listener에서 두 가지를 비교해서 설명 해 드리면

HttpSessionListener는 세션의 생성과 세션이 해제 되는 이벤트에 맞게 리스너를 호출 할 수 있습니다.

HttpSessionBindingListener는 세션바인딩리스너 인터페이스를 구현한 세션에 바인딩 시키거나 언바인딩 되는 이벤트에 맞게 리스너를 호출 할 수 있습니다.

(세션의 속성을 추가 , 제거 를 뜻함)

 

1. 흐름

1.1

header.jsp 에서 로그인 시도 - ajax를 통해 서블릿으로 아이디와 비밀번호 및 아이디 저장 체크 유무 전송

1.2

FrontController.java 에서 url-pattern 및 분기를 통해 해당 Command로 이동

1.3

LoginCommand.java 에서 아이디와 비밀번호가 알맞을 경우, setSession을 통해 HashTable에 저장합니다.

세션바인딩 리스너는 setSession 메소드가 호출 했을 경우 valueBound가 실행 되며 ,

session.invalidate(); 와 같이 세션의 속성을 제거 했을 때 valueUnBound가 실행됩니다.

 

그리고 세션바인딩 리스너 인터페이스를 구현한 클래스는 싱글톤 패턴을 통해 효율적으로 관리됩니다.

이때 유저의 정보를 담고 있는 HashTable은 static으로 지정을 해 스태틱 메모리 영역에 저장을 합니다.

이는 공유하기 위해 요기다가 저장 하는 겁니당

1.4

이후 header.jsp에서 로그아웃을 하면 서블릿을 통해 해당 Command(Logout)로 이동하여 session.invalidate(); 를

실행합니다. 이 때 세션바인딩 리스너에서 valueUnBound가 실행되며 HashTable에서 해당하는 아이디가 제거됩니다.

1.5

중복아이디를 판단하는 메소드는 간단합니다. 세션 바인딩 리스너에서 isUsing 메소드를 통해서 현재 아이디가 HashTable

에 담겨 있다면 true를 반환하고, 없다면 false를 반환합니다.

LoginCommand에서 SessionListener.getInstance().isUsing(userId) 를 조건문으로 두어 중복로그인 인지 판별합

니다.

 

header.jsp


 

LoginCommand.java


 

SessionListener.java


 

 

'Spring' 카테고리의 다른 글

DI 설정 방법 - xml  (0) 2018.09.06
DI 설정 방법 - JAVA  (0) 2018.09.06
DI 설정 방법 - Java & xml 같이 사용  (0) 2018.09.06
Spring 한글 깨짐 현상  (0) 2018.07.17

Chatbot (카카오 아이 오픈빌더 + Java Spring)

이번에 'Kakao i 오픈빌더' 를 이용할 수 있는 기회가 있어 카카오 플러스 친구를 활용하여

완벽하진 않겠지만, AI 챗봇을 만들어 보려고 한다.

준비물 - STS (Spring Tool Suite) + 카카오 i 오픈빌더(신청 해야함) + 카카오 플러스친구 관리자 계정 + AWS EC2

준비 단계

  1. 카카오 플러스친구 관리자 계정

    카카오 플러스친구 관리자센터에 들어가, 서비스 할 플러스친구를 만든다.

    플러스친구 계정을 만들어 '스마트 채팅' 카테고리를 들어가면 '챗봇' 이란 부분이 있는데

    이 '챗봇'을 카카오 i 오픈 빌더를 통해 만드는 것임

    플러스 친구 계정을 만든 후, 카카오 i 오픈 빌더 사이트로 들어가서 연동을 하면 된다

image

아 그리고 관리 -> 상세설정에서 아래와 같이 설정을 해주어야 사용자들이 카카오톡에서 검색할 수 있음

image

  1. 카카오 i 오픈 빌더

    카카오 i open builder는 신청을 하고, 만들수 있다는 가정하에 설명하겠음

    일단 카카오 i에 대해 짧게 설명해드리자면, 카카오 인공지능 기술을 이용하여 카카오톡 플러스친구 챗봇을 쉽게 설계할 수 있도록 도와주는 설계 플랫폼이다.

    기본적인 것들을 이것저것 사용해봤는데, 일단 장점은 카카오톡 이용자들이 정말 엄청나게 많은데, 이 사용자들이 잠재고객 이 될수도 있는? 음.. , 대형 플랫폼이다 광고만 잘한다면 저 많은 사람들이 한번쯤은 들어올 확률이 어느정도 있지않을까 한다.

    그리고 카카오 i 오픈빌더를 이용하면, 챗봇의 화면 구성이라던지, 발화에 따른 교육을 쉽게 할 수있다. 예를 들어 사용자가 '사용법'을 치면 챗봇을 어떻게 사용할 수 있는지 사용법이 쫘르르륵 나오는데(물론 버튼식으로도 만들수 있음) 오타로 '사용버ㅂ' 이라고 치던지, 'ㅅㅏ용법' 이라고 칠수도 있는데, 이러한 부분을 '학습' 시킴으로 써 위와 같은 오타를 쳤어도 '사용법'에 대한 내용을 쫙 보내줄수 있다. 그리고 STS를 활용하여 '스킬'을 구성할 수 있는데, 내가 제공하고 싶은 내용들을 이 '스킬'을 활용하면 더욱 SkillFul하게 챗봇을 만들 수 있다.

    kakao_i2

아래와 같이 설정을 해주면 카카오 챗봇과 연동할수 있음

image


그럼 밑에와 같이 연동이 된것을 확인할 수 있다

image


웰컴 블록을 만들면, 처음 사용자가 플러스친구에 접속했을 때 나오는 화면을 구성할 수 있다

화면 구성 및 스킬, 학습 사용법은 도움말을 이용해서 확인하시면 됨

image

####STS

카카오 플랫폼을 활용하며, 카카오톡 플러스친구를 통해 서비스 하기 때문에 따로 View가 필요하지 않다.

특정한 JSP와 같은 뷰가 필요하지 않기 때문에, REST방식으로 데이터를 처리하면 되기 때문에

@RestContoller 를 사용하며, 데이터를 반환만 하면 된다. @Controller를 사용해도 무방하며, @ResponseBody를 붙여주어야 함.

@RestController를 사용하기 위해선 Spring 버전을 4 이상으로 pom.xml에서 설정해주어야 한다.

(틀린거 지적해주시면 감사하겠습니당.)

STS는 일단 스킬 서버를 구성하기 위해 우리가 작업을 하는건데, 봇 시스템에서 스킬 서버로 요청을 하면, 그에 따른 알맞은 json을 스킬 서버에서 반환해 주어, 봇 시스템은 받은 json에 알맞게 화면을 구성해준다.

image

응답 타입별 JSON 포멧은 여러가지가 있는데, 가장 간단한 SimpleText의 예제를 보여드리겠슴다.

이걸 하기에 앞서 pom.xml 에서 Controller에서 객체 반환을 할 때 JSON형태로 반환하게끔 도와주는 디펜던시를 추가해줘야함, dependencies 가장 밑에 추가

image

봇 시스템에 반환할 객체 vo를 만들어보좌

image

그 다음 Controller 에서 반환하게 끔 코딩을 해보좌

image

이제 로컬 서버를 켜서 확인을 해보좌

image

다음으로 skill로 한번 만들어 보좌

일단 여기서 미리 만들어둔 AWS EC2 서버를 사용할 건데, 만드는 법은 나중에 올리던지, 아니면 필요하신분은 구글링을 통해 만들어 보시면 될듯 함

저는 ec2서버(ubuntu)에 jdk1.8에 tomcat(8.5) 설치하구 manager 설정을 통해 employ를 했습니당.

그럼 밑에 처럼 서버를 통해 요청을 할 수 있습니당.

image

이것을 이제 스킬로 한번 만들어보겠슴다. 카카오 i 오픈빌더를 통해 들어가 밑에 URL을 넣은 뒤

스크린샷 2019-03-18 오후 6 03 27

밑에 스킬서버로 전송을 누르면, 봇시스템에 제대로 응답이 왔는지 확인 할 수 있습니다.

스크린샷 2019-03-18 오후 6 03 54

그럼 이것을 위에서 우리가 만든 웰컴 블록에서 '사용법' 버튼에게 스킬을 적용시켜 보겠습니다.

SimpleText 라는 시나리오를 만들고, 거기에 발화(사용자가 발화로 지정한 단어를 입력했을 때, 현재 만든 시나리오가 발동!)를 지정하며, 스킬까지 같이 지정을 하고 어떻게 쓰는지 확인해보좌

발화를 '심플'로 지정, 파라미터 설정을 통해 내가 만든 스킬을 등록

image

웹훅객체 사용법은 도움말을 통해 보면 되시구, vo 로 만든 SimpleText에 text라는 이름의 string 타입의 데이터가 있었는데, JSON형태로 받은 봇시스템은 웹훅객체를 통해 요로코롬 불러올수 있다

image

저장을 하고, 오른쪽 상단위에 봇테스트를 통해 테스트 해보좌

image

요로코롬 나올수 있는걸 확인할수 있다..

6강. DI 설정 방법 - 3 (xml 사용)

#DI 설정 방법

오늘은 IOC컨테이너 안에 의존하는 객체인 DI를 설정하는 방법을 알아보자 !

총 3가지의 방법이 있다.

  1. DI in xml
  2. DI in java
  3. java 와 xml 같이 사용

 

 

###1. XML파일을 이용한 DI 설정 방법(DI in XML)

image

 

image

image

 

 

 

 

'Spring' 카테고리의 다른 글

Spring 중복 로그인 (세션바인딩 리스너) 정리  (4) 2019.04.26
DI 설정 방법 - JAVA  (0) 2018.09.06
DI 설정 방법 - Java & xml 같이 사용  (0) 2018.09.06
Spring 한글 깨짐 현상  (0) 2018.07.17
6강. DI 설정 방법 - 3 (java 사용)

DI 설정 방법

오늘은 IOC컨테이너 안에 의존하는 객체인 DI를 설정하는 방법을 알아보자 !

총 3가지의 방법이 있다.

  1. DI in xml
  2. DI in java
  3. java 와 xml 같이 사용

 

2. JAVA를 이용한 DI 설정 방법

image

 

이번에 DI설정하는 방법은 바로 JAVA를 이용해서 스프링 설정(DI 설정) 하는 방법이다. 그럼 의존성 객체를 어떻게 생성하는지 소스를 통해 확인하자

 

 

'Spring' 카테고리의 다른 글

Spring 중복 로그인 (세션바인딩 리스너) 정리  (4) 2019.04.26
DI 설정 방법 - xml  (0) 2018.09.06
DI 설정 방법 - Java & xml 같이 사용  (0) 2018.09.06
Spring 한글 깨짐 현상  (0) 2018.07.17
6강. DI 설정 방법 - 3 (java & xml 같이 사용)

DI 설정 방법

오늘은 IOC컨테이너 안에 의존하는 객체인 DI를 설정하는 방법을 알아보자 !

총 3가지의 방법이 있다.

  1. DI in xml
  2. DI in java
  3. java 와 xml 같이 사용

 

3. XML과 JAVA를 같이 사용

image

1. xml파일에 JAVA파일을 포함시켜 사용 하는방법

DI in xml 과 DI in JAVA와 두개 합친거와 거의 동일하지만, xml파일 안에 configuration 어노테이션을 가져오겠다는 명령문 하나를 삽입해야한다.

 

 

2. JAVA파일 안에 XML 파일을 가져와 사용하는 방법

 

 

'Spring' 카테고리의 다른 글

Spring 중복 로그인 (세션바인딩 리스너) 정리  (4) 2019.04.26
DI 설정 방법 - xml  (0) 2018.09.06
DI 설정 방법 - JAVA  (0) 2018.09.06
Spring 한글 깨짐 현상  (0) 2018.07.17
2.객체지향 언어 특징

객체지향 언어(Object Orientied Language) 특징

1. 캡슐화

짧게 정리하면 데이터(정보)와 데이터를 다루는 방법(메소드)를 결합시켜 묶는 것.

이는 더욱 깊게 들어가면 코드를 재수정 없이 재활용 하는 방법이라고 설명 할 수 있다.

프로그램 코드를 재활용 하려고 하는데 기능(함수/프로시저 : 메소드)이 분산되어 있고 특성(변수 : 데이터)이 분산 되어 있는 프로그램 코드는 재활용을 하기 매우 힘들다. 이 때문에 관련 기능과 특성을 한곳으로 모으고 분류할 필요성이 있다.

  • 클래스 & 인스턴스

객체 지향에서는 이렇게 계층적으로 분류한 기능과 특성의 모음을 클래스(Class)라는 캡슐(capsule)에 분류된 집단 별로 각각 집어 넣는다. 이러한 클래스를 실체화(Instance) 하면 객체(Object)를 만들수 있다.

붕어빵 틀 = 클래스

붕어빵 = 객체(인스턴스)

2. 상속

사실 클래스 이전의 프로그래밍 기법에선 코드 재활용이 불가능하지는 않았다. 예전에도 라이브러리 등을 통해서 남이 짜놓은 코드를 그대로 가져올 수 있었다.

  • '라이브러리'의 문제점

라이브러리는 코드의 재활용에 지대한 영향을 미쳤지만 치명적인 단점이 있었다. 라이브러리의 기능을 약간 바꾸어야 할 경우 라이브러리의 소스를 변경해야 했고 이 때문에 전혀 다른 라이브러리가 되어 버린다는 것이다. 이것은 라이브러리 버전에 따라 그 라이브러리를 사용하는 프로그램이 동작을 안할수도 있다는 것이고 불필요한 코드의 수정작업을 해야 한다는 것이다.

  • '상속'의 도입

객체 지향 프로그램에서는 이 문제를 해결하기 위해 "상속"을 도입 했다."포용성"으로 이전의 라이브러리보다 더 논리적이고 체계적으로 기능과 데이터를 계층적으로 분류해서 사용의 편의성을 도모하면서, 상속을 사용해 부모 클래스의 특성과 기능을 그대로 이어받고 기능의 일부분을 변경해야 할 경우 상속 받은 자식 클래스에서 그 기능만을 다시 정의하여 수정하게 하였다. 이러한 작업을 "덮어쓰기(재정의 : Override)"라고 한다.

 

3. 다형성

하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것을 말한다. 위에서 설명한 오버라이딩 이외에, 변수에 따라 함수의 기능이 달라지는 오버로딩도 여기에 해당한다.

  • 연산자 오버로딩

C++, C# 등에서는 기본 연산자를 오버로딩해서 기본 연산자가 해당 클래스에 맞는 역할을 수행하게 하는 것도 가능하다. JAVA 등에서는 연산자의 오버로딩이 불가능하다. 펄 6나 스몰토크, F# 등, 연산자의 신규 정의가 가능한 언어도 있다.

 

 

 

'Java' 카테고리의 다른 글

싱글톤 (Singleton)  (0) 2020.08.19
1. Java란  (0) 2018.07.26
2. 변수자료형연산자  (0) 2017.03.16
1. 기본 입출력  (0) 2017.03.16
1.Java란

JAVA

자바(Java)를 짧게 설명하자면 우리 제임스 고슬링 형님께서 가전 제품내에 동작하는 프로그램을 만드는 용도로 개발하신 객체지향언어 이다.

 

객체 지향 프로그래밍(Object Oriented Programming), OOP

프로그램 을 어떻게 설계해야 하는지에 대한 일종의 개념이자 방법론

 

프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체'라는 기본 단위로 나누고 이 객체들의 상호작용으로 서술하는 방식

 

기존 절차적 프로그래밍에서는 메소드를 기계, 데이터를 원료로 생각해서 데이터가 메소드 사이를 통과하면서 차츰 순서대로 가공돼 나가는 방식으로 이해한다면 객체 지향 프로그래밍에서는 데이터를 중심으로 메소드가 데이터에 접근해서 수정한다는 개념이다. 즉 원료가 움직이냐 기계(함수, 메소드)가 움직이냐의 차이.

 

절차적 프로그래밍 vs 객체 지향 프로그래밍

 절차 지향 언어객체 지향 언어
장점1. 완성된 코드의 실행처리 속도가 빠르다.
2. 초기 프로그래밍 언어로 컴퓨터의 구조와 비슷해 속도가 빠르다.
1. 코드 재사용 용이
2. 코딩이 간단
3. 유지보수가 쉽다.
4. 대형 프로젝트에 좋다.
단점1. 유지보수가 어렵다.
2. 분석이 어렵다.
3. 대형 프로젝트에 부적합
1.처리속도가 상대적으로 느림
2.객체가 많으면 용량이 커질 수 있다.
3.설계 시 많은 시간이 투자 된다.
4. 설계 실패 시 처음부터 다시 시작

출처 : http://hunit.tistory.com/151

그럼 같은 객체 지향 언어인 c++ 과 차이점이 뭘까?

c++은 c언어의 로우 레벨의 시스템 프로그래밍의 강점 + 객체 지향 언어의 하이 레벨 기능들을 포함

Java는 포인터라는 강력한 무기를 포기하는 대신, 객체 지향(oop)에 집중하여 언어적 완성도를 높임

 

C++ vs JAVA 비교

1.상속

c++는 다중 상속 지원, Java는 다중 상속 지원x

다중 상속을 할 때, 다이아몬드 문제가 발생하는데, c++은 이를 회피할 수 있는 기능을 제공(virtual)

 

다이아몬드 문제

다중 상속을 하면 일어나는 문제가 있는데 그것은 다이아몬드 문제가 발생한다.

만약 A가 print()라는 메소드가 있다고 가정하자. 그럼 B와 C도 print() 라는 메소드를 보유하고 있을 것이다..

이 때 D의 인스턴스를 만들고, print() 메소드를 사용 할 경우, 모호(ambiguous)가 발생하며 메소드를 수행하지 못할 것이다.

이는 B가 상속받은 A의 메소드인지 , C가 상속받은 A의 메소드의 것을 사용하는지 모호하기 때문이다.

그래서 virtual키워드를 통해 A의 print() 메소드를 명시해 주어 모호하지 않게 해주는 것이다.

 

1.2 friend 키워드

c++은 friend 키워드 지원, Java는 지원 x

예를 들어 A클래스가 B클래스를 friend키워드를 통해 명시하면, A가 private로 데이터 또는 메소드를 접근제어자로 명시해도 B는 접근이 가능하다.

 

1.3 Interface

Java는 다중 상속이 없는대신, Interface를 통해 흉내낼 수 있다. 또 한 Interface는 상속이 아닌 구현이기 때문에

모든 추상 메소드를 구현 해야만 하기 때문에 다이아몬드 문제가 발생하지 않는다.

 

참고로, Interface는 상수와 추상 메소드로만 이루어짐.

 

2. 메모리 처리

앞서 JVM에 대해 소개했듯, JAVA와 C++의 메모리 처리(이런 '용어'를 써도 되는지 모르겠다.)에도 차이가 있는데...

첫째로, JAVA는 객체를 메모리의 Heap영역에만 할당할 수 있으나, C++의 경우 Heap과 Stack영역 모두에 할당이 가능하다. C++에서 new 키워드를 통해 객체를 생성하면 Heap영역에 객체가 할당되고, 일반적인 변수 선언 방식을 택하면 Stack영역에 할당이 된다. JAVA에서는 일반적인 변수 선언 방식으로 객체를 생성할 수 없다. (http://preamtree.tistory.com/28 [스크랩자료]Heap과 Stack의 비교)

둘째로, JAVA는 메모리(Heap 영역) 해제가 자동으로 이루어지지만, C++은 프로그래머가 수동으로 해야한다. JAVA에서는 Garbage Collector가 미사용 객체 등의 자원을 자동으로 해제하며, 프로그래머는 수동으로 GC를 조작할 수 없다. C++에서는 Destructor(소멸자)를 통해 메모리 해제가 가능하다.

 

3. 문법 및 기능

첫째로, C++에서는 연산자오버로딩을 지원하지만, JAVA는 그렇지 않다. 연산자 오버로딩은 단어 그대로 연산자를 재정의 하여 활용한다는 것인데, '객체'간 연산에 활용할 수 있다. (이를테면, *연산을 재정의하여 객체와 객체를 * 연산처리 할 수 있다.) JAVA는 만들어질 때부터 이러한 연산자 오버로딩을 지원하지 않는 방향으로 개발되었다고 한다.

 

둘째로, JAVA는 익명클래스(Anonymous Class)를 지원하지만, C++의 경우 그렇지 않다. 익명클래스는 JAVA에서 지원하는 기능인데, 말 그대로 이름이 없는 클래스이다. 인터페이스의 메소드 중 하나만 재정의하고 싶을 때 자주 사용되며, 클래스의 선언과 객체의 생성이 동시에 이루어지는 형태를 띄고 있다. JAVA는 익명클래스를 통해 '함수형 프로그래밍'의 형태를 어느 정도 흉내낼 수 있다.

셋째로, JAVA는 동적바인딩(Dynamic Binding)을 택하고 있지만, C++은 정적바인딩(Static Binding)을 택하고 있다. 하지만 C++이 정적바인딩만 지원하는 것은 아니고, virtual 키워드를 통해 동적바인딩을 지원한다.

※ 요약

  1. C++은 연산자오버로딩 지원, JAVA는 지원하지 않음.
  1. JAVA는 익명클래스 지원(함수형 프로그래밍을 어느정도 구현), C++은 지원하지 않음.
  1. JAVA는 동적바인딩, C++은 정적바인딩(virtual 키워드로 동적바인딩 가능)

 

기능c++Java
다중상속가능불가
Friend class가능불가
Interface불가가능
객체 생성stack, heapheap
Garbage Collection수동자동
연산자 오버로딩가능불가
익명클래스불가가능
바인딩 방식동적동적, 정적

출처:

http://preamtree.tistory.com/6

[Preamtree의 행복로그]

'Java' 카테고리의 다른 글

싱글톤 (Singleton)  (0) 2020.08.19
2. 객체지향 언어 특징  (0) 2018.07.26
2. 변수자료형연산자  (0) 2017.03.16
1. 기본 입출력  (0) 2017.03.16

+ Recent posts