Bean은 Spring IoC 컨테이너에 의해 관리되는 객체 인스턴스입니다.
// 예시: IoC 컨테이너에 등록된 객체
@Service
public class UserService {
...
}
Spring은 이 Bean들을 필요할 때 주입(@Autowired, @Inject, @RequiredArgsConstructor)해서 사용합니다.
| 어노테이션 | 역할 |
|---|---|
@Component | 기본적인 Bean 등록용 |
@Service | 서비스 계층에 의미 부여 (@Component의 특수화) |
@Repository | DAO 계층 의미 + 예외 변환 AOP 포함 |
@Controller | MVC 컨트롤러 (웹 전용) |
@RestController | JSON 반환하는 컨트롤러 |
@Component
public class MyComponent { ... }
@Service
public class UserService { ... }
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserServiceImpl();
}
}
이 방식은 Java 코드 기반 명시적 등록이며, 과거 XML 설정을 대체하는 방식입니다.
<bean id="userService" class="com.example.UserServiceImpl" />
현재는 거의 사용되지 않지만, 레거시 프로젝트나 Spring 초기 버전에서 사용됨.
@Import(AppConfig.class)
public class MainConfig { }
@ComponentScan(basePackages = "com.external.lib")
public class AppConfig { }
@ImportResource("classpath:/beans.xml")
XML 설정을 유지하되, 일부만 Spring Boot에 연결할 때 사용
Spring Boot의 강력한 조건부 Bean 등록 기능
@Bean
@Profile("dev")
public DataSource devDataSource() { ... }
@Bean
@ConditionalOnMissingBean(MyService.class)
public MyService myService() { ... }
| 방식 | 장점 | 단점 | 추천 상황 |
|---|---|---|---|
@Component, @Service 등 | 간단, 직관적 | 스캔 누락, 숨겨진 등록 | 일반적인 서비스/DAO/컨트롤러 |
@Bean + @Configuration | 명시적, 테스트 친화 | 코드 많음 | 외부 라이브러리, 수동 설정 |
| XML | 독립 설정 파일 | 유지보수 어려움 | 레거시 프로젝트 |
@Import, @ComponentScan | 모듈화 용이 | 추적 어려움 | 외부 설정 합칠 때 |
@Profile, @Conditional | 환경 구분, 자동 설정 | 조건 복잡도 ↑ | 멀티 환경 지원, 라이브러리 개발 |
| 상황 | 추천 방식 |
|---|---|
| ✅ 일반적인 Spring Boot 개발 | @Component, @Service, @Repository, @Controller |
| ✅ 복잡한 설정, 외부 클래스 등록 | @Configuration + @Bean |
| ✅ 환경에 따라 다른 Bean | @Profile, @ConditionalOnMissingBean |
| ✅ 레거시 XML 호환 | @ImportResource |
| ✅ 다수의 설정 클래스 통합 | @Import, @ComponentScan(basePackages) |