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")으로 변경가능
- @Configuration
- 장점
- 의존관계를 명시적으로 설정 가능하고, 객체들이 서로 어떻게 연결되어 있는지 (의존관계) 한눈에 파악하기 쉬움
- 유연성 - 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이라는 비즈니스 로직을 담은 구현체가 있으면 @Service를 붙힐 수 있다.
@Service를 들어가보면,

@Component가 들어가 있는 것을 볼 수 있다.
반드시 @Service와 같은 @Component를 담은 어노테이션은 구현체 위에 붙혀주어야 하는데, 그 이유는 스프링 컨테이너가 빈으로 등록하기 위해서는 객체를 직접 생성해야(instantiate) 하기 때문이다.
- 장점
- 어노테이션만 붙혀주기 때문에 간편하고 자동화가 쉽고, 유지보수도 쉬워짐
- 보일러플레이트 코드 감소
- 단점
- 스캔 범위를 잘못 설정되면 빈이 누락될수 있음
- 암시적 설명으로 명시성이 부족함
- 외부 라이브러리 적용이 불가함 - 직접 코드를 수정할 수 없는 외부 라이브러리의 클래스에는 @Component를 붙힐 수 없음 (@Configuration + @Bean사용해야함)
자료
- https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/html/using-boot-using-springbootapplication-annotation.html
- https://m42-orion.tistory.com/99
- https://youwjune.tistory.com/43#%--Component%EB%A-%BC%--%EC%--%AC%EC%-A%A-%ED%--%--%EB%-A%--%--%EB%--%--%--%EB%-B%A-%EB%A-%B-%--%EC%--%B-%EB%--%B-%ED%--%-C%EC%-D%B-%EC%--%--%EB%--%A-
'Spring' 카테고리의 다른 글
| [SpringBoot] @Controller와 @RestController의 차이점과 요청 처리 흐름 (0) | 2025.07.03 |
|---|---|
| [Spring] Spring AOP 개념과 실제 활용 사례 (0) | 2025.07.01 |
| [SpringBoot] 웹 서버와 WAS의 차이, 그리고 스프링 부트 내장 톰캣 (1) | 2025.06.24 |
| [Spring] 프레임워크 vs 라이브러리: 제어 흐름과 사용 방식 비교 (Spring 예시 포함) (1) | 2025.06.16 |
| [Spring] Spring Framework의 탄생 배경과 목적 (0) | 2025.06.16 |