본문 바로가기
Spring

[Spring] @Bean, @Component, @Configuration

by diaryDev 2024. 8. 9.
728x90

 

스프링 빈(Bean)

Spring의 DI Container에 의해 관리되는 POJO(Plain Old Java Object)

 

빈 등록 방법

 

1. 빈 설정 파일(Bean Configuration File)에 직접 등록(@Configuration, @Bean)

▶ 설정 클래스에서 @Bean 어노테이션을 사용해 수동으로 스프링 컨테이너에 빈을 등록

▶ @Bean을 사용하는 클래스에 @Configuration 사용하여 클래스에서 Bean을 등록하고자 함을 명시한다.
@Configuration
public class SpringConfig {

    private final  MemberRepository memberRepository;

    public SpringConfig(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository);
    }
}

 

▶ @Configuration을 사용하는 이유
스프링 빈으로 등록된 다른 클래스 안에서 @Bean으로 직접 빈을 등록해는 것도 동작은 하지만 @Configuration 안에서 @Bean을 사용해야 싱글톤을 보장받을 수 있으므로 @Bean 어노테이션은 반드시 @Configuration과 함께 사용해야 한다.

▶ 스프링이 @Configuration을 따로 만든 이유는 CGLib으로 프록시 패턴을 적용해 수동으로 등록하는 스프링 빈이 반드시 싱글톤으로 생성됨을 보장하기 위해서이며, @Bean이 있는 메소드를 여러 번 호출하여도 항상 동일한 객체를 반환하여 싱글톤을 보장한다. 또한 스프링의 경우 @Component 스캔을 통해 자동으로 빈 등록을 하는 방식을 권장한다.

의도적으로 매번 다른 객체가 생성되기를 원한다면 @Configuration(proxyBeanMethods = false)로 해주면 된다. 
설정 클래스에 대해서 프록시가 적용되지 않으며 모든 @Bean 메소드 호출마다 새로운 객체를 생성해준다.

수동으로 빈을 등록해야 하는 경우
1. 개발자가 직접 제어가 불가능한 라이브러리를 활용할 때
2. 애플리케이션 전범위적으로 사용되는 클래스를 등록할 때
3. 다형성을 활용하여 여러 구현체를 등록해주어야 할 때 

 

@Component Annotation 사용

스프링의 경우 @Component 스캔을 통해 자동으로 빈 등록을 하는 방식을 권장

 

 


 

 

참고

https://mangkyu.tistory.com/75

728x90