일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- FunctionalInterface
- sql-mappler
- 운영체제
- strict stubbing
- ReflectUtils
- 도커
- functional interface
- task_struct
- @Header
- 쓰레드 라이브러리
- python-socketio
- spring-data-jpa
- none이미지
- AOP
- 문자열 리터럴
- 롬복주의점
- Thread Multiplexing
- SystemCall
- rainbow table
- 함수형 인터페이스
- 문자열 불변성
- Process
- hiberbate
- java.util.function
- django-crontab
- Spring
- Thread Library
- custom annotation
- OS
- 프로세스
- Today
- Total
JH's Develog
[SpringBoot] @Component vs @Bean vs @Configuration 본문
@Component
Component 어노테이션은 클래스에 붙어서(Class-level) 이 클래스를 Custom Bean으로 만들어줍니다. ComponentScan을 통해서 @Component가 붙은 클래스는 필요한 의존성을 모두 주입받고 스프링 컨테이너에 등록되며, 등록하려는 Bean의 클래스 소스가 편집가능한 경우에 사용됩니다.
Component에는 @Controller, @Service, @Repository라는 스테레오 타입 어노테이션들이 있으며 목적에 맞게 선택하여 사용할 수 있습니다.
@Bean
Bean 어노테이션은 메서드에 붙는 Method-level 어노테이션이며 인스턴스화 하는 코드가 수동으로 작성됩니다.
빈의 인스턴스 코드와 클래스의 정의가 분리된 구조이기 때문에 외부 라이브러리나 써드 파티 클래스도 빈으로 등록할 수 있게 해줍니다.
인스턴스화 하는 코드가 수동으로 작성된다 -> 위 코드의 return new BubbleSort<>(); 처럼 직접 new를 통해서 인스턴스를 생성한다.
인스턴스 코드와 클래스의 정의가 분리됐다 -> BubbleSort가 구현된 부분과 인스턴스를 생성하는 부분이 분리되어있다.
@Configuration
해당 클래스는 각종 Bean설정을 담고 있음을 나타내는 어노테이션입니다. 클래스 내부의 Bean 설정(메서드)을 읽어서 스프링 컨테이너에 등록하고 필요한 곳에 주입하거나 각종 스프링 인터페이스의 구현에 함께 활용합니다.
@Configuration 어노테이션도 구조를 살펴보면 @Component 어노테이션을 포함하고 있으므로 Component의 일종이라고 할 수 있습니다. 그러나 빈 설정을 위해서는 @Configuration, 클래스 빈 등록을 위해서는 @Component를 사용해 줌으로써 어노테이션이 의도에 맞게 적절히 잘 사용되도록 하여야합니다.
+Bean의 생성법 3가지
빈을 생성하는 방법은 총 3가지가 있습니다.
1. @Component
2. @Bean in @Configuration
3. @Bean in @Component
기본적으로 스프링에서 생성되는 Bean은 Proxy Bean으로 생성되는데 3번 방법을 사용하면 Lite Mode Bean이 생성됩니다. Proxy Bean으로 생성되어야 스프링에서 제공하는 AOP와 같은 기능을 적용할 수 있지만 Proxy Bean은 생성하는 속도가 느립니다. 그러므로 만약 내가 생성하려고 하는 Bean의 역할을 모두 정확히 아는데 Proxy Bean으로 생성될 필요가 없다고 판단한 경우에는 Lite Mode로 Bean을 생성할 수 있습니다.
(다만, 스프링의 기능을 온전하게 사용하려면 Proxy Bean이어야 하므로 일반적으로 Proxy Bean으로 생성합니다.)
'Spring' 카테고리의 다른 글
[Spring] 롬복의 단점 (주의할 점) (0) | 2022.01.13 |
---|---|
[SpringBoot] application.properties에 환경변수 설정하기 (@ConfigurationProperties) (0) | 2022.01.10 |
[SpringCore] Validation (유효성 검증) (0) | 2021.12.27 |
[SpringCore] Custom Annotation과 AOP로 메서드 실행시간 측정하기 (0) | 2021.12.25 |
[SpringCore] AOP (0) | 2021.12.25 |