기본 콘텐츠로 건너뛰기

12월, 2015의 게시물 표시

Spring Boot + Spring Batch 그리고 CommandLineRunner Unit 테스트 하기

커멘드라인에서 실행되는 배치 어프리케이션을 작성할때 겪었던 2가지 문제 정리

첫번째, 커멘드라인에서 실행하는 배치프로그램을 만들때 spring.batch.job.enabled 옵션을 꺼두지 않아 Job이 두번 실행되는 문제

http://stackoverflow.com/questions/23447948/how-spring-boot-run-batch-jobs
http://stackoverflow.com/questions/22318907/how-to-stop-spring-batch-scheduled-jobs-from-running-at-first-time-when-executin

spring.batch.job.enabled: false

두번째, 부트기반 커멘드라인 어프리케이션은 UnitTest를 작성하기가 불편하기 때문에 CommandLineRunner 인터페이스를 사용했다. 이 CommandLineRunner는 스프링 빈이 모두 생성 후 호출되어 Unit Tese 작성이 수월하다.

문제는 Unit Test를 설정에 @SpringApplicationConfiguration 을 사용하면 CommandLineRunner가 바로 실행 되어 버린다. CommandLineRunner가 여러개일 경우나 인자를 넘겨야 할 때는 문제가 된다. @SpringApplicationConfiguration은 단순히 SpringApplicationConfiguration Loader를 @ContextConfiguration로 사용하는 어노테이션이다. ( 코드 )

...@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(classes = App.class)publicclassAppTest{@Testpublicvoid test1(){...}}...
그래서 @ContextConfiguration 에 class를 지정하면 CommandLineRunner가 바로 실행되지 않게 할 수 있다.

...@RunWith(SpringJUnit…

Lombok은 어떻게 동작되나? 간단정리

lombok은 Annotation Processing과 Instrumentation을 사용한다. Instrumentation은 이클립스는 별도 컴파일러가 있기 때문에 이클립스 종속적인 bytecode 처리에 사용되고, AnnotationProcessor에서는 Annotation별로 코드를 생성하는데 사용된다.
Annotation별 코드 생성이란, 예를 들어 @Getter를 선언하면 실제 getter가 생성된다. @Getter String name;
public String getName(){returnthis.name;}
간단히 lombok구현은 AnnotationProcessor를 이용한 컴파일 시점 코드 생성으로 요약 할 수 있다. AnnotationProcessor는 Java Compiler와 관련이 있다. 잠시 정리해 보자 http://openjdk.java.net/groups/compiler/doc/package-overview
javac는 크게 두가지 부분으로 나눈다. 하나는 ".java"을 ".class"로 바꾸는 컴파일러이고 다른 하나는 컴파일러를 지원하는 환경이다.
컴파일러 환경은 세가지 API 패키지를 제공하고
Language Model API ( javax.lang.model package ) Annotation Processing API ( javax.annotation.processing package ) Compiler Tree API( com.sun.source package ) 컴파일러는 Java Compiler API 패키지를 제공한다.
Java Compiler API ( javax.tools package ) 
javac는 세가지 방식으로 호출 할 수 있다.
com.sun.tools.javac.main.Main: 커멘드라인에서 직접 호출 java Compiler API: javax.tools 패키지 이용 Compiler Tree API: javax.tools.CompilationTask를 com…