테스트 코드의 어노테이션을 줄여보자 그리고 테스트 컨텍스트 캐싱의 이점을 얻자
현재 프로젝트가 어느 정도 진행되면서 Test위에 붙는 Import도 늘어났다. 아래 사진처럼 매번 Repository 테스트를 할 때마다 붙여줘야 하는데 불편해서 어노테이션을 만들어서 정리를 해보았다.
사실 포스팅 할만한 정도로 대단할 건 없지만 앞으로도 프로젝트를 진행하면 자주 적용할 것 같아서 기록해두려고 한다.
메타 어노테이션을 활용하여 위와 같이 작성해주면 끝!
이제 @Repository만 작성하면 간편하게 적용이 가능하다. 또한 스프링은 테스트 시 매번 컨텍스트를 띄우지 않고 테스트가 사용하는 컨텍스트를 캐싱해서 여러 테스트가 1개의 (애플리케이션) 컨텍스트를 공유하는 방법을 제공한다. 즉, 테스트마다 동일한 컨텍스트를 사용하면 컨텍스트가 1번만 올라가므로 테스트 성능에도 좋다.
1) @Repository만 작성하면 간편하게 적용이 가능하다.
2) (레포테스트기준)컨텍스트가 1번만 올라가므로 테스트 성능에도 좋다.
이렇게 끝내면 아쉬우니 어노테이션을 정리해보자.
Java의 어노테이션은 크게 built-in 어노테이션과 Meta 어노테이션이 존재한다. 메타 데이터의 메타와 마찬가지로 어노테이션을 위한 어노테이션이다.
built-in어노테이션은 흔히 아는 @Overried, @Deprecated, @SuppressWarnings 등이 있다.
메타 어노테이션
Retention
해당 어노테이션의 정보를 어느 범위까지 유지할 것인지를 설정한다.
- RetentionPolicy.SOURCE: 컴파일 전까지만 유효하며 컴파일 이후에는 사라짐
- RetentionPolicy.CLASS: 컴파일러가 클래스를 참조할 때까지 유효함
- RetentionPolicy.RUNTIME: Reflection을 사용하여 컴파일 이후에도 JVM에 의해 계속 참조가 가능함
Target
해당 어노테이션이 사용되는 위치를 결정한다.
- ElementType.PACKAGE : 패키지 선언 시 사용한다.
- ElementType.TYPE : 클래스, 인터페이스, 이넘 선언 시 사용한다.
- ElementType.CONSTRUCTOR : 생성자 선언시 사용한다.
- ElementType.FIELD : 맴버 변수 선언 시 사용한다.
- ElementType.METHOD : 메소드 선언 시 사용한다.
- ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언 시 사용한다.
- ElementType.LOCAL_VARIABLE : 지역 변수 선언시 사용한다.
- ElementType.TYPE_PARAMETER : 매개 변수 타입 선언 시 사용한다.
ElementType 내부에 설명이 잘 되어있어서 읽으면 될 것 같다.
Documented: JavaDoc 생성 시 Document에 포함되도록 한다.
Inherited: 해당 어노테이션을 하위 클래스까지 적용한다.