[Spring] Spring Annotation

스프링 프로젝트

  • Spring Boot
  • Spring Framework
  • Spring Data
  • Spring Cloud
  • Spring Security
  • Spring HATEOAS
  • Spring Batch
  • Spring for Apache Kafka

Spring Framework/Spring Boot

@Bean

  • 메서드를 스프링 컨테이너가 관리하는 빈 객체를 생성하는 메서드로 지정
  • @Bean 메서드는 일반적으로 구성 클래스(@Configuration 클래스)에 선언됨
  • 스프링 컨테이너는 구성 클래스 안에서 빈 인스턴스 정의인 @Bean 메서드를 찾음
  • 구성 클래스의 메서드에 @Bean을 지정하면 해당 메서드 이름과 동일한 이름의 객체가 생성됨
  • @Bean 메소드는 객체의 인스턴스화 및 초기화 후 객체의 참조를 반환함

@Autowired

  • 의존성 주입을 통해 객체 사이의 의존성 관계 설정
  • 스프링 컨테이너는 패키지의 모든 컴포넌트들을 스캔한 후 객체를 주입
  • 객체 의존성을 암시적으로 주입
  • @Autowired을 통해 객체 주입을 하려면 해당 클래스의 @Component 어노테이션 설정 또는 구성 클래스의 @Bean 메소드에 의해 객체 생성이 되어 있어야 함(스프링 컨테이너가 해당 객체를 생성해야 함)
  • 프로퍼티(필드), setter 메서드, 생성자에 사용할 수 있음
  • 프로퍼티(필드)에 사용 (field injection)
    • 해당 객체가 생성될 때 프로퍼티에 객체를 주입
    • setter 메서드를 사용하지 않아도 됨
    • 스프링 컨테이너는 @Autowired이 설정된 프로퍼티의 변수 타입을 체크하고 해당 타입의 객체가 메모리에 존재하는지 확인한 후에, 그 객체를 변수에 주입함
    • 프로퍼티의 타입이 객체인 경우 해당 객체가 생성되어 메모리에 존재한다면 해당 객체를 객체 타입 변수에 주입
    • 프로퍼티의 타입이 인터페이스인 경우 해당 인터페이스의 구현 객체가 생성되었는지 확인한 후에, 구현 객체를 인터페이스 타입 변수에 주입
    • 만약 @Autowired에 의한 의존성 주입 대상 객체가 생성되지 않아 메모리에 존재하지 않는다면 스프링 컨테이너는 NoSuchBeanDefinitionException을 발생시킴
  • setter 메서드에 사용 (setter injection)
    • 클래스의 setter 메서드를 호출하면 setter 메서드의 인자에 스프링 컨테이너에 의해 생성된 컴포넌트 객체가 주입되어 결국 클래스의 setter 대상 프로퍼티에 객체가 주입됨
  • 생성자에 사용 (constructor injection)
    • 클래스의 객체가 생성될 때 생성자가 호출되면 생성자의 인자에 스프링 컨테이너에 의해 생성된 컴포넌트 객체가 주입되어 결국 클래스의 초기화 대상 프로퍼티에 객체가 주입됨
    • 객체가 생성될 때 생성자가 호출되므로 클래스의 객체 생성 시점에 객체가 주입됨
    • 생성자를 통한 의존성 주입이 권장됨
    • 생성자가 하나라면 @Autowired 어노테이션 지정은 필요 없으며 생성자가 두 개 이상 정의되어 있을 때 지정
    • 생성자를 통한 의존성 주입 시 해당 객체의 필드는 final로 지정되어 이후에 변경할 수 없게 됨

@Component

  • 해당 클래스를 애플리케이션의 ‘컴포넌트’로 지정
  • 해당 클래스는 어노테이션 기반 설정 및 클래스패스 탐색 시 스프링 컨테이너에 의한 자동 탐지 후보가 됨
  • 스프링 컨테이너가 해당 클래스의 객체를 생성하여 스프링 빈으로 등록
  • @Controller, @Repository, @Service 포함
  • @Component 설정이 되어 있어야 스프링 컨테이너가 해당 클래스의 객체를 생성하고 @Autowired 설정에 의해 객체를 주입할 수 있으며 객체가 메모리에 생성되어 있지 않다면 @Autowired를 통한 객체 주입시 예외가 발생함

@Configuration

  • 스프링 애플리케이션 컨텍스트(스프링 컨테이너)를 위한 빈 정의 소스(메서드)가 있는 구성(configuration) 클래스
  • XML 구성 파일과 동일한 기능을 함
  • 클래스의 인스턴스 생성, 객체 간 의존성 주입 코드가 존재함
  • 하나 이상의 @Bean 메서드가 존재하며 런타임 시 스프링 컨테이너에 의해 해당 객체에 대한 정의가 생성되고 객체에 대한 요청이 처리됨
  • 메인 메서드가 존재하는 클래스를 주요 구성 클래스로 지정하는 것이 좋음

@ComponentScan

  • 클래스를 스프링 컨테이너가 관리할 수 있는 빈 객체로 만들기 위해 클래스에 어노테이션을 지정하며 스프링 컨테이너에게 이 어노테이션 지정 클래스들을 어디서 찾을 수 있는지 알려주는 역할을 함
  • 현재 패키지에서 어노테이션 지정 클래스들을 찾도록 지시하며 특정 패키지를 지정할 수도 있음
  • @Configuration와 함께 작동
  • 구성 클래스의 위치가 컴포넌트 탐색을 위한 패키지 위치의 기본값이 됨
  • 패키지를 지정하지 않은(패키지 선언을 포함하지 않은) 클래스(기본 패키지)를 구성 클래스로 지정하면 스프링은 클래스패스에 있는 모든 jar 파일을 탐색하므로 에러가 발생할 수 있음
  • 스프링 컨테이너는 클래스패스에 있는 클래스들을 스캔하여 @Component가 설정된 클래스들을 대상으로 자동으로 객체를 생성하여 스프링 빈으로 등록

@EnableAutoConfiguration

  • 스프링 부트 자동 구성 메커니즘에 의해 jar 의존성에 기반하여 스프링 애플리케이션을 자동으로 구성하도록 함
  • 스프링 애플리케이션 컨텍스트(스프링 컨테이너)의 자동 구성을 활성화하여 필요하다고 여겨지는 빈들을 추측하고 구성
  • 모든 서브 패키지와 클래스들이 탐색되도록 루트 패키지에 위치시키는 것이 권장됨
  • 클래스패스 설정, 다른 빈들, 다양한 프로퍼티 설정에 기반하여 스프링 부트가 빈들을 추가하도록 함
    • 예: spring-webmvc가 클래스패스에 있는 경우 애플리케이션을 웹 애플리케이션으로 플래그 지정하고 DispatchServlet 설정과 같은 주요 동작들을 활성화함

@SpringBootApplication

  • @SpringBootConfiguration, @EnableAutoConfiguration, @ComponentScan 포함

Spring Web MVC

@Controller

  • 스프링 MVC가 웹 요청을 처리할 수 있게 해줌
  • 웹 요청의 결과 HTML 콘텐츠를 렌더링하는 데 필요한 뷰의 이름을 반환
  • 클라이언트의 요청이 어떤 메서드와 매핑될 건지 정의하는 컨트롤러 클래스로 지정

@RestController

  • 스프링 MVC가 웹 요청을 처리할 수 있게 해줌
  • @Controller, @ResposeBody 포함
    • @RestController = @Controller + @ResponseBody
  • @Controller 대신 @RestController를 사용하여 컨트롤러 클래스를 선언하면 해당 클래스는 뷰를 반환하지 않고 요청에 대한 응답의 결과로 데이터만 전달함 (페이지가 이동하지 않음)
    • 웹 요청의 결과로 뷰가 아닌 데이터를 직접 반환
  • @ResposeBody는 해당 클래스에 정의된 메소드들에 의해 반환되는 데이터는 템플릿을 렌더링하는 대신 곧바로 HTTP 응답 본문으로 쓰여지도록 함
  • @ResposeBody를 사용하면 스프링 MVC의 HttpMessageConverter를 이용해 유저가 요청한 표현형으로 객체를 변환할 수 있음
  • 클래스패스에 JAXB2, 잭슨, ROME 등의 라이브러리가 존재하면 스프링은 해당 기술에 적합한 HttpMessageConverter를 알아서 등록함
  • JSON으로 응답 결과를 반환하는 경우 스프링 Jackson2JsonMessageConverter 클래스가 마샬링을 수행

@RequestBody

  • HTTP 요청(클라이언트로부터의 요청) 바디를 읽고 역직렬화시킴

@ResponseBody

  • 서버의 응답을 HTTP 응답 바디에 직렬화시킴

@EnableWebMvc

@RequestMapping

  • 클라이언트의 HTTP 요청에 대해 해당 메소드를 매핑
  • @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping 어노테이션들은 @RequestMapping을 포함하고 있음

@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping

  • 요청 메서드 타입별로 각각 서로 다른 처리를 하기 위해 도입된 어노테이션
  • @GetMapping은 GET 요청 메소드만, @PostMapping은 POST 요청 메서드만 처리
  • 해당 요청 메서드와 일치하지 않는 요청을 보내면 405 응답 코드를 전송

@PathVariable

@RequestParam

Spring Data JPA

@Entity

Spring Data REST

@RepositoryRestResource

  • Spring MVC가 해당 URL 요청에 대한 REST 엔드포인트를 생성하도록 지시

Comments