이전 절에서는 프로퍼티 파일을 이용하여 DAO나 페이지 컨트롤러 등을 관리하였다. 예전보다는 DAO나 페이지 컨트롤러를 추가하더라도 손이 덜 가는 구조이지만, 그럼이도 이전 객체들을 추가할 때마다 프로퍼티 파일에 한 줄 추가해야 하는 약간의 번거로움이 남아 있다. 이번 절에서는 이런 약간의 번거로움 마저도 없애 본다. 자바 '어노테이션(Annotation)'을 사용하여 이를 처리할 것이다.
'어노테이션'은 컴파일이나 배포, 실행할 때 참조할 수 있는 아주 특별한 주석이다. 어노테이션을 사용하면 클래스나 필드, 메서드에 대해 부가 정보를 등록할 수 있다. 이번 절을 통해 어노테이션을 실무 개발에 적용하는 방법을 배워 본다.
1. 어노테이션 활용
① 웹 애플리케이션이 시작되면 서블릿 컨테이너는 ContextLoaderListener 클래스에 대해 contextInitialized() 메서드를 호출한다.
② contextInitialized() 메서드는 ApplicationContext 객체를 생성합니다. 생성자의 매개변수 값으로 프로퍼티 파일의 경로를 넘긴다.
③ ApplicationContext 클래스 생성자는 프로퍼티 파일을 로딩하여 내부 맵에 보관한다.
④ ApplicationContext 클래스는 맵에 저장된 정보를 꺼내 인스턴스를 생성하거나 또는 톰캣 서버에서 객체를 가져온다.
⑤ 또한, 자바 classpath를 뒤져서 어노테이션이 붙은 클래스를 찾는다. 그리고 어노테이션에 지정된 정보에 따라 인스턴스를 생성한다.
⑥ 객체가 모두 준비되었으면, 각 객체에 대해 의존 객체를 찾아서 할당한다.
이전 절에서 배운 '프로퍼티를 이용한 객체 관리' 시나리오와 같다. 다만, 시나리오 중간에 어노테이션이 선언된 클래스를 탐색하는 부분이 추가되었다. 탐색 중, 어노테이션이 붙은 클래스를 발견하면 그 클래스의 인스턴스를 추가한다.
2. 어노테이션 정의
이제 DAO나 페이지 컨트롤러에 붙일 어노테이션을 정의한다. 클래스 선언에 붙일 @Component 어노테이션이다. 어노테이션의 기본값은 객체 이름이다.
//@Component 어노테이션의 사용 예
@Component("memberDao") //어노테이션 선언
class MemberDao {
...
}
spms.annotation 패키지를 생성한 뒤, 이 패키지에 Component 어노테이션을 생성한다.
package spms.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
//Component 어노테이션 속성 선언
@Retention(RetentionPolicy.RUNTIME) //어노테이션 유지 정책 : 어노테이션 정보를 언제까지 유지할 것인지 설정하는 문법
public @interface Component {
String value() default ""; //value 속성의 값 지정하지 않으면 default의 ""값이 기본값
}
어노테이션 문법은 인터페이스 문법과 비슷하다. interface 키워드 앞에 @가 붙는다.
public @interface Component {
...
}
객체 이름을 저장하는 용도로 사용할 'value'라는 기본 속성을 정의한다. value 속성은 값을 설정할 때 이름을 생략할 수 있는 특별한 기능이 있다.
String value() default ""; //value 속성의 값 지정하지 않으면 default의 ""값이 기본값
어노테이션의 속성을 선언하는 문법은 인터페이스에서 메서드를 선언하는 문법과 비슷하다. 그러나 인터페이스의 메서드와 달리 '기본값'을 지정할 수 있다. 속성 선언 다음에 오는 'default' 키워드가 기본값을 지정하는 문법이다. 즉 value 속성의 값을 지정하지 않으면 default로 지정한 값(예제 코드에서는 빈 문자열)이 할당된다.
- 어노테이션 유지 정책
어노테이션을 정의할 때 잊지 말아야 할 것은 어노테이션의 유지 정책을 지정하는 것이다. 이것을 깜박 잊고 개발하다가 한참을 헤매는 개발자를 자주 봤다. '어노테이선 유지 정책'이란 어노테이션 정보를 언제까지 유지할 것인지 설정하는 문법이다.
@Retention(RetentionPolicy.RUNTIME) //어노테이션 유지 정책 : 어노테이션 정보를 언제까지 유지할 것인지 설정하는 문법
앞의 코드에서 어노테이션의 유지 정책을 RUNTIME으로 지정했기 때문에, 실행 중에도 언제든지 @Component 어노테이션의 속성값을 참조할 수 있다. 다음은 어노테이션 유지 정책을 표로 정리한 것이다.
정책 | 설명 |
RetentionPolicy.SOURCE | 소스 파일에서만 유지, 컴파일할 때 제거됨, 즉 클래스 파일에 어노테이션 정보가 남아 있지 않음. |
RetentionPolicy.CLASS | 클래스 파일에 기록됨, 실행 시에는 유지되지 않음, 즉 실행 중에서는 클래스에 기록된 어노테이션 값을 꺼낼 수 없음(기본 정책). |
RetentionPolicy.RUNTIME | 클래스 파일에 기록됨. 실행 시에도 유지됨. 즉, 실행 중에 클래스에 기록된 어노테이션 값을 참조할 수 있음. |
어노테이션의 유지 정책을 지정하지 않으면 기본으로 RetentionPolicy.CLASS가 된다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
94. 어노테이션을 이용한 객체 관리 (3) (0) | 2022.08.15 |
---|---|
93. 어노테이션을 이용한 객체 관리 (2) (0) | 2022.08.14 |
91. 프로퍼티를 이용한 객체 관리 (3) (1) | 2022.08.11 |
90. 프로퍼티를 이용한 객체 관리 (2) (0) | 2022.08.10 |
89. 프로퍼티를 이용한 객체 관리 (1) (0) | 2022.08.08 |
댓글