기본 콘텐츠로 건너뛰기

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 ) public class AppTest { @Test public void test1 () { ... } } ... 그래서 @ContextConfiguration 에 class

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

lombok 은 Annotation Processing과 Instrumentation을 사용한다. Instrumentation은  이클립스는 별도 컴파일러 가 있기 때문에 이클립스 종속적인 bytecode 처리에 사용되고, AnnotationProcessor에서는 Annotation별로 코드를 생성하는데 사용된다. Annotation별 코드 생성이란, 예를 들어 @Getter를 선언하면 실제 getter가 생성된다. @Getter String name ; public String getName () { return this . 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