KoreaIt Academy/Spring Boot

[Spring Boot] 어노테이션(Annotation, @) 정리

hongeeii 2021. 10. 8.
728x90
반응형

Annotation 이란?

Annotation(@)은 사전적 의미로는 주석이라는 뜻입니다.
자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술입니다.
즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있습니다.

 

기본적으로 어노테이션을 사용하는 순서는 다음과 같습니다.

  1. 어노테이션을 정의합니다.
  2. 클래스에 어노테이션을 배치합니다.
  3. 코드가 실행되는 중 Reflection을 이용하여 추가 정보를 획득하여 기능을 실시합니다.

 

Annotation 종류

@ComponentScan

@Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 Annotation입니다.
@Component Annotation이 있는 클래스에 대하여 bean 인스턴스를 생성합니다.

Spring에서 @Component로 다 쓰지 않고 @Repository, @Service, @Controller등을 사용하는 이유는,

예를들어 @Repository는 DAO의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있기 때문입니다.

또한 가독성에서도 해당 애노테이션을 갖는 클래스가 무엇을 하는지 단 번에 알 수 있습니다.

 

@Component

@Component  개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 Annotation입니다.

 

@Component(value="mystudent")

public class Student {

public Student() { System.out.println("hi"); }

}

 

Component에 대한 추가 정보가 없다면 Class의 이름을 camelCase로 변경한 것이 Bean id로 사용됩니다.

하지만 @Bean과 다르게 @Component는 name이 아닌 value를 이용해 Bean의 이름을 지정합니다.

@Bean

@Bean은 개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용되는 Annotation입니다.

@Autowired

속성(field), setter method, constructor(생성자)에서 사용하며 Type에 따라 알아서 Bean을 주입 해줍니다.
무조건적인 객체에 대한 의존성을 주입시킵니다.
 Annotation을 사용할 시, 스프링이 자동적으로 값을 할당합니다.

 

@Qualifier("id123")

@Autowired와 같이 쓰이며, 같은 타입의 Bean 객체가 있을 때 해당 아이디를 적어 원하는 Bean이 주입될 수 있도록 하는 Annotation입니다.
같은 타입이 존재하는 경우 ex) 동물 = 원숭이, 닭, 개, 돼지

같은 타입의 Bean이 두 개 이상이 존재하는 경우 Spring이 어떤 Bean을 주입해야 할지 알 수 없어서 Spring Container를 초기화하는 과정에서 예외를 발생시킵니다.

이 경우 @Qualifier을 @Autowired와 함께 사용하여 정확히 어떤 bean을 사용할지 지정하여 특정 의존 객체를 주입할 수 있도록 합니다.

 

xml 설정에서 bean의 한정자 값(qualifier value)을 설정합니다.
@Autowired 어노테이션이 적용된 주입 대상에 @Qualifier 어노테이션을 설정합니다.

 

 

@RequiredArgsConstructor

이 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 줍니다.

주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 합니다.

 

 

@Controller

Spring의 Controller를 의미한다. Spring MVC에서 Controller클래스에 쓰입니다.

 

@RestController

@Controller에 @ResponseBody가 결합된 어노테이션입니다. 

컨트롤러 클래스에 @RestController를 붙이면, 컨트롤러 클래스 하위 메서드에 @ResponseBody 어노테이션을 붙이지 않아도 문자열과 JSON 등을 전송할 수 있습니다.

 

@Service

Service Class에서 쓰입니다.
비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도입니다.

 

@Repository

DAO class에서 쓰입니다.
DataBase에 접근하는 method를 가지고 있는 Class에서 쓰입니다.

 

 

@RequestMapping

요청 URL을 어떤 method가 처리할지 mapping해주는 Annotation입니다.

Controller나 Controller의 method에 적용합니다.

요청을 받는 형식인 GET, POST, PATCH, PUT, DELETE 를 정의하기도 합니다.

요청 받는 형식을 정의하지 않는다면, 자동적으로 GET으로 설정됩니다.

 

@ModelAttribute

view에서 전달해주는 parameter를 Class(VO/DTO)의 멤버 변수로 binding 해주는 Annotation입니다.

binding 기준은 <input name="id" /> 처럼 어떤 태그의 name값이 해당 Class의 멤버 변수명과 일치해야하고 setmethod명도 일치해야한다.

 

//view에 값을 전달할 때 request.setAttribute와 같은 느낌으로 사용합니다.

 

@RequestParam

request의 parameter에서 가져오는 것입니다.

 method의 파라미터에 사용됩니다.
?moviename=thepurge 와 같은 쿼리 파라미터를 파싱해줍니다.

HTTP GET 요청에 대해 매칭되는 request parameter 값이 자동으로 들어갑니다.
url 뒤에 붙는 parameter 값을 가져올 때 사용합니다.

 

//gender값을 data이름으로 파싱하여 받을 수 있습니다.

 

@PathVariable 

매핑의 URL에 { } 로 들어가는 패스 변수(path variable)를 받습니다.

@Data

@Getter @Setter @EqualsAndHashCode @AllArgsConstructor @toString @equals 를 포함한 Lombok에서 제공하는 필드와 관련된 모든 코드를 생성합니다.

 

@ExceptionHandler(ExceptionClassName.class)

해당 클래스의 예외를 캐치하여 처리합니다.

@ControllerAdvice

Class 위에 ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지는

각 메소드 상단에 @ExceptionHandler(예외클래스명.class)를 붙여서 기술합니다.

728x90
반응형

추천 글