SlideShare a Scribd company logo
1 of 54
오오픈픈 소소스스를를 활활용용한한 게게임임 배배치치 
플플랫랫폼폼 개개선선 사사례례 
NCSOFT 김형석
OVERVIEW 
• 구 배치 환경 소개 
• 개선 방향 
• 솔류션 평가 및 선정 
• 계획 및 일정 
• 개선 결과
배치 구성도 
HTTP 
XML 
Game API 
BATCH SERVER 
WEB DB
구 배치 수집 현황 
• 스케쥴링 : RAC XML에 명시된 Quart JOB 을 수행 
• 마샬링 : Xstream 
• 일 수집 데이터 평균 건수 : 10만건 
• 배치 JOB 건수 : 9 건 
• JOB 이력 관리 단일 테이블을 통해 전체 JOB 이 수행 여부 체크 
• (조건 : 완료가 안되었거나 작업 완료후 4시간 지난경우)
문제점 
• 특정 시간 혹은 작업 이력테이블상에선 알수 없는 
이유로 인해 배치가 동작이 안됨 
• 특정 JOb 구동시 3시간 30 분 이상 소요 
가 되며 
시간이 지날수록 점차 증대 
• 재 구동시에도 반복적인 현상 발생되며 톰켓상 오류로는 
배치 상세 문제 확인이 어렵고 테스트가 불가능 
.
장애 및 지연 원인 
• 1건 처리시마다 Sleep 구간을 두어 시간이 지연 
• 대량의 데이타 등록후 데이타 미삭제로 인해 
인덱스 단편화 발생되어 성능 하락 
• 특정 JOB 실패시 작업 이력 테이블 삭제가 되며 
해당 JOB 재시도가 아닌 전체 배치 재 구동되어 시간 지연 
• 데이터 한건마다 트랜잭션을 수행하며 대량 데이터 일괄 처리를 
위한 ORM BATCH 기능 부재
조치 사항 
• 시간 체크주기를 3 시간에서 4 시간 으로 임시 증가 
• 배치를 재 구동후 전체가 완료될때까지 수동 모니터링 
• JOB 별로 하나씩 처리후 Tomcat Restart 후 반복 확인
근본적인 문제 
• 로깅 및 메세지 , 예외 처리 문제 
– 특정 배치 JOB 에 대한 실행, 시작, 종료, 성공 여부, 오류 사항에 대한 로그가 
없어서 명확한 원인 파악이 불가능 
• 모니터링 시스템에 대한 부재 
– 배치 오류시 개발자에 의한 확인보다는 장애 확인요청에 의한 대응 
• 일괄 처리 정책 미흡 
– 대량의 데이터 처리시 DB 에 영향을 최소화 하며 일정 단위로 나누어 한꺼번에 
처리하는 방법이 필요함 
• 부분 처리에 대한 고려 필요 
– 실행 중인 작업이 중간에 에러 발생시 전체 작업을 재시도하기때문에 진행 부분에 
대한 파악이 어려움 
• 테스트 환경의 어려움 : 
– 처리되는 전체작업을 하나의 단위로 처리하는 경우가 많기 때문에 에러 발생시 디 
버깅에 어렵다.
OVERVIEW 
• 배치 소개 
• 개선 방향 
• 솔류션 평가 및 선정 
• 추진 계획 
• 개선 결과
개선 방향
사용자와의 상호 작용 
• 일반적인 온라인 Application 과 달리 사용자에 의해 
실행이 결정되지 않는다 . 
• 주어진 시간외에 독립적으로 배치를 실행 지원 
• 실시간 동작되는 배치를 업무 필요상 중단 혹은 재 
시작을 손쉽게 할수 있어야 한다.
정해진 시간내에 실행이 완료 
• 사업 및 기획 요구 특성에 따라 수집 데이터 증가되고 
있으며 전형적인 CNP 패턴으로 유사 코드 반복으로 
인해 정책 반영이 느림 
• WAS 위에 동작되는 어플리케이션으로 서로 다른 배치 
가 
영향을 주고 받아 성능 문제 발생 
• 업무 로직 개선과 배치 분리 개선 병행
대량의 데이터를 다루기 위한 
성능 최적화 
• 배치 처리 에러 발생시 전체가 롤백됨 
• 트랜잭션 단위가 껀별로 진행되어 성능지연 
• 전체 ( 성공 &실패) 단위로 배치가 구성되어 부분 처 
리 미흡 
• FILE 및 DB I/O 최소화 및 프로그램 최적화 
• 병렬 처리
관리 시스템 구축과 기반 설계 
• 모듈 활용의 부족 
• ORM BATCH 기능 부재 
• 장애 관련 모니터링 시스템 부족 
• 배치 상세 모니터링 시스템 구성 
• 아키텍처 모듈 최적화 
• 배치 정책 (재시도, 재시작,건너뛰기) 수립 
• SPRING 및 오픈 소스 최대 활용 
• Jenkins 활용한 배치 모니터링 시스템 구성
배치 서비스 표준화 
• 배치에서의 정보 항목등이 명확하지 않음 
– 작업주기, 작업 유형 , 작업 현황 정의 
• 배치 기술 유형이 불분명하고 , 기술 유형별로 구현 방 
법이 상이 
– 입출력 리소스 추상화 , 사용 도구 , 처리 흐름 , 적 
용 기술
배치 서비스 표준화 
• 개인역량에 따라 각기 배치 어플리케이션의 보안 , 성 
능, 
자원관리 개발이 이루어지고 품질 확보가 어려움 
• 기존 Batch SYSTEM 
– Linux 의 Crontab을 이용한 Shell Script 
– Windows 의 작업스케쥴러를 이용한 batch script 
– Web Service 안에 Web Call 호출 방식 
– Web Service 안에 QuartzJob 이용 
– 자체 배치 플랫폼 개발 
– Legacy (C, C++, php, ETL, rsync, perl, python, Pure Java)
배치 서비스 표준화 
• 트랜잭션에 대한 깊은 고민 부족 
– 지나치게 긴 트랜잭션은 DB 자원 (Rollback 
Segement) 
한계 부딪칠 가능성 높다 
– 짧은 트랜잭션은 좋은 성능 보장이 어려움 
DB 및 운영 특성에 맞게 일정 사이즈로 데이터 
를 
균일하게 Fetch 하여 적정횟수 만큼 Commit 
문서 참고 : http://helloworld.naver.com/helloworld/1247
배치 서비스 표준화 개선 절차 
• 비즈니스 변화에 대한 빠른 대응과 저 비용으로 
고품질을 만들수 있어야 한다. 
• 유형별로 빨리 만들어 낼수 있어야 한다. 
• 반복되는 로깅, 보안, 예외처리, 신경 끄기 
• 개발자에게 노출이 필요한 부분 최소화 
• 배치 기반 특성이 충분히 반영되어야 한다
OVERVIEW 
• 배치 소개 
• 개선 방향 
• 솔류션 평가 및 선정 
• 추진 계획 
• 개선 결과
솔류션 평가 및 선정 
• SPRING BATCH 
• SPRING DATA JPA 
• SPRING BOOT 
• JdbcTemplate 
• Java Configuration
SPRING BATCH + ALPHA 
• Run Tier : 실행과 스케쥴링 담당 ( Spring Boot, Jenkins) 
• Job Tier : 전체적인 JOB 수행 책임 (Spring Batch) 
• Application Tier : JOB 을 수행하는 필요한 컴포넌트 
(Spring Data Jpa, Java Configuration) 
• Data Tier : DataBase, Flat, XML 등 물리적 데이터 리소스
SPRING BATCH 
• Spring 의 기술력과 컨설팅 회사인 Accenture 의 
대형 금융권 배치 기술 아키텍처의 경험이 녹여듬 
• 자바 환경에서 사실상 표준인 Spring 활용 
• 국내 및 해외 유수 보험 및 금융기관에서 채택되어 
전사 표준 배치로 사용중 
• Spring 추상화 기술로 특정 기술에 종속적이지 않음
SPRING BATCH 
AmqpItemReader 
JpaPagingItemReader 
IbatisPaingItemReader 
JdbcCursorItemReader 
MultiResourceItemReader 
FlatFileItemReader HibernatecursorItemReader 
JmsItemReader 
ListItemReader 
MongoItemReader Neo4jItemReader 
RepositoryItemReader 
ResourceItemReader 
StaxEventItemReader StoredProcedureItemReader
SPRING BATCH 
문서 참고 : http://docs.spring.io/spring-batch-old/1.1.x/spring-batch-docs/reference/html-single/index.html
SPRING BATCH 
• 혼자 이해하던 복잡한 Legacy 배치를 배치 프 
레임워크 변환후 동료들과 공유 가능 
• JOB 문제시 추적 범위가 좁혀져 오류 발생시 
원인파악이 쉬움 
• 코딩량이 이전에 비해 ½로 줄어듬 
• 배치 로직 구현이 단일건 대상으로 이해가 쉬 
움
SPRING DATA JPA 
• 도메인 클래스에 대한 투명한 감시 및 관리 
• 페이징 지원, 다이나믹 쿼리 수행, 데이터 엑세스 코드를 도메인에 통합 
• ANNOTATION 으로 테이블 매핑
SPRING DATA JPA
SPRING DATA JPA 
• 반복적인 쿼리 노가다 삽질 작업 제거 
• 엔티티 기반 도메인 설계에 집중 
• 비즈니스 로직 구현 최소화 
• 인터페이스 정의만 하면 알아서 구현체 생성 
• 변경 사항에 대한 개발 기간 단축 
• 코딩량이 이전의 ½ 로 줄어듬 
• 손쉬운 테스트 코드 작성
SPRING BOOT 
• Spring 프로젝트 개발을 빠르고 다양한 방법으로 
시작할수 있도록 한다. 
• 설정을 위해 별도의 코드 구현이 없으며 XML 이 
필요치 않다. 
• Tomcat 과 Jetty가 내장됨 
• 임베디드서버, 시큐리티, 헬스체크, 외부 설정 연 
계등 개발의 모든 사이클을 제공한다.
SPRING BOOT 
spring-boot-starter-actuator 
spring-boot-starter-amqp 
spring-boot-starter-aop 
spring-boot-starter-batch 
spring-boot-starter-data-elasticsearch 
spring-boot-starter-data-gemfire 
spring-boot-starter-data-jpa 
spring-boot-starter-data-mongodb 
spring-boot-starter-data-rest 
spring-boot-starter-data-solr 
spring-boot-starter-freemarker 
spring-boot-starter-groovy-templates 
spring-boot-starter-hornetq 
spring-boot-starter-integration 
spring-boot-starter-jdbc 
spring-boot-starter-jetty 
spring-boot-starter-log4j 
spring-boot-starter-logging 
spring-boot-starter-mobile 
spring-boot-starter-parent 
spring-boot-starter-redis 
spring-boot-starter-remote-shell 
spring-boot-starter-security 
spring-boot-starter-social-facebook 
spring-boot-starter-social-linkedin 
spring-boot-starter-social-twitter 
spring-boot-starter-test 
spring-boot-starter-thymeleaf 
spring-boot-starter-tomcat 
spring-boot-starter-velocity 
spring-boot-starter-web 
spring-boot-starter-websocket 
spring-boot-starter-ws 
spring-boot-starter 
Boot Application Starter
SPRING BOOT 
Endpoints 
ID 설명 
Autoconfig 자동 설정되거나 설정되지 않는 목록들과 그 이유 
Bean 어플리케이션에서 선언한 Bean 목록들 
Configprops Properties 로 선언된 목록들 
Dump Thread Dump 
Env 시스템 환경 및 어플리케이션 환경 목록 
Health 어플리케이션 상태 체크 
Info 어플리케이션 정보 
metrics 어플리케이션의 메트릭스 정보 
mappings @RequestMapping 에 매핑된 경로 정보 
shutdown 어플리케이션 종료 
trace Http 요청 정보
SPRING BOOT 
Endpoints Example
SPRING BOOT 
Magic 
@Configuration 
@EnableAutoConfiguration 
@ComponentScan 
public class Start { 
public static void main(String[] args) { 
if (args.length == 0) { 
args = new String[]{ "date=" + getCurrentDate()}; 
} 
SpringApplication.run(AppConfig.class, args); 
}
JAVA CONFIGURATION 
스크롤의 압박
JAVA CONFIGURATION
OVERVIEW 
• 배치 소개 
• 개선 방향 
• 솔류션 평가 및 선정 
• 추진 계획 
• 개선 결과
추진 계획 
2014 
3월 4월 5월 
13 19 03 30 08 20 28 
Start With GitHub 
1차 Prototype 구현 
성능 테스트 
Major JOB 완료 
및 모듈 구성 
2차 Prototype 
Spring Data JPA 연동 
Spring Boot 연동 
망별 성능 테스트 
End With Live Deploy 
Jenkins 을 활용한 스케쥴링 
Timeline
OVERVIEW 
• 배치 소개 
• 개선 방향 
• 솔류션 평가 및 선정 
• 추진 계획 
• 개선 결과
속도 및 코드 개선 
배치 수행 시간 코드 라인 수 
Lombok 
제외
운영 및 모니터링 개선 
• Jenkins 을 활용한 스케쥴링 자동화 
– Job failure, Load balancing 
– Web UI에서 로그 확인 
– Retry , 노드 확장성 
Jenkins JOB Spring Batch
운영 및 모니터링 개선 
스케쥴 관리 
실행 스크립트 
Profile 설정
운영 및 모니터링 개선 
• JOB 실패시 DB 이력 
•
운영 및 모니터링 개선 
• Spring Batch Listener 를 활용한 배치 상세 로그 관리 
– Job 별 수행건수, 수행시간, 에러메세지, 배치 상태, 
커밋, 롤백, 파라미터 관리, Skip, 에외 처리 기록…
운영 및 모니터링 개선 
Spring Boot 를 활용한 어플리케이션 생성 , JOB 손쉬운 관리 
#SPRING BATCH 
Spring.batch.job.names=armorItemXmlToDbJob 
Spring.batch.job.enabled=true 
Spring.batch.initalizer.enabled=false 
• spring.batch.job.names : Context 에 등록된 Bean 중 해당하는 JOB 만 명시적으로 선 
언하여 사용할지 선택하며 comma 로 구분 
• spring,batch.job.enabled : Spring Ruuner 가 구동시 모든 JOB 을 수행할지 여부 
• spring,batch.initializer.enable : 데이타베이스 플랫폼에 해당하는 SQL 초기화 스크립 
트를 수행 여부
테스트 및 유지보수 개선 
• 망별 환경설정을 통해 XML , URL Resource 자동 분기 
– Spring.profiles.active, spring.core.io.resource
테스트 및 유지보수 개선 
• 단계별 JOB 수행 및 테스트 코드를 통해 빠른 테스트 
진행 및 선택적 확인 가능 
– Full Test Code Support
테스트 및 유지보수 개선 
• SPRING DATA JPA를 통한 반복적 쿼리 작업 제거 
NO
테스트 및 유지보수 개선 
• Web Project에서 배치를 제거하여 관심 분리 
• 유지보수 집중화 
WEB WEB 
BATCH 
BATCH
로직 개선 
• 쿼리 및 비즈니스 로직 최소화 
MVC 
패턴 
SPRING 
DATA 
SPRING 
BATCH 
SPRING 
DATA 
Domain -> Service -> ServiceImpl -> DAO -> DaoImpl -> 쿼리 
Domain -> Service -> Repository 
Domain -> Processor
배포 개선 
With Spring BOOT
고려사항 
• 코드양은 줄어드는 반면 개념이해는 필수 
• SPRING 프로젝트들은 계속 진화중 
• SPRING-BATCH 는 동일 JOB Repository 에 동일한 JOB-NAME 과 
JOB-PARAMETER 로 JOB Instance 생성 불가 
• BATCH JOB 은 성격이 다양하기 때문에 SPRING에서 다양한 해결 
방법을 지원한다 
• 바퀴를 재 개발하지 말고 오픈 소스를 찾아서 사용하자 
• 장애 발생을 최소화 하고 TestCase를 통해 사전에 문제를 예방 
• 테스트가 어느 자리, 어느 망에서도 쉽게 재현되도록 준비
참고 
• http://blog.skcc.com/932 
• http://www.manageability.org/blog/stuff/open-source-etl 
• http://docs.spring.io/spring-boot/docs/current- 
SNAPSHOT/reference/htmlsingle/#boot-features-external-config 
• http://www.slideshare.net/knight1128/batch-8508863 
• http://www.dbguide.net/knowledge.db? 
cmd=view&boardUid=128487&boardConfigUid=20&boardStep=0 
•
DEMO 
• https://github.com/ghostflare76/spring-batch-extension/ 
tree/master/spring_batch
배치는 
오픈소스+ 스프링 조합으로 
간단하게 끝

More Related Content

What's hot

02.실행환경 교육교재(데이터처리)
02.실행환경 교육교재(데이터처리)02.실행환경 교육교재(데이터처리)
02.실행환경 교육교재(데이터처리)Hankyo
 
04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)Hankyo
 
04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)Hankyo
 
spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례Daehwan Lee
 
SMARTSTUDY Django 오픈 세션 2012-08
SMARTSTUDY Django 오픈 세션 2012-08SMARTSTUDY Django 오픈 세션 2012-08
SMARTSTUDY Django 오픈 세션 2012-08Hyun-woo Park
 
Tomcat monitoring using_javamelody
Tomcat monitoring using_javamelodyTomcat monitoring using_javamelody
Tomcat monitoring using_javamelody중선 곽
 
[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core Ji-Woong Choi
 
세미나 Spring mybatis
세미나 Spring mybatis세미나 Spring mybatis
세미나 Spring mybatisSomang Jeong
 
Springcamp spring boot intro
Springcamp spring boot introSpringcamp spring boot intro
Springcamp spring boot introJae-il Lee
 
04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재Hankyo
 
Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Jaesup Kwak
 
[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance Tuning[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance TuningJi-Woong Choi
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
스프링 부트와 로깅
스프링 부트와 로깅스프링 부트와 로깅
스프링 부트와 로깅Keesun Baik
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초Kwangyoun Jung
 
[오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC [오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC Ji-Woong Choi
 

What's hot (20)

02.실행환경 교육교재(데이터처리)
02.실행환경 교육교재(데이터처리)02.실행환경 교육교재(데이터처리)
02.실행환경 교육교재(데이터처리)
 
04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)04.실행환경 교육교재(화면처리)
04.실행환경 교육교재(화면처리)
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)04.실행환경 실습교재(화면처리)
04.실행환경 실습교재(화면처리)
 
spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례spring.io를 통해 배우는 spring 개발사례
spring.io를 통해 배우는 spring 개발사례
 
SMARTSTUDY Django 오픈 세션 2012-08
SMARTSTUDY Django 오픈 세션 2012-08SMARTSTUDY Django 오픈 세션 2012-08
SMARTSTUDY Django 오픈 세션 2012-08
 
Spring boot actuator
Spring boot   actuatorSpring boot   actuator
Spring boot actuator
 
Tomcat monitoring using_javamelody
Tomcat monitoring using_javamelodyTomcat monitoring using_javamelody
Tomcat monitoring using_javamelody
 
[오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core [오픈소스컨설팅]Spring 3.1 Core
[오픈소스컨설팅]Spring 3.1 Core
 
세미나 Spring mybatis
세미나 Spring mybatis세미나 Spring mybatis
세미나 Spring mybatis
 
Springcamp spring boot intro
Springcamp spring boot introSpringcamp spring boot intro
Springcamp spring boot intro
 
04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재04.[참고]개발환경 실습교재
04.[참고]개발환경 실습교재
 
Express 프레임워크
Express 프레임워크Express 프레임워크
Express 프레임워크
 
Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)Spring boot-summary(part2-part3)
Spring boot-summary(part2-part3)
 
[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance Tuning[오픈소스컨설팅]Java Performance Tuning
[오픈소스컨설팅]Java Performance Tuning
 
HTTP web server 구현
HTTP web server 구현HTTP web server 구현
HTTP web server 구현
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
스프링 부트와 로깅
스프링 부트와 로깅스프링 부트와 로깅
스프링 부트와 로깅
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
 
[오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC [오픈소스컨설팅]Spring MVC
[오픈소스컨설팅]Spring MVC
 

Similar to 오픈 소스를 활용한 게임 배치 플랫폼 개선 사례

Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스Hee Jae Lee
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)수보 김
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기Brian Hong
 
VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리Gyuwon Yi
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나JeongHwan Kim
 
모바일 Rpg 게임서버 제작
모바일 Rpg 게임서버 제작모바일 Rpg 게임서버 제작
모바일 Rpg 게임서버 제작기환 천
 
마이크로서비스 아키텍처 기반의 의료정보시스템 고도화 전환사례.건국대학교병원.이제관
마이크로서비스 아키텍처 기반의 의료정보시스템 고도화 전환사례.건국대학교병원.이제관마이크로서비스 아키텍처 기반의 의료정보시스템 고도화 전환사례.건국대학교병원.이제관
마이크로서비스 아키텍처 기반의 의료정보시스템 고도화 전환사례.건국대학교병원.이제관제관 이
 
Talk IT_ Oracle_한혜영_110720
Talk IT_ Oracle_한혜영_110720Talk IT_ Oracle_한혜영_110720
Talk IT_ Oracle_한혜영_110720Cana Ko
 
[웨비나] 클라우드 마이그레이션 수행 시 가장 많이 하는 질문 Top 10!
[웨비나] 클라우드 마이그레이션 수행 시 가장 많이 하는 질문 Top 10![웨비나] 클라우드 마이그레이션 수행 시 가장 많이 하는 질문 Top 10!
[웨비나] 클라우드 마이그레이션 수행 시 가장 많이 하는 질문 Top 10!Open Source Consulting
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2Daniel Lim
 
주니어 개발자의 서버 로그 관리 개선기
주니어 개발자의 서버 로그 관리 개선기주니어 개발자의 서버 로그 관리 개선기
주니어 개발자의 서버 로그 관리 개선기Yeonhee Kim
 
성장하는 스타트업의 프로세스 개척기
성장하는 스타트업의 프로세스 개척기성장하는 스타트업의 프로세스 개척기
성장하는 스타트업의 프로세스 개척기DomainDriven DomainDriven
 
MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바NeoClova
 
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...Amazon Web Services Korea
 
Visual studio team system with agile tech days 2010
Visual studio team system with agile tech days 2010Visual studio team system with agile tech days 2010
Visual studio team system with agile tech days 2010준일 엄
 
스마일게이트 서버개발캠프 - QuadCore - BTS Deck
스마일게이트 서버개발캠프 - QuadCore - BTS Deck스마일게이트 서버개발캠프 - QuadCore - BTS Deck
스마일게이트 서버개발캠프 - QuadCore - BTS DeckServerDevCamp
 
Spring vs. spring boot
Spring vs. spring bootSpring vs. spring boot
Spring vs. spring bootChloeChoi23
 

Similar to 오픈 소스를 활용한 게임 배치 플랫폼 개선 사례 (20)

Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
[오픈소스컨설팅]Session 6. scrum과 jira 기반의 소프트웨어 개발 프로세스
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
 
쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기쿠키런 1년, 서버개발 분투기
쿠키런 1년, 서버개발 분투기
 
VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리VSTS와 Azure를 이용한 팀 프로세스 관리
VSTS와 Azure를 이용한 팀 프로세스 관리
 
스프링 배치
스프링 배치 스프링 배치
스프링 배치
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나
 
모바일 Rpg 게임서버 제작
모바일 Rpg 게임서버 제작모바일 Rpg 게임서버 제작
모바일 Rpg 게임서버 제작
 
마이크로서비스 아키텍처 기반의 의료정보시스템 고도화 전환사례.건국대학교병원.이제관
마이크로서비스 아키텍처 기반의 의료정보시스템 고도화 전환사례.건국대학교병원.이제관마이크로서비스 아키텍처 기반의 의료정보시스템 고도화 전환사례.건국대학교병원.이제관
마이크로서비스 아키텍처 기반의 의료정보시스템 고도화 전환사례.건국대학교병원.이제관
 
Talk IT_ Oracle_한혜영_110720
Talk IT_ Oracle_한혜영_110720Talk IT_ Oracle_한혜영_110720
Talk IT_ Oracle_한혜영_110720
 
[웨비나] 클라우드 마이그레이션 수행 시 가장 많이 하는 질문 Top 10!
[웨비나] 클라우드 마이그레이션 수행 시 가장 많이 하는 질문 Top 10![웨비나] 클라우드 마이그레이션 수행 시 가장 많이 하는 질문 Top 10!
[웨비나] 클라우드 마이그레이션 수행 시 가장 많이 하는 질문 Top 10!
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2개발 생산성 향상 기법 V1.2
개발 생산성 향상 기법 V1.2
 
주니어 개발자의 서버 로그 관리 개선기
주니어 개발자의 서버 로그 관리 개선기주니어 개발자의 서버 로그 관리 개선기
주니어 개발자의 서버 로그 관리 개선기
 
성장하는 스타트업의 프로세스 개척기
성장하는 스타트업의 프로세스 개척기성장하는 스타트업의 프로세스 개척기
성장하는 스타트업의 프로세스 개척기
 
MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바
 
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
엔터프라이즈 클라우드 마이그레이션 준비와 실행. 그리고, 클라우드 운영 모범 사례 공유-최지웅, 오픈소스컨설팅 CTO / 장진환, 스마일샤...
 
Visual studio team system with agile tech days 2010
Visual studio team system with agile tech days 2010Visual studio team system with agile tech days 2010
Visual studio team system with agile tech days 2010
 
스마일게이트 서버개발캠프 - QuadCore - BTS Deck
스마일게이트 서버개발캠프 - QuadCore - BTS Deck스마일게이트 서버개발캠프 - QuadCore - BTS Deck
스마일게이트 서버개발캠프 - QuadCore - BTS Deck
 
Spring vs. spring boot
Spring vs. spring bootSpring vs. spring boot
Spring vs. spring boot
 

오픈 소스를 활용한 게임 배치 플랫폼 개선 사례

  • 1. 오오픈픈 소소스스를를 활활용용한한 게게임임 배배치치 플플랫랫폼폼 개개선선 사사례례 NCSOFT 김형석
  • 2. OVERVIEW • 구 배치 환경 소개 • 개선 방향 • 솔류션 평가 및 선정 • 계획 및 일정 • 개선 결과
  • 3. 배치 구성도 HTTP XML Game API BATCH SERVER WEB DB
  • 4. 구 배치 수집 현황 • 스케쥴링 : RAC XML에 명시된 Quart JOB 을 수행 • 마샬링 : Xstream • 일 수집 데이터 평균 건수 : 10만건 • 배치 JOB 건수 : 9 건 • JOB 이력 관리 단일 테이블을 통해 전체 JOB 이 수행 여부 체크 • (조건 : 완료가 안되었거나 작업 완료후 4시간 지난경우)
  • 5. 문제점 • 특정 시간 혹은 작업 이력테이블상에선 알수 없는 이유로 인해 배치가 동작이 안됨 • 특정 JOb 구동시 3시간 30 분 이상 소요 가 되며 시간이 지날수록 점차 증대 • 재 구동시에도 반복적인 현상 발생되며 톰켓상 오류로는 배치 상세 문제 확인이 어렵고 테스트가 불가능 .
  • 6. 장애 및 지연 원인 • 1건 처리시마다 Sleep 구간을 두어 시간이 지연 • 대량의 데이타 등록후 데이타 미삭제로 인해 인덱스 단편화 발생되어 성능 하락 • 특정 JOB 실패시 작업 이력 테이블 삭제가 되며 해당 JOB 재시도가 아닌 전체 배치 재 구동되어 시간 지연 • 데이터 한건마다 트랜잭션을 수행하며 대량 데이터 일괄 처리를 위한 ORM BATCH 기능 부재
  • 7. 조치 사항 • 시간 체크주기를 3 시간에서 4 시간 으로 임시 증가 • 배치를 재 구동후 전체가 완료될때까지 수동 모니터링 • JOB 별로 하나씩 처리후 Tomcat Restart 후 반복 확인
  • 8. 근본적인 문제 • 로깅 및 메세지 , 예외 처리 문제 – 특정 배치 JOB 에 대한 실행, 시작, 종료, 성공 여부, 오류 사항에 대한 로그가 없어서 명확한 원인 파악이 불가능 • 모니터링 시스템에 대한 부재 – 배치 오류시 개발자에 의한 확인보다는 장애 확인요청에 의한 대응 • 일괄 처리 정책 미흡 – 대량의 데이터 처리시 DB 에 영향을 최소화 하며 일정 단위로 나누어 한꺼번에 처리하는 방법이 필요함 • 부분 처리에 대한 고려 필요 – 실행 중인 작업이 중간에 에러 발생시 전체 작업을 재시도하기때문에 진행 부분에 대한 파악이 어려움 • 테스트 환경의 어려움 : – 처리되는 전체작업을 하나의 단위로 처리하는 경우가 많기 때문에 에러 발생시 디 버깅에 어렵다.
  • 9. OVERVIEW • 배치 소개 • 개선 방향 • 솔류션 평가 및 선정 • 추진 계획 • 개선 결과
  • 11. 사용자와의 상호 작용 • 일반적인 온라인 Application 과 달리 사용자에 의해 실행이 결정되지 않는다 . • 주어진 시간외에 독립적으로 배치를 실행 지원 • 실시간 동작되는 배치를 업무 필요상 중단 혹은 재 시작을 손쉽게 할수 있어야 한다.
  • 12. 정해진 시간내에 실행이 완료 • 사업 및 기획 요구 특성에 따라 수집 데이터 증가되고 있으며 전형적인 CNP 패턴으로 유사 코드 반복으로 인해 정책 반영이 느림 • WAS 위에 동작되는 어플리케이션으로 서로 다른 배치 가 영향을 주고 받아 성능 문제 발생 • 업무 로직 개선과 배치 분리 개선 병행
  • 13. 대량의 데이터를 다루기 위한 성능 최적화 • 배치 처리 에러 발생시 전체가 롤백됨 • 트랜잭션 단위가 껀별로 진행되어 성능지연 • 전체 ( 성공 &실패) 단위로 배치가 구성되어 부분 처 리 미흡 • FILE 및 DB I/O 최소화 및 프로그램 최적화 • 병렬 처리
  • 14. 관리 시스템 구축과 기반 설계 • 모듈 활용의 부족 • ORM BATCH 기능 부재 • 장애 관련 모니터링 시스템 부족 • 배치 상세 모니터링 시스템 구성 • 아키텍처 모듈 최적화 • 배치 정책 (재시도, 재시작,건너뛰기) 수립 • SPRING 및 오픈 소스 최대 활용 • Jenkins 활용한 배치 모니터링 시스템 구성
  • 15. 배치 서비스 표준화 • 배치에서의 정보 항목등이 명확하지 않음 – 작업주기, 작업 유형 , 작업 현황 정의 • 배치 기술 유형이 불분명하고 , 기술 유형별로 구현 방 법이 상이 – 입출력 리소스 추상화 , 사용 도구 , 처리 흐름 , 적 용 기술
  • 16. 배치 서비스 표준화 • 개인역량에 따라 각기 배치 어플리케이션의 보안 , 성 능, 자원관리 개발이 이루어지고 품질 확보가 어려움 • 기존 Batch SYSTEM – Linux 의 Crontab을 이용한 Shell Script – Windows 의 작업스케쥴러를 이용한 batch script – Web Service 안에 Web Call 호출 방식 – Web Service 안에 QuartzJob 이용 – 자체 배치 플랫폼 개발 – Legacy (C, C++, php, ETL, rsync, perl, python, Pure Java)
  • 17. 배치 서비스 표준화 • 트랜잭션에 대한 깊은 고민 부족 – 지나치게 긴 트랜잭션은 DB 자원 (Rollback Segement) 한계 부딪칠 가능성 높다 – 짧은 트랜잭션은 좋은 성능 보장이 어려움 DB 및 운영 특성에 맞게 일정 사이즈로 데이터 를 균일하게 Fetch 하여 적정횟수 만큼 Commit 문서 참고 : http://helloworld.naver.com/helloworld/1247
  • 18. 배치 서비스 표준화 개선 절차 • 비즈니스 변화에 대한 빠른 대응과 저 비용으로 고품질을 만들수 있어야 한다. • 유형별로 빨리 만들어 낼수 있어야 한다. • 반복되는 로깅, 보안, 예외처리, 신경 끄기 • 개발자에게 노출이 필요한 부분 최소화 • 배치 기반 특성이 충분히 반영되어야 한다
  • 19. OVERVIEW • 배치 소개 • 개선 방향 • 솔류션 평가 및 선정 • 추진 계획 • 개선 결과
  • 20. 솔류션 평가 및 선정 • SPRING BATCH • SPRING DATA JPA • SPRING BOOT • JdbcTemplate • Java Configuration
  • 21. SPRING BATCH + ALPHA • Run Tier : 실행과 스케쥴링 담당 ( Spring Boot, Jenkins) • Job Tier : 전체적인 JOB 수행 책임 (Spring Batch) • Application Tier : JOB 을 수행하는 필요한 컴포넌트 (Spring Data Jpa, Java Configuration) • Data Tier : DataBase, Flat, XML 등 물리적 데이터 리소스
  • 22. SPRING BATCH • Spring 의 기술력과 컨설팅 회사인 Accenture 의 대형 금융권 배치 기술 아키텍처의 경험이 녹여듬 • 자바 환경에서 사실상 표준인 Spring 활용 • 국내 및 해외 유수 보험 및 금융기관에서 채택되어 전사 표준 배치로 사용중 • Spring 추상화 기술로 특정 기술에 종속적이지 않음
  • 23. SPRING BATCH AmqpItemReader JpaPagingItemReader IbatisPaingItemReader JdbcCursorItemReader MultiResourceItemReader FlatFileItemReader HibernatecursorItemReader JmsItemReader ListItemReader MongoItemReader Neo4jItemReader RepositoryItemReader ResourceItemReader StaxEventItemReader StoredProcedureItemReader
  • 24. SPRING BATCH 문서 참고 : http://docs.spring.io/spring-batch-old/1.1.x/spring-batch-docs/reference/html-single/index.html
  • 25. SPRING BATCH • 혼자 이해하던 복잡한 Legacy 배치를 배치 프 레임워크 변환후 동료들과 공유 가능 • JOB 문제시 추적 범위가 좁혀져 오류 발생시 원인파악이 쉬움 • 코딩량이 이전에 비해 ½로 줄어듬 • 배치 로직 구현이 단일건 대상으로 이해가 쉬 움
  • 26. SPRING DATA JPA • 도메인 클래스에 대한 투명한 감시 및 관리 • 페이징 지원, 다이나믹 쿼리 수행, 데이터 엑세스 코드를 도메인에 통합 • ANNOTATION 으로 테이블 매핑
  • 28. SPRING DATA JPA • 반복적인 쿼리 노가다 삽질 작업 제거 • 엔티티 기반 도메인 설계에 집중 • 비즈니스 로직 구현 최소화 • 인터페이스 정의만 하면 알아서 구현체 생성 • 변경 사항에 대한 개발 기간 단축 • 코딩량이 이전의 ½ 로 줄어듬 • 손쉬운 테스트 코드 작성
  • 29. SPRING BOOT • Spring 프로젝트 개발을 빠르고 다양한 방법으로 시작할수 있도록 한다. • 설정을 위해 별도의 코드 구현이 없으며 XML 이 필요치 않다. • Tomcat 과 Jetty가 내장됨 • 임베디드서버, 시큐리티, 헬스체크, 외부 설정 연 계등 개발의 모든 사이클을 제공한다.
  • 30. SPRING BOOT spring-boot-starter-actuator spring-boot-starter-amqp spring-boot-starter-aop spring-boot-starter-batch spring-boot-starter-data-elasticsearch spring-boot-starter-data-gemfire spring-boot-starter-data-jpa spring-boot-starter-data-mongodb spring-boot-starter-data-rest spring-boot-starter-data-solr spring-boot-starter-freemarker spring-boot-starter-groovy-templates spring-boot-starter-hornetq spring-boot-starter-integration spring-boot-starter-jdbc spring-boot-starter-jetty spring-boot-starter-log4j spring-boot-starter-logging spring-boot-starter-mobile spring-boot-starter-parent spring-boot-starter-redis spring-boot-starter-remote-shell spring-boot-starter-security spring-boot-starter-social-facebook spring-boot-starter-social-linkedin spring-boot-starter-social-twitter spring-boot-starter-test spring-boot-starter-thymeleaf spring-boot-starter-tomcat spring-boot-starter-velocity spring-boot-starter-web spring-boot-starter-websocket spring-boot-starter-ws spring-boot-starter Boot Application Starter
  • 31. SPRING BOOT Endpoints ID 설명 Autoconfig 자동 설정되거나 설정되지 않는 목록들과 그 이유 Bean 어플리케이션에서 선언한 Bean 목록들 Configprops Properties 로 선언된 목록들 Dump Thread Dump Env 시스템 환경 및 어플리케이션 환경 목록 Health 어플리케이션 상태 체크 Info 어플리케이션 정보 metrics 어플리케이션의 메트릭스 정보 mappings @RequestMapping 에 매핑된 경로 정보 shutdown 어플리케이션 종료 trace Http 요청 정보
  • 33. SPRING BOOT Magic @Configuration @EnableAutoConfiguration @ComponentScan public class Start { public static void main(String[] args) { if (args.length == 0) { args = new String[]{ "date=" + getCurrentDate()}; } SpringApplication.run(AppConfig.class, args); }
  • 36. OVERVIEW • 배치 소개 • 개선 방향 • 솔류션 평가 및 선정 • 추진 계획 • 개선 결과
  • 37. 추진 계획 2014 3월 4월 5월 13 19 03 30 08 20 28 Start With GitHub 1차 Prototype 구현 성능 테스트 Major JOB 완료 및 모듈 구성 2차 Prototype Spring Data JPA 연동 Spring Boot 연동 망별 성능 테스트 End With Live Deploy Jenkins 을 활용한 스케쥴링 Timeline
  • 38. OVERVIEW • 배치 소개 • 개선 방향 • 솔류션 평가 및 선정 • 추진 계획 • 개선 결과
  • 39. 속도 및 코드 개선 배치 수행 시간 코드 라인 수 Lombok 제외
  • 40. 운영 및 모니터링 개선 • Jenkins 을 활용한 스케쥴링 자동화 – Job failure, Load balancing – Web UI에서 로그 확인 – Retry , 노드 확장성 Jenkins JOB Spring Batch
  • 41. 운영 및 모니터링 개선 스케쥴 관리 실행 스크립트 Profile 설정
  • 42. 운영 및 모니터링 개선 • JOB 실패시 DB 이력 •
  • 43. 운영 및 모니터링 개선 • Spring Batch Listener 를 활용한 배치 상세 로그 관리 – Job 별 수행건수, 수행시간, 에러메세지, 배치 상태, 커밋, 롤백, 파라미터 관리, Skip, 에외 처리 기록…
  • 44. 운영 및 모니터링 개선 Spring Boot 를 활용한 어플리케이션 생성 , JOB 손쉬운 관리 #SPRING BATCH Spring.batch.job.names=armorItemXmlToDbJob Spring.batch.job.enabled=true Spring.batch.initalizer.enabled=false • spring.batch.job.names : Context 에 등록된 Bean 중 해당하는 JOB 만 명시적으로 선 언하여 사용할지 선택하며 comma 로 구분 • spring,batch.job.enabled : Spring Ruuner 가 구동시 모든 JOB 을 수행할지 여부 • spring,batch.initializer.enable : 데이타베이스 플랫폼에 해당하는 SQL 초기화 스크립 트를 수행 여부
  • 45. 테스트 및 유지보수 개선 • 망별 환경설정을 통해 XML , URL Resource 자동 분기 – Spring.profiles.active, spring.core.io.resource
  • 46. 테스트 및 유지보수 개선 • 단계별 JOB 수행 및 테스트 코드를 통해 빠른 테스트 진행 및 선택적 확인 가능 – Full Test Code Support
  • 47. 테스트 및 유지보수 개선 • SPRING DATA JPA를 통한 반복적 쿼리 작업 제거 NO
  • 48. 테스트 및 유지보수 개선 • Web Project에서 배치를 제거하여 관심 분리 • 유지보수 집중화 WEB WEB BATCH BATCH
  • 49. 로직 개선 • 쿼리 및 비즈니스 로직 최소화 MVC 패턴 SPRING DATA SPRING BATCH SPRING DATA Domain -> Service -> ServiceImpl -> DAO -> DaoImpl -> 쿼리 Domain -> Service -> Repository Domain -> Processor
  • 50. 배포 개선 With Spring BOOT
  • 51. 고려사항 • 코드양은 줄어드는 반면 개념이해는 필수 • SPRING 프로젝트들은 계속 진화중 • SPRING-BATCH 는 동일 JOB Repository 에 동일한 JOB-NAME 과 JOB-PARAMETER 로 JOB Instance 생성 불가 • BATCH JOB 은 성격이 다양하기 때문에 SPRING에서 다양한 해결 방법을 지원한다 • 바퀴를 재 개발하지 말고 오픈 소스를 찾아서 사용하자 • 장애 발생을 최소화 하고 TestCase를 통해 사전에 문제를 예방 • 테스트가 어느 자리, 어느 망에서도 쉽게 재현되도록 준비
  • 52. 참고 • http://blog.skcc.com/932 • http://www.manageability.org/blog/stuff/open-source-etl • http://docs.spring.io/spring-boot/docs/current- SNAPSHOT/reference/htmlsingle/#boot-features-external-config • http://www.slideshare.net/knight1128/batch-8508863 • http://www.dbguide.net/knowledge.db? cmd=view&boardUid=128487&boardConfigUid=20&boardStep=0 •
  • 54. 배치는 오픈소스+ 스프링 조합으로 간단하게 끝