SlideShare a Scribd company logo
채팅서버 개발기
(+클라이언트 구현 삽질 몇가지)
NodeJS, SocketIO
박정웅 (myuoong@gmail.com)
개발 배경…
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 : 채팅방 UUID
id : 참여자
start_num : 채팅방에서 시작 메시지
( 채팅방 중간에 초대된 경우 start_num에 시작 메시지 번호 입력 )
메시지 테이블
num : 메시지 고유 ID
flag : 메시지 읽은 사람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

More Related Content

PPT
Digital Marketing - VAI TRÒ DIGITAL MARKETING TRONG CHIẾN DỊCH TRUYỀN THÔNG ...
PDF
How to Become a Thought Leader in Your Niche
PDF
PDF
개발자라면, 블로그
PDF
3 Things Every Sales Team Needs to Be Thinking About in 2017
PDF
Build Features, Not Apps
PDF
Visual Design with Data
PDF
Generative adversarial networks
Digital Marketing - VAI TRÒ DIGITAL MARKETING TRONG CHIẾN DỊCH TRUYỀN THÔNG ...
How to Become a Thought Leader in Your Niche
개발자라면, 블로그
3 Things Every Sales Team Needs to Be Thinking About in 2017
Build Features, Not Apps
Visual Design with Data
Generative adversarial networks

Viewers also liked (14)

DOCX
Cinética enzimática
PPTX
Music therapy in hungary – the life of mt 2
PPTX
El cartílago
PPTX
Luthfiani azzahra
PDF
Spring Boot 소개
PPTX
학생 개발자, 인턴십으로 성장하기
PDF
Study: The Future of VR, AR and Self-Driving Cars
PDF
Designing Teams for Emerging Challenges
PPTX
No borders innovation: how to build a remote working-based “liquid company”
PDF
TEDx Manchester: AI & The Future of Work
PDF
Toimintakulttuurin muutos ohjauksessa;: digitaalisuuden mahdollisuudet ja haa...
PPTX
Irene Porras Vega
PPTX
Oι πλανήτες
DOCX
Tourism final 16 proposals (by abad)
Cinética enzimática
Music therapy in hungary – the life of mt 2
El cartílago
Luthfiani azzahra
Spring Boot 소개
학생 개발자, 인턴십으로 성장하기
Study: The Future of VR, AR and Self-Driving Cars
Designing Teams for Emerging Challenges
No borders innovation: how to build a remote working-based “liquid company”
TEDx Manchester: AI & The Future of Work
Toimintakulttuurin muutos ohjauksessa;: digitaalisuuden mahdollisuudet ja haa...
Irene Porras Vega
Oι πλανήτες
Tourism final 16 proposals (by abad)
Ad

Similar to Node-express 채팅 서버 개발기 (20)

PPTX
Redis data design by usecase
PDF
Portfolio
PPTX
포트폴리오
PDF
모바일 메신저 아키텍쳐 소개
PPTX
포트폴리오
PDF
20160427 ROS 4차 강의 (for 아스라다 팀)
PDF
Mongodb 특징 분석
PDF
Mongo db 시작하기
PPTX
리스펙토링 세미나 - 나만의 카카오 챗봇 만들기
PPTX
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
PDF
리로그인 Relogin: 코드스테이츠 데모데이
PPTX
Node.js의 도입과 활용
PPT
Rhea_MMO_SNG_Convergence_Server_Architecture
PDF
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
PDF
루비온레일즈로 카카오톡 봇 만들기
PDF
Web server page_ed10
PDF
PDF
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
PDF
IT 일반기술 강의자료_ed10
PDF
리눅스 소켓 프로그래밍 기초
Redis data design by usecase
Portfolio
포트폴리오
모바일 메신저 아키텍쳐 소개
포트폴리오
20160427 ROS 4차 강의 (for 아스라다 팀)
Mongodb 특징 분석
Mongo db 시작하기
리스펙토링 세미나 - 나만의 카카오 챗봇 만들기
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
리로그인 Relogin: 코드스테이츠 데모데이
Node.js의 도입과 활용
Rhea_MMO_SNG_Convergence_Server_Architecture
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
루비온레일즈로 카카오톡 봇 만들기
Web server page_ed10
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
IT 일반기술 강의자료_ed10
리눅스 소켓 프로그래밍 기초
Ad

Node-express 채팅 서버 개발기

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