Back-end/JAVA,Spring

스프링에서 자주 사용하는 기본 @어노테이션 정리

cheersHena 2022. 8. 7. 18:23
반응형

@ 어노테이션이란?

어노테이션의 사전적 의미는 주석이지만 Java에서는 그 이상의 메타 데이터 역할을 한다.
어노테이션을 선언하여 특수한 기능을 사용할 수 있다. 
 

@Component

스프링에서 관리하는 객체임을 표기하는 가장 기본적인 범용 스테레오타입 어노테이션.
스프링 빈으로 등록시키는 역할을 수행.
Application Context에서 스프링 빈을 등록할 때, 빈으로 등록할 후보 클래스들을 탐지하여 등록한다.  
<context:conponent-scan> 에서는 @Component만 스캔하도록 되어있다. 
당연하게 쓰던 어노테이션을 따라가서 소스를 살펴보자.... 
ex) @Controller 
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface Controller {
  String value() default "";
}
소스에서 알 수 있듯, 사실상 @Controller, @Service, @Repository를 바로 찾는것이 아니고, 해당 어노테이션에 @Component 어노테이션이 명시되어 있기 때문에 스캔되는 것이다. 
@Service와 @Repository도 마찬가지이다. 즉, 이 3개의 어노테이션은 @Component 를 기능별로 세분화 시켜놓은 어노테이션이라고 이해할 수 있으며 이들은 자체적으로 @Component를 가지고 있기 때문에 스캔되는 것이다. 

 

@Controller

스프링에서 컨트롤러를 지정하는 어노테이션.
Model객체를 만들어 데이터를 담고, View를 반환한다.  
*@RequestMapping 어노테이션이 달린 메소드를 감지한다. 
 

@RequestMapping

@RequestMapping(value=””) 의 형태로 사용하며, URI의 요청과 어노테이션 값이 일치하면 해당 메소드나 클래스가 실행된다. @Controller 객체 내의 클래스 또는 메서드에서 적용가능하다. *클래스에서 사용시 하위 메서드에 모두 적용됨. 
 

@RequestParam

@RequestBody 

URL 내의 파라미터(param)또는 본문(body)를 메서드의 인자와 매핑시켜 처리할 수 있게 하는 어노테이션. 
JSON형식의 Body를 MessageConverter를 통해 Java 객체로 변환해 준다. 
보통 JSON 방식의 비동기 통신에 주로 사용된다. 
 

@ModelAttribute

클라이언트가 전송하는 HTTP  파라미터, 본문 내용을 Setter 함수를 통해 객체를 1:1 매핑한다. @RequestBody와 달리 @ModelAttribute는 MessageConverting 기능이 없기 때문에 JSON을 처리할 수 없다.   

 

@Service

스프링에서 서비스를 지정하는 어노테이션.
사실 @Component 어노테이션과 거의 차이가 없지만 비즈니스 로직을 수행하는 서비스 레이어 클래스 임을 나타낸다.
캡슐화 없이 모델 내 단독 인터페이스로써 제공되는 동작을 의미.
 
 

@Repository 

스프링에서 지원하지 않는 Exception을 Spring Exception으로 전환하기 위해서 @Repository어노테이션을 사용한다. 여기서는 Exception이 발생할 경우 Unchecked Exception을 DataAccessException으로 전환시켜준다. 
주로 DAO(Data Access Object)에서 사용하는데 예를들어 트랜잭션을 적용한 메소드에서 DB오류가 발생해도 롤백이 가능한 이유이다. 
 

@Autowired

객체의 ‘타입'에 해당하는 빈을 찾아 의존 주입(DI)하는 어노테이션. 
스프링에서 의존주입은 3가지 방법이 있는데 1. 생성자주입 2.수정자주입 3.필드주입 세가지 경우에  @Autowired를 선언하여 주입한다. 
 

@Qualifier

의존 주입시, @Autowired 를 사용하여 ‘타입’을 기준으로 의존 주입을 한다고 했다. 이때 각각의 Bean이 유일한 타입을 가지고 있다면 해당 빈을 주입받지만 만약 같은 타입의 빈이 여러개 있다면 문제가 발생한다. 
이때 @Qualifier를 사용한다. @Autowired가 ‘타입'을 기준으로 찾는 받면 @Qualifier는 ‘이름'을 기준으로 찾는다. 즉 @Qualifier(”UserDAO”) 의 형식으로 특정 객체 이름을 지정하여 사용하면 해당 객체를 이름으로 찾아서 주입한다. 
*우선순위는 1.타입 2.이름 으로 찾음  

 

반응형