SlideShare a Scribd company logo
1 of 106
Download to read offline
텀 프로젝트에서
제품 프로젝트로
6개월간의 현업 경험담
경희대학교 성준영
발표자 소개
성준영
경희대학교 컴퓨터 공학과 3학년
T.G.WinG
Nomadstar 서버개발 인턴
wnsdud1861@gmail.com
0_ 발표자 소개
1_ 개요
스타트업 인턴으로 맡은 포지션
거쳐간 업무들
2_ 현업 경험담
6개월의 타임라인
AWS 서버이전 > 컨퍼런스와 문서화
AWS Lambda > 코드리뷰와 리펙토링
REST API 설계 > 좋은 설계
3_ 정리
경험과 교훈의 요약
입사 전과 비교해본 나
결론
목차
개요 > 스타트업 인턴으로 맡은 포지션
쓰담 (Beta)
솔직한 사용자 후기를 이용하여,
반려 동물의 특성에 딱 맞는 제품을
찾을 수 있도록 돕는
반려동물 제품 리뷰 SNS
어플리케이션 (Adroid)
1.1
쓰담 서비스의 서버 관리 및
백엔드 API, 데이터베이스 작성과 설계
1.1 개요 > 스타트업 인턴으로 맡은 포지션
개요 > 거쳐간 업무들
AWS Lambda
Dynamodb
이미지 포맷 변경
REST API
1.2
관리자 페이지
쓰담 홈페이지
AWS 서버이전
이미지 압축 및 리사이징
1.2
AWS Lambda
Dynamodb
이미지 포맷 변경
REST API
관리자 페이지
쓰담 홈페이지
AWS 서버이전
이미지 압축 및 리사이징
개요 > 거쳐간 업무들
1.2
가장 많은 것을 배우고 느꼈던
세가지 경험을 여러분과 공유하려 합니다.
개요 > 거쳐간 업무들
AWS 서버이전 > 컨퍼런스와 문서화
AWS Lambda > 코드리뷰와 리펙토링
REST API > 좋은 설계
현업 경험담 > 6개월의 타임라인2.1
관리자 페이지
AWS 서버이전
홈페이지
이미지 압축
및 리사이징
AWS Lambda
이전 시작
( ~ 현재 )
이미지 포맷
변경
REST API
( ~ 현재 )
16.09 16.12 17.02
dynamodb
버전 1.0 개발
현업 경험담 > AWS 서버이전 > AWS 란?2.2
컴퓨팅 서버, 스토리지, 데이터베이스, 네트워크 등
웹 서비스에 필요한 모든 서비스를 제공하는
세계 1위 클라우드 서비스 플랫폼
현업 경험담 > AWS 서버이전 > AWS Summit Seoul2.2
입사 전 (16.5.17) 참관했던
코엑스에서 열린 AWS 컨퍼런스
AWS 임직원과 전문가들의 강연
파트너 솔루션 전시
임원 초청 행사
현업 경험담 > AWS 서버이전 > AWS Summit Seoul2.2
입사 전 (16.5.17) 참관했던
코엑스에서 열린 AWS 컨퍼런스
AWS 임직원과 전문가들의 강연
파트너 솔루션 전시
임원 초청 행사
멍때리며 들은
멍때리며 본
멍때리며 박수친
현업 경험담 > AWS 서버이전 > 왜?2.2
국내 클라우드 서비스에서
아마존 웹 서비스로 이전
왜?
2.2
SNS의 특성상
이미지가 많고, 파일이 계속 늘어남에 따라
고가용성의 이미지 서버가 필요
AWS 이전의 이유 첫번째
Image Server
IMAGE FILES
현업 경험담 > AWS 서버이전 > 왜?
2.2
AWS S3
무한대에 가까운 스토리지 제공
여러 물리적 저장소에 대한 중복 저장으로,
99.999999999% 내구성과 99.99%의 가용성 보장
AWS 이전의 이유 첫번째
S3
IMAGE FILES …
현업 경험담 > AWS 서버이전 > 왜?
2.2
트래픽에 비해
지나친 스펙의 서버, 비용절감의 필요성
AWS 이전의 이유 두번째
트
래
픽
낭비되는
영역
Before
현업 경험담 > AWS 서버이전 > 왜?
2.2
AWS 이전의 이유 두번째
간단한 절차만으로 서버를 늘렸다 줄이는
오토 스케일링이 가능
트
래
픽
절약되는
영역
Before
After
인
스
턴
스
갯
수
현업 경험담 > AWS 서버이전 > 왜?
2.2
단일 서버 구성으로 인해 서버 장애발생 시
모든 서비스의 마비 가능성
AWS 이전의 이유 세번째
SERVER
API
DATA
BASE
IMAGE
STORAGE
CLIENT
현업 경험담 > AWS 서버이전 > 왜?
2.2
단일 서버 구성으로 인해 서버 장애발생 시
모든 서비스의 마비 가능성
AWS 이전의 이유 세번째
SERVER
API
DATA
BASE
IMAGE
STORAGE
CLIENT
현업 경험담 > AWS 서버이전 > 왜?
2.2
ELB (Elastic Load Balancing)
자동 부하분산 시스템으로,
주기적인 서버 상태를 체크하여 자동 트래픽 분산
AWS 이전의 이유 세번째
SERVER
API
DATA
BASE
IMAGE
STORAGE
CLIENT
SERVER
API
DATA
BASE
IMAGE
STORAGE
현업 경험담 > AWS 서버이전 > 왜?
2.2
ELB (Elastic Load Balancing)
자동 부하분산 시스템으로,
주기적인 서버 상태를 체크하여 자동 트래픽 분산
AWS 이전의 이유 세번째
SERVER
API
DATA
BASE
IMAGE
STORAGE
CLIENT
SERVER
API
DATA
BASE
IMAGE
STORAGE
현업 경험담 > AWS 서버이전 > 왜?
현업 경험담 > AWS 서버이전 > API EC2 이전2.2
AWS 에 첫 발을 딛은
기존 국내 클라우드 서버에 있던 API 들을
EC2 인스턴스로 이전하는 작업
API
EC2 Instance
API
현업 경험담 > AWS 서버이전 > API EC2 이전2.2
AWS EC2 (Amazon Elastic Compute Cloud)
가상 컴퓨터 환경을 제공하는 인스턴스,
머신 이미지를 제공하는 AMI,
스토리지 볼륨인 EBS 등을 포함하는 서비스
현업 경험담 > AWS 서버이전 > API EC2 이전2.2
API를 옮기고 테스트 중, 푸시 메시지가
클라이언트로 전송 되지 않는 현상을 발견
EC2 Instance
API
???
PUSH
현업 경험담 > AWS 서버이전 > API EC2 이전2.2
푸시 데이터를
쌓긴 하는데…
PUSH DATA
현업 경험담 > AWS 서버이전 > API EC2 이전2.2
쌓아놓은 푸시를
클라이언트 기기로 보내주는 코드가 없음
?
현업 경험담 > AWS 서버이전 > API EC2 이전2.2
??????
?
현업 경험담 > AWS 서버이전 > API EC2 이전2.2
API
1. 푸시상황이 되면 푸시 데이터를 쌓는다.
2. ?
3. 성공 후 비운다.
현업 경험담 > AWS 서버이전 > API EC2 이전2.2
API
1. 푸시상황이 되면 푸시 데이터를 쌓는다.
2. Shell Script 를 cron 으로 반복한다.
3. 성공 후 비운다.
현업 경험담 > AWS 서버이전 > API EC2 이전2.2
리눅스 작업 스케줄러인 cron 으로
쉘스크립트를 1분 간격으로 계속 호출하고 있었던 것
* * * * * /path/push_fcm.sh
현업 경험담 > AWS 서버이전 > API EC2 이전2.2
/*
* 푸시 전송 : /path/push_fcm.sh
* crontab 1분에 1회 반복합니다.
*/
API 코드 내 주석 혹은 문서만 있었다면
크게 줄어들었을 작업시간…
현업 경험담 > AWS 서버이전 > API EC2 이전2.2
다음 개발자가 이런 일로 고생할 일이 없도록
코드로는 이해못할 부분에 대한 문서화와 주석
현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2
EC2 로 서버도 만들어봤는데! 이왕 AWS 를 쓸거,
AWS 를 최대한 활용하여 백엔드를 구축해 보자!
클라우드 데이터베이스 서비스인 RDS 활용과 AWS 아키텍처의 구성
현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2
그러나 너무 많은 서비스들
아키텍처는 고사하고 뭔지도 모르겠는데요..
현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2
그때 기억난 멍때리며 들었던 윤석찬님의
“AWS 클라우드로 천만명 웹서비스 확장하기”세션
현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2
당시의 발표 자료와 영상을 찾아
프레젠테이션을 참고하며 따라해보기 시작
http://www.slideshare.net/awskorea/your-first-10-million-customer-web-service-on-aws-channy-yun
현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2
완성된 초기 쓰담 서비스의 AWS 아키텍처
현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2
컨퍼런스에서 들은 내용을 바탕으로
실제 서비스의 적용까지
현업 경험담 > AWS 서버이전 > 느낀 점2.2
문서화
개발자 컨퍼런스
현업 경험담 > AWS 서버이전 > 느낀 점2.2
문서화
실제로 고생을 해 보고 중요성을 실감
앞으로 짜게될 코드에 대한
똑똑한 주석과 문서화의 필요성
현업 경험담 > AWS 서버이전 > 느낀 점2.2
개발자 컨퍼런스
컨퍼런스를 통한
잠재 지식의 확대와 최신 트랜드 파악
나아가 프로젝트에의 적용
EC2 인스턴스 에서 Lambda 로
Backend API 전환
현업 경험담 > AWS Lambda > AWS Lambda 로의 이전결정2.3
현업 경험담 > AWS Lambda > AWS Lambda 로의 이전결정2.3
Beta 에서 정식 버전으로 가면서
대대적인 기획안 변경
현업 경험담 > AWS Lambda > AWS Lambda 로의 이전결정2.3
Beta 에서 정식 버전으로 가면서
대대적인 기획안 변경
에 따른 대대적인 백엔드 API 변경
현업 경험담 > AWS Lambda > AWS Lambda 로의 이전결정2.3
백엔드, 갈아엎자!
EC2 에서 Lambda 로
PHP 에서 node.js 로
RDS 에서 dynamodb 로
현업 경험담 > AWS Lambda > AWS Lambda 란?2.3
AWS Lambda
2014년 발표된, 특정한 이벤트에 응답하여 실행되는,
자동으로 컴퓨팅 리소스를 관리하는 서버리스 컴퓨팅 시스템
API Gateway 를 통해 URI, method 와 연결하거나,
S3 / Dynamodb 등 AWS 리소스의 특정 트리거와 연결해 호출가능
Lambda node.js Hello World 예제
현업 경험담 > AWS Lambda > AWS Lambda 란?2.3
exports.handler = function(event, context) {
context.succeed('Hello World');
}
현업 경험담 > AWS Lambda > Lambda 를 사용한 이유2.3
Lambda 사용의 이유 첫번째
초기 버전의 난항으로 인한
잦은 백엔드 변경사항 발생으로
스케일링 관리와 배포의 번거로움
2.3
Lambda 사용의 이유 첫번째 > 스케일링 관리와 배포의 번거로움
오토스케일링
필요한 소프트웨어가 이미 구성되어 있는 인스턴스 템플릿인
AMI (Amazon Machine Image) 로 Launch config 를 만들고,
오토 스케일링 그룹 설정
AMI
AutoScaling
Launch Config
AutoScaling
Group
V1 V1
현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
2.3
서버를 배포할 때,
업데이트된 인스턴스로부터
AMI 를 업데이트하고, Launch Config를 재설정하는 과정 필요
배포의 자동화가 이루어지지 않은 상태의 번거로운 작업
AutoScaling
Launch Config
AutoScaling
Group
V2 V2 V2
Lambda 사용의 이유 첫번째 > 스케일링 관리와 배포의 번거로움
현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
2.3
Lambda 사용의 이유 첫번째
서버의 운영과 관리
(스케일링, 모니터링, 보안, 코드배포..) 는
AWS 에서 수행해 주므로
별도의 번거로운 서버작업이 필요없어짐
현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
2.3
Lambda 사용의 이유 두번째
사수님 曰,
“재밌겠다. 해보자, 스타트업이잖아."
현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
2.3
Lambda 사용의 이유 두번째
사수님 曰,
“재밌겠다. 해보자, 스타트업이잖아."
현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
2.3
Lambda 사용의 이유 세번째
node.js 로 작성하고 API-Gateway로 묶은
이벤트 기반의 Lambda Function들은
Roopback, restify 등 REST API 프레임워크로
쉬운 이전이 가능
현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
2.3
Lambda 사용의 이유 세번째
Lambda 의 한정된
Timeout 과 Memory에 한계가 보인다면.
언제든지 REST 기반 프레임워크로 이전
> 부담없는 시작
현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
현업 경험담 > AWS Lambda > PHP to node.js2.3
Lambda function 언어 결정
부담없는 시작
npm 의 모든 패키지가 사용가능
Lambda 관련 라이브러리가 가장 활성화
현업 경험담 > AWS Lambda > PHP to node.js2.3
PHP 에서 node.js로 모든 API 의 변경
현업 경험담 > AWS Lambda > PHP to node.js2.3
node.js 로 API를 변경하며 겪었던 난항
진행할수록 가독성 떨어지는 코드
1. 이미지 버퍼를 받는다.
2. 원본을 저장한다.
3. 이미지를 리사이징한다.
4. 리사이징된 이미지를 저장한다.
받은 이미지를 리사이징 후 저장
현업 경험담 > AWS Lambda > PHP to node.js2.3
<?php
..
// 원본을 저장한다.
saveOriginalImage($image);
// 이미지를 리사이징해 용량을 줄인다.
$resizedImage = resizeImage($image);
// 리사이징한 이미지를 저장한다.
saveResizedImage($resizedImage);
..
?>
현업 경험담 > AWS Lambda > PHP to node.js2.3
이벤트 기반 / 비동기 / 콜백 ....
나도 대충 알아! 짤수 있다!
node.js 로 API를 변경하며 겪었던 난항
진행할수록 가독성 떨어지는 코드
saveOriginalImage(image, function(err, savedImage) {
if (err)
return '원본이미지 저장 에러';
else {
}
})
현업 경험담 > AWS Lambda > PHP to node.js2.3
원본 이미지의 저장이 성공하면
콜백의 결과를 받아서 이미지를 압축하고...
saveOriginalImage(image, function(err, savedImage) {
if (err)
return '원본이미지 저장 에러';
else {
resizeImage(savedImage, function(err, resizedImage) {
if (err)
return '이미지 리사이징 에러';
else {
saveResizedImage(resizedImage, result){
if (err)
return ’리사이징 된 이미지 저장 에러';
else {
return '성공';
}
}
}
})
}
})
현업 경험담 > AWS Lambda > PHP to node.js2.3
현업 경험담 > AWS Lambda > PHP to node.js2.3
saveOriginalImage(image, function(err, savedImage) {
if (err)
return '원본이미지 저장 에러';
else {
resizeImage(savedImage, function(err, resizedImage) {
if (err)
return '이미지 리사이징 에러';
else {
saveResizedImage(resizedImage, result){
if (err)
return ’리사이징 된 이미지 저장 에러';
else {
return '성공';
}
}
}
})
}
})
???
현업 경험담 > AWS Lambda > PHP to node.js2.3
saveOriginalImage(image, function(err, result) {
if (err)
return '원본이미지 저장 에러';
else {
resizeImage(result, function(err, resizedImage) {
if (err)
return '이미지 리사이징 에러';
else {
saveResizedImage(resizedImage, result){
if (err)
return ’리사이징 된 이미지 저장 에러';
else {
somefunction1(result, function(err, result) {
if (err)
return ’이런 에러';
else {
somefunction2(result, function(err, result){
if (err)
return ’저런 에러';
else {
somefunction3(result, function(err, result){
if (err)
return ’요런 에러';
else {
???????
현업 경험담 > AWS Lambda > PHP to node.js2.3
점점 읽기 힘들어지는 코드들
Callback Hell
node.js 로 API를 변경하며 겪었던 난항
진행할수록 가독성 떨어지는 코드
현업 경험담 > AWS Lambda > PHP to node.js2.3
https://cnodejs.org/topic/570fb6a40a1e9da252f1e310
http://thecodebarbarian.com/2015/03/20/callback-hell-is-a-myth
node.js 로 API를 변경하며 겪었던 난항
진행할수록 가독성 떨어지는 코드
현업 경험담 > AWS Lambda > PHP to node.js2.3
그렇게 우여곡절 끝에
로그인 API 완성
현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3
“코드리뷰 한번 해볼까요?”
네?
현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3
“코드리뷰 한번 해볼까요?”
내 코드를 보여주는 것에 두려움과 부끄러움
현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3
단일 Lambda 함수에 대한 코드리뷰 진행
node.js 에서 알아두면 좋을 패턴에 대한 소개
효율적인 코드를 위한 토론
좋은 라이브러리의 제안
잘못된 코드에 대한 지적
현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3
단일 Lambda 함수에 대한 코드리뷰 진행
Callback Hell을 해결할 수 있는 Promise 라는 패턴이 있어요.
Array.some 메서드를 쓰면 코드가 좀 더 간결해 지지 않을까요?
이미지를 다룰때 Imagemagick 도 좋지만, sharp 도 한번 찾아보세요!
여기서 === 연산자를 쓰지 않으면 문제 발생의 가능성이 있어요.
현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3
수 번의 리펙토링과 리뷰 반복
코드리뷰로 얻은 결과를 통해
현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3
코드리뷰로와 리펙토링으로 변경된
Promise 패턴과 Arrow function 의 사용
saveOriginalImage(image, function(err, savedImage) {
if (err)
return '원본이미지 저장 에러';
else {
resizeImage(savedImage, function(err, resizedImage) {
if (err)
return '이미지 리사이징 에러';
else {
saveResizedImage(resizedImage, result){
if (err)
return ’리사이징 된 이미지 저장 에러';
else {
return '성공';
}
}
}
})
}
})
코드의 규모가 커질수록 콜백의 중첩으로
순차적인 작업 진행 시 가독성이 매우 떨어지는 코드에서,
현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3
saveOriginalImage(image)
.then(function(savedImage){
return resizeImage(savedImage);
})
.then(function(resizedImage){
return saveResizedImage(resizedImage);
})
.then(function(result){
return '성공';
}))
.catch(function(err){
return err;
})
Promise 패턴의 적용으로
한결 간결해진 코드
현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3
ECMA 6 Arrow function 의 적용과
축약한 통용 단어의 사용으로
더욱 직관적이고 간결해진 코드
코드리뷰로와 리펙토링으로 변경된
Promise 패턴과 Arrow function 의 사용
saveOrigImg(img)
.then(savedImg => resizeImg(savedImg))
.then(resizedImg => saveResizedImg(resizedImg))
.then(result => '성공')
.catch(err => err);
현업 경험담 > AWS Lambda > 느낀점2.3
코드 리뷰와 리펙토링
남이보는 내 코드에 대한 두려움을 버리고
동료 프로그래머와의 페어 프로그래밍
혹은 코드리뷰로
결함의 감소와 품질 향상, 나아가 성장
현업 경험담 > REST API > REST API 란?2.4
로이 필딩 (Roy Fielding)의 박사학위 논문에서 최초로 소개,
웹의 장점을 최대한 활용할 수 있는 아키텍처
URI 와 HTTP Method 를 이용해 API 를 만드는 것
RESTGET / POST / PUT / DELETE
현업 경험담 > REST API > REST API 란?2.4
첫 번째,
URI는 Resource(자원)를 표현한다.
두 번째,
Resource 에 대한 행위는
HTTP Method로 표현한다.
POST : Create
GET : Read
PUT : Update
DELETE : Delete
RESTful API
현업 경험담 > REST API > REST API 란?2.4
첫 번째,
URI는 Resource(자원)를 표현한다.
두 번째,
Resource 에 대한 행위는
HTTP Method로 표현한다.
설계 방법론에 대한
많은 책들이 존재하지만,
정해진 룰은 없음
하지만..
RESTful API
현업 경험담 > REST API > 기존 API의 수정 경험2.4
리뷰, 이야기, 이벤트만 존재하던 탭
페이스북 페이지의 반려동물 팁 컨텐츠의 증가에 따라,
앱 내에서도 컨텐츠를 볼 수 있도록
매거진 탭의 추가와
댓글에 댓글을 달아달라는 많은 사용자의 요구에 따른
댓글의 댓글 기능 기능 추가
기능 추가 요청
현업 경험담 > REST API > 기존 API의 수정 경험2.4
기존 API 의 URI 구성 _ Default Codeigniter
기능 추가 요청
https://Base_url/review/write
CI_Controller 를 상속받는 클래스명에 대응
현업 경험담 > REST API > 기존 API의 수정 경험2.4
기존 API 의 URI 구성 _ Default Codeigniter
기능 추가 요청
https://Base_url/review/write
클래스 내의 메서드명에 대응
현업 경험담 > REST API > 기존 API의 수정 경험2.4
기존 API 의 URI 구성 _ Default Codeigniter
기능 추가 요청
https://Base_url/review/write
클래스 내의 메서드명에 대응
현업 경험담 > REST API > 기존 API의 수정 경험2.4
기존 API 의 URI 구성 _ 리뷰
https://Base_url/review/write
https://Base_url/review/update
https://Base_url/review/delete
https://Base_url/review/list
https://Base_url/review/detail
기능 추가 요청
현업 경험담 > REST API > 기존 API의 수정 경험2.4
기존 API 의 URI 구성 _ 리뷰
https://Base_url/review/write
https://Base_url/review/update
https://Base_url/review/delete
https://Base_url/review/list
https://Base_url/review/detail
https://Base_url/review_comment/write
https://Base_url/review_comment/update
https://Base_url/review_comment/delete
https://Base_url/review_comment/list
기능 추가 요청
현업 경험담 > REST API > 기존 API의 수정 경험2.4
https://Base_url/story/write
https://Base_url/story/update
https://Base_url/story/delete
https://Base_url/story/list
https://Base_url/story/detail
https://Base_url/story_comment/write
https://Base_url/story_comment/update
https://Base_url/story_comment/delete
https://Base_url/story_comment/list
기존 API 의 URI 구성 _ 스토리
기능 추가 요청
현업 경험담 > REST API > 기존 API의 수정 경험2.4
매거진의 추가?
기능 추가 요청
https://Base_url/magazine/write
https://Base_url/magazine/update
https://Base_url/magazine/delete
https://Base_url/magazine/list
https://Base_url/magazine/detail
https://Base_url/magazine_comment/write
https://Base_url/magazine_comment/update
https://Base_url/magazine_comment/delete
https://Base_url/magazine_comment/list
너무 많은 코드의 중복과
불필요한 작업의 증가
현업 경험담 > REST API > 기존 API의 수정 경험2.4
댓글의 댓글 기능?
기능 추가 요청
많은 방법을 생각해 봤으나
구현 후 더이상의 유지보수 및
기능추가는 NAVER...
현업 경험담 > REST API > API 의 재설계2.4
HTTP 는 서버와 클라이언트의
정보를 주고받기 위해 약속된 통신 규약 (프로토콜)
기존 API 설계의 문제점 파악 첫번째
POST : Create
GET : Read
PUT : Update
DELETE : Delete
현업 경험담 > REST API > API 의 재설계2.4
HTTP 프로토콜을 무시한 Method
리소스에 대한 행위를 표현하지 않고 무의미한 사용
https://Base_url/story/write
https://Base_url/story/update
https://Base_url/story/delete
https://Base_url/story/list
https://Base_url/story/detail
POST
POST
POST
GET
GET
기존 API 설계의 문제점 파악 첫번째
현업 경험담 > REST API > API 의 재설계2.4
HTTP 프로토콜을 준수하며
HTTP 메소드로 리소스에 대한 행위를 표현하도록
https://Base_url/story/write
https://Base_url/story/update
https://Base_url/story/delete
https://Base_url/story/list
https://Base_url/story/detail
POST
POST
POST
GET
GET
스토리 작성
특정 스토리 업데이트
특정 스토리 삭제
스토리 리스트 불러오기
특정 스토리 불러오기
CREATE
UPDATE
DELETE
READ
READ
기존 API 설계의 문제점 파악 첫번째 _ 재설계
현업 경험담 > REST API > API 의 재설계2.4
HTTP 프로토콜을 준수하며
HTTP 메소드로 리소스에 대한 행위를 표현하도록
https://Base_url/stories
https://Base_url/stories/{story_id}
https://Base_url/stories/{story_id}
https://Base_url/stories
https://Base_url/stories/{story_id}
POST
PUT
DELTE
GET
GET
스토리 작성
특정 스토리 업데이트
특정 스토리 삭제
스토리 리스트 불러오기
특정 스토리 불러오기
CREATE
UPDATE
DELETE
READ
READ
기존 API 설계의 문제점 파악 첫번째 _ 재설계
현업 경험담 > REST API > API 의 재설계2.4
리소스간의 관계가 무의미한 설계로
URL과 Method로는 API 파악의 어려움
기존 API 설계의 문제점 파악 두번째
https://Base_url/story_comment/write
댓글은 이야기의 하위 리소스이지만 분리되어 작성된 URL
어떤 스토리의 댓글을 쓰기 위한 API 인지 알기 위해서는,
서버에서 요구하는 parameter의 story_id 를 알아야 함
POST
무의미
현업 경험담 > REST API > API 의 재설계2.4
리소스간의 관계파악으로
URL 과 Method 로 어떤 API 인지 파악가능하도록
기존 API 설계의 문제점 파악 두번째 _ 재설계
https://Base_url/stories/{story_id}/comments/{comment_id}
{story_id} 스토리의 {comment_id} 댓글을 수정하는 API 이구나!
PUT
https://Base_url/stories/{story_id}/comments GET
{story_id} 스토리의 모든 댓글들을 가져오는 API 이구나!
현업 경험담 > REST API > API 의 재설계2.4
기존 API 설계의 문제점 파악 세번째
story
review
event
story_comment
review_comment
event_comment
리소스간의 관계가 무의미한 설계로
지나친 코드의 중복으로 인한 유지보수의 어려움
현업 경험담 > REST API > API 의 재설계2.4
기존 API 설계의 문제점 파악 세번째 _ 재설계
리소스간의 관계파악 후
소스코드의 설계로
유지보수가 쉽고,
확장성 있는 코드의 작성
story
comment
review event
sub_commet
현업 경험담 > REST API > 느낀 점2.4
설계와 분석
처음 피부에 와닿도록 느낀
시스템 분석에 따른
좋은 설계의 중요성
정리 > 요약 >3.1
문서화 개발자 컨퍼런스 코드 리뷰와 리펙토링 설계와 분석
정리 > 입사 전과 비교해본 나 >3.2
문서화 개발자 컨퍼런스 코드 리뷰와 리펙토링 설계와 분석
항상 듣던 너무 당연한,
정리 > 입사 전과 비교해본 나 >3.2
문서화 개발자 컨퍼런스 코드 리뷰와 리펙토링 설계와 분석
항상 듣던 너무 당연한,
하지만 추상적이고 머리에 떠다니던 개념들
정리 > 입사 전과 비교해본 나 >3.2
문서화 개발자 컨퍼런스 코드 리뷰와 리펙토링 설계와 분석
AWS 로 서버이전을 하면서,
정리 > 입사 전과 비교해본 나 >3.2
문서화 개발자 컨퍼런스 설계와 분석
경험이 없었던 node.js 로 API를 옮기면서
코드 리뷰와 리펙토링
정리 > 입사 전과 비교해본 나 >3.2
문서화 개발자 컨퍼런스
기존 서버의 유지보수와 새로운 API 설계를 맡으면서
코드 리뷰와 리펙토링 설계와 분석
정리 > 입사 전과 비교해본 나 >3.2
현업을 겪으며 다시금 생각하게 된
‘당연한 이야기들’
정리 > 결론 >3.3
모자른 발표로나마 간접경험을 통해
함께 성장하는 개발자가 되었으면 좋겠습니다 :)
경청해주셔서 감사합니다 :D

More Related Content

What's hot

Aws발표자료 final
Aws발표자료 finalAws발표자료 final
Aws발표자료 finalGi Bong Kim
 
[213]monitoringwithscouter 이건희
[213]monitoringwithscouter 이건희[213]monitoringwithscouter 이건희
[213]monitoringwithscouter 이건희NAVER D2
 
[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱NAVER D2
 
Play node conference
Play node conferencePlay node conference
Play node conferenceJohn Kim
 
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)Brian Hong
 
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container DayAmazon Web Services Korea
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트Dae Kim
 
Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략
Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략
Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략Kris Jeong
 
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스Dan Kang (강동한)
 
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축Juhong Park
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기Chanwoong Kim
 
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceXionglong Jin
 
AWS를 활용하여 Daily Report 만들기 : 로그 수집부터 자동화된 분석까지
AWS를 활용하여 Daily Report 만들기 : 로그 수집부터 자동화된 분석까지AWS를 활용하여 Daily Report 만들기 : 로그 수집부터 자동화된 분석까지
AWS를 활용하여 Daily Report 만들기 : 로그 수집부터 자동화된 분석까지Changje Jeong
 
[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술NAVER D2
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유Hyojun Jeon
 
what is_tabs_share
what is_tabs_sharewhat is_tabs_share
what is_tabs_shareNAVER D2
 
[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준NAVER D2
 
C# Game Server
C# Game ServerC# Game Server
C# Game Serverlactrious
 

What's hot (20)

Aws발표자료 final
Aws발표자료 finalAws발표자료 final
Aws발표자료 final
 
[213]monitoringwithscouter 이건희
[213]monitoringwithscouter 이건희[213]monitoringwithscouter 이건희
[213]monitoringwithscouter 이건희
 
[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱[231]나는서버를썰터이니너는개발만하여라 양지욱
[231]나는서버를썰터이니너는개발만하여라 양지욱
 
Play node conference
Play node conferencePlay node conference
Play node conference
 
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)
AWS와 함께 한 쿠키런 서버 Re-architecting 사례 (Gaming on AWS)
 
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day
도커의 기초 - 김상필 솔루션즈 아키텍트 :: AWS Container Day
 
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
모바일 게임과 앱을 위한 오픈소스 게임서버 엔진 프로젝트 CloudBread 프로젝트
 
Ansible과 CloudFormation을 이용한 배포 자동화
Ansible과 CloudFormation을 이용한 배포 자동화Ansible과 CloudFormation을 이용한 배포 자동화
Ansible과 CloudFormation을 이용한 배포 자동화
 
Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략
Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략
Soscon2017 오픈소스를 활용한 마이크로 서비스의 캐시 전략
 
Kubernetes
Kubernetes Kubernetes
Kubernetes
 
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
[Play.node] node.js 를 사용한 대규모 글로벌(+중국) 서비스
 
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
[NDC 2018] Spark, Flintrock, Airflow 로 구현하는 탄력적이고 유연한 데이터 분산처리 자동화 인프라 구축
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games ConferenceKGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
KGC 2016: HTTPS 로 모바일 게임 서버 구축한다는 것 - Korea Games Conference
 
AWS를 활용하여 Daily Report 만들기 : 로그 수집부터 자동화된 분석까지
AWS를 활용하여 Daily Report 만들기 : 로그 수집부터 자동화된 분석까지AWS를 활용하여 Daily Report 만들기 : 로그 수집부터 자동화된 분석까지
AWS를 활용하여 Daily Report 만들기 : 로그 수집부터 자동화된 분석까지
 
[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술
 
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
[NDC18] 야생의 땅 듀랑고의 데이터 엔지니어링 이야기: 로그 시스템 구축 경험 공유
 
what is_tabs_share
what is_tabs_sharewhat is_tabs_share
what is_tabs_share
 
[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준[246] foursquare데이터라이프사이클 설현준
[246] foursquare데이터라이프사이클 설현준
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 

Viewers also liked

[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functions
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functions[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functions
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functionsNAVER D2
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generator
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generator[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generator
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generatorNAVER D2
 
Papago/N2MT 개발이야기
Papago/N2MT 개발이야기Papago/N2MT 개발이야기
Papago/N2MT 개발이야기NAVER D2
 
JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님
JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님
JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님NAVER D2
 
데이터분석과통계2 - 최재걸님
데이터분석과통계2 - 최재걸님데이터분석과통계2 - 최재걸님
데이터분석과통계2 - 최재걸님NAVER D2
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitiveNAVER D2
 
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신NAVER D2
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promise
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promise[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promise
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promiseNAVER D2
 
[D2 오픈세미나]2.모바일웹디버깅
[D2 오픈세미나]2.모바일웹디버깅[D2 오픈세미나]2.모바일웹디버깅
[D2 오픈세미나]2.모바일웹디버깅NAVER D2
 
[D2 오픈세미나]1.무한스크롤성능개선
[D2 오픈세미나]1.무한스크롤성능개선[D2 오픈세미나]1.무한스크롤성능개선
[D2 오픈세미나]1.무한스크롤성능개선NAVER D2
 
[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridapp[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridappNAVER D2
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅NAVER D2
 
blue-green deployment with docker containers
blue-green deployment with docker containersblue-green deployment with docker containers
blue-green deployment with docker containersAlfred UC
 
[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...
[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...
[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...NAVER D2
 
[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshift
[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshift[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshift
[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshiftNAVER D2
 
[D2 COMMUNITY] Open Container Seoul Meetup - Docker security
[D2 COMMUNITY] Open Container Seoul Meetup - Docker security[D2 COMMUNITY] Open Container Seoul Meetup - Docker security
[D2 COMMUNITY] Open Container Seoul Meetup - Docker securityNAVER D2
 
Container & kubernetes
Container & kubernetesContainer & kubernetes
Container & kubernetesTed Jung
 
Docker d2 박승환
Docker d2 박승환Docker d2 박승환
Docker d2 박승환Seunghwan Park
 
[KAIST - RUN] 프로그래밍 경진대회 문제 풀이
[KAIST - RUN] 프로그래밍 경진대회 문제 풀이[KAIST - RUN] 프로그래밍 경진대회 문제 풀이
[KAIST - RUN] 프로그래밍 경진대회 문제 풀이NAVER D2
 
[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOS[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOSNAVER D2
 

Viewers also liked (20)

[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functions
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functions[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functions
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 2. functions
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generator
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generator[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generator
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 3. generator
 
Papago/N2MT 개발이야기
Papago/N2MT 개발이야기Papago/N2MT 개발이야기
Papago/N2MT 개발이야기
 
JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님
JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님
JavaScript 비동기 프로그래밍 집중 탐구 - 조유성님
 
데이터분석과통계2 - 최재걸님
데이터분석과통계2 - 최재걸님데이터분석과통계2 - 최재걸님
데이터분석과통계2 - 최재걸님
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 1. primitive
 
[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신[D2 오픈세미나]4.네이티브앱저장통신
[D2 오픈세미나]4.네이티브앱저장통신
 
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promise
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promise[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promise
[D2 COMMUNITY] ECMAScript 2015 S67 seminar - 4. promise
 
[D2 오픈세미나]2.모바일웹디버깅
[D2 오픈세미나]2.모바일웹디버깅[D2 오픈세미나]2.모바일웹디버깅
[D2 오픈세미나]2.모바일웹디버깅
 
[D2 오픈세미나]1.무한스크롤성능개선
[D2 오픈세미나]1.무한스크롤성능개선[D2 오픈세미나]1.무한스크롤성능개선
[D2 오픈세미나]1.무한스크롤성능개선
 
[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridapp[D2 오픈세미나]3.web view hybridapp
[D2 오픈세미나]3.web view hybridapp
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
 
blue-green deployment with docker containers
blue-green deployment with docker containersblue-green deployment with docker containers
blue-green deployment with docker containers
 
[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...
[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...
[D2 COMMUNITY] Open Container Seoul Meetup - Running a container platform in ...
 
[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshift
[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshift[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshift
[D2 COMMUNITY] Open Container Seoul Meetup - Kubernetes를 이용한 서비스 구축과 openshift
 
[D2 COMMUNITY] Open Container Seoul Meetup - Docker security
[D2 COMMUNITY] Open Container Seoul Meetup - Docker security[D2 COMMUNITY] Open Container Seoul Meetup - Docker security
[D2 COMMUNITY] Open Container Seoul Meetup - Docker security
 
Container & kubernetes
Container & kubernetesContainer & kubernetes
Container & kubernetes
 
Docker d2 박승환
Docker d2 박승환Docker d2 박승환
Docker d2 박승환
 
[KAIST - RUN] 프로그래밍 경진대회 문제 풀이
[KAIST - RUN] 프로그래밍 경진대회 문제 풀이[KAIST - RUN] 프로그래밍 경진대회 문제 풀이
[KAIST - RUN] 프로그래밍 경진대회 문제 풀이
 
[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOS[D2CAMPUS] Algorithm tips - ALGOS
[D2CAMPUS] Algorithm tips - ALGOS
 

Similar to 텀 프로젝트에서 제품 프로젝트로 - 성준영님

Aws lambda 와 함께 서버리스 서비스 만들기
Aws lambda 와 함께 서버리스 서비스 만들기Aws lambda 와 함께 서버리스 서비스 만들기
Aws lambda 와 함께 서버리스 서비스 만들기Junyoung Sung
 
DevOps with AWS Edge
DevOps with AWS EdgeDevOps with AWS Edge
DevOps with AWS EdgeGS Neotek
 
AWS Lambda 100% 활용하기 :: 김상필 솔루션즈 아키텍트 :: Gaming on AWS 2016
AWS Lambda 100% 활용하기 :: 김상필 솔루션즈 아키텍트 :: Gaming on AWS 2016AWS Lambda 100% 활용하기 :: 김상필 솔루션즈 아키텍트 :: Gaming on AWS 2016
AWS Lambda 100% 활용하기 :: 김상필 솔루션즈 아키텍트 :: Gaming on AWS 2016Amazon Web Services Korea
 
IT 이노베이션 센터 이야기 - AWS Lambda를 활용한 개발 스폰서십 확보편
IT 이노베이션 센터 이야기 - AWS Lambda를 활용한 개발 스폰서십 확보편IT 이노베이션 센터 이야기 - AWS Lambda를 활용한 개발 스폰서십 확보편
IT 이노베이션 센터 이야기 - AWS Lambda를 활용한 개발 스폰서십 확보편Darion Kim
 
AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집
AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집
AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집AWSKRUG - AWS한국사용자모임
 
AWS 상에서 Microsoft 워크로드 구축 및 운영 - AWS Summit Seoul 2017
AWS 상에서 Microsoft 워크로드 구축 및 운영 - AWS Summit Seoul 2017AWS 상에서 Microsoft 워크로드 구축 및 운영 - AWS Summit Seoul 2017
AWS 상에서 Microsoft 워크로드 구축 및 운영 - AWS Summit Seoul 2017Amazon Web Services Korea
 
대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션 - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션  - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션  - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션 - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021Amazon Web Services Korea
 
판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중
판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중
판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중Amazon Web Services Korea
 
AWS Summit Seoul 2015 - AWS 이용사례 - SM 엔터테인먼트 및 셰이커미디어 사례를 중심으로
AWS Summit Seoul 2015 - AWS 이용사례 - SM 엔터테인먼트 및 셰이커미디어 사례를 중심으로AWS Summit Seoul 2015 - AWS 이용사례 - SM 엔터테인먼트 및 셰이커미디어 사례를 중심으로
AWS Summit Seoul 2015 - AWS 이용사례 - SM 엔터테인먼트 및 셰이커미디어 사례를 중심으로Amazon Web Services Korea
 
천만사용자를 위한 AWS 클라우드 아키텍처 진화하기 – 문종민, AWS솔루션즈 아키텍트:: AWS Summit Online Korea 2020
천만사용자를 위한 AWS 클라우드 아키텍처 진화하기 – 문종민, AWS솔루션즈 아키텍트::  AWS Summit Online Korea 2020천만사용자를 위한 AWS 클라우드 아키텍처 진화하기 – 문종민, AWS솔루션즈 아키텍트::  AWS Summit Online Korea 2020
천만사용자를 위한 AWS 클라우드 아키텍처 진화하기 – 문종민, AWS솔루션즈 아키텍트:: AWS Summit Online Korea 2020Amazon Web Services Korea
 
AWS re:Invent 특집 온라인 세미나 - 주요 신규 출시 서비스 알아보기 (윤석찬, AWS테크에반젤리스트)
AWS re:Invent 특집 온라인 세미나 - 주요 신규 출시 서비스 알아보기 (윤석찬, AWS테크에반젤리스트)AWS re:Invent 특집 온라인 세미나 - 주요 신규 출시 서비스 알아보기 (윤석찬, AWS테크에반젤리스트)
AWS re:Invent 특집 온라인 세미나 - 주요 신규 출시 서비스 알아보기 (윤석찬, AWS테크에반젤리스트)Amazon Web Services Korea
 
AWS lambda, step function, cloud watch
AWS lambda, step function, cloud watchAWS lambda, step function, cloud watch
AWS lambda, step function, cloud watchHan Sung Kim
 
데브옵스(DevOps) 문화 모범 사례와 구현 도구 살펴보기 – 박선준 :: AWS Builders Online Series
데브옵스(DevOps) 문화 모범 사례와 구현 도구 살펴보기 – 박선준 :: AWS Builders Online Series데브옵스(DevOps) 문화 모범 사례와 구현 도구 살펴보기 – 박선준 :: AWS Builders Online Series
데브옵스(DevOps) 문화 모범 사례와 구현 도구 살펴보기 – 박선준 :: AWS Builders Online SeriesAmazon Web Services Korea
 
AWS의 하둡 관련 서비스 - EMR/S3
AWS의 하둡 관련 서비스 - EMR/S3AWS의 하둡 관련 서비스 - EMR/S3
AWS의 하둡 관련 서비스 - EMR/S3Keeyong Han
 
서버리스 애플리케이션 구축 패턴 및 구축 사례 - AWS Summit Seoul 2017
서버리스 애플리케이션 구축 패턴 및 구축 사례 - AWS Summit Seoul 2017서버리스 애플리케이션 구축 패턴 및 구축 사례 - AWS Summit Seoul 2017
서버리스 애플리케이션 구축 패턴 및 구축 사례 - AWS Summit Seoul 2017Amazon Web Services Korea
 
데브옵스 엔지니어를 위한 신규 운영 서비스 - 김필중, AWS 개발 전문 솔루션즈 아키텍트 / 김현민, 메가존클라우드 솔루션즈 아키텍트 :...
데브옵스 엔지니어를 위한 신규 운영 서비스 - 김필중, AWS 개발 전문 솔루션즈 아키텍트 / 김현민, 메가존클라우드 솔루션즈 아키텍트 :...데브옵스 엔지니어를 위한 신규 운영 서비스 - 김필중, AWS 개발 전문 솔루션즈 아키텍트 / 김현민, 메가존클라우드 솔루션즈 아키텍트 :...
데브옵스 엔지니어를 위한 신규 운영 서비스 - 김필중, AWS 개발 전문 솔루션즈 아키텍트 / 김현민, 메가존클라우드 솔루션즈 아키텍트 :...Amazon Web Services Korea
 

Similar to 텀 프로젝트에서 제품 프로젝트로 - 성준영님 (20)

Aws lambda 와 함께 서버리스 서비스 만들기
Aws lambda 와 함께 서버리스 서비스 만들기Aws lambda 와 함께 서버리스 서비스 만들기
Aws lambda 와 함께 서버리스 서비스 만들기
 
DevOps with AWS Edge
DevOps with AWS EdgeDevOps with AWS Edge
DevOps with AWS Edge
 
AWS Lambda 100% 활용하기 :: 김상필 솔루션즈 아키텍트 :: Gaming on AWS 2016
AWS Lambda 100% 활용하기 :: 김상필 솔루션즈 아키텍트 :: Gaming on AWS 2016AWS Lambda 100% 활용하기 :: 김상필 솔루션즈 아키텍트 :: Gaming on AWS 2016
AWS Lambda 100% 활용하기 :: 김상필 솔루션즈 아키텍트 :: Gaming on AWS 2016
 
IT 이노베이션 센터 이야기 - AWS Lambda를 활용한 개발 스폰서십 확보편
IT 이노베이션 센터 이야기 - AWS Lambda를 활용한 개발 스폰서십 확보편IT 이노베이션 센터 이야기 - AWS Lambda를 활용한 개발 스폰서십 확보편
IT 이노베이션 센터 이야기 - AWS Lambda를 활용한 개발 스폰서십 확보편
 
AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집
AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집
AWS 서버리스 신규 서비스 총정리 - 트랙2, Community Day 2018 re:Invent 특집
 
AWS 상에서 Microsoft 워크로드 구축 및 운영 - AWS Summit Seoul 2017
AWS 상에서 Microsoft 워크로드 구축 및 운영 - AWS Summit Seoul 2017AWS 상에서 Microsoft 워크로드 구축 및 운영 - AWS Summit Seoul 2017
AWS 상에서 Microsoft 워크로드 구축 및 운영 - AWS Summit Seoul 2017
 
대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션 - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션  - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션  - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션 - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
 
판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중
판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중
판교 개발자 데이 – Aws가 제안하는 서버리스 아키텍처 – 김필중
 
Amazed by aws 2nd session
Amazed by aws 2nd sessionAmazed by aws 2nd session
Amazed by aws 2nd session
 
AWS Summit Seoul 2015 - AWS 이용사례 - SM 엔터테인먼트 및 셰이커미디어 사례를 중심으로
AWS Summit Seoul 2015 - AWS 이용사례 - SM 엔터테인먼트 및 셰이커미디어 사례를 중심으로AWS Summit Seoul 2015 - AWS 이용사례 - SM 엔터테인먼트 및 셰이커미디어 사례를 중심으로
AWS Summit Seoul 2015 - AWS 이용사례 - SM 엔터테인먼트 및 셰이커미디어 사례를 중심으로
 
모두싸인의 AWS 성장기
모두싸인의 AWS 성장기모두싸인의 AWS 성장기
모두싸인의 AWS 성장기
 
천만사용자를 위한 AWS 클라우드 아키텍처 진화하기 – 문종민, AWS솔루션즈 아키텍트:: AWS Summit Online Korea 2020
천만사용자를 위한 AWS 클라우드 아키텍처 진화하기 – 문종민, AWS솔루션즈 아키텍트::  AWS Summit Online Korea 2020천만사용자를 위한 AWS 클라우드 아키텍처 진화하기 – 문종민, AWS솔루션즈 아키텍트::  AWS Summit Online Korea 2020
천만사용자를 위한 AWS 클라우드 아키텍처 진화하기 – 문종민, AWS솔루션즈 아키텍트:: AWS Summit Online Korea 2020
 
Serverless Architecture - 김현민
Serverless Architecture - 김현민Serverless Architecture - 김현민
Serverless Architecture - 김현민
 
AWS re:Invent 특집 온라인 세미나 - 주요 신규 출시 서비스 알아보기 (윤석찬, AWS테크에반젤리스트)
AWS re:Invent 특집 온라인 세미나 - 주요 신규 출시 서비스 알아보기 (윤석찬, AWS테크에반젤리스트)AWS re:Invent 특집 온라인 세미나 - 주요 신규 출시 서비스 알아보기 (윤석찬, AWS테크에반젤리스트)
AWS re:Invent 특집 온라인 세미나 - 주요 신규 출시 서비스 알아보기 (윤석찬, AWS테크에반젤리스트)
 
AWS lambda, step function, cloud watch
AWS lambda, step function, cloud watchAWS lambda, step function, cloud watch
AWS lambda, step function, cloud watch
 
데브옵스(DevOps) 문화 모범 사례와 구현 도구 살펴보기 – 박선준 :: AWS Builders Online Series
데브옵스(DevOps) 문화 모범 사례와 구현 도구 살펴보기 – 박선준 :: AWS Builders Online Series데브옵스(DevOps) 문화 모범 사례와 구현 도구 살펴보기 – 박선준 :: AWS Builders Online Series
데브옵스(DevOps) 문화 모범 사례와 구현 도구 살펴보기 – 박선준 :: AWS Builders Online Series
 
Cloud Design Pattern
Cloud Design PatternCloud Design Pattern
Cloud Design Pattern
 
AWS의 하둡 관련 서비스 - EMR/S3
AWS의 하둡 관련 서비스 - EMR/S3AWS의 하둡 관련 서비스 - EMR/S3
AWS의 하둡 관련 서비스 - EMR/S3
 
서버리스 애플리케이션 구축 패턴 및 구축 사례 - AWS Summit Seoul 2017
서버리스 애플리케이션 구축 패턴 및 구축 사례 - AWS Summit Seoul 2017서버리스 애플리케이션 구축 패턴 및 구축 사례 - AWS Summit Seoul 2017
서버리스 애플리케이션 구축 패턴 및 구축 사례 - AWS Summit Seoul 2017
 
데브옵스 엔지니어를 위한 신규 운영 서비스 - 김필중, AWS 개발 전문 솔루션즈 아키텍트 / 김현민, 메가존클라우드 솔루션즈 아키텍트 :...
데브옵스 엔지니어를 위한 신규 운영 서비스 - 김필중, AWS 개발 전문 솔루션즈 아키텍트 / 김현민, 메가존클라우드 솔루션즈 아키텍트 :...데브옵스 엔지니어를 위한 신규 운영 서비스 - 김필중, AWS 개발 전문 솔루션즈 아키텍트 / 김현민, 메가존클라우드 솔루션즈 아키텍트 :...
데브옵스 엔지니어를 위한 신규 운영 서비스 - 김필중, AWS 개발 전문 솔루션즈 아키텍트 / 김현민, 메가존클라우드 솔루션즈 아키텍트 :...
 

More from NAVER D2

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다NAVER D2
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...NAVER D2
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기NAVER D2
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발NAVER D2
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈NAVER D2
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&ANAVER D2
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기NAVER D2
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep LearningNAVER D2
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applicationsNAVER D2
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingNAVER D2
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지NAVER D2
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기NAVER D2
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화NAVER D2
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)NAVER D2
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기NAVER D2
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual SearchNAVER D2
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화NAVER D2
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지NAVER D2
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터NAVER D2
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?NAVER D2
 

More from NAVER D2 (20)

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 

텀 프로젝트에서 제품 프로젝트로 - 성준영님

  • 1. 텀 프로젝트에서 제품 프로젝트로 6개월간의 현업 경험담 경희대학교 성준영
  • 2. 발표자 소개 성준영 경희대학교 컴퓨터 공학과 3학년 T.G.WinG Nomadstar 서버개발 인턴 wnsdud1861@gmail.com
  • 3. 0_ 발표자 소개 1_ 개요 스타트업 인턴으로 맡은 포지션 거쳐간 업무들 2_ 현업 경험담 6개월의 타임라인 AWS 서버이전 > 컨퍼런스와 문서화 AWS Lambda > 코드리뷰와 리펙토링 REST API 설계 > 좋은 설계 3_ 정리 경험과 교훈의 요약 입사 전과 비교해본 나 결론 목차
  • 4. 개요 > 스타트업 인턴으로 맡은 포지션 쓰담 (Beta) 솔직한 사용자 후기를 이용하여, 반려 동물의 특성에 딱 맞는 제품을 찾을 수 있도록 돕는 반려동물 제품 리뷰 SNS 어플리케이션 (Adroid) 1.1
  • 5. 쓰담 서비스의 서버 관리 및 백엔드 API, 데이터베이스 작성과 설계 1.1 개요 > 스타트업 인턴으로 맡은 포지션
  • 6. 개요 > 거쳐간 업무들 AWS Lambda Dynamodb 이미지 포맷 변경 REST API 1.2 관리자 페이지 쓰담 홈페이지 AWS 서버이전 이미지 압축 및 리사이징
  • 7. 1.2 AWS Lambda Dynamodb 이미지 포맷 변경 REST API 관리자 페이지 쓰담 홈페이지 AWS 서버이전 이미지 압축 및 리사이징 개요 > 거쳐간 업무들
  • 8. 1.2 가장 많은 것을 배우고 느꼈던 세가지 경험을 여러분과 공유하려 합니다. 개요 > 거쳐간 업무들 AWS 서버이전 > 컨퍼런스와 문서화 AWS Lambda > 코드리뷰와 리펙토링 REST API > 좋은 설계
  • 9. 현업 경험담 > 6개월의 타임라인2.1 관리자 페이지 AWS 서버이전 홈페이지 이미지 압축 및 리사이징 AWS Lambda 이전 시작 ( ~ 현재 ) 이미지 포맷 변경 REST API ( ~ 현재 ) 16.09 16.12 17.02 dynamodb 버전 1.0 개발
  • 10. 현업 경험담 > AWS 서버이전 > AWS 란?2.2 컴퓨팅 서버, 스토리지, 데이터베이스, 네트워크 등 웹 서비스에 필요한 모든 서비스를 제공하는 세계 1위 클라우드 서비스 플랫폼
  • 11. 현업 경험담 > AWS 서버이전 > AWS Summit Seoul2.2 입사 전 (16.5.17) 참관했던 코엑스에서 열린 AWS 컨퍼런스 AWS 임직원과 전문가들의 강연 파트너 솔루션 전시 임원 초청 행사
  • 12. 현업 경험담 > AWS 서버이전 > AWS Summit Seoul2.2 입사 전 (16.5.17) 참관했던 코엑스에서 열린 AWS 컨퍼런스 AWS 임직원과 전문가들의 강연 파트너 솔루션 전시 임원 초청 행사 멍때리며 들은 멍때리며 본 멍때리며 박수친
  • 13. 현업 경험담 > AWS 서버이전 > 왜?2.2 국내 클라우드 서비스에서 아마존 웹 서비스로 이전 왜?
  • 14. 2.2 SNS의 특성상 이미지가 많고, 파일이 계속 늘어남에 따라 고가용성의 이미지 서버가 필요 AWS 이전의 이유 첫번째 Image Server IMAGE FILES 현업 경험담 > AWS 서버이전 > 왜?
  • 15. 2.2 AWS S3 무한대에 가까운 스토리지 제공 여러 물리적 저장소에 대한 중복 저장으로, 99.999999999% 내구성과 99.99%의 가용성 보장 AWS 이전의 이유 첫번째 S3 IMAGE FILES … 현업 경험담 > AWS 서버이전 > 왜?
  • 16. 2.2 트래픽에 비해 지나친 스펙의 서버, 비용절감의 필요성 AWS 이전의 이유 두번째 트 래 픽 낭비되는 영역 Before 현업 경험담 > AWS 서버이전 > 왜?
  • 17. 2.2 AWS 이전의 이유 두번째 간단한 절차만으로 서버를 늘렸다 줄이는 오토 스케일링이 가능 트 래 픽 절약되는 영역 Before After 인 스 턴 스 갯 수 현업 경험담 > AWS 서버이전 > 왜?
  • 18. 2.2 단일 서버 구성으로 인해 서버 장애발생 시 모든 서비스의 마비 가능성 AWS 이전의 이유 세번째 SERVER API DATA BASE IMAGE STORAGE CLIENT 현업 경험담 > AWS 서버이전 > 왜?
  • 19. 2.2 단일 서버 구성으로 인해 서버 장애발생 시 모든 서비스의 마비 가능성 AWS 이전의 이유 세번째 SERVER API DATA BASE IMAGE STORAGE CLIENT 현업 경험담 > AWS 서버이전 > 왜?
  • 20. 2.2 ELB (Elastic Load Balancing) 자동 부하분산 시스템으로, 주기적인 서버 상태를 체크하여 자동 트래픽 분산 AWS 이전의 이유 세번째 SERVER API DATA BASE IMAGE STORAGE CLIENT SERVER API DATA BASE IMAGE STORAGE 현업 경험담 > AWS 서버이전 > 왜?
  • 21. 2.2 ELB (Elastic Load Balancing) 자동 부하분산 시스템으로, 주기적인 서버 상태를 체크하여 자동 트래픽 분산 AWS 이전의 이유 세번째 SERVER API DATA BASE IMAGE STORAGE CLIENT SERVER API DATA BASE IMAGE STORAGE 현업 경험담 > AWS 서버이전 > 왜?
  • 22. 현업 경험담 > AWS 서버이전 > API EC2 이전2.2 AWS 에 첫 발을 딛은 기존 국내 클라우드 서버에 있던 API 들을 EC2 인스턴스로 이전하는 작업 API EC2 Instance API
  • 23. 현업 경험담 > AWS 서버이전 > API EC2 이전2.2 AWS EC2 (Amazon Elastic Compute Cloud) 가상 컴퓨터 환경을 제공하는 인스턴스, 머신 이미지를 제공하는 AMI, 스토리지 볼륨인 EBS 등을 포함하는 서비스
  • 24. 현업 경험담 > AWS 서버이전 > API EC2 이전2.2 API를 옮기고 테스트 중, 푸시 메시지가 클라이언트로 전송 되지 않는 현상을 발견 EC2 Instance API ??? PUSH
  • 25. 현업 경험담 > AWS 서버이전 > API EC2 이전2.2 푸시 데이터를 쌓긴 하는데… PUSH DATA
  • 26. 현업 경험담 > AWS 서버이전 > API EC2 이전2.2 쌓아놓은 푸시를 클라이언트 기기로 보내주는 코드가 없음 ?
  • 27. 현업 경험담 > AWS 서버이전 > API EC2 이전2.2 ?????? ?
  • 28. 현업 경험담 > AWS 서버이전 > API EC2 이전2.2 API 1. 푸시상황이 되면 푸시 데이터를 쌓는다. 2. ? 3. 성공 후 비운다.
  • 29. 현업 경험담 > AWS 서버이전 > API EC2 이전2.2 API 1. 푸시상황이 되면 푸시 데이터를 쌓는다. 2. Shell Script 를 cron 으로 반복한다. 3. 성공 후 비운다.
  • 30. 현업 경험담 > AWS 서버이전 > API EC2 이전2.2 리눅스 작업 스케줄러인 cron 으로 쉘스크립트를 1분 간격으로 계속 호출하고 있었던 것 * * * * * /path/push_fcm.sh
  • 31. 현업 경험담 > AWS 서버이전 > API EC2 이전2.2 /* * 푸시 전송 : /path/push_fcm.sh * crontab 1분에 1회 반복합니다. */ API 코드 내 주석 혹은 문서만 있었다면 크게 줄어들었을 작업시간…
  • 32. 현업 경험담 > AWS 서버이전 > API EC2 이전2.2 다음 개발자가 이런 일로 고생할 일이 없도록 코드로는 이해못할 부분에 대한 문서화와 주석
  • 33. 현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2 EC2 로 서버도 만들어봤는데! 이왕 AWS 를 쓸거, AWS 를 최대한 활용하여 백엔드를 구축해 보자! 클라우드 데이터베이스 서비스인 RDS 활용과 AWS 아키텍처의 구성
  • 34. 현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2 그러나 너무 많은 서비스들 아키텍처는 고사하고 뭔지도 모르겠는데요..
  • 35. 현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2 그때 기억난 멍때리며 들었던 윤석찬님의 “AWS 클라우드로 천만명 웹서비스 확장하기”세션
  • 36. 현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2 당시의 발표 자료와 영상을 찾아 프레젠테이션을 참고하며 따라해보기 시작 http://www.slideshare.net/awskorea/your-first-10-million-customer-web-service-on-aws-channy-yun
  • 37. 현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2 완성된 초기 쓰담 서비스의 AWS 아키텍처
  • 38. 현업 경험담 > AWS 서버이전 > AWS 아키텍처2.2 컨퍼런스에서 들은 내용을 바탕으로 실제 서비스의 적용까지
  • 39. 현업 경험담 > AWS 서버이전 > 느낀 점2.2 문서화 개발자 컨퍼런스
  • 40. 현업 경험담 > AWS 서버이전 > 느낀 점2.2 문서화 실제로 고생을 해 보고 중요성을 실감 앞으로 짜게될 코드에 대한 똑똑한 주석과 문서화의 필요성
  • 41. 현업 경험담 > AWS 서버이전 > 느낀 점2.2 개발자 컨퍼런스 컨퍼런스를 통한 잠재 지식의 확대와 최신 트랜드 파악 나아가 프로젝트에의 적용
  • 42. EC2 인스턴스 에서 Lambda 로 Backend API 전환 현업 경험담 > AWS Lambda > AWS Lambda 로의 이전결정2.3
  • 43. 현업 경험담 > AWS Lambda > AWS Lambda 로의 이전결정2.3 Beta 에서 정식 버전으로 가면서 대대적인 기획안 변경
  • 44. 현업 경험담 > AWS Lambda > AWS Lambda 로의 이전결정2.3 Beta 에서 정식 버전으로 가면서 대대적인 기획안 변경 에 따른 대대적인 백엔드 API 변경
  • 45. 현업 경험담 > AWS Lambda > AWS Lambda 로의 이전결정2.3 백엔드, 갈아엎자! EC2 에서 Lambda 로 PHP 에서 node.js 로 RDS 에서 dynamodb 로
  • 46. 현업 경험담 > AWS Lambda > AWS Lambda 란?2.3 AWS Lambda 2014년 발표된, 특정한 이벤트에 응답하여 실행되는, 자동으로 컴퓨팅 리소스를 관리하는 서버리스 컴퓨팅 시스템
  • 47. API Gateway 를 통해 URI, method 와 연결하거나, S3 / Dynamodb 등 AWS 리소스의 특정 트리거와 연결해 호출가능 Lambda node.js Hello World 예제 현업 경험담 > AWS Lambda > AWS Lambda 란?2.3 exports.handler = function(event, context) { context.succeed('Hello World'); }
  • 48. 현업 경험담 > AWS Lambda > Lambda 를 사용한 이유2.3 Lambda 사용의 이유 첫번째 초기 버전의 난항으로 인한 잦은 백엔드 변경사항 발생으로 스케일링 관리와 배포의 번거로움
  • 49. 2.3 Lambda 사용의 이유 첫번째 > 스케일링 관리와 배포의 번거로움 오토스케일링 필요한 소프트웨어가 이미 구성되어 있는 인스턴스 템플릿인 AMI (Amazon Machine Image) 로 Launch config 를 만들고, 오토 스케일링 그룹 설정 AMI AutoScaling Launch Config AutoScaling Group V1 V1 현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
  • 50. 2.3 서버를 배포할 때, 업데이트된 인스턴스로부터 AMI 를 업데이트하고, Launch Config를 재설정하는 과정 필요 배포의 자동화가 이루어지지 않은 상태의 번거로운 작업 AutoScaling Launch Config AutoScaling Group V2 V2 V2 Lambda 사용의 이유 첫번째 > 스케일링 관리와 배포의 번거로움 현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
  • 51. 2.3 Lambda 사용의 이유 첫번째 서버의 운영과 관리 (스케일링, 모니터링, 보안, 코드배포..) 는 AWS 에서 수행해 주므로 별도의 번거로운 서버작업이 필요없어짐 현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
  • 52. 2.3 Lambda 사용의 이유 두번째 사수님 曰, “재밌겠다. 해보자, 스타트업이잖아." 현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
  • 53. 2.3 Lambda 사용의 이유 두번째 사수님 曰, “재밌겠다. 해보자, 스타트업이잖아." 현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
  • 54. 2.3 Lambda 사용의 이유 세번째 node.js 로 작성하고 API-Gateway로 묶은 이벤트 기반의 Lambda Function들은 Roopback, restify 등 REST API 프레임워크로 쉬운 이전이 가능 현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
  • 55. 2.3 Lambda 사용의 이유 세번째 Lambda 의 한정된 Timeout 과 Memory에 한계가 보인다면. 언제든지 REST 기반 프레임워크로 이전 > 부담없는 시작 현업 경험담 > AWS Lambda > Lambda 를 사용한 이유
  • 56. 현업 경험담 > AWS Lambda > PHP to node.js2.3 Lambda function 언어 결정 부담없는 시작 npm 의 모든 패키지가 사용가능 Lambda 관련 라이브러리가 가장 활성화
  • 57. 현업 경험담 > AWS Lambda > PHP to node.js2.3 PHP 에서 node.js로 모든 API 의 변경
  • 58. 현업 경험담 > AWS Lambda > PHP to node.js2.3 node.js 로 API를 변경하며 겪었던 난항 진행할수록 가독성 떨어지는 코드 1. 이미지 버퍼를 받는다. 2. 원본을 저장한다. 3. 이미지를 리사이징한다. 4. 리사이징된 이미지를 저장한다. 받은 이미지를 리사이징 후 저장
  • 59. 현업 경험담 > AWS Lambda > PHP to node.js2.3 <?php .. // 원본을 저장한다. saveOriginalImage($image); // 이미지를 리사이징해 용량을 줄인다. $resizedImage = resizeImage($image); // 리사이징한 이미지를 저장한다. saveResizedImage($resizedImage); .. ?>
  • 60. 현업 경험담 > AWS Lambda > PHP to node.js2.3 이벤트 기반 / 비동기 / 콜백 .... 나도 대충 알아! 짤수 있다! node.js 로 API를 변경하며 겪었던 난항 진행할수록 가독성 떨어지는 코드
  • 61. saveOriginalImage(image, function(err, savedImage) { if (err) return '원본이미지 저장 에러'; else { } }) 현업 경험담 > AWS Lambda > PHP to node.js2.3 원본 이미지의 저장이 성공하면 콜백의 결과를 받아서 이미지를 압축하고...
  • 62. saveOriginalImage(image, function(err, savedImage) { if (err) return '원본이미지 저장 에러'; else { resizeImage(savedImage, function(err, resizedImage) { if (err) return '이미지 리사이징 에러'; else { saveResizedImage(resizedImage, result){ if (err) return ’리사이징 된 이미지 저장 에러'; else { return '성공'; } } } }) } }) 현업 경험담 > AWS Lambda > PHP to node.js2.3
  • 63. 현업 경험담 > AWS Lambda > PHP to node.js2.3 saveOriginalImage(image, function(err, savedImage) { if (err) return '원본이미지 저장 에러'; else { resizeImage(savedImage, function(err, resizedImage) { if (err) return '이미지 리사이징 에러'; else { saveResizedImage(resizedImage, result){ if (err) return ’리사이징 된 이미지 저장 에러'; else { return '성공'; } } } }) } }) ???
  • 64. 현업 경험담 > AWS Lambda > PHP to node.js2.3 saveOriginalImage(image, function(err, result) { if (err) return '원본이미지 저장 에러'; else { resizeImage(result, function(err, resizedImage) { if (err) return '이미지 리사이징 에러'; else { saveResizedImage(resizedImage, result){ if (err) return ’리사이징 된 이미지 저장 에러'; else { somefunction1(result, function(err, result) { if (err) return ’이런 에러'; else { somefunction2(result, function(err, result){ if (err) return ’저런 에러'; else { somefunction3(result, function(err, result){ if (err) return ’요런 에러'; else { ???????
  • 65. 현업 경험담 > AWS Lambda > PHP to node.js2.3 점점 읽기 힘들어지는 코드들 Callback Hell node.js 로 API를 변경하며 겪었던 난항 진행할수록 가독성 떨어지는 코드
  • 66. 현업 경험담 > AWS Lambda > PHP to node.js2.3 https://cnodejs.org/topic/570fb6a40a1e9da252f1e310 http://thecodebarbarian.com/2015/03/20/callback-hell-is-a-myth node.js 로 API를 변경하며 겪었던 난항 진행할수록 가독성 떨어지는 코드
  • 67. 현업 경험담 > AWS Lambda > PHP to node.js2.3 그렇게 우여곡절 끝에 로그인 API 완성
  • 68. 현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3 “코드리뷰 한번 해볼까요?” 네?
  • 69. 현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3 “코드리뷰 한번 해볼까요?” 내 코드를 보여주는 것에 두려움과 부끄러움
  • 70. 현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3 단일 Lambda 함수에 대한 코드리뷰 진행 node.js 에서 알아두면 좋을 패턴에 대한 소개 효율적인 코드를 위한 토론 좋은 라이브러리의 제안 잘못된 코드에 대한 지적
  • 71. 현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3 단일 Lambda 함수에 대한 코드리뷰 진행 Callback Hell을 해결할 수 있는 Promise 라는 패턴이 있어요. Array.some 메서드를 쓰면 코드가 좀 더 간결해 지지 않을까요? 이미지를 다룰때 Imagemagick 도 좋지만, sharp 도 한번 찾아보세요! 여기서 === 연산자를 쓰지 않으면 문제 발생의 가능성이 있어요.
  • 72. 현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3 수 번의 리펙토링과 리뷰 반복 코드리뷰로 얻은 결과를 통해
  • 73. 현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3 코드리뷰로와 리펙토링으로 변경된 Promise 패턴과 Arrow function 의 사용 saveOriginalImage(image, function(err, savedImage) { if (err) return '원본이미지 저장 에러'; else { resizeImage(savedImage, function(err, resizedImage) { if (err) return '이미지 리사이징 에러'; else { saveResizedImage(resizedImage, result){ if (err) return ’리사이징 된 이미지 저장 에러'; else { return '성공'; } } } }) } }) 코드의 규모가 커질수록 콜백의 중첩으로 순차적인 작업 진행 시 가독성이 매우 떨어지는 코드에서,
  • 74. 현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3 saveOriginalImage(image) .then(function(savedImage){ return resizeImage(savedImage); }) .then(function(resizedImage){ return saveResizedImage(resizedImage); }) .then(function(result){ return '성공'; })) .catch(function(err){ return err; }) Promise 패턴의 적용으로 한결 간결해진 코드
  • 75. 현업 경험담 > AWS Lambda > 코드리뷰와 리펙토링2.3 ECMA 6 Arrow function 의 적용과 축약한 통용 단어의 사용으로 더욱 직관적이고 간결해진 코드 코드리뷰로와 리펙토링으로 변경된 Promise 패턴과 Arrow function 의 사용 saveOrigImg(img) .then(savedImg => resizeImg(savedImg)) .then(resizedImg => saveResizedImg(resizedImg)) .then(result => '성공') .catch(err => err);
  • 76. 현업 경험담 > AWS Lambda > 느낀점2.3 코드 리뷰와 리펙토링 남이보는 내 코드에 대한 두려움을 버리고 동료 프로그래머와의 페어 프로그래밍 혹은 코드리뷰로 결함의 감소와 품질 향상, 나아가 성장
  • 77. 현업 경험담 > REST API > REST API 란?2.4 로이 필딩 (Roy Fielding)의 박사학위 논문에서 최초로 소개, 웹의 장점을 최대한 활용할 수 있는 아키텍처 URI 와 HTTP Method 를 이용해 API 를 만드는 것 RESTGET / POST / PUT / DELETE
  • 78. 현업 경험담 > REST API > REST API 란?2.4 첫 번째, URI는 Resource(자원)를 표현한다. 두 번째, Resource 에 대한 행위는 HTTP Method로 표현한다. POST : Create GET : Read PUT : Update DELETE : Delete RESTful API
  • 79. 현업 경험담 > REST API > REST API 란?2.4 첫 번째, URI는 Resource(자원)를 표현한다. 두 번째, Resource 에 대한 행위는 HTTP Method로 표현한다. 설계 방법론에 대한 많은 책들이 존재하지만, 정해진 룰은 없음 하지만.. RESTful API
  • 80. 현업 경험담 > REST API > 기존 API의 수정 경험2.4 리뷰, 이야기, 이벤트만 존재하던 탭 페이스북 페이지의 반려동물 팁 컨텐츠의 증가에 따라, 앱 내에서도 컨텐츠를 볼 수 있도록 매거진 탭의 추가와 댓글에 댓글을 달아달라는 많은 사용자의 요구에 따른 댓글의 댓글 기능 기능 추가 기능 추가 요청
  • 81. 현업 경험담 > REST API > 기존 API의 수정 경험2.4 기존 API 의 URI 구성 _ Default Codeigniter 기능 추가 요청 https://Base_url/review/write CI_Controller 를 상속받는 클래스명에 대응
  • 82. 현업 경험담 > REST API > 기존 API의 수정 경험2.4 기존 API 의 URI 구성 _ Default Codeigniter 기능 추가 요청 https://Base_url/review/write 클래스 내의 메서드명에 대응
  • 83. 현업 경험담 > REST API > 기존 API의 수정 경험2.4 기존 API 의 URI 구성 _ Default Codeigniter 기능 추가 요청 https://Base_url/review/write 클래스 내의 메서드명에 대응
  • 84. 현업 경험담 > REST API > 기존 API의 수정 경험2.4 기존 API 의 URI 구성 _ 리뷰 https://Base_url/review/write https://Base_url/review/update https://Base_url/review/delete https://Base_url/review/list https://Base_url/review/detail 기능 추가 요청
  • 85. 현업 경험담 > REST API > 기존 API의 수정 경험2.4 기존 API 의 URI 구성 _ 리뷰 https://Base_url/review/write https://Base_url/review/update https://Base_url/review/delete https://Base_url/review/list https://Base_url/review/detail https://Base_url/review_comment/write https://Base_url/review_comment/update https://Base_url/review_comment/delete https://Base_url/review_comment/list 기능 추가 요청
  • 86. 현업 경험담 > REST API > 기존 API의 수정 경험2.4 https://Base_url/story/write https://Base_url/story/update https://Base_url/story/delete https://Base_url/story/list https://Base_url/story/detail https://Base_url/story_comment/write https://Base_url/story_comment/update https://Base_url/story_comment/delete https://Base_url/story_comment/list 기존 API 의 URI 구성 _ 스토리 기능 추가 요청
  • 87. 현업 경험담 > REST API > 기존 API의 수정 경험2.4 매거진의 추가? 기능 추가 요청 https://Base_url/magazine/write https://Base_url/magazine/update https://Base_url/magazine/delete https://Base_url/magazine/list https://Base_url/magazine/detail https://Base_url/magazine_comment/write https://Base_url/magazine_comment/update https://Base_url/magazine_comment/delete https://Base_url/magazine_comment/list 너무 많은 코드의 중복과 불필요한 작업의 증가
  • 88. 현업 경험담 > REST API > 기존 API의 수정 경험2.4 댓글의 댓글 기능? 기능 추가 요청 많은 방법을 생각해 봤으나 구현 후 더이상의 유지보수 및 기능추가는 NAVER...
  • 89. 현업 경험담 > REST API > API 의 재설계2.4 HTTP 는 서버와 클라이언트의 정보를 주고받기 위해 약속된 통신 규약 (프로토콜) 기존 API 설계의 문제점 파악 첫번째 POST : Create GET : Read PUT : Update DELETE : Delete
  • 90. 현업 경험담 > REST API > API 의 재설계2.4 HTTP 프로토콜을 무시한 Method 리소스에 대한 행위를 표현하지 않고 무의미한 사용 https://Base_url/story/write https://Base_url/story/update https://Base_url/story/delete https://Base_url/story/list https://Base_url/story/detail POST POST POST GET GET 기존 API 설계의 문제점 파악 첫번째
  • 91. 현업 경험담 > REST API > API 의 재설계2.4 HTTP 프로토콜을 준수하며 HTTP 메소드로 리소스에 대한 행위를 표현하도록 https://Base_url/story/write https://Base_url/story/update https://Base_url/story/delete https://Base_url/story/list https://Base_url/story/detail POST POST POST GET GET 스토리 작성 특정 스토리 업데이트 특정 스토리 삭제 스토리 리스트 불러오기 특정 스토리 불러오기 CREATE UPDATE DELETE READ READ 기존 API 설계의 문제점 파악 첫번째 _ 재설계
  • 92. 현업 경험담 > REST API > API 의 재설계2.4 HTTP 프로토콜을 준수하며 HTTP 메소드로 리소스에 대한 행위를 표현하도록 https://Base_url/stories https://Base_url/stories/{story_id} https://Base_url/stories/{story_id} https://Base_url/stories https://Base_url/stories/{story_id} POST PUT DELTE GET GET 스토리 작성 특정 스토리 업데이트 특정 스토리 삭제 스토리 리스트 불러오기 특정 스토리 불러오기 CREATE UPDATE DELETE READ READ 기존 API 설계의 문제점 파악 첫번째 _ 재설계
  • 93. 현업 경험담 > REST API > API 의 재설계2.4 리소스간의 관계가 무의미한 설계로 URL과 Method로는 API 파악의 어려움 기존 API 설계의 문제점 파악 두번째 https://Base_url/story_comment/write 댓글은 이야기의 하위 리소스이지만 분리되어 작성된 URL 어떤 스토리의 댓글을 쓰기 위한 API 인지 알기 위해서는, 서버에서 요구하는 parameter의 story_id 를 알아야 함 POST 무의미
  • 94. 현업 경험담 > REST API > API 의 재설계2.4 리소스간의 관계파악으로 URL 과 Method 로 어떤 API 인지 파악가능하도록 기존 API 설계의 문제점 파악 두번째 _ 재설계 https://Base_url/stories/{story_id}/comments/{comment_id} {story_id} 스토리의 {comment_id} 댓글을 수정하는 API 이구나! PUT https://Base_url/stories/{story_id}/comments GET {story_id} 스토리의 모든 댓글들을 가져오는 API 이구나!
  • 95. 현업 경험담 > REST API > API 의 재설계2.4 기존 API 설계의 문제점 파악 세번째 story review event story_comment review_comment event_comment 리소스간의 관계가 무의미한 설계로 지나친 코드의 중복으로 인한 유지보수의 어려움
  • 96. 현업 경험담 > REST API > API 의 재설계2.4 기존 API 설계의 문제점 파악 세번째 _ 재설계 리소스간의 관계파악 후 소스코드의 설계로 유지보수가 쉽고, 확장성 있는 코드의 작성 story comment review event sub_commet
  • 97. 현업 경험담 > REST API > 느낀 점2.4 설계와 분석 처음 피부에 와닿도록 느낀 시스템 분석에 따른 좋은 설계의 중요성
  • 98. 정리 > 요약 >3.1 문서화 개발자 컨퍼런스 코드 리뷰와 리펙토링 설계와 분석
  • 99. 정리 > 입사 전과 비교해본 나 >3.2 문서화 개발자 컨퍼런스 코드 리뷰와 리펙토링 설계와 분석 항상 듣던 너무 당연한,
  • 100. 정리 > 입사 전과 비교해본 나 >3.2 문서화 개발자 컨퍼런스 코드 리뷰와 리펙토링 설계와 분석 항상 듣던 너무 당연한, 하지만 추상적이고 머리에 떠다니던 개념들
  • 101. 정리 > 입사 전과 비교해본 나 >3.2 문서화 개발자 컨퍼런스 코드 리뷰와 리펙토링 설계와 분석 AWS 로 서버이전을 하면서,
  • 102. 정리 > 입사 전과 비교해본 나 >3.2 문서화 개발자 컨퍼런스 설계와 분석 경험이 없었던 node.js 로 API를 옮기면서 코드 리뷰와 리펙토링
  • 103. 정리 > 입사 전과 비교해본 나 >3.2 문서화 개발자 컨퍼런스 기존 서버의 유지보수와 새로운 API 설계를 맡으면서 코드 리뷰와 리펙토링 설계와 분석
  • 104. 정리 > 입사 전과 비교해본 나 >3.2 현업을 겪으며 다시금 생각하게 된 ‘당연한 이야기들’
  • 105. 정리 > 결론 >3.3 모자른 발표로나마 간접경험을 통해 함께 성장하는 개발자가 되었으면 좋겠습니다 :)