얼마 전에 회사 프로젝트 개발하다가 custom annotation을 사용하게 되었습니다.
평소에 어렴풋이 알고 있었는데 막상 써보려고 하니 시간이 오래 걸렸습니다.
프로젝트에서 custom annotation을 클래스에 적용했습니다.
똑같은 인터페이스를 상속한 클래스 중에서 특정 클래스를 호출하는 기능을 개발했습니다.
먼저 annotation을 생성합니다.
annotation을 적용할 타입을 클래스로 정하고(8라인)
사용 유지 범위를 운영환경까지로 정합니다.(9라인)
"service"라는 속성을 추가했습니다.(12라인)
다음으로 annotation을 적용한 클래스들을 관리하는 클래스를 생성합니다.
annotation을 적용한 클래스들의 정보를 저장하는 "tmpAnnoationList" 라는 map 객체를 생성하고(18라인)
전체 스프링의 빈들 중에서 custom annotation이 적용된 클래스와 TmpService를 구현한 클래스들만
tmpAnnoationList에 추가합니다.(36 ~ 42라인)
41라인을 보게 되면 key는 "path", value는 "obj"로 tmpAnnoationList에 추가하고 있는데
path는 annotation의 String 속성값을 뜻하고 obj는 annotation이 적용된 객체를 가리킵니다.
그리고 "tmpCallback"이라는 메서드를 생성했는데
이 메서드는 annotation이 적용된 객체를 리턴하는 함수입니다.(47 ~ 56라인)
위 2개 클래스는 annotation이 적용된 클래스들로(TmpService를 구현한 클래스)
각각 annotation 속성값으로 "tmpService1", "tmpService2"를 가지고 있습니다.(8라인)
annotation이 적용된 객체를 호출하는 컨트롤러를 생성합니다.
파라미터로 클래스 이름을 받아서 해당 객체를 받은 다음에 해당 객체의 메서드를 호출합니다.(21라인)
클래스 별로 표출될 페이지가 메서드 리턴 값으로 반환됩니다.
파라미터로 객체 이름을 넘기면 해당 객체의 페이지가 표출됩니다.
마찬가지로 TmpSeriveImp2를 호출하면 해당 페이지가 표출됩니다.
프로젝트를 개발하다 보면 특정 객체를 사용해야 하는 경우에
custom annotation을 사용하면 쉽게 개발할 수 있을 거 같습니다.
'dev > 스프링' 카테고리의 다른 글
use try-with-resources or close "DefaultTransaction" in a "finally" clause 버그 수정 (0) | 2020.05.04 |
---|---|
스프링 프레임워크 개발 시작하기 (0) | 2020.04.01 |
The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 에러 (0) | 2020.01.25 |
component-scan 에러 (0) | 2019.08.16 |
cvc-complex-type.2.4.a invalid content was found starting with element 에러 해결 (0) | 2019.04.09 |