명명 패턴보다 Annotation을 사용하라
1. 명명 패턴
- 원래는 도구나 프레임워크가 특별히 다뤄야 할 프로그램 요소에는
명명 패턴
을 적용해왔다.
- 예)
JUnit
은 ver.3 까지 테스트 메소드 이름은 test
로 시작해야 했다.
1) 명명 패턴의 단점
- 오타가 나면 메소드가 무시된다.
- 예) 테스트 메소드 앞에
test
를 붙여야 하는데 tast
를 붙이면 해당 테스트 메소드는 무시된다.
- 개발자는 테스트 메소드가 무시된 것을 테스트 메소드가 통과한 것으로 오해할 수 있다.
- 개발자가 뭐 앞에
test
만 붙이면 다 되는줄 안다.
- 메소드가 아닌 클래스 앞에
Test
를 붙여놓고, 해당 클래스에 정의된 메소드들이 테스트 메소드로 실행되길 바란다면?
- JUnit은 클래스 이름에는 관심이 없으며, 경고 메세지조차 출력하지 않는다.
- 개발자는 역시나 메소드들이 모두 무시된 것을, 테스트 메소드가 모두 통과한 것으로 오해할 수 있다.
- 매개변수를 사용할 수 없다.
- 특정 예외를 던져야만 성공하는 테스트가 있는 경우
- 기대하는 예외 타입을 테스트에 알려줘야 하지만 방법이 없다.
2) 단점을 어떻게 해결해야 하나?
- Annotation을 사용하면 명명 패턴이 가지는 위의 문제들을 해결할 수 있다.
2. Annotation
1) 마커 어노테이션 (Marker Annotation)
- 아무 매개변수 없이 단순히 달아주기만 하는 어노테이션
- 어노테이션에 오타를 내거나, 지정된 위치(메소드 위 등) 외 잘못된 위치에 어노테이션을 다는 경우
컴파일 오류가 발생하기 때문에 기존 명명 패턴에서 발생하던 문제를 해결할 수 있다.
- 테스트 메소드용 어노테이션을 직접 정의해보자.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test { ... }
@Retention(RetentionPolicy.RUNTIME)
@Test
가 런타임에도 유지되어야 한다는 표시. 생략하면 테스트 도구는 @Test
를 인식할 수 없다
@Target(ElementType.METHOD)
@Test
가 반드시 메서드 선언에서만 사용되어야 한다는 뜻
- 이렇게 어노테이션에 달 수 있는 어노테이션을 메타 어노테이션 이라고 한다.