Spring에서 Bean은 IoC 컨테이너가 관리하는 객체입니다.
보통 Service, Repository, Controller, Config 등의 클래스들이 이에 해당하며, DI(의존성 주입) 대상이 됩니다.
| 항목 | Spring Legacy | Spring Boot |
|---|---|---|
| Bean 등록 방식 | 수동 (XML/JavaConfig) | 자동 (@ComponentScan + @EnableAutoConfiguration) |
| 설정 위치 | XML 파일 또는 JavaConfig 클래스 | @SpringBootApplication 내부 |
| 철학 | 명시적 구성 | 관례 기반 자동 구성 (Convention over Configuration) |
| 장점 | 명확한 제어 가능 | 빠른 개발, 설정 간소화 |
| 단점 | 반복 설정, 비효율 | 자동 구성 파악 어려움 가능 |
<bean id="myService" class="com.example.MyService"/>@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}@Service
public class GreetingService {
public String greet() {
return "Hello";
}
}@RestController
public class GreetingController {
private final GreetingService greetingService;
public GreetingController(GreetingService greetingService) {
this.greetingService = greetingService;
}
@GetMapping("/greet")
public String greet() {
return greetingService.greet();
}
}@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}@Target(TYPE) @Retention(RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan public @interface SpringBootApplication { }
@SpringBootConfiguration:@Configuration과 같음@ComponentScan: 자동으로 하위 패키지 스캔@EnableAutoConfiguration: 자동 설정 클래스 활성화
- 특정 패키지 내의 클래스 중
@Component,@Service,@Repository,@Controller등이 붙은 클래스를 자동으로 스캔해 Bean으로 등록하는 어노테이션
@ComponentScan(basePackages = "com.example")- 지정된 패키지 및 하위 패키지를 스캔
- 지정하지 않으면, 현재 클래스의 패키지부터 하위 패키지까지 스캔
| 어노테이션 | 역할 | 내부적으로 포함된 어노테이션 |
|---|---|---|
@Component |
기본 Bean | 없음 |
@Service |
서비스 계층 | @Component |
@Repository |
DAO 계층 | @Component |
@Controller |
MVC 컨트롤러 | @Component |
@Target(TYPE)
@Retention(RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {}@ComponentScan: 현재 패키지 기준으로 Bean 탐색@EnableAutoConfiguration: classpath에 있는 설정 클래스들을 자동으로 구성 (ex: WebMvcAutoConfiguration, DataSourceAutoConfiguration 등)
@EnableAutoConfiguration
↓
SpringFactoriesLoader.loadFactoryNames()
↓
META-INF/spring.factories에서 자동 설정 클래스 목록 로딩
↓
조건에 맞는 설정 클래스만 적용 (@ConditionalOnXxx)
| 항목 | @ComponentScan |
@Bean |
|---|---|---|
| 사용 위치 | 클래스에 @Component 붙임 |
@Configuration 클래스 내부 메서드에 붙임 |
| 자동 등록 여부 | O (스캔 기반) | X (명시적으로 등록) |
| 제어 수준 | 낮음 (관례 기반) | 높음 (구체적 객체 생성 로직 가능) |
| 예시 용도 | 일반적인 서비스, 레포지토리 등 | 외부 라이브러리 객체, 조건 기반 생성 등 |
@SpringBootApplication클래스는 항상 최상위 패키지에 위치- 그렇지 않으면 ComponentScan이 하위 Bean을 인식 못할 수 있음
@ComponentScan의 범위 밖에 클래스가 위치함@Component계열 어노테이션이 누락됨- Bean이 동적으로 생성되어 수동 등록 필요할 경우
@ComponentScan(
basePackages = "com.example",
includeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = CustomComponent.class),
excludeFilters = @ComponentScan.Filter(
type = FilterType.ASSIGNABLE_TYPE,
classes = LegacyService.class)
)- Spring Legacy: 명시적 설정 기반 (
@Bean, XML) - Spring Boot: 자동 설정 + 컴포넌트 스캔으로 개발 생산성 ↑
- @ComponentScan: 지정된 패키지 및 하위 패키지에서 자동 탐색
- Auto Configuration은 SpringFactoriesLoader를 통해 동적으로 설정 클래스 로딩
A1. Spring에서 Bean은 IoC 컨테이너에 의해 생성되고 관리되는 객체를 말합니다. @Component, @Service, @Repository, @Controller, @Bean 등을 통해 등록되며, 주로 의존성 주입(DI) 대상이 됩니다.
A2.
- Spring Legacy: XML 또는 Java Config로 명시적으로 Bean 등록
- Spring Boot:
@ComponentScan과@EnableAutoConfiguration에 의해 자동 등록
→ **명시적 구성 vs 관례 기반 구성(Convention over Configuration)**이라는 철학 차이
A3. @ComponentScan은 지정된 패키지 내의 클래스 중 @Component 계열 어노테이션이 붙은 클래스를 자동으로 스캔하여 Bean으로 등록하는 기능입니다.
지정하지 않으면 현재 클래스의 패키지부터 하위 패키지를 스캔합니다.
A4.
| 항목 | @Component (자동 등록) |
@Bean (수동 등록) |
|---|---|---|
| 선언 위치 | 클래스에 어노테이션 부착 | @Configuration 내부 메서드 |
| 등록 방식 | 자동 등록 (@ComponentScan) |
명시적 등록 |
| 제어 수준 | 낮음 | 높음 |
| 사용 예 | 일반적인 내부 클래스 | 외부 라이브러리, 조건 분기 필요 시 |
A5. @SpringBootApplication은 다음 세 가지 어노테이션의 합성입니다:
@SpringBootConfiguration(→@Configuration)@EnableAutoConfiguration(→ 자동 설정)@ComponentScan(→ 컴포넌트 스캔 자동화)
A6.
@EnableAutoConfiguration→SpringFactoriesLoader.loadFactoryNames()호출META-INF/spring.factories에서 자동 구성 클래스 목록 로딩@ConditionalOnXxx조건에 따라 필요한 설정 클래스만 실제 Bean으로 등록됨