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

hyeong taek jo·2023년 10월 28일
0

Spring

목록 보기
22/34

📌 @ 어노테이션이란?

  • 어노테이션의 사전적 의미는 주석이지만 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.이름 으로 찾음
profile
마포구 주민

0개의 댓글