SlideShare a Scribd company logo
1 of 20
Download to read offline
채팅서버 개발기
(+클라이언트 구현 삽질 몇가지)
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

What's hot

Routebased-Policybased VPN.pptx
Routebased-Policybased VPN.pptxRoutebased-Policybased VPN.pptx
Routebased-Policybased VPN.pptxDhruv Sharma
 
Chris Durkin Resume - Expert .NET Consultant 18 years experience
Chris Durkin Resume - Expert .NET Consultant 18 years experienceChris Durkin Resume - Expert .NET Consultant 18 years experience
Chris Durkin Resume - Expert .NET Consultant 18 years experienceChris Durkin
 
Ns3 implementation wifi
Ns3 implementation wifiNs3 implementation wifi
Ns3 implementation wifiSalah Amean
 
ITN_Module_3.pptx
ITN_Module_3.pptxITN_Module_3.pptx
ITN_Module_3.pptxargost1003
 
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】WESEEKWESEEK
 
Alcatel - 7750 SR & CGNAT SR-OS Fundamental
Alcatel - 7750 SR & CGNAT SR-OS FundamentalAlcatel - 7750 SR & CGNAT SR-OS Fundamental
Alcatel - 7750 SR & CGNAT SR-OS FundamentalWilson Vicente Júnior
 
Cuestionario 2 Int. a las rutas dinámicas 1.docx
Cuestionario 2 Int. a las rutas dinámicas 1.docxCuestionario 2 Int. a las rutas dinámicas 1.docx
Cuestionario 2 Int. a las rutas dinámicas 1.docxBriaanGalindo
 
Java-Chapter 01 Introduction to Java Programming
Java-Chapter 01 Introduction to Java ProgrammingJava-Chapter 01 Introduction to Java Programming
Java-Chapter 01 Introduction to Java ProgrammingWongyos Keardsri
 
HPCユーザが知っておきたいTCP/IPの話 ~クラスタ・グリッド環境の落とし穴~
HPCユーザが知っておきたいTCP/IPの話 ~クラスタ・グリッド環境の落とし穴~HPCユーザが知っておきたいTCP/IPの話 ~クラスタ・グリッド環境の落とし穴~
HPCユーザが知っておきたいTCP/IPの話 ~クラスタ・グリッド環境の落とし穴~Ryousei Takano
 
Cisco asa active,active failover configuration
Cisco asa active,active failover configurationCisco asa active,active failover configuration
Cisco asa active,active failover configurationIT Tech
 
実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いたAkihiro Kuwano
 
Cisco CCNA-Router on Stick
Cisco CCNA-Router on StickCisco CCNA-Router on Stick
Cisco CCNA-Router on StickHamed Moghaddam
 
Home Brew IPTV head-end
Home Brew IPTV head-endHome Brew IPTV head-end
Home Brew IPTV head-endThomas Kernen
 

What's hot (20)

Routebased-Policybased VPN.pptx
Routebased-Policybased VPN.pptxRoutebased-Policybased VPN.pptx
Routebased-Policybased VPN.pptx
 
Chris Durkin Resume - Expert .NET Consultant 18 years experience
Chris Durkin Resume - Expert .NET Consultant 18 years experienceChris Durkin Resume - Expert .NET Consultant 18 years experience
Chris Durkin Resume - Expert .NET Consultant 18 years experience
 
Ns3 implementation wifi
Ns3 implementation wifiNs3 implementation wifi
Ns3 implementation wifi
 
ITN_Module_3.pptx
ITN_Module_3.pptxITN_Module_3.pptx
ITN_Module_3.pptx
 
deepali-resume (3)
deepali-resume (3)deepali-resume (3)
deepali-resume (3)
 
FlexVPN
FlexVPNFlexVPN
FlexVPN
 
WebRTC研修
WebRTC研修WebRTC研修
WebRTC研修
 
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
もう知らずにはいられないGitOpsをArgoCDで学ぶ【WESEEK Tech Conf #3】
 
Alcatel - 7750 SR & CGNAT SR-OS Fundamental
Alcatel - 7750 SR & CGNAT SR-OS FundamentalAlcatel - 7750 SR & CGNAT SR-OS Fundamental
Alcatel - 7750 SR & CGNAT SR-OS Fundamental
 
Consistent hash
Consistent hashConsistent hash
Consistent hash
 
Cuestionario 2 Int. a las rutas dinámicas 1.docx
Cuestionario 2 Int. a las rutas dinámicas 1.docxCuestionario 2 Int. a las rutas dinámicas 1.docx
Cuestionario 2 Int. a las rutas dinámicas 1.docx
 
Java-Chapter 01 Introduction to Java Programming
Java-Chapter 01 Introduction to Java ProgrammingJava-Chapter 01 Introduction to Java Programming
Java-Chapter 01 Introduction to Java Programming
 
RFC5996(IKEv2)第2版
RFC5996(IKEv2)第2版RFC5996(IKEv2)第2版
RFC5996(IKEv2)第2版
 
HPCユーザが知っておきたいTCP/IPの話 ~クラスタ・グリッド環境の落とし穴~
HPCユーザが知っておきたいTCP/IPの話 ~クラスタ・グリッド環境の落とし穴~HPCユーザが知っておきたいTCP/IPの話 ~クラスタ・グリッド環境の落とし穴~
HPCユーザが知っておきたいTCP/IPの話 ~クラスタ・グリッド環境の落とし穴~
 
Cisco asa active,active failover configuration
Cisco asa active,active failover configurationCisco asa active,active failover configuration
Cisco asa active,active failover configuration
 
Tema2 01-mpls
Tema2 01-mplsTema2 01-mpls
Tema2 01-mpls
 
実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた実環境にTerraform導入したら驚いた
実環境にTerraform導入したら驚いた
 
vishnu rhcsa resume
vishnu rhcsa resumevishnu rhcsa resume
vishnu rhcsa resume
 
Cisco CCNA-Router on Stick
Cisco CCNA-Router on StickCisco CCNA-Router on Stick
Cisco CCNA-Router on Stick
 
Home Brew IPTV head-end
Home Brew IPTV head-endHome Brew IPTV head-end
Home Brew IPTV head-end
 

Viewers also liked

How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheLeslie Samuel
 
개발자라면, 블로그
개발자라면, 블로그개발자라면, 블로그
개발자라면, 블로그HyunSeob Lee
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017Drift
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with DataSeth Familian
 
Generative adversarial networks
Generative adversarial networksGenerative adversarial networks
Generative adversarial networks남주 김
 
Cinética enzimática
Cinética enzimática  Cinética enzimática
Cinética enzimática Alexis Gomez
 
Music therapy in hungary – the life of mt 2
Music therapy in hungary – the life of mt 2Music therapy in hungary – the life of mt 2
Music therapy in hungary – the life of mt 2Éva Szathmáry
 
학생 개발자, 인턴십으로 성장하기
학생 개발자, 인턴십으로 성장하기학생 개발자, 인턴십으로 성장하기
학생 개발자, 인턴십으로 성장하기재원 최
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsLinkedIn
 
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging ChallengesAaron Irizarry
 
No borders innovation: how to build a remote working-based “liquid company”
No borders innovation: how to build a remote working-based “liquid company”No borders innovation: how to build a remote working-based “liquid company”
No borders innovation: how to build a remote working-based “liquid company”Emanuela Zaccone
 
TEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of WorkTEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of WorkVolker Hirsch
 
Toimintakulttuurin muutos ohjauksessa;: digitaalisuuden mahdollisuudet ja haa...
Toimintakulttuurin muutos ohjauksessa;: digitaalisuuden mahdollisuudet ja haa...Toimintakulttuurin muutos ohjauksessa;: digitaalisuuden mahdollisuudet ja haa...
Toimintakulttuurin muutos ohjauksessa;: digitaalisuuden mahdollisuudet ja haa...Satu Aksovaara
 
Irene Porras Vega
Irene Porras VegaIrene Porras Vega
Irene Porras VegaIrenepv96
 

Viewers also liked (20)

How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 
ecdevday1
ecdevday1ecdevday1
ecdevday1
 
개발자라면, 블로그
개발자라면, 블로그개발자라면, 블로그
개발자라면, 블로그
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017
 
Build Features, Not Apps
Build Features, Not AppsBuild Features, Not Apps
Build Features, Not Apps
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 
Generative adversarial networks
Generative adversarial networksGenerative adversarial networks
Generative adversarial networks
 
Cinética enzimática
Cinética enzimática  Cinética enzimática
Cinética enzimática
 
Music therapy in hungary – the life of mt 2
Music therapy in hungary – the life of mt 2Music therapy in hungary – the life of mt 2
Music therapy in hungary – the life of mt 2
 
El cartílago
El cartílago El cartílago
El cartílago
 
Luthfiani azzahra
Luthfiani azzahraLuthfiani azzahra
Luthfiani azzahra
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
 
학생 개발자, 인턴십으로 성장하기
학생 개발자, 인턴십으로 성장하기학생 개발자, 인턴십으로 성장하기
학생 개발자, 인턴십으로 성장하기
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving Cars
 
Designing Teams for Emerging Challenges
Designing Teams for Emerging ChallengesDesigning Teams for Emerging Challenges
Designing Teams for Emerging Challenges
 
No borders innovation: how to build a remote working-based “liquid company”
No borders innovation: how to build a remote working-based “liquid company”No borders innovation: how to build a remote working-based “liquid company”
No borders innovation: how to build a remote working-based “liquid company”
 
TEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of WorkTEDx Manchester: AI & The Future of Work
TEDx Manchester: AI & The Future of Work
 
Toimintakulttuurin muutos ohjauksessa;: digitaalisuuden mahdollisuudet ja haa...
Toimintakulttuurin muutos ohjauksessa;: digitaalisuuden mahdollisuudet ja haa...Toimintakulttuurin muutos ohjauksessa;: digitaalisuuden mahdollisuudet ja haa...
Toimintakulttuurin muutos ohjauksessa;: digitaalisuuden mahdollisuudet ja haa...
 
Irene Porras Vega
Irene Porras VegaIrene Porras Vega
Irene Porras Vega
 
Oι πλανήτες
Oι πλανήτεςOι πλανήτες
Oι πλανήτες
 

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

Redis data design by usecase
Redis data design by usecaseRedis data design by usecase
Redis data design by usecaseKris Jeong
 
모바일 메신저 아키텍쳐 소개
모바일 메신저 아키텍쳐 소개모바일 메신저 아키텍쳐 소개
모바일 메신저 아키텍쳐 소개Hyogi Jung
 
20160427 ROS 4차 강의 (for 아스라다 팀)
20160427 ROS 4차 강의 (for 아스라다 팀)20160427 ROS 4차 강의 (for 아스라다 팀)
20160427 ROS 4차 강의 (for 아스라다 팀)Yoonseok Pyo
 
Mongodb 특징 분석
Mongodb 특징 분석Mongodb 특징 분석
Mongodb 특징 분석Daeyong Shin
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기OnGameServer
 
리스펙토링 세미나 - 나만의 카카오 챗봇 만들기
리스펙토링 세미나 - 나만의 카카오 챗봇 만들기리스펙토링 세미나 - 나만의 카카오 챗봇 만들기
리스펙토링 세미나 - 나만의 카카오 챗봇 만들기Wooyoung Ko
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용Jin wook
 
Rhea_MMO_SNG_Convergence_Server_Architecture
Rhea_MMO_SNG_Convergence_Server_ArchitectureRhea_MMO_SNG_Convergence_Server_Architecture
Rhea_MMO_SNG_Convergence_Server_ArchitectureRhea Strike
 
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDB
[124]네이버에서 사용되는 여러가지 Data Platform, 그리고 MongoDBNAVER D2
 
루비온레일즈로 카카오톡 봇 만들기
루비온레일즈로 카카오톡 봇 만들기루비온레일즈로 카카오톡 봇 만들기
루비온레일즈로 카카오톡 봇 만들기Junghyun Park
 
Web server page_ed10
Web server page_ed10Web server page_ed10
Web server page_ed10hungrok
 
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'
[110730/아꿈사발표자료] mongo db 완벽 가이드 : 7장 '고급기능'sung ki choi
 
IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10hungrok
 
리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초Yu Yongwoo
 

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

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

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