<3탄>스프링 부트를 사용한 마이크로 서비스 개발 (로컬 환경) | 페어 프로그래밍 데모 (테스트 작성)
이번 세션에서는 Spring Boot를 사용한 웹 애플리케이션 개발에 대해 소개합니다. 이때 제작되는 애플리케이션은 Pivotal에서 풀타임으로 사용하고 있는 페어프로그래밍을 통해 테스트부터 작성하는 핑퐁 페어등을 소개합니다. 두명이 함께 코드를 작성하는 환경을 통해 빠른 사업환경의 변화를 수용할 수 있는 개발 업무가 Pivotal에서는 어떻게 다른지 살펴봅니다.
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례Jeongsang Baek
대부분의 중소 모바일 게임 업체는 앱을 잘 만들기에도 시간이 모자라 출시일을 잘 맞추기 급급한 상황이다. 그러다 보니 운영을 위한 툴은 소홀히 개발하는 경우가 대부분이고 운영 캠페인은 날림으로 개발하거나 그때 그때 개발자가 필요한 부분만 개발하기 일쑤다. 그러다보니 마케터는 결국 늘 개발자 눈치만 살피게 된다. 필자는 블루윈드에서 이러한 문제를 절감했고 '모바일 게임 개발사가 앱 개발에만 집중할 수 있게 해주고 싶다'는 IGAworks의 철학에 공감하여 라이브 오퍼레이션 프로젝트를 시작하게 되었다.
라이브 오퍼레이션의 개발 중점과제는 5가지였다. 첫번째, 다수의 개발사가 하나의 큰 클라우드 시스템을 사용하도록 multi-tenant 인프라를 구축해야 한다. 두번째, TCO(Total cost of ownership)를 최소화해야 한다. 세번째, 앱의 핵심유저를 실시간으로 그룹화하여 타게팅 캠페인을 할 수 있어야 한다. 네번째, 캠페인의 성과를 마케터에게 실시간으로 피드백해야 한다. 다섯째, 3개월 안에 정식 서비스가 되어야 한다는 점이었다. (왜 우리에게 주어지는 시간은 늘 3개월인가) 그리고 당연하지만 이 서비스를 혼자 개발해야 했다.
이 다섯가지 이슈를 해결하기 위하여 AWS 클라우드 상에 생산성과 성능이 검증된 node.js 와 mongodb를 이용하여 서비스 백엔드를 구성하였고, multi-tenant를 구성하기 위한 여러가지 고민과 그 해결책을 직접 구현하였다. 필자는 node.js와 mongodb를 사용해 본 경험이 충분하다 생각했지만 대규모 정식 서비스를 진행하며 많은 함정에 빠졌고 결국 해결했다.
이 발표를 통해 청강자는 node.js와 mongodb를 이용하여 multi-tenant 인프라를 구축해야 할 때 고려해야 할 설계 방식과 기술적인 고민, 그것에 대한 현실적인 해법을 얻을 수 있다.
APAC Principal Solutions Architect, Johnathon Meichtry will run through the highlights of 2015 showcasing the biggest announcements and how customers are using these new features. This session will cover the entire breadth of the AWS platform, and is a chance to get a high level overview of all of the announcements, feature updates and new services that AWS has launched in 2015.
<3탄>스프링 부트를 사용한 마이크로 서비스 개발 (로컬 환경) | 페어 프로그래밍 데모 (테스트 작성)
이번 세션에서는 Spring Boot를 사용한 웹 애플리케이션 개발에 대해 소개합니다. 이때 제작되는 애플리케이션은 Pivotal에서 풀타임으로 사용하고 있는 페어프로그래밍을 통해 테스트부터 작성하는 핑퐁 페어등을 소개합니다. 두명이 함께 코드를 작성하는 환경을 통해 빠른 사업환경의 변화를 수용할 수 있는 개발 업무가 Pivotal에서는 어떻게 다른지 살펴봅니다.
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례Jeongsang Baek
대부분의 중소 모바일 게임 업체는 앱을 잘 만들기에도 시간이 모자라 출시일을 잘 맞추기 급급한 상황이다. 그러다 보니 운영을 위한 툴은 소홀히 개발하는 경우가 대부분이고 운영 캠페인은 날림으로 개발하거나 그때 그때 개발자가 필요한 부분만 개발하기 일쑤다. 그러다보니 마케터는 결국 늘 개발자 눈치만 살피게 된다. 필자는 블루윈드에서 이러한 문제를 절감했고 '모바일 게임 개발사가 앱 개발에만 집중할 수 있게 해주고 싶다'는 IGAworks의 철학에 공감하여 라이브 오퍼레이션 프로젝트를 시작하게 되었다.
라이브 오퍼레이션의 개발 중점과제는 5가지였다. 첫번째, 다수의 개발사가 하나의 큰 클라우드 시스템을 사용하도록 multi-tenant 인프라를 구축해야 한다. 두번째, TCO(Total cost of ownership)를 최소화해야 한다. 세번째, 앱의 핵심유저를 실시간으로 그룹화하여 타게팅 캠페인을 할 수 있어야 한다. 네번째, 캠페인의 성과를 마케터에게 실시간으로 피드백해야 한다. 다섯째, 3개월 안에 정식 서비스가 되어야 한다는 점이었다. (왜 우리에게 주어지는 시간은 늘 3개월인가) 그리고 당연하지만 이 서비스를 혼자 개발해야 했다.
이 다섯가지 이슈를 해결하기 위하여 AWS 클라우드 상에 생산성과 성능이 검증된 node.js 와 mongodb를 이용하여 서비스 백엔드를 구성하였고, multi-tenant를 구성하기 위한 여러가지 고민과 그 해결책을 직접 구현하였다. 필자는 node.js와 mongodb를 사용해 본 경험이 충분하다 생각했지만 대규모 정식 서비스를 진행하며 많은 함정에 빠졌고 결국 해결했다.
이 발표를 통해 청강자는 node.js와 mongodb를 이용하여 multi-tenant 인프라를 구축해야 할 때 고려해야 할 설계 방식과 기술적인 고민, 그것에 대한 현실적인 해법을 얻을 수 있다.
APAC Principal Solutions Architect, Johnathon Meichtry will run through the highlights of 2015 showcasing the biggest announcements and how customers are using these new features. This session will cover the entire breadth of the AWS platform, and is a chance to get a high level overview of all of the announcements, feature updates and new services that AWS has launched in 2015.
Spring Data Requery is alternatives of Spring Data JPA
Requery is lightweight ORM for DBMS (MySQL, PostgreSQL, H2, SQLite, Oracle, SQL Server)
Spring Data Requery provide Query By Native Query, Query By Example and Query By Property like Spring Data JPA
Spring Data Requery is better performance than JPA
Alternatives of JPA
Requery provide simple Object Mapping & Generate SQL to execute without reflection and session, so fast than JPA, simple and easy to learn.
4. 개발자 분류
Domain 별
Software 산업이라는 것은 모든 산업에 Software를 제공하는 것
정부, 게임, B2C, B2B, O2O, Embedded …
Topic 별
보안, 엔터테인먼트, 오픈소스
Role 별
SI, SM, Service, Infra, DBA, Device
Architecture, PM, Analysis, Consultant
기술 분야
Frontend – Windows, Web, Mobile (iOS, Android …)
Backend – Web, Middleware, Servers (Cache, MQ …) …
Database – DBA, OLTP, OLAP, Big Data
4
5. 좋은 개발자란?
좋은 제품을 만드는 사람
사용성
안정성 (예외처리)
성능
유지보수성
납기 준수, 매뉴얼
논리적 사고, 자기계발
게으름 자동화, 관심 자기주도, 3D 끈기
참고 : 좋은 프로그래머 되기
5
6. 좋은 개발자란?
6
SI
• 적기 납품
• Domain 지식 (요구사항 충족)
• 유지보수성
Solution
• 범용성 (다양한 Needs를 일반화)
• 안정성 / 성능
• 자동화 / 매뉴얼
• 호환성
Embedded
• 안정성
• 성능
• 호환성
SM
•현업과의 소통
•Domain 지식 / 코드 이해력
•시스템 운영 능력
분야별
9. 학습 전략을 짜라
분야별로 10년 학습 Milestone 을 짜라 (Currier Path)
자신있는 분야, 흥미있는 분야부터 공략해라
돈 되는 것, 남이 원하는 것만 하게되면 언젠가 후회한다.
쉬운 것부터 해라
폼생폼사가 아니다.
첨부터 잘하는 놈 없다.
눈에 보이는 것부터 해라 - 남들에게 Feedback 을 쉽게 받을 수 있는 것
을 해라
최종적으로는?
자신이 오래 할 수 있는 것을 해라
성과가 높은 것?
자동화가 가능한 것?
항상 새로운 것?
9
10. 학습전략
10
개발방법론 CBD (UML) Waterfall Agile
Language Java (OOP) Python C/C++
Scala
(Functional)
Frontend HTML /
JavaScript
jQuery
Responsible
Web
JavaScript
Framework
NodeJS
Backend 자료구조 WAS
멀티스레딩
비동기
분산 서버
DATA RDBMS NoSQL Hadoop Spark
Machine
Learning
Infra OS / Linux
Build
Automation
Docker AWS (Cloud)
11. 11
KEST 개발자
Backend
이론
자료구조
디자인패턴
Framework
Spring
Framework
Spring MVC
Spring Data
Spring Batch
Spring
Integration
비동기
Java NIO
Concurrency
Parallel
Programming
분산환경
HA 구성
분산 Cache
Frontend
JavaScript
jQuery
AngularJS
React
Meteor
Resposible
Bootstrap
CSS3
Mobile App
Android
iOS / Swift
Database
RDBMS
Persistence
Framework
SQL Mapper
MyBatis
jOOQ
ORM
Hibernate
JPA
Oracle PostgreSQL
PostGIS
HStore
NoSQL
MongoDB
Redis
ElasticSearch
InfluxDB
13. 책 읽기 방법
좋은 책을 선택해라
다독보다 양서를 읽어라
변화가 심한 분야는 차라리 Blog Article 을 읽어라
Head First 류는 서점에서 간단히 읽어라 (돈이 아깝다)
추천도서를 우선순위에 둬라 (서평도 꼭 봐라)
되도록 영문원서를 읽을 수 있도록 해라 (SW 정보 변화를 생각해
라)
같은 책을 두번 이상 읽어라
끝까지 읽어라
처음에는 전체 구조 파악을 목표로 하라 (목차, 전체 내용 파악)
두번째는 정독하기 (예제는 실행해보기)
요즘은 예제도 github에 올라온다 (이런 책이 좋은 개발자가 쓴 책이다)
세번째부터는 모르는 부분, 즉시 적용해야 하는 부분
13
15. Programming Language 학습방법
자신에게 맞는 개발 환경을 구축해라
좋은 IDE (VS.NET, IntelliJ IDEA), 코딩용 폰트
언어의 Eco Environments 를 적극 활용하라
빌드 툴 (Maven, Gradle) 을 먼저 익혀라 (Ant 는 잊어라)
개발 프로세스를 먼저 익혀라
소스 관리 툴 (GIT) 을 익혀라
TDD 로 코딩하라
예제도 TDD 로 하라
실제 코딩 전에 테스트 코드로 검증하라
운영 OS 에 대한 기본 지식은 필수이다
프로그램이 구동되는 환경이다
되도록 운영 환경과 같은 환경에서 개발해라
15
18. 좋은 팀원이 되려면
문제를 숨기지 마라
지뢰를 심어놓으면, 나중에 다른 사람이 다친다
문제를 빨리 파악하는 능력을 키워야 한다 (TDD)
남의 문제에 대한 지적질도 매우 중요하다 (대안도 같이 제시)
꼼수는 필요하지만, 나중에 꼭 개선해야 한다 (Refactoring)
논쟁은 필수, 항상 Why 를 생각하라
누가 시켰어요 … (전 생각이 없어요)
지식은 나누면 더 크게 돌아온다
팀원의 경험과 Idea는 나눠야 팀의 역량이 강화된다
Communication Tool 을 적극 활용하라
개발자는 문제 해결사이다
문제 파악 / 문제 해결 경험을 많이 가져라 (직관도 높아진다)
협업 툴을 적극 활용하라
GIT, Wiki, Jira, Build Automation 등을 사용 못하면 팀에서 제외될 수 있다
18
20. 좋은 프로그래머가 되려면
소프트웨어 개발 방법론을 공부해라
CBD, DDD, TDD, Agile …
알고리즘을 배워라
자료구조는 기본이다
알고리즘은 작동여부 뿐 아니라 성능도 중요하다
H/W 를 알아야 한다
OS 의 기본 특성을 잘 알아야 한다 – OS 설정은 매우 중요하다
관심 분야의 Community 활동을 해라
회사 내부에 전문가가 없다하더라도 국내외에는 상당히 많다
영어를 못하더라도 상관없다. 외국애들 참 친절하다.
두가지 이상의 언어를 사용해야 한다 (Polyglat)
20
22. 좋은 코더가 되려면 1
내가 짠 코드는 내가 책임진다
코드가 작동되는 것을 책임진다 (증명한다)
의사코드(Pseudo code) 와 주석은 꼭 작성한다.
Logging Frameworks 을 잘 사용해야 한다
Log 만 보고도 시스템의 활동을 알 수 있어야 한다
Printf 가 아니다 ㅠ.ㅠ
읽기 쉬운 코드 (Readable Code) (참고)
코드는 간결하게, 중복 제거
Format 은 보기 좋게
변수는 의미있게 (한글이 아닌 영어 단어로 – JuminNo
CitizenNo)
함수명도 의미있게 (전치사를 잘 쓰면 좋다 – With, Of, By, On 등)
22
23. 23
/**
* 예보 발표 시각과 예보 시각에 해당하는 값을 조회한다. DB에 없으면 새로 생성하여 반환합니다.
*
* @param refTimeUtc 예보 발표 시각
* @param forecastTimeUtc 예보 시각
* @return {@link ForecastTime} 인스턴스, 없으면 null 반환
*/
default ForecastTime getOrCreate(@NonNull DateTime refTimeUtc, @NonNull DateTime forecastTimeUtc) {
ForecastTime time = findOne(refTimeUtc, forecastTimeUtc);
if (time == null) {
synchronized (this) {
time = findOne(refTimeUtc, forecastTimeUtc);
if (time == null) {
time = save(ForecastTime.of(refTimeUtc, forecastTimeUtc));
log.debug("새로운 ForecastTime 엔티티를 생성했습니다. {}", time);
}
}
}
return time;
}
1. 주석은 꼭 작성해야 한다
2. Logging 은 필요한 부분에 적절한 LEVEL로 추가한다 (비용문제)
참고 : Top 15+ Best Practices for Writing Super Readable Code
24. 24
public class MongoCacheItem extends AbstractMongoDocument {
private Object key;
private byte[] value;
private long expireAt = 0;
public Object getKey() {
return key;
}
public void setKey(Object key1) {
this.key = key1;
}
public byte[] getValue() {
return key;
}
public void setValue(byte[] value1) {
this.value = value1;
}
public long getExpireAt() {
return expireAt;
}
public void setExpireAt(long expireAt1) {
this.expireAt = expireAt1;
}
private static final long serialVersionUID = 5081372628460588627L;
}
@Getter
@Setter
public class MongoCacheItem extends AbstractMongoDocument {
private Object key;
private byte[] value;
private long expireAt = 0;
private static final long serialVersionUID = 5081372628460588627L;
}
Project Lombok
Java 의 Boilerplate 코드를 최대한 간결하게 줄여라
참고: Reducing Boilerplate Code with Project Lombok
26. 좋은 코더가 되려면 2
남의 좋은 코드를 참고하라
유명한 라이브러리의 소스를 자주 읽어라
사용하는 라이브러리의 소스를 자주 읽어라
좋은 코드 작성 능력은 하늘에서 떨어지는 게 아니다
좋은 소설도 초안이 여러 개이다
Refactoring 을 습관화하라 (변수명 개선, 구조 개선 등등)
디자인 패턴을 익히고 적용하라
디자인 패턴은 코딩 Best Practices
좋은 라이브러리를 사용해라
좋은 라이브러리를 채택하는 능력이 중요
검증된 라이브러리를 잘 사용하는 것이 능력이다
26
Editor's Notes
프로그래밍 언어 중 Java 는 굉장히 쉬운 언어이다.
다만, 같은 의미의 코드 작성 시 장황해지기 쉽다.
Lombok Project 의 Annotation 을 활용하면, 코드를 간결하게 작성할 수 있다