1. Bean이란?
- Spring에서 관리하는 객체로, ApplicationContext에 등록되어 의존성 주입(DI)이 가능하게 된 객체
- Spring Boot에서는 다양한 방식으로 Bean을 등록할 수 있다.
2. Spring Boot에서 Bean을 등록하는 방법

Spring Boot에서는 자동 등록 방식(@Component 계열)이 기본이지만,
세세한 설정이 필요한 경우에 따라 수동 등록(@Bean 사용)이 필요할 수도 있다.
3. Bean 등록 방법별 상세 설명 및 비교
1) @Component 계열 어노테이션 사용 (자동 등록)
- 설명
- @Component와 그 하위 어노테이션(@Service, @Repository, @Controller)을 사용하면 Spring이 자동으로 Bean으로 등록.
- Spring Boot는 기본적으로 @ComponentScan을 사용하여 특정 패키지 이하의 클래스를 자동으로 스캔하여 Bean으로 등록.
- 등록 흐름
- @SpringBootApplication이 포함된 클래스에서 SpringApplication.run() 실행됨
- 내부적으로 스프링 컨테이너(ApplicationContext)가 생성됨
- @SpringBootApplication 안에 포함된 @ComponentScan이 동작
- 지정된 패키지(기본은 @SpringBootApplication이 위치한 패키지)와 그 하위 패키지를 탐색
- @Component, @Service, @Repository, @Controller가 붙은 클래스들을 찾음
- 해당 클래스들을 객체로 생성하고, Spring 컨테이너에 Bean으로 등록
(기본적으로 클래스명에서 앞 글자를 소문자로 바꾼 이름으로 등록됨)
- 이후 다른 클래스에서 @Autowired, 생성자 주입 등을 통해 이 Bean을 사용할 수 있게 됨
예제 코드
@Component
public class MyComponent {
public void doSomething() {
System.out.println("MyComponent 실행!");
}
}
@Service
public class MyService {
public String getMessage() {
return "Hello from Service!";
}
}
- 장점
- 자동 등록이 가능하여 설정이 간편
- @Service, @Repository를 사용하면 계층별 역할이 명확해짐
- Spring Boot 기본 동작 방식과 잘 맞음 (Spring Boot는 자동 설정을 지향)
=> 이러한 장점들 때문에 가장 많이 사용하는 방법!
- 단점
- 클래스를 직접 수정해야 Bean 등록이 가능 (외부 라이브러리는 사용 불가)
- 세밀한 설정이 어려움 (인스턴스 생성 방식 변경이 불가능)
2) @Bean 어노테이션 사용 (수동 등록)
- 설명
- @Configuration 클래스에서 @Bean을 사용하면 개발자가 직접 Bean을 생성하여 관리할 수 있음.
- 외부 라이브러리나 인터페이스 기반 객체 등을 Bean으로 등록할 때 유용.
- 등록 흐름
1) @SpringBootApplication이 포함된 클래스에서 SpringApplication.run() 실행됨
2) 내부적으로 스프링 컨테이너(ApplicationContext)가 만들어짐
3) 클래스패스를 스캔해서 @Configuration이 붙은 클래스들을 찾음 (@SpringBootApplication에 @ComponentScan이 자동 포함돼 있어서!)
4) @Configuration 클래스 내의 @Bean 메서드들을 실행함 -> 메서드를 호출해서 객체 생성 -> 리턴된 객체를 스프링 컨테이너에 등록
5) 이후 다른 클래스에서 @Autowired, 생성자 주입 등을 통해 이 Bean을 사용할 수 있게 됨
예제 코드
@Configuration
public class MyConfig {
@Bean
public MyComponent myComponent() {
return new MyComponent();
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
- 장점
- 외부 라이브러리 및 인터페이스 객체도 등록 가능
- 세밀한 제어 가능 (생성자 주입, 싱글톤 설정 등)
- 리팩토링 시 유연하게 대응 가능
- 단점
- 클래스가 많아지면 설정 파일이 길어질 수 있음
- 자동 등록보다 코드량이 많아질 수 있음
3) XML 기반 설정 (거의 사용 안 함)
- 설명
- applicationContext.xml에서 < bean> 태그를 사용하여 Bean을 수동 등록하는 방식.
- Spring Boot에서는 거의 사용되지 않음.
(Spring Boot는 XML 설정 없이 @Configuration과 @ComponentScan으로 자동 설정)
예제 코드
<bean id="myComponent" class="com.example.MyComponent"/>
-
장점
- XML 파일로 설정을 관리할 수 있어 코드와 분리됨
- 다양한 설정을 한곳에서 관리 가능
-
단점
- Spring Boot에서는 비효율적이며 사용하지 않음
- 설정이 길고 가독성이 떨어짐
4. Bean 등록 방법 비교 정리

5. 언제 어떤 방법을 사용할까?
- @Component 기반 자동 등록을 기본으로 사용
- 대부분의 경우 @Service, @Repository, @Controller 등을 사용하면 충분함.
- 세부 설정 또는 외부 라이브러리 Bean 등록이 필요할 때 @Bean 사용
- RestTemplate, ObjectMapper 같은 Spring이 관리하지 않는 객체를 등록해야 할 때
- 팩토리 패턴을 사용할 때
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
return mapper;
}
=> 세부 설정은 new로 생성한 객체에다가 필요한 설정을 직접 넣어주는 방식으로 처리
- XML 설정은 사용하지 않음
- Spring Boot에서는 XML 설정 없이도 충분히 관리 가능
- XML 설정이 필요한 경우 설계 개선을 고려
6. 결론

- Spring Boot에서는 @Component 계열을 기본으로 사용하고, 필요할 때 @Bean을 활용하면 된다!