Node-express 채팅 서버 개발기
Transcript of Node-express 채팅 서버 개발기
채팅서버개발기(+클라이언트 구현 삽질 몇가지)NodeJS, SocketIO
박정웅 ([email protected])
개발배경…
4학년끝나갈무렵 ..
교수님께서기존웹, 모바일서비스와연동되는채팅기능을추가개발해달함
그리고몇가지요구사항을말씀하시는데...
이렇게 2주간 시간을잡고개발을시작하였다...
채팅서버요구사항
• 단체채팅기능
• 메시지미수신자확인
• 실시간현재접속중인사람확인
• 대화방초대기능
• 푸시(GCM/APNS) 메시지 전송
• 웹, 모바일(하이브리드앱) 지원
• 방나가기기능
짱구굴리기…
소켓서버개발이처음.. 검색 또 검색 ...
1) 기술 스팩 결정
2) 문서 둘러보기
3) 패킷 전송 프로세스결정 (방참여, 메시지 전송, 등)
4) 프로젝트 구성
5) DB 구성
6) 각 기능 구현
서버기술스팩
• 서버 : NodeJS (6.x)
• 소켓 Lib�: Socket.io (1.7.x)
• 프레임워크 : express(4.x)
• DB�:�mysql
클라이언트기술스팩
• 웹• Jquery
• Socket.io
• 모바일(하이브리드 앱)• angularJS
• Socket.io
Socket.IO 문서 둘러보기1
• 이벤트 리슨 &�발생
응답을콜백함수로할땐emit하는곳에서 3번째인자값으로콜백함수명시해야됨 ( 2번째 emit참고)
Socket.IO 문서 둘러보기2
• 대화방 == 채널 ( 룸 ) 사용
대화방1
대화방2
소켓 서버• 소켓을묶어서채널(룸)을 생성 함• 해당채널(룸)은 독립된 공간• 클라이언트접속시해당채널(룸)으로 조인• 접속종료시해당채널(룸)을 나간 후 소켓연결종료
Socket.IO 문서 둘러보기3
• 채팅 서버 생성
• 채팅 방 관련
• 메시지 전송
이부분은각자맞게수정
//보내는사람포함
//보내는사람제외
소켓패킷프로세스 1(방 접속)
서버클라이언트-소켓 연결된 상태-
1.상대ID-> 방 존재 검사-> 없으면 생성 있으면 기존방코드1.방코드-> 검증2.메시지 읽음 처리3.최근 메시지 & 구성원 목록 가져옴4.소켓 룸에 등록5.모든 메시지 읽음 정보 가져옴
메시지읽음정보 ->다음장에서보충설명
*모든 응답,요청은 JSON형식
소켓패킷프로세스 2(메시지 읽음)
서버클라이언트A
-A는 먼저 방에 접속된 상태-
for(메시지 목록){if(메시지 번호 같음)읽음 숫자 변경
}
클라이언트B
프로세스 1번과같은동작후
소켓패킷프로세스 3(메시지 전송)
서버클라이언트A
1.방에 접속 중인 사람 검사2.메시지 저장 (내용,..읽음사람)3.해당 방에 메시지 전송4.응답으로 메시지 번호(DB의 PK번호)
+ 메시지 내용 + 시간, 등..
클라이언트B
-소켓 연결된 상태-
서버프로젝트구성
DB 엑세스
DB 접속 정보
비지니스 로직
푸시 관련 모듈
메인파일..(거의 컨트롤러ㅎ)
DB 구성
채팅방테이블room�:�채팅방 UUIDid�:�참여자start_num :�채팅방에서시작메시지( 채팅방 중간에초대된경우 start_num에 시작 메시지번호입력 )
메시지테이블num :�메시지 고유 IDflag : 메시지 읽은사람ID�(id1,id2,id3�형식으로 저장)
*그 외 유저 table은 각자 맞게구성
기능구현1(chat_main.js)
각이벤트에따라 service요청
(service�요청 예시)
기능구현2(chat_service.js)
chat_main.js에서 넘겨받은파라미터로
비지니스로직동작및 DAO 호출
(dao 호출 예시)
기능구현3(dao.js)
DB에 보낼 sql 문 작성
커넥션정보는 credentials.js에서 가져와서사용
(DB접속 정보)
기능구현4(비동기 처리)
• 비동기처리 & 콜백 지옥탈출을위한필수모듈
• Bluebird�모듈 설치npm install�--save�bluebird
Promise:약속생성Resolve:약속지킴Reject:약속못지킴
Fn().then(콜백)형식으로받아서사용함
그외약속배열을받아처리하는 all,등이있음
클라이언트구현(삽질 했던 것)
• ionic 환경에서 삽질했던것
socket연결(성공) -> 종료 -> 연결(실패)
해결 방법 : socket.io lib 업데이트
socket연결을 반복적으로연결끊기했을때이벤트(socket.on())가 중복으로호출됨
해결방법 : connect()전에 socket.removeListener();호출
scope변경 값이 뷰에적용안됨
해결방법 : socket이벤트 동기와 scope 업데이트 동기가안맞는듯
Scope를 강제로 업데이트
apply를 그냥 호출하면충돌이날수있으니주기를검사후호출
전체코드는 Git Hub에…
• https://github.com/parkjungwoong/Node-based-chat-server