20
채팅서버 개발기 (+클라이언트 구현 삽질 몇가지) NodeJS, SocketIO 박정웅 ([email protected])

Node-express 채팅 서버 개발기

  • Upload
    -

  • View
    6.061

  • Download
    1

Embed Size (px)

Citation preview

Page 1: Node-express 채팅 서버 개발기

채팅서버개발기(+클라이언트 구현 삽질 몇가지)NodeJS, SocketIO

박정웅 ([email protected])

Page 2: Node-express 채팅 서버 개발기

개발배경…

4학년끝나갈무렵 ..

교수님께서기존웹, 모바일서비스와연동되는채팅기능을추가개발해달함

그리고몇가지요구사항을말씀하시는데...

이렇게 2주간 시간을잡고개발을시작하였다...

Page 3: Node-express 채팅 서버 개발기

채팅서버요구사항

• 단체채팅기능

• 메시지미수신자확인

• 실시간현재접속중인사람확인

• 대화방초대기능

• 푸시(GCM/APNS) 메시지 전송

• 웹, 모바일(하이브리드앱) 지원

• 방나가기기능

Page 4: Node-express 채팅 서버 개발기

짱구굴리기…

소켓서버개발이처음.. 검색 또 검색 ...

1) 기술 스팩 결정

2) 문서 둘러보기

3) 패킷 전송 프로세스결정 (방참여, 메시지 전송, 등)

4) 프로젝트 구성

5) DB 구성

6) 각 기능 구현

Page 5: Node-express 채팅 서버 개발기

서버기술스팩

• 서버 : NodeJS (6.x)

• 소켓 Lib�: Socket.io (1.7.x)

• 프레임워크 : express(4.x)

• DB�:�mysql

Page 6: Node-express 채팅 서버 개발기

클라이언트기술스팩

• 웹• Jquery

• Socket.io

• 모바일(하이브리드 앱)• angularJS

• Socket.io

Page 7: Node-express 채팅 서버 개발기

Socket.IO 문서 둘러보기1

• 이벤트 리슨 &�발생

응답을콜백함수로할땐emit하는곳에서 3번째인자값으로콜백함수명시해야됨 ( 2번째 emit참고)

Page 8: Node-express 채팅 서버 개발기

Socket.IO 문서 둘러보기2

• 대화방 == 채널 ( 룸 ) 사용

대화방1

대화방2

소켓 서버• 소켓을묶어서채널(룸)을 생성 함• 해당채널(룸)은 독립된 공간• 클라이언트접속시해당채널(룸)으로 조인• 접속종료시해당채널(룸)을 나간 후 소켓연결종료

Page 9: Node-express 채팅 서버 개발기

Socket.IO 문서 둘러보기3

• 채팅 서버 생성

• 채팅 방 관련

• 메시지 전송

이부분은각자맞게수정

//보내는사람포함

//보내는사람제외

Page 10: Node-express 채팅 서버 개발기

소켓패킷프로세스 1(방 접속)

서버클라이언트-소켓 연결된 상태-

1.상대ID-> 방 존재 검사-> 없으면 생성 있으면 기존방코드1.방코드-> 검증2.메시지 읽음 처리3.최근 메시지 & 구성원 목록 가져옴4.소켓 룸에 등록5.모든 메시지 읽음 정보 가져옴

메시지읽음정보 ->다음장에서보충설명

*모든 응답,요청은 JSON형식

Page 11: Node-express 채팅 서버 개발기

소켓패킷프로세스 2(메시지 읽음)

서버클라이언트A

-A는 먼저 방에 접속된 상태-

for(메시지 목록){if(메시지 번호 같음)읽음 숫자 변경

}

클라이언트B

프로세스 1번과같은동작후

Page 12: Node-express 채팅 서버 개발기

소켓패킷프로세스 3(메시지 전송)

서버클라이언트A

1.방에 접속 중인 사람 검사2.메시지 저장 (내용,..읽음사람)3.해당 방에 메시지 전송4.응답으로 메시지 번호(DB의 PK번호)

+ 메시지 내용 + 시간, 등..

클라이언트B

-소켓 연결된 상태-

Page 13: Node-express 채팅 서버 개발기

서버프로젝트구성

DB 엑세스

DB 접속 정보

비지니스 로직

푸시 관련 모듈

메인파일..(거의 컨트롤러ㅎ)

Page 14: Node-express 채팅 서버 개발기

DB 구성

채팅방테이블room�:�채팅방 UUIDid�:�참여자start_num :�채팅방에서시작메시지( 채팅방 중간에초대된경우 start_num에 시작 메시지번호입력 )

메시지테이블num :�메시지 고유 IDflag : 메시지 읽은사람ID�(id1,id2,id3�형식으로 저장)

*그 외 유저 table은 각자 맞게구성

Page 15: Node-express 채팅 서버 개발기

기능구현1(chat_main.js)

각이벤트에따라 service요청

(service�요청 예시)

Page 16: Node-express 채팅 서버 개발기

기능구현2(chat_service.js)

chat_main.js에서 넘겨받은파라미터로

비지니스로직동작및 DAO 호출

(dao 호출 예시)

Page 17: Node-express 채팅 서버 개발기

기능구현3(dao.js)

DB에 보낼 sql 문 작성

커넥션정보는 credentials.js에서 가져와서사용

(DB접속 정보)

Page 18: Node-express 채팅 서버 개발기

기능구현4(비동기 처리)

• 비동기처리 & 콜백 지옥탈출을위한필수모듈

• Bluebird�모듈 설치npm install�--save�bluebird

Promise:약속생성Resolve:약속지킴Reject:약속못지킴

Fn().then(콜백)형식으로받아서사용함

그외약속배열을받아처리하는 all,등이있음

Page 19: Node-express 채팅 서버 개발기

클라이언트구현(삽질 했던 것)

• ionic 환경에서 삽질했던것

socket연결(성공) -> 종료 -> 연결(실패)

해결 방법 : socket.io lib 업데이트

socket연결을 반복적으로연결끊기했을때이벤트(socket.on())가 중복으로호출됨

해결방법 : connect()전에 socket.removeListener();호출

scope변경 값이 뷰에적용안됨

해결방법 : socket이벤트 동기와 scope 업데이트 동기가안맞는듯

Scope를 강제로 업데이트

apply를 그냥 호출하면충돌이날수있으니주기를검사후호출

Page 20: Node-express 채팅 서버 개발기

전체코드는 Git Hub에…

• https://github.com/parkjungwoong/Node-based-chat-server