Oasis' story

[Spring]Annotation 본문

Program Note/JAVA

[Spring]Annotation

oasispapa 2014. 11. 7. 16:55

* Annotation?

- 애플리케이션 규모가 커지고 스프링 빈의 개수가 증가함에 따라 annotation을 이용하게 됨.

- JDK5 버전 이후 부터 사용가능 하고, 메타데이터를 xml 등의 문서에 설정하는 것이 아니라, 소스코드에 @annotation 형태로 표현하고, 클래스, 필드, 메서드의 선언부에 추가한다.

- 데이터를 문서화하거나, 컴파일 타임이나 런타임 시에 원하는 동작을 수행할 수 있도록 하는데 사용하기도 한다.

 

* 종류

@Override

- 메소드에만 사용

- 상위 클래스의 메소드를 재정의 한다는 것

- 상위 클래스의 메소드를 재정의 하지 못하면 에러가 발생

 

@Deprecated

- 특정 클래스나 인터페이스, 메소드, 필드 등이 더 이상 사용되지 말아야한다는 것을 경고.

- 컴파일러는 deprecated된 메소드나 클래스 혹은 변수를 사용할 때마다 경고를 발생

 

@SuppressWarning

- 클래스 또는 메소드 수준에서 컴파일러의 경고 표시를 제거

- Generics 때문에 컴파일러는 컬렉션이 type-safety 하지 않게 사용되었다고 경고를 던지는데, 이러한 경고를 없애고 싶을때 사용

- all, deprecation, unchecked, fallthrough, path, serial, finally 등의 금지 옵션이 있다.

 

@Required

- 스프링 빈의 프로퍼티에 정의된 빈으로 설정할 때(setter) 사용되며 이 프로퍼티가 필수임을 알려줌. 해당 프로퍼티의 setter 메소드 선언구에 설정,즉 어떤 클래스를 쓰려고 할때 @Required 로 명시하면, xml에 해당 프로퍼티가 정의되어 있는지를 검사해서 없으면 예외 발생시킴.

 

@Autowired

- 타입을 기준으로 의존관계를 자동으로 설정한다. 자동 와이어링 기능을 제공하며, 필드, 생성자, 메소드(일반,세터) 에 적용할 수 있다. 가장 유연하고 강력한 기능을 가짐.

- xml 문서의 양을 대폭 줄여줄 수 있다.

- 프로퍼티나 생성자 파라미터를 지정하지 않고 미리 정해진 규칙을 이용해 자동으로 DI 설정을 컨테이너에 추가

- 자동으로 의존 관계가 맺어져야 할 빈을 찾아서 연결

 

@Qualifier

- Autowired 와 같이 사용하여, 타입이외의 정보를 추가해서 자동 연결될 빈 객체의 수식어를 값으로 제공

 

@Resource

- Autowired 가 타입을 기준으로 의존관계를 자동으로 설정한다면, Resource는 이름과 일치되는 스프링 빈을 자동으로 검색해서 적용

 

@Configuration

- 자바에서 빈을 생성하고자 할 때, 빈 설정 메타 정보를 담고 있는 자바에 선언하며, ApplicationContext 객체 생성시 생성자의 인자 값으로 xml 파일이 아닌 (해당 클래스명).class 가 적용된다.

   @Bean

    public Person getPerson(){ return new Person();} // <bean id="getPerson" class="Person"/> 와 같은 선언이 되는거임..

 

※ 스프링의 스테레오 타입 annotation 

 Annotation 

 설명

 @Component

 일반적인 스프링 빈으로 등록된다. (클래스이름을 빈의 id로 사용되게 된다. 단 첫글자는 소문자로 전환. 이름을 지정하고 싶으면 @Component("name") 이런 식으로 지정 할 수 있음. @Scope("prototype") 을 밑에 줄에 추가하여, 스코프를 지정할 수 있음. )

스캐닝해서 빈으로 등록하는 방법은 두 가지로,

자바단에서 ApplicationContext context = new AnnotationConfigApplicationContext("spring.study");

또는 xml 파일내에서, <context:component-scan base-package="spring.study"/> 로 스캐닝 시킬 수 있음.

 @Controller

 스프링 MVC의 컨트롤러 객체로 등록된다.

 @Repository

 DAO와 같이 데이터 접근을 위한 저장소 객체로 등록된다.

 @Service

 비즈니스 로직을 구현한 서비스 객체로 등록된다.

 

※ Advise 종류

 

 @Aspect 

 설명 

 xml 기반 테그로 표현 

 @Before

* 조인 포인트를 실행하기 전에 어떤 처리를 할 수 있음

* 스프링에서 조인포인트는 항상 메소드 호출이기 때문에 해당 메소드를 처리하기 전에 전처리 과정을 수행하는데 사용

* 호출하는 메소드에 넘겨주는 인자들을 비롯한 타겟 객체에도 접근할 수 있지만 메소드 실행 자체를 제어할 수는 없음

 <aop:before>

 @AfterReturning

* 조인 포인트의 매소드가 실행을 끝내고 값을 반환했을 때 실행

* 해당 메소드에 넘겨주는 인자와 타겟 객체, 그리고 반환값에 접근

* After Returning 어드바이스를 적용하기 전에 이미 메소드는 실행을 마쳤기 때문에 메소드 호출 자체를 제어할 수는 없음

 <aop:after-returning>

 @AfterThrowing

* Exception이 발생하여 조인포인트가 빠져나갈 때 수행

* try-catch 블록의 catch블록과 비슷

* 메소드가 호출된 후에 실행되는데 단 해당 메소드가 예외를 던졌을 경우에만 실행

* 특정 예외만 잡아 메소드에 넘겨준 인자와 타겟 객체에 접근내도록 설정할 수 있으며, 해당 예외를 발생

 <aop:after-throwing>

 @After

* 조인포인트를 빠져나가는 (정상적이거나 예외적인 반환) 방법에 상관없이 수행

* try-catch-finally 에서 finally 블록과 비슷

 <aop:after>

 @Around

* 조인포인트 전후에 수행

* 메소드 실행 전과 후에 어떤 작업을 수행할 수 있으며, 어느 시점에 메소드를 호출 할지 혹은 실행하지 않을지 제어할 수 있음

* 필요한 경우 해당 메소드 대신 별도의 로직을 제공

 <aop:around>

 

 

*장단점

- 코드의 가독성 증대.

- 복잡한 xml 스키마를 파악하지 않아 개발 효율성 증대

- 별도의 파서를 적용하지 않고 활용할 수 있어 편리함 증대

 

- xml 파일 등에 설정하던 것에 비해 지역화

- 리플렉션을 통해 해당 클래스를 분석해야 하는 오버헤드 발생

- 모듈이나애플리케이션에 쓰는 메타데이터를 설정할 수 없음

 

=> xml 과 annotation 을 함께 사용하는 것이 좋음.

- 디플로이 환경에 따라 바뀔 수 있는 부분과 애플리케이션 전반에 공통적으로 사용하는 정보는 xml에 설정해서 사용하고,

  애플리케이션상 설계 시점에 결정되는 부분과 개별적인 설정인 경우는 annotation 을 사용하는게 좋다.