SlideShare une entreprise Scribd logo
1  sur  20
Télécharger pour lire hors ligne
채팅서버 개발기
(+클라이언트 구현 삽질 몇가지)
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

Contenu connexe

Tendances

[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅DongMin Choi
 
Хвороба Крона та неспецифічний виразковий коліт
Хвороба Крона та неспецифічний виразковий колітХвороба Крона та неспецифічний виразковий коліт
Хвороба Крона та неспецифічний виразковий колітVasyl Nagibin
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
Лекція 4. Імунологічні аспекти автоімунних захворювань
Лекція 4. Імунологічні аспекти автоімунних захворюваньЛекція 4. Імунологічні аспекти автоімунних захворювань
Лекція 4. Імунологічні аспекти автоімунних захворюваньYuriy Korsak
 
업적,칭호,타이틀 그게 뭐든간에...
업적,칭호,타이틀 그게 뭐든간에...업적,칭호,타이틀 그게 뭐든간에...
업적,칭호,타이틀 그게 뭐든간에...SeungYeon Jeong
 
언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링TonyCms
 
모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기Sunnyrider
 
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부Eunseok Yi
 
게임기획자 준비는 어떻게 하고, 면접은 어떻게?
게임기획자 준비는 어떻게 하고, 면접은 어떻게?게임기획자 준비는 어떻게 하고, 면접은 어떻게?
게임기획자 준비는 어떻게 하고, 면접은 어떻게?Sunnyrider
 
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션NHN FORWARD
 
[IGC 2016] 넷게임즈 김복식 - 중국 모바일 게임과 캐주얼 게임 디자인
[IGC 2016] 넷게임즈 김복식 - 중국 모바일 게임과 캐주얼 게임 디자인[IGC 2016] 넷게임즈 김복식 - 중국 모바일 게임과 캐주얼 게임 디자인
[IGC 2016] 넷게임즈 김복식 - 중국 모바일 게임과 캐주얼 게임 디자인강 민우
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직Hoyoung Choi
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1Hong-Gi Joe
 
NDC 2014 이은석 - 온라인 게임의 창발적 플레이 디자인
NDC 2014 이은석 - 온라인 게임의 창발적 플레이 디자인NDC 2014 이은석 - 온라인 게임의 창발적 플레이 디자인
NDC 2014 이은석 - 온라인 게임의 창발적 플레이 디자인Eunseok Yi
 
엄재민 Nhn과제 신규 게임 컨셉 제안서
엄재민 Nhn과제 신규 게임 컨셉 제안서엄재민 Nhn과제 신규 게임 컨셉 제안서
엄재민 Nhn과제 신규 게임 컨셉 제안서재민 엄
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기Yongha Kim
 
[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능Yongha Kim
 
쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다Jinho Jung
 
퍼즐앤드래곤 전투시스템
퍼즐앤드래곤 전투시스템퍼즐앤드래곤 전투시스템
퍼즐앤드래곤 전투시스템Eui hwan Hyeon
 

Tendances (20)

[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
 
Хвороба Крона та неспецифічний виразковий коліт
Хвороба Крона та неспецифічний виразковий колітХвороба Крона та неспецифічний виразковий коліт
Хвороба Крона та неспецифічний виразковий коліт
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
Лекція 4. Імунологічні аспекти автоімунних захворювань
Лекція 4. Імунологічні аспекти автоімунних захворюваньЛекція 4. Імунологічні аспекти автоімунних захворювань
Лекція 4. Імунологічні аспекти автоімунних захворювань
 
업적,칭호,타이틀 그게 뭐든간에...
업적,칭호,타이틀 그게 뭐든간에...업적,칭호,타이틀 그게 뭐든간에...
업적,칭호,타이틀 그게 뭐든간에...
 
언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링언리얼을 활용한 오브젝트 풀링
언리얼을 활용한 오브젝트 풀링
 
모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기
 
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
 
게임기획자 준비는 어떻게 하고, 면접은 어떻게?
게임기획자 준비는 어떻게 하고, 면접은 어떻게?게임기획자 준비는 어떻게 하고, 면접은 어떻게?
게임기획자 준비는 어떻게 하고, 면접은 어떻게?
 
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
[2019] 언리얼 엔진을 통해 살펴보는 리플렉션과 가비지 컬렉션
 
[IGC 2016] 넷게임즈 김복식 - 중국 모바일 게임과 캐주얼 게임 디자인
[IGC 2016] 넷게임즈 김복식 - 중국 모바일 게임과 캐주얼 게임 디자인[IGC 2016] 넷게임즈 김복식 - 중국 모바일 게임과 캐주얼 게임 디자인
[IGC 2016] 넷게임즈 김복식 - 중국 모바일 게임과 캐주얼 게임 디자인
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1
 
NDC 2014 이은석 - 온라인 게임의 창발적 플레이 디자인
NDC 2014 이은석 - 온라인 게임의 창발적 플레이 디자인NDC 2014 이은석 - 온라인 게임의 창발적 플레이 디자인
NDC 2014 이은석 - 온라인 게임의 창발적 플레이 디자인
 
엄재민 Nhn과제 신규 게임 컨셉 제안서
엄재민 Nhn과제 신규 게임 컨셉 제안서엄재민 Nhn과제 신규 게임 컨셉 제안서
엄재민 Nhn과제 신규 게임 컨셉 제안서
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
 
[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능
 
NLog 소개
NLog 소개NLog 소개
NLog 소개
 
쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다
 
퍼즐앤드래곤 전투시스템
퍼즐앤드래곤 전투시스템퍼즐앤드래곤 전투시스템
퍼즐앤드래곤 전투시스템
 

En vedette

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
 

En vedette (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ι πλανήτες
 

Similaire à 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
 

Similaire à 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