일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- spring
- Kotlin
- consumer
- Entity
- Spring JPA
- offsetdatetime
- CodePipeline
- mysql
- entity graph
- PAGING
- Spring Data JPA
- kafka
- cd
- AWS
- API
- producer
- transactionaleventlistener
- centos7
- CI
- K8s
- mirror maker2
- Kubernetes
- ECS
- bean
- spring kafka
- QueryDSL
- git
- JPA
- Streams
- topic생성
- Today
- Total
Yebali
Spring Bean 등록/설정 방법 본문
Bean이란?
Bean이란 Spring IoC 컨테이너가 생성하고 관리하는 자바 객체를 말한다.
흔히 Java에서 new 연산자로 객체를 생성했을 때 만들어지는 객체는 빈이 아니다.
Spring Frameworkd를 사용할 때 Spring Bean을 얻기 위해서는 ApplicationContext.getBean()와 같은 메서드를 통해 Bean을 얻을 수 있다.
Bean을 Spring IoC 컨테이너에 등록하는 방법
@ConponentScan, @Component
@ComponentScan 어노테이션과 @Conponent 어노테이션을 사용해서 빈을 등록하는 방법이다.
Spring으로 개발하면 흔히 사용하는 @Controller, @RestController의 내부 구현을 살펴보면 @Component 어노테이션이 사용되고 있다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
/**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
* @since 4.0.1
*/
@AliasFor(annotation = Controller.class)
String value() default "";
}
그렇다면 @ComponentScan은 어디에 있을까?
바로 @SpringBootApplication에 있다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
.
.
.
}
즉, Spring Framework를 사용하여 개발 할 때 사용하는 @SpringBootApplication, @Controller, @Service, @Repository 어노테이션들은 @ConponentScan, @Component를 사용하여 Bean을 등록한다.
@Configuration, @Bean
@Configuration, @Bean 애너테이션을 사용해 Bean을 추가하는 방법이다.
클래스 이름 위에 @Configuration 어노테이션을 명시하여 1개 이상의 Bean을 등록하고 있음을 명시한다.
그렇기 때문에 @Bean 어노테이션은 반드시 @Configuration 와 함께 사용해야 한다.
@Configuration
public class SpringConfig {
private final MemberRepository memberRepository;
@Bean //Spring Container에 Bean을 등록(추가).
public MemberService memberService() {
return new MemberService(memberRepository);
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
@Bean 어노테이션의 경우 아래와 같은 상황에서 주로 사용한다.
1. 개발자가 직접 제어가 불가능한 라이브러리를 사용할 때
2. 초기에 설정을 하기 위해
Spring Bean 설정하는 방법
위의 다양한 방법들로 Bean은 Spring IoC 컨테이너에 생성되고 등록된다.
그렇다면 등록되어 있는 Bean들을 사용하기 위해 설정하는 방법도 알아보자
1. 필드 주입
@Autowired
private MemberService memberService;
@Autowired을 사용하면 Spring이 Spring IoC 컨테이너에 등록되어있는 Bean을 자동으로 설정해준다.
장점 : 코드가 상대적으로 짧다.
단점 : 개발자가 Bean을 임의로 설정 할 수 없다.
2. Setter 주입
@Autowired
public setMemberService(MemberService memberService) {
this.memberService = memberService;
}
단점 : Setter가 public으로 열려있어 다른 개발자가 Bean을 임의로 바꿀 수 있다.
3. 생성자(Constructor) 주입
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
장점 : 개발자가 임의로 Bean을 설정할 수 있다. 다른 개발자가 임의로 Bean을 바꿀 수 없다.
보통은 생성자 주입이 가장 추천되는 방법이다.
참고로 Bean들은 기본적으로 Spring IoC 컨테이너 내에 단 하나의 Bean만 만들어서 관리한다. (Singleton Pattern)
'Spring' 카테고리의 다른 글
Spring을 이용한 API개발 - 기본 (0) | 2021.10.11 |
---|---|
Spring JPA 준영속 엔티티 수정하기 (0) | 2021.10.11 |
Spring JPA Entity 설계 시 주의점 (0) | 2021.10.11 |
Spring JPA 1:N 관계 설정 (0) | 2021.10.10 |
Spring Bean의 생명주기 (0) | 2021.10.10 |