[SpringBoot] 어노테이션과 리플렉션

Intro

레거시와 부트를 공부하면서 어노테이션을 자주 사용했는데, 최근에 리플렉션 강의를 들으면서 리플렉션과 같이 연결되는 개념이라 정리하고자 한다.

1. 어노테이션(Annotation)이란?

사전적 의미로는 주석을 뜻한다. 스프링에서는 주석 이상의 기능을 갖고 있는데, 클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할을 한다. 예를 들어, Bean을 주입하거나 getter & setter를 생성, 매핑하는 데 자주 사용된다.

2. 대표적인 Annotation

@Component

  • 개발자가 생성한 클래스를 스프링의 Bean으로 등록하고자 할 때 사용.
  • 스프링은 @Component 어노테이션을 보고 Bean으로 등록한다.

@ComponentScan

  • @Component, @Controller, @Service, @Repository, @Configuration이 선언된 클래스가 있으면 Bean에 등록한다.

@Bean

  • @Bean은 개발자가 외부 라이브러리와 같은 제어 불가능한 것들을 Bean으로 만들 때 사용하는 어노테이션임.
  • 수동으로 스프링 컨테이너에 빈을 등록하는 방법이며, @Configuration과 반드시 같이 사용해야만 한다.
    • 이유에 대해서는 Component, Configuration, Bean을 총 정리하여 포스팅 할 예정!

@ModelAttribute

  • @ModelAttribute는 HTTP Body 내용과 HTTP 파라미터 값들을 Getter, Setter 생성자를 통해 1:1로 객체에 데이터를 연결(바인딩)한다. @RequestBody와는 달리 Body의 내용은 multipart/form-data 형태를 요구한다.
  • @RequestBody의 경우는 JSON 데이터를 받는 것과 달리 @ModelAttribute는 JSON 데이터를 처리할 수 없다.

@RequestBody & @ResponseBody & @PathVariable

  • @RequestBody는 HTTP 요청이 들어왔을 때 Body에 담긴 값을 자바 객체로 변환 해주는 어노테이션이다.
  • @RequestParam는 HTTP 요청이 들어왔을 때 URI의 queryString에 붙은 name=value 형태의 값을 받을 때 사용하는 어노테이션이다.
  • @REST API에서 요청이 들어올 때 URI에 가변형 변수 부분을 받는 어노테이션이다.
  • 자세한 설명은 여기!

@Autowired

  • @Autowired란, 스프링 컨테이너에 등록한 빈에게 의존관계주입이 필요할 때, DI(의존성 주입)을 도와주는 어노테이션이다.
  • 자세한 설명은 여기!

@GetMapping & @PostMapping

  • 각각 Get요청, Post요청을 보내기 위해 사용되는 어노테이션임.

3. 리플렉션(Reflection)이란?

사전적 의미로는 투영을 뜻한다. 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API를 의미하며 컴파일 시간이 아닌 실행시간(ex.요청 들어왔을 때)에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법이라 할 수 있다.

  • 요청(ex. http://localhost:8080/context-path/xxxx)이 들어오게 되면 리플렉션을 통해 context-path뒤에 붙은 주소를 기반으로 컨트롤러에서 함수를 찾아낸다.
  • 즉, 주소를 작성해둘 때는 어떤 클래스를 사용할 지 모르지만 런타임 시점에 가져와 실행해야 하는 경우 리플렉션이 필요하다.
  • 스프링에서는 어노테이션이 리플렉션을 제공함.

참고 사이트

어노테이션 정리한 글
리플렉션 강의