[Spring Boot] 어노테이션(Annotation, @) 정리
Annotation 이란?
Annotation(@)은 사전적 의미로는 주석이라는 뜻입니다.
자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술입니다.
즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있습니다.
기본적으로 어노테이션을 사용하는 순서는 다음과 같습니다.
- 어노테이션을 정의합니다.
- 클래스에 어노테이션을 배치합니다.
- 코드가 실행되는 중에 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)를 붙여서 기술합니다.
'KoreaIt Academy > Spring Boot' 카테고리의 다른 글
[Spring Boot] MyBatis 설정 (hikari cp), 사용법 (0) | 2021.10.08 |
---|---|
[Spring Boot] Front-Controller 패턴 , Controller와 View(값을 뿌리는 방법), 타임리프(thymeleaf) 라이브러리 사용법 (0) | 2021.10.08 |
[Spring Boot] 의존성 주입(DI) (0) | 2021.10.08 |
[Spring Boot] IntelliJ 설치 (0) | 2021.10.07 |
[Spring] Spring 프레임 워크란? 스프링의 장점과 특징 (0) | 2021.10.07 |
댓글