본문 바로가기

Spring

Spring Annotation 정리

 저번에 DI의 개념을 정리할 때 @Configuration과 @Bean과 같은 annotation을 사용하여 xml 설정파일을 대신했던 것 처럼 Spring에선 다양한 용도의 Annotation을 제공한다.  

 

 

[ @Required ] 

 

Required 어노테이션은 setter method에 사용하며,

필수 프로퍼티임을 명시하는 것으로 설정하지 않을 경우 빈 생성시 예외를 발생시킨다.

RequiredAnnotationBeanPostProcessor 클래스는 스프링 컨테이너에 등록된 bean 객체를 조사하여 @Required 어노테이션으로 설정되어 있는 프로퍼티의 값이 설정되어 있는지 검사한다.

사용하려면 <bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor" /> 클래스를 빈으로 등록시켜줘야 하지만 이를 대신하여 <context:annotation-config> 태그를 사용해도 된다:

 

 

[ @Autowired ]

 

필드, 생성자,메서드에 적용 가능하다.

의존관계를 자동설정할 때 사용하며 Type에 따라 의존하는 객체(Bean)를 삽입해 준다.

때문에 해당 타입의 빈객체가 존재하지 않거나 또는 2개 이상 존재할 경우 스프링은 예외를 발생시키게 된다.

 

- required : Autowired 어노테이션을 적용한 프로퍼티 중 반드시 설정할 필요가 없는 경우에 false값을 주어 프로퍼티가 존재하지 않더라도 스프링이 예외를 발생하지 않도록 한다. default는 TRUE이다. ex) @Autowired(required=false)

 

사용하려면 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" /> 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.

@Autowired를 적용할 때 같은 타입의 빈이 2개 이상 존재하게 되면 예외가 발생하는데, Autowired도 이러한 문제가 발생한다. 이럴 때 @Qualifier를 사용하면 동일한 타입의 빈 중 특정 빈을 사용하도록 하여 문제를 해결할 수 있다.

 

 

[ @Qualifier ]

 @Autowired의 목적에서 동일 타입의 빈객체가 존재시 특정빈을 삽입할 수 있게 설정한다. @Qualifier("Bean1")의 형태로 @Autowired와 같이 사용하며 해당 <bean>태그에 <qualifire value="Bean1" /> 태그를 선언해주어야 한다. 메서드에서 두개이상의 파라미터를 사용할 경우는 파라미터 앞에 선언해야한다.

 

[ @Resource ]

@Autowired와 흡사하지만 @Autowired는 Type으로, @Resource는 이름(Name)으로으로 연결한다는 점이 다르다.

 

- name : 자동으로 연결될 빈객체의 이름을 입력한다. ex) @Resource(name="hakDao")

 

사용하려면 <bean class="org.springframework.beans.factory.annotation.CommonAnnotationBeanPostProcessor"/> 클래스를 빈으로 등록시켜줘야 한다. 해당 설정 대신에 <context:annotation-config> 태그를 사용해도 된다.

 

[ @Inject ]

 이 어노테이션도 @Autowired와 유사하지만 더운 스탠다드한 어노테이션이다.

특정 Framework에 종속되지 않은 어플리케이션을 구성하기 위해서는 @Inject를 사용할 것을 권장한다고 한다.

 

 

 

 

 

 

 

[ @Component ]

<context:component-scan> 태그를 설정파일에 추가하게되면 특정 패키지(적용할 기본  패키지를 base-package 속성으로 등록할 수 있다.) 내부의 클래스들을 스캔하여 @Component annotation이 적용된 클래스를 빈으로 등록한다. 

 

<context:include-filter> 태그와 <context:exclude-filter> 태그를 사용하면 자동 스캔 대상에 포함시킬 클래스와 포함시키지 않을 클래스를 구체적으로 명시할 수 있다. 둘 다 type 속성과 expresseion 속성을 가지고  type 속성에 따라 expression 속성에 올 수 있는 값이 달라진다.

 

> type 속성

  • annotation: 클랙스에 지정한 어노테이션이 적용됐는지의 여부.  expression 속성에서 "org.example.SomeAnnotation"와 같은 어노테이션 이름을 입력한다.
  • assignable: 클래스가 지정한 타입으로 할당 가능한지의 여부.  expression 속성에 "org.exampleSomeClass" 와 같은 타입 이름을 입력한다.
  • regex: 클래스 이름이 정규 표현식에 매칭되는 지의 여부.  expression 속성에 "org\.example\.Default.*" 와 같이 정규표현식을 입력한다.
  • aspectj: 클래스 이름이 AspectJ 의 표현식에 매칭되는 지의 여부.  expression 속성에 "org.example..*Service+" 와 같이 AspectJ 의 표현식을 입력한다.

 

[ @Controller / @Service / @Repository ]

@Component를 구체화시켜 해당하는 클래스가 어떤 목적으로 사용되는지 나타내는 용도이다.

 

- @Controller : 컨트롤러 class

- @Service : 비지니스 로직을 수행하는 class

- @Repository : DAO class

 

 

 

 

 

[ @Scope ]

스프링은 기본적으로 빈의 범위를 "singleton" 으로 설정한다. "singleton" 이 아닌 다른범위를 지정하고 싶다면 @Scope 어노테이션을 이용하여 범위를 지정한다.

 

[ @PostConstruct ] 

의존하는 객체를 설정한 이후에 초기화 작업을 수행하기 위해 사용한다.

사용하려면 CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. <context:annotation-config> 태그로 대신할 수 있다.

 

[ @PreDestroy ]

컨테이너에서 객체를 제거하기 전에 해야할 작업을 수행하기 위해 사용한다.

사용하려면 CommonAnnotationBeanPostProcessor 클래스를 빈으로 등록시켜줘야 한다. <context:annotation-config> 태그로 대신할 수 있다.

 

 

 

 

 

 

 

[ @RequestMapping ]

컨트롤러 혹은 메서드의 URI를 정의한다. (/~/~)

 

- value : 해당 url로 요청이 오면 value에 정의된 메서드 수행

- method : 요청 메서드 명시. 없으면 http method 형식에 대해 수행

 

GET, POST등 요청 형식을 정의 한다. defalut는 GET이다.

 

[ @ResponseBody ]

클라이언트에 JSON 형식의 값을 응답할 때 유용하다. 메서드에 @ResponseBody를 적용한 후 문자열을 리턴하면 그 값은 HTTP response header가 아니라 HTTP response body에 쓰여진다. 객체를 넘길경우 스프링에 내장된 JACKSON에 의해 문자열로 변환될 것이다.

또한 @ResponseBody가 적용된 컨트롤러는 context에 설정된 resolver를 무시한다.

 

[ @RequestParam ]

HTTP GET 요청에 대해 매칭되는 request parameter값이 자동으로 들어간다.

URL 뒤에 붙는 parameter 값을 가져올때 사용한다.

 

[ @PathVariable ]

HTTP 요청에 대해 매칭되는 request parameter값이 자동으로 들어간다.

URI에서 각 구분자에 들어오는 값을 처리할때 사용한다. (ex - REST API 값 호출)

 

[ @RestController ]

Controller중 View로 응답하지 않는 컨트롤러이다.

이 annotaion이 있으면 컨트롤러의 메서드는 HttpResponse로 바로 응답이 가능하며

@ResponseBody의 역할(메소드의 반환 결과를 JSON파싱)을 자동으로 해준다.  

 

@Controller는 View가 주목적이고 API와 View를 동시에 사용할때,

@RestController는 View가 필요없고 API만 지원하는 서비스일때 사용한다.

 

[ @RequestBody ]

HTTP POST 요청에 대해서만 처리한다.이 어노테이션이 적용된 파라미터는 request body의 내용이 전달된다.

 

[ @ModelAttribute ]

medium.com/webeveloper/modelattribute-%EC%99%80-%EC%BB%A4%EB%A7%A8%EB%93%9C-%EA%B0%9D%EC%B2%B4-command-object-42c14f268324

 

[ @SessionAttributes ]

SessionAttribute annotation은 세션상에서 model의 정보를 유지하고 싶을 경우 사용한다.

 

728x90
반응형