[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