Spring

[SpringBoot] Spring Boot의 다양한 Bean 등록 방법

leejunkim 2025. 6. 23. 23:28

WeeklyPaper 주제: Spring Boot에서 사용되는 다양한 Bean 등록 방법들에 대해 설명하고, 각각의 장단점을 비교하세요.

 

 

내부적으로 빈이 등록되는 방식


 

스프링 컨테이너는 빈을 <key (빈 이름), value (빈 객체)>로 등록한다. key값인 빈 이름은 클래스의 이름으로 저장이 되고, value값인 빈 객체는 실제 반환하는 객체로 저장이 된다.

 

 

수동으로 등록 - @ Configuration과 @Bean


만약에 빈을 수동으로 등록하고 싶다면, 클래스 위에 @Configuration을 적용해주고 내부에서 빈으로 등록할 메서드에 대해 @Bean 어노테이션을 쓰면 스프링 컨테이너에 등록이 된다.

  • 클래스에 @Configuration없이 클래스의 메서드 위에 @Bean만 사용해서 빈 객체로 등록하는 것도 가능하다.
  • 하지만 @Configuration은 CGLIB 라이브러리를 통해 프록시 (Proxy)객체를 만들어, 해당 @Bean 객체가 싱글톤으로 등록되게 보장해주므로 무조건 @Configuration과 같이 사용하는 것이 권장된다. 
    • 싱글튼은 어디서든 같은 빈을 주입받으면 항상 동일한 객체 인스턴스가 사용되게끔 한다.
@Configuration
public class AppConfig {
    // 이 메서드가 반환하는 객체가 스프링 빈으로 등록됨
    // 빈의 이름은 기본적으로 메서드 이름(memberRepository)으로 지정됨
    @Bean
    public MemberRepository memberRepository() {
    	return new InMemoryMemberRepository();
    }
}

 

  • 언제 사용해야 할까?
    • 복잡한 초기화 방식이 필요할때. 예) 단순한 생성자 호출이 아닌 여러 로직을 거치거나 조건이 있을 때
    • @Bean 같은 경우, 보통 개발자가 직접 수동으로 변경하기 어려운 객체에 사용이 많이 된다. 예) 직접 수정할 수 없는 외부 라이브러리의 클래스를 빈으로 등록하고 싶을때
    • 동일한 타입의 빈을 여러개 등록해야 할때
  • @Configuration과 @Bean
    • @Configuration
      • "이 클래스는 스프링의 설정 정보를 담고 있는 특별한 클래스입니다" 라고 알려주는 어노테이션
      • 스프링 컨테이너에게 어떤 객체(빈)을 어떻게 만들어서 관리해야 하는지에 대한 설명서 역할
      • 위에서도 이야기했듯이, 싱글톤을 보장함
    • @Bean
      • @Configuration 설정된 클래스의 메서드에서 사용가능
      • 메소드의 리턴 객체가 스프링 빈 객체임을 선언함
      • 빈의 이름은 기본적으로 메소드의 이름이지만, @Bean(name="name")으로 변경가능
  • 장점
    • 의존관계를 명시적으로 설정 가능하고, 객체들이 서로 어떻게 연결되어 있는지 (의존관계) 한눈에 파악하기 쉬움
    • 유연성 - if else, for loop 등 다양한 로직을 활용하거나 특정 조건에 따라 빈을 등록할 수 있음
    • 테스트 할때 mock 객체 설정하기 쉬움
  • 단점
    • 클래스가 많아질때 코드가 장황해질 수 있음 (boilerplate 코드 증가함)
    • @Bean을 사용하면서 너무 복잡한 로직이 들어가면 나중에 유지보수가 어려워질 수 있음

 

자동으로 등록 - @Component 사용


[Spring의 @ComponentScan]

Spring의 @ComponentScan은 @Component가 붙은 모든 객체를 빈으로 자동 등록시켜준다. 

  • 여기서 잠깐 더 설명하자면 @SpringBootApplication는 @ComponentScan, @EnableAutoConfiguration, @Configuration이 들어가 있다.
    • @EnableAutoConfiguration: 스프링 부트의 자동 설정 기능을 활성화
    • @ComponentScan: 애플리케이션이 위치한 패키지를 기준으로 @Component가 붙은 클래스를 스캔하여 빈으로 등록
    • @Configuration: 컨텍스트에 추가적인 빈을 등록하거나 다른 설정 클래스를 불러올 수 있게 함
@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}

 

그래서 즉, 이 메인 Application을 실행하면, 내부의 @Component Scan이 @Component 어노테이션을 가진 객체를 스캔해서 빈으로 등록을 한다. 가장 쉽고 간단하므로 현업에서도 가장 많이 쓰이는 방법이라고 한다.

[@Component]

이 어노테이션을 붙히면 자동으로 @ComponentScan의 대상이 된다.

  • 내부적으로 @Component어노테이션을 사용하는 다른 어노테이션들은 이렇게 있다:
    • @Controller
    • @RestController
    • @Service
    • @Repository
    • @Configuration

BasicChannelService의 예시

예를 들면 이렇게 BasicChannelService이라는 비즈니스 로직을 담은 구현체가 있으면 @Service를 붙힐 수 있다.

 

@Service를 들어가보면,

@Service안에 들어있는 @Component 어노테이션

@Component가 들어가 있는 것을 볼 수 있다.

반드시 @Service와 같은 @Component를 담은 어노테이션은 구현체 위에 붙혀주어야 하는데, 그 이유는 스프링 컨테이너가 빈으로 등록하기 위해서는 객체를 직접 생성해야(instantiate) 하기 때문이다.

 

  •  장점
    • 어노테이션만 붙혀주기 때문에 간편하고 자동화가 쉽고, 유지보수도 쉬워짐
    • 보일러플레이트 코드 감소
  • 단점
    • 스캔 범위를 잘못 설정되면 빈이 누락될수 있음
    • 암시적 설명으로 명시성이 부족함
    • 외부 라이브러리 적용이 불가함 - 직접 코드를 수정할 수 없는 외부 라이브러리의 클래스에는 @Component를 붙힐 수 없음 (@Configuration + @Bean사용해야함)

자료