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

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

+ Recent posts