우아한테크코스 4기/프로젝트

테스트 코드의 어노테이션을 줄여보자 그리고 테스트 컨텍스트 캐싱의 이점을 얻자

giron 2022. 9. 13. 22:54
728x90

현재 프로젝트가 어느 정도 진행되면서 Test위에 붙는 Import도 늘어났다. 아래 사진처럼 매번 Repository 테스트를 할 때마다 붙여줘야 하는데 불편해서 어노테이션을 만들어서 정리를 해보았다.

예시

사실 포스팅 할만한 정도로 대단할 건 없지만 앞으로도 프로젝트를 진행하면 자주 적용할 것 같아서 기록해두려고 한다.

적용

메타 어노테이션을 활용하여 위와 같이 작성해주면 끝!

적용2

이제 @Repository만 작성하면 간편하게 적용이 가능하다. 또한 스프링은 테스트 시 매번 컨텍스트를 띄우지 않고 테스트가 사용하는 컨텍스트를 캐싱해서 여러 테스트가 1개의 (애플리케이션) 컨텍스트를 공유하는 방법을 제공한다. 즉, 테스트마다 동일한 컨텍스트를 사용하면 컨텍스트가 1번만 올라가므로 테스트 성능에도 좋다.

 

1) @Repository만 작성하면 간편하게 적용이 가능하다. 

2) (레포테스트기준)컨텍스트가 1번만 올라가므로 테스트 성능에도 좋다.

 

이렇게 끝내면 아쉬우니 어노테이션을 정리해보자.

 Java의 어노테이션은 크게 built-in 어노테이션과 Meta 어노테이션이 존재한다. 메타 데이터의 메타와 마찬가지로 어노테이션을 위한 어노테이션이다.

built-in어노테이션은 흔히 아는 @Overried, @Deprecated, @SuppressWarnings 등이 있다.

메타 어노테이션

Retention

Retention

해당 어노테이션의 정보를 어느 범위까지 유지할 것인지를 설정한다. 

  • RetentionPolicy.SOURCE: 컴파일 전까지만 유효하며 컴파일 이후에는 사라짐
  • RetentionPolicy.CLASS: 컴파일러가 클래스를 참조할 때까지 유효함
  • RetentionPolicy.RUNTIME: Reflection을 사용하여 컴파일 이후에도 JVM에 의해 계속 참조가 가능함

Target

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: 해당 어노테이션을 하위 클래스까지 적용한다.

728x90