본문 바로가기

dev/스프링

custom annotation 사용법

얼마 전에 회사 프로젝트 개발하다가 custom annotation을 사용하게 되었습니다.

 

평소에 어렴풋이 알고 있었는데 막상 써보려고 하니 시간이 오래 걸렸습니다.

 

프로젝트에서 custom annotation을 클래스에 적용했습니다.

 

똑같은 인터페이스를 상속한 클래스 중에서 특정 클래스를 호출하는 기능을 개발했습니다.

 

custom annotaion 생성

 

먼저 annotation을 생성합니다.

 

annotation을 적용할 타입을 클래스로 정하고(8라인)

 

사용 유지 범위를 운영환경까지로 정합니다.(9라인)

 

"service"라는 속성을 추가했습니다.(12라인)

 

custom annotation 관리 클래스

 

다음으로 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라인)

 

annotation 적용 클래스1, TmpServiceImp1

 

annotation 적용 클래스2, TmpServiceImp2

 

위 2개 클래스는 annotation이 적용된 클래스들로(TmpService를 구현한 클래스)

 

각각 annotation 속성값으로 "tmpService1", "tmpService2"를 가지고 있습니다.(8라인)

 

annotation 적용 객체 호출 컨트롤러

 

annotation이 적용된 객체를 호출하는 컨트롤러를 생성합니다.

 

파라미터로 클래스 이름을 받아서 해당 객체를 받은 다음에 해당 객체의 메서드를 호출합니다.(21라인)

 

클래스 별로 표출될 페이지가 메서드 리턴 값으로 반환됩니다.

 

TmpServiceImp1 호출 화면

 

파라미터로 객체 이름을 넘기면 해당 객체의 페이지가 표출됩니다.

 

TmpServiceImp2 호출 화면

 

마찬가지로 TmpSeriveImp2를 호출하면 해당 페이지가 표출됩니다.

 

프로젝트를 개발하다 보면 특정 객체를 사용해야 하는 경우에

 

custom annotation을 사용하면 쉽게 개발할 수 있을 거 같습니다.