SlideShare a Scribd company logo
1 of 51
댓글 플러그인 개발 사례
실시간성을 극대화한
SK플래닛 Platform Software개발1팀
김군우 (a.k.a. 겨미겨미)
헛!
오늘 다룰 이야기
• 댓글 플러그인의 개발 배경 및 기능 소개
• 서비스 개발 과정에서 겪었던 기술적인 고민
• 고민의 결과 얻게된 기술적인 인사이트
• 프로젝트의 Best Practice
김군우
프론트엔드 개발자
• 엔씨소프트 오픈마루 스튜디오
레몬펜, 아이온 SNS 아바타북
• NHN
웹 표준/접근성 연구 개발
• SK플래닛
“AFFOGATO” 개발 중...
왜 댓글인가?
• 웹 초창기부터 있어 왔지만, 큰 혁신은 없었던 댓글
…
• 댓글의 변화 – 소셜미디어 공유하기
• 가장 일상적인 것을 평범하지 않게 만들어
널리 쓰이게 하자.
아포가토
(Affogato)
댓글의 재발견!
댓글이 더 많이 달리
게!
더욱 많이 공유되
게!
아이디어 : 실시간성을 극대화하자!
훨씬귀기울이게되는효과!
Affogato의 가치
• 사용자에게 주는 가치
• “현재” 가장 “인기”있는 댓글로 주의를 집중 / 분산
• 다른 유저들과 실시간으로 대화하는 즐거움
• 내 댓글에 대한 다른 유저의 반응을 실시간으로 확인
• 서비스 사이트에게 주는 가치
• 댓글을 통한 상호작용의 증가  유저 몰입도 증가
• SNS 동시 포스팅을 통해 컨텐츠 공유 및 확산
댓글 플러그인 Affogato를 소개합니다.
지금접속해서써보실수있어요!
readme.skplanet.co.kr/?p=3161
3rd Party 사이트 계정 로그인
+
1) 다양한 소셜 로그인 지원
2) SNS 동시 포스팅, 공유하기
3) 링크, 동영상, 이미지 댓글로 풍성한 대화거리
그리고,유저들을 Lock-in할수있는Edge기능들…
4) 실시간 새 댓글 업데이트
5) 작성중 알림
6) 내 댓글에 대한 반응 알림
그리고,아포가토만의고유한…
7) 사이드바 인디케이터
7) 사이드바 인디케이터
<script>
SKP.commentsPlugin({
app_id: ‘MY_APP_ID’,
page_id: ‘page3162’
});
</script>
설치 방법
YourSite.com
아포가토 개발사례 7선
1. 대용량 데이터의 고속 처리를 위한 DB MW (DB
Proxy)
2. 다른 사이트의 프레임과 통신하기
3. Socket.IO를 이용한 댓글 작성중 표시
4. Socket.IO 클러스터링
5. 모바일 웹 1 Page Application
6. node.js 테스트 프레임워크 mocha
7. 저비용 고효율 CSS3 Transition
1. 대용량 데이터의 고속 처리를 위한 DB MW
(DB Proxy)
• DB를 HTTP(Tomcat) API로 추상화 제공
• Master/Master 이중화로 Read/Write 모두 분산처리
• Backup, 복구 및 Dynamic Scale Out 지원
1. 대용량 데이터의 고속 처리를 위한 DB MW
(DB Proxy)
YourSite.com
2. 다른 사이트의 프레임과 통신하기
2. 다른 사이트의 프레임과 통신하기
• 다른 도메인간에는 페이지 간 document에 접근 불
가
• HTML5 postMessage API로 극복
• 지원않는 IE6/IE7은 작은 flash 파일로 통신 가능
• 두가지를 단일 API로 감싼 easyXDM
2. 다른 사이트의 프레임과 통신하기
프레임 로드 (easyXDM)
YourSite.com
프레임 높이 변경 요청
실시간 이벤트 전송
2. 다른 사이트의 프레임과 통신하기
YourSite.com
// host site
new easyXDM.Rpc({
remote: ‘http://remote.com/frame’,
swf: ‘/path/to/easyxdm.swf’
}, {
local: {
setFrameHeight: function() {
// ...
}
}
});
2. 다른 사이트의 프레임과 통신하기
YourSite.com
// host site
new easyXDM.Rpc({
remote: ‘http://remote.com/frame’,
swf: ‘/path/to/easyxdm.swf’
}, {
local: {
setFrameHeight: function() {
// ...
}
}
});
// affogato frame
var rpc = new easyXDM.Rpc({
swf: ‘/path/to/easyxdm.swf’,
onReady: function () {
rpc.setFrameHeight();
}
}, {
remote: {
setFrameHeight: {}
}
});
3. Socket.IO를 이용한 댓글 작성중 표시
3. Socket.IO를 이용한 댓글 작성중 표시
컴2
H e l l o
어떻게 사용자의댓글 작성 시작/끝을표시할
까?
마지막이벤트발생3초후작성중표시
Off
3. Socket.IO를 이용한 댓글 작성중 표시
컴2
H e l l o (마지막 입력 3초
후)
3. Socket.IO를 이용한 댓글 작성중 표시
컴2
H e l l o (마지막 입력 3초
후)
//client side
var socket = io.connect(‘http://server.url’);
var isWriting = false;
var endTimeoutId =null;
$(‘textarea’).on(‘keyup’, function () {
if (!isWriting) {
socket.emit(‘writing_start’, {});
isWriting = true;
}
endTimeoutId = setTimeout(function () {
socket.emit(‘writing_end’, {});
isWriting = false;
}, 3000);
});
4. Socket.IO 클러스터링
4. Socket.IO 클러스터링
• 단일 프로세스 node 서버로는 대용량 실시간 처리
에
어려움을 겪음 (성능 미흡)
• 다중 프로세스의 node 서버 클러스터링으로 해결
함
• 프로세스(또는 서버)간 통신은 udp multicast를 이
컴2 컴2 컴2 컴2 컴2 컴2 컴2 컴2 컴2
AA AB C
5. 모바일 웹 1 Page Application
5. 모바일 웹 1 Page Application
• 원글 페이지에 아포가토의 모든 기능을 넣기는 무겁
다.
• 원글에는 인기댓글 몇개만 표시, 나머지는 별도 페이
지로
• HTML5 pushState API를 통한 1 Page Application으로
• Express.js같은 인터페이스를 제공하는 Davis.js 사용
5. 모바일 웹 1 Page Application
6. node.js 테스트 프레임워크 mocha
6. node.js 테스트 프레임워크 mocha
describe('test', function() {
it('runs', function(done) {
true.should.be(false);
done();
});
});
6. node.js 테스트 프레임워크 mocha
require('mocha');
varshould=require('should');
varrequest=require('request');
varexpress=require('express');
varapp=express();
varmiddleware=require('../maruta').middleware;
app.use(middleware);
app.listen(8088);//orusesomeports
describe('maruta',function(){
it('workswell',function(done){
request.get('http://localhost:8088’,
function(err,res,body){
res.statusCode.should.eql(200);
body.should.eql("DONE");
done();
});
});
});
6. node.js 테스트 프레임워크 mocha
mocha 테스트 기본 timeout은 2초
SNS login 후 테스트를 위해 timeout을 10초 이상으로 조정
7. 저비용 고효율 CSS3 Transition
7. 저비용 고효율 CSS3 Transition
CSS Transition를 넣자는 결정은 누구의 몫?
7. 저비용 고효율 CSS3 Transition
거의다 IE를 쓰니 하나마나 아닌가?
7. 저비용 고효율 CSS3 Transition
작은 투자, 큰 차별!
.uninteresting_ui{
opacity:0;
margin-top:-20px;
}
.uninteresting_ui.make_fun{
transition:200mslinear;
opacity:1;
margin-top:0;
}
지금까지 살펴본 아포가토 개발사례 7선
1. 대용량 데이터의 고속 처리를 위한 DB MW (DB
Proxy)
2. 다른 사이트의 프레임과 통신하기
3. Socket.IO를 이용한 댓글 작성중 표시
4. Socket.IO 클러스터링
5. 모바일 웹 1 Page Application
6. node.js 테스트 프레임워크 mocha
7. 저비용 고효율 CSS3 Transition
아포가토 팀
은...
감사합니다 

More Related Content

What's hot

Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략
Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략
Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략Kris Jeong
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability흥배 최
 
Rhea mmo node_for_share
Rhea mmo node_for_shareRhea mmo node_for_share
Rhea mmo node_for_shareRhea Strike
 
Node.js + Websocket 삽질기
Node.js + Websocket 삽질기Node.js + Websocket 삽질기
Node.js + Websocket 삽질기Paprikhan
 
[211]대규모 시스템 시각화 현동석김광림
[211]대규모 시스템 시각화 현동석김광림[211]대규모 시스템 시각화 현동석김광림
[211]대규모 시스템 시각화 현동석김광림NAVER D2
 
Google Cloud Next 2017 Seoul Extended 1st Session.
Google Cloud Next 2017 Seoul Extended 1st Session.Google Cloud Next 2017 Seoul Extended 1st Session.
Google Cloud Next 2017 Seoul Extended 1st Session.Harrison Jung
 
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)Sang Don Kim
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드Jeongsang Baek
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션흥배 최
 
Aws 커뮤니티데이 APM 헨즈온
Aws 커뮤니티데이 APM 헨즈온Aws 커뮤니티데이 APM 헨즈온
Aws 커뮤니티데이 APM 헨즈온재현 신
 
Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doorttsRyan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doorttsSuwon Chae
 
AWS Aurora 100% 활용하기
AWS Aurora 100% 활용하기AWS Aurora 100% 활용하기
AWS Aurora 100% 활용하기I Goo Lee
 
[111217 아꿈사연말모임] 웹소켓과온라인게임
[111217 아꿈사연말모임] 웹소켓과온라인게임[111217 아꿈사연말모임] 웹소켓과온라인게임
[111217 아꿈사연말모임] 웹소켓과온라인게임sung ki choi
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구ByungJoon Lee
 
Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터jinho park
 
[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영NAVER D2
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀승명 양
 
자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들cho hyun jong
 
Node.js 시작하기
Node.js 시작하기Node.js 시작하기
Node.js 시작하기Huey Park
 

What's hot (20)

Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략
Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략
Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
 
Rhea mmo node_for_share
Rhea mmo node_for_shareRhea mmo node_for_share
Rhea mmo node_for_share
 
Node.js + Websocket 삽질기
Node.js + Websocket 삽질기Node.js + Websocket 삽질기
Node.js + Websocket 삽질기
 
[211]대규모 시스템 시각화 현동석김광림
[211]대규모 시스템 시각화 현동석김광림[211]대규모 시스템 시각화 현동석김광림
[211]대규모 시스템 시각화 현동석김광림
 
Google Cloud Next 2017 Seoul Extended 1st Session.
Google Cloud Next 2017 Seoul Extended 1st Session.Google Cloud Next 2017 Seoul Extended 1st Session.
Google Cloud Next 2017 Seoul Extended 1st Session.
 
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
[Td 2015]개발하기 바쁜데 푸시서버와 메시지큐는 있는거 쓸래요(김영재)
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
 
Aws 커뮤니티데이 APM 헨즈온
Aws 커뮤니티데이 APM 헨즈온Aws 커뮤니티데이 APM 헨즈온
Aws 커뮤니티데이 APM 헨즈온
 
Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doorttsRyan Dahl의 Node.js 소개 동영상 해설 by doortts
Ryan Dahl의 Node.js 소개 동영상 해설 by doortts
 
AWS Aurora 100% 활용하기
AWS Aurora 100% 활용하기AWS Aurora 100% 활용하기
AWS Aurora 100% 활용하기
 
[111217 아꿈사연말모임] 웹소켓과온라인게임
[111217 아꿈사연말모임] 웹소켓과온라인게임[111217 아꿈사연말모임] 웹소켓과온라인게임
[111217 아꿈사연말모임] 웹소켓과온라인게임
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구
 
Ansible과 CloudFormation을 이용한 배포 자동화
Ansible과 CloudFormation을 이용한 배포 자동화Ansible과 CloudFormation을 이용한 배포 자동화
Ansible과 CloudFormation을 이용한 배포 자동화
 
Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터Node Js와 Redis를 사용한 구조화된 데이터
Node Js와 Redis를 사용한 구조화된 데이터
 
[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영[236] 카카오의데이터파이프라인 윤도영
[236] 카카오의데이터파이프라인 윤도영
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들
 
Node.js 시작하기
Node.js 시작하기Node.js 시작하기
Node.js 시작하기
 

Similar to 댓글 플러그인 아포가토

HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기Miyu Park
 
빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.xTerry Cho
 
Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.효근 박
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해Terry Cho
 
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...JinKwon Lee
 
Spring Framework 튜토리얼 - 네이버 최영목님
Spring Framework 튜토리얼 - 네이버 최영목님Spring Framework 튜토리얼 - 네이버 최영목님
Spring Framework 튜토리얼 - 네이버 최영목님NAVER D2
 
Private PaaS with Docker, spring cloud and mesos
Private PaaS with Docker, spring cloud and mesos Private PaaS with Docker, spring cloud and mesos
Private PaaS with Docker, spring cloud and mesos uEngine Solutions
 
Slipp 발표 자료 20151212
Slipp 발표 자료 20151212Slipp 발표 자료 20151212
Slipp 발표 자료 20151212Jinsoo Jung
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈NAVER D2
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)수보 김
 
한국 중소기업 개발자의 AWS 사용방법
한국 중소기업 개발자의 AWS 사용방법한국 중소기업 개발자의 AWS 사용방법
한국 중소기업 개발자의 AWS 사용방법Hyunmin Kim
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드KwangSeob Jeong
 
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable FunctionsJongin Lee
 
Netty 시작하기 (1)
Netty 시작하기 (1)Netty 시작하기 (1)
Netty 시작하기 (1)Daehyun Kim
 
웹 IDE 비교
웹 IDE 비교웹 IDE 비교
웹 IDE 비교Junyoung Lee
 
Spring 4.x Web Application 살펴보기
Spring 4.x Web Application  살펴보기Spring 4.x Web Application  살펴보기
Spring 4.x Web Application 살펴보기Ji Heon Kim
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyondJae Sung Park
 
[15.09.17] 인터넷과 웹의 역사 그리고 현재의 트렌드
[15.09.17] 인터넷과 웹의 역사 그리고 현재의 트렌드[15.09.17] 인터넷과 웹의 역사 그리고 현재의 트렌드
[15.09.17] 인터넷과 웹의 역사 그리고 현재의 트렌드Sanghun Yun
 

Similar to 댓글 플러그인 아포가토 (20)

HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
HTML5/JSON 을 이용해 범용 2D 맵에디터 제작하기
 
빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x빠르게훓어보는 Node.js와 Vert.x
빠르게훓어보는 Node.js와 Vert.x
 
Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.Big Data platform을 위한 Sencha Ext JS 사례.
Big Data platform을 위한 Sencha Ext JS 사례.
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
 
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
[Korea Linux Forum] Implementing web based online multiplayer tetris with Ope...
 
Spring Framework 튜토리얼 - 네이버 최영목님
Spring Framework 튜토리얼 - 네이버 최영목님Spring Framework 튜토리얼 - 네이버 최영목님
Spring Framework 튜토리얼 - 네이버 최영목님
 
Private PaaS with Docker, spring cloud and mesos
Private PaaS with Docker, spring cloud and mesos Private PaaS with Docker, spring cloud and mesos
Private PaaS with Docker, spring cloud and mesos
 
Slipp 발표 자료 20151212
Slipp 발표 자료 20151212Slipp 발표 자료 20151212
Slipp 발표 자료 20151212
 
[123] electron 김성훈
[123] electron 김성훈[123] electron 김성훈
[123] electron 김성훈
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
 
한국 중소기업 개발자의 AWS 사용방법
한국 중소기업 개발자의 AWS 사용방법한국 중소기업 개발자의 AWS 사용방법
한국 중소기업 개발자의 AWS 사용방법
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions
코드로 바로 해버리는 서버리스 오케스트레이션 - Azure Durable Functions
 
Netty 시작하기 (1)
Netty 시작하기 (1)Netty 시작하기 (1)
Netty 시작하기 (1)
 
웹 IDE 비교
웹 IDE 비교웹 IDE 비교
웹 IDE 비교
 
Spring 4.x Web Application 살펴보기
Spring 4.x Web Application  살펴보기Spring 4.x Web Application  살펴보기
Spring 4.x Web Application 살펴보기
 
Front end dev 2016 & beyond
Front end dev 2016 & beyondFront end dev 2016 & beyond
Front end dev 2016 & beyond
 
[15.09.17] 인터넷과 웹의 역사 그리고 현재의 트렌드
[15.09.17] 인터넷과 웹의 역사 그리고 현재의 트렌드[15.09.17] 인터넷과 웹의 역사 그리고 현재의 트렌드
[15.09.17] 인터넷과 웹의 역사 그리고 현재의 트렌드
 

Recently uploaded

JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP Korea
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?Jay Park
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법JMP Korea
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP Korea
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화JMP Korea
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석JMP Korea
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP Korea
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP Korea
 

Recently uploaded (8)

JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 

댓글 플러그인 아포가토

  • 1. 댓글 플러그인 개발 사례 실시간성을 극대화한 SK플래닛 Platform Software개발1팀 김군우 (a.k.a. 겨미겨미) 헛!
  • 2. 오늘 다룰 이야기 • 댓글 플러그인의 개발 배경 및 기능 소개 • 서비스 개발 과정에서 겪었던 기술적인 고민 • 고민의 결과 얻게된 기술적인 인사이트 • 프로젝트의 Best Practice
  • 3. 김군우 프론트엔드 개발자 • 엔씨소프트 오픈마루 스튜디오 레몬펜, 아이온 SNS 아바타북 • NHN 웹 표준/접근성 연구 개발 • SK플래닛 “AFFOGATO” 개발 중...
  • 4. 왜 댓글인가? • 웹 초창기부터 있어 왔지만, 큰 혁신은 없었던 댓글 … • 댓글의 변화 – 소셜미디어 공유하기 • 가장 일상적인 것을 평범하지 않게 만들어 널리 쓰이게 하자.
  • 6. 댓글의 재발견! 댓글이 더 많이 달리 게! 더욱 많이 공유되 게!
  • 7. 아이디어 : 실시간성을 극대화하자! 훨씬귀기울이게되는효과!
  • 8. Affogato의 가치 • 사용자에게 주는 가치 • “현재” 가장 “인기”있는 댓글로 주의를 집중 / 분산 • 다른 유저들과 실시간으로 대화하는 즐거움 • 내 댓글에 대한 다른 유저의 반응을 실시간으로 확인 • 서비스 사이트에게 주는 가치 • 댓글을 통한 상호작용의 증가  유저 몰입도 증가 • SNS 동시 포스팅을 통해 컨텐츠 공유 및 확산
  • 10.
  • 11.
  • 13. 3rd Party 사이트 계정 로그인 + 1) 다양한 소셜 로그인 지원
  • 14. 2) SNS 동시 포스팅, 공유하기
  • 15. 3) 링크, 동영상, 이미지 댓글로 풍성한 대화거리
  • 17. 4) 실시간 새 댓글 업데이트
  • 19. 6) 내 댓글에 대한 반응 알림
  • 24. 아포가토 개발사례 7선 1. 대용량 데이터의 고속 처리를 위한 DB MW (DB Proxy) 2. 다른 사이트의 프레임과 통신하기 3. Socket.IO를 이용한 댓글 작성중 표시 4. Socket.IO 클러스터링 5. 모바일 웹 1 Page Application 6. node.js 테스트 프레임워크 mocha 7. 저비용 고효율 CSS3 Transition
  • 25. 1. 대용량 데이터의 고속 처리를 위한 DB MW (DB Proxy)
  • 26. • DB를 HTTP(Tomcat) API로 추상화 제공 • Master/Master 이중화로 Read/Write 모두 분산처리 • Backup, 복구 및 Dynamic Scale Out 지원 1. 대용량 데이터의 고속 처리를 위한 DB MW (DB Proxy)
  • 27. YourSite.com 2. 다른 사이트의 프레임과 통신하기
  • 28. 2. 다른 사이트의 프레임과 통신하기 • 다른 도메인간에는 페이지 간 document에 접근 불 가 • HTML5 postMessage API로 극복 • 지원않는 IE6/IE7은 작은 flash 파일로 통신 가능 • 두가지를 단일 API로 감싼 easyXDM
  • 29. 2. 다른 사이트의 프레임과 통신하기 프레임 로드 (easyXDM) YourSite.com 프레임 높이 변경 요청 실시간 이벤트 전송
  • 30. 2. 다른 사이트의 프레임과 통신하기 YourSite.com // host site new easyXDM.Rpc({ remote: ‘http://remote.com/frame’, swf: ‘/path/to/easyxdm.swf’ }, { local: { setFrameHeight: function() { // ... } } });
  • 31. 2. 다른 사이트의 프레임과 통신하기 YourSite.com // host site new easyXDM.Rpc({ remote: ‘http://remote.com/frame’, swf: ‘/path/to/easyxdm.swf’ }, { local: { setFrameHeight: function() { // ... } } }); // affogato frame var rpc = new easyXDM.Rpc({ swf: ‘/path/to/easyxdm.swf’, onReady: function () { rpc.setFrameHeight(); } }, { remote: { setFrameHeight: {} } });
  • 32. 3. Socket.IO를 이용한 댓글 작성중 표시
  • 33. 3. Socket.IO를 이용한 댓글 작성중 표시 컴2 H e l l o 어떻게 사용자의댓글 작성 시작/끝을표시할 까? 마지막이벤트발생3초후작성중표시 Off
  • 34. 3. Socket.IO를 이용한 댓글 작성중 표시 컴2 H e l l o (마지막 입력 3초 후)
  • 35. 3. Socket.IO를 이용한 댓글 작성중 표시 컴2 H e l l o (마지막 입력 3초 후) //client side var socket = io.connect(‘http://server.url’); var isWriting = false; var endTimeoutId =null; $(‘textarea’).on(‘keyup’, function () { if (!isWriting) { socket.emit(‘writing_start’, {}); isWriting = true; } endTimeoutId = setTimeout(function () { socket.emit(‘writing_end’, {}); isWriting = false; }, 3000); });
  • 37. 4. Socket.IO 클러스터링 • 단일 프로세스 node 서버로는 대용량 실시간 처리 에 어려움을 겪음 (성능 미흡) • 다중 프로세스의 node 서버 클러스터링으로 해결 함 • 프로세스(또는 서버)간 통신은 udp multicast를 이 컴2 컴2 컴2 컴2 컴2 컴2 컴2 컴2 컴2 AA AB C
  • 38. 5. 모바일 웹 1 Page Application
  • 39. 5. 모바일 웹 1 Page Application • 원글 페이지에 아포가토의 모든 기능을 넣기는 무겁 다. • 원글에는 인기댓글 몇개만 표시, 나머지는 별도 페이 지로 • HTML5 pushState API를 통한 1 Page Application으로 • Express.js같은 인터페이스를 제공하는 Davis.js 사용
  • 40. 5. 모바일 웹 1 Page Application
  • 41. 6. node.js 테스트 프레임워크 mocha
  • 42. 6. node.js 테스트 프레임워크 mocha describe('test', function() { it('runs', function(done) { true.should.be(false); done(); }); });
  • 43. 6. node.js 테스트 프레임워크 mocha require('mocha'); varshould=require('should'); varrequest=require('request'); varexpress=require('express'); varapp=express(); varmiddleware=require('../maruta').middleware; app.use(middleware); app.listen(8088);//orusesomeports describe('maruta',function(){ it('workswell',function(done){ request.get('http://localhost:8088’, function(err,res,body){ res.statusCode.should.eql(200); body.should.eql("DONE"); done(); }); }); });
  • 44. 6. node.js 테스트 프레임워크 mocha mocha 테스트 기본 timeout은 2초 SNS login 후 테스트를 위해 timeout을 10초 이상으로 조정
  • 45. 7. 저비용 고효율 CSS3 Transition
  • 46. 7. 저비용 고효율 CSS3 Transition CSS Transition를 넣자는 결정은 누구의 몫?
  • 47. 7. 저비용 고효율 CSS3 Transition 거의다 IE를 쓰니 하나마나 아닌가?
  • 48. 7. 저비용 고효율 CSS3 Transition 작은 투자, 큰 차별! .uninteresting_ui{ opacity:0; margin-top:-20px; } .uninteresting_ui.make_fun{ transition:200mslinear; opacity:1; margin-top:0; }
  • 49. 지금까지 살펴본 아포가토 개발사례 7선 1. 대용량 데이터의 고속 처리를 위한 DB MW (DB Proxy) 2. 다른 사이트의 프레임과 통신하기 3. Socket.IO를 이용한 댓글 작성중 표시 4. Socket.IO 클러스터링 5. 모바일 웹 1 Page Application 6. node.js 테스트 프레임워크 mocha 7. 저비용 고효율 CSS3 Transition

Editor's Notes

  1. ... 이런 것들에 관해 저희 팀을 대표해서 소개를 드리게 되었습니다.
  2. 웹 초창기부터 있어 왔지만 댓글은 그저 개발 시간 잡아먹는 기능 중 하나였습니다. 요새 흥하는 서비스들 중에 이런 일상적인 것들을 평범하지 않게 만든 것들이 굉장히 많은데요. 댓글도 그렇게 될 수 있을 것이라고 생각했습니다.
  3. 아포가토는 차가운 아이스크림에 뜨거운 에스프레소를 끼얹어서 즐기는 음료입니다. 댓글 플러그인은 아포가토의 아이스크림처럼 기존 사이트들에 색다른 재미요소가 되지 않을까 하고 프로젝트명으로 아포가토로 정하게 되었습니다.
  4. 그래서 저희는...
  5. 기존 댓글은 그냥 쭉 한번 훑어보고 지나가버리는 것이라면 아포가토는 댓글들을 훑어보다가... 바로 이루어지는 실시간 업데이트나 인기글에 대한 피드백을 받아서 관전 모드가 될 수 있고 더 나아가서 직접 참여하게 될 수도 있겠다... 고 생각했습니다. SNS의 아이덴티티는 이걸 더 촉발시켜줄 것이라고도 생각했고요.
  6. 그래서 아포가토의 가치는... 사용자에게 주는 가치부터 보자면...
  7. 1) 실시간 업데이트 - 브라우저 업데이트하지 않아도, 새글이 생겼을 때 알 수 있어 더욱 집중하게 됨
  8. 1) 실시간 업데이트 - 브라우저 업데이트하지 않아도, 새글이 생겼을 때 알 수 있어 더욱 집중하게 됨
  9. 3) 내 댓글 알림 - 내 댓글에 대한 반응 알림
  10. DB MiddleWare
  11. ... 분산처리를 통해서 안정성과 고속처리를 할 수 있도록 만들었고요. ... 복구, 그리고 Dynamic Scale Out을 지원하여 운영중에 DB를 내리는 일 없이 scale out할 수 있도록 하였습니다.
  12. 사용자가 댓글을 입력한 경우뿐 아니라 입력중인 이벤트들도 다루기 때문에 Socket.IO이 동시에 많은 접속과 이벤트를 처리할 수 있어야 했습니다. 4번째 이야기는 그러기 위한 Socket.IO의 클러스터링을 어떻게 했는지 하는 것인데요.
  13. 저희 Socket.IO 서버는 node.js로 되어 있는데요. 단일 프로세스의 node 서버로는 테스트를 해보니 다른 멀티 스레드 기반 언어들에 비해 대용량 실시간 처리에의 퍼포먼스가 조금 떨어지더라고요. 그래서 다중 ... ... udp multicast를 이용하여 프로세스와 서버간에 통신을 하고, 그래서 Scale out을 쉽게 할 수 있도록 구성했습니다.
  14. CSS Transition은 UI 디자이너와 프론트엔드 개발자의 역할이 오버랩되는 부분이라고 생각해요. 그래서 오히려 이 부분을 자주 놓치게 되곤 합니다. CSS 속성 한두개만 넣으면 그 UI를 사용자하는 사용자의 경험이 굉장히 달라질 수 있다고 생각합니다.
  15. 실제로 IE6, 7, 8은 CSS Transition을 지원하지 않죠. IE9는 지원해요. 물론 다른 브라우저도 당연히 지원하죠. 저도 얼마전까지 “음... 우리나라 사이트들에 CSS Transition이 이렇게나 안쓰이는 이유가 써봤자 적용받는 사용자가 그리 많이 않아서 일꺼야...” 라고 생각했었는데요. 며칠전에 무심코 국내 브라우저 점유율 자료를 찾아봤더니 크롬은 거의 20%나 되고 IE9까지 CSS Transition 지원하는 브라우저를 합치면 절반이 넘더라고요. 물론 jQuery Animation 같이 자바스크립트를 이용하면 오래된 IE에까지 비슷한 효과를 구현할 수는 있는데요. 이러면 표현이 자바스크립트 안에 뒤섞여버려서 코드 관리나 디자인 변경을 하려고 할 때 장애물이 되곤 해서 주로 꼭 Transition 효과가 필요한 부분이 아니면 잘 쓰지 않는 것 같아요. 그래서 나머지 부분의 UI를 조금 더 낫게 만들 기회를 놓치고 있는 건 아닌가... CSS Transition을 쓰면 참 좋겠다... 라고 생각했어요.
  16. 이 사진은 저희팀이 매일 아침에 10분정도 하는 미팅 장면인데요. 아침마다 많은 소통도 하게 되고 팀웍도 다질 수 있게 된 것 같아서 굉장히 좋아하는 시간입니다. 저희는 이 시간마다 업무 진행 상황을 Trello라는 웹 서비스에 주별로 정리해서 살펴보고요. 우리 목표 대비 일이 얼마나 진행되었는지를 체크하는 번다운 차트를 만들어서 확인하고 있어요. y축 0점이 목표 달성 지점이죠. 여기 구불구불한 빨간 선하고 그 아래 파란 선이 있잖아요. 어떤 선이 저희 실제 상황일까요? 네... 불행히도 목표에 한참 모잘라네요. ㅠㅜ