Yebali

Spring Bean 등록/설정 방법 본문

Spring

Spring Bean 등록/설정 방법

예발이 2021. 10. 4. 22:14

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