📌 @ComponentScan을 이용한 자동 Bean 등록
Spring이 특정 패키지를 탐색하며 @Component, @Service, @Repository, @Controller 등으로 선언된 클래스를 자동으로 Bean으로 등록
✅ 자동 등록 과정

- 개발자가 직접 객체를 생성하지 않아도 Spring이 자동으로 Bean으로 등록하여 주입까지 처리
- @SpringBootApplication 은 내부적으로 @ComponentScan을 포함하고 있어 자동 스캔이 활성화
📌 @Configuration & @Bean을 이용한 수동 Bean 등록
외부 라이브러리나 명확하게 제어가 필요한 Bean은 수동 등록이 효과적
@Configuration
public class AppConfig {
@Bean
public TestService testService() {
return new TestServiceImpl();
}
}
- 메서드명 = Bean 이름
- @Configuration 없으면 CGLIB 프록시 기능이 적용되지 않아 싱글톤 보장 불가
⚠️ Bean 충돌과 해결 방법
❌ 자동 등록 vs 자동 등록
@Component("service")
public class ConflictServiceV1 implements ConflictService {}
@Component("service")
public class ConflictServiceV2 implements ConflictService {}
- 같은 이름의 Bean 등록 시 ConflictingBeanDefinitionException 발생
❗ 수동 등록 vs 자동 등록
- 수동 등록이 자동 등록을 오버라이딩합니다
- 실수가 발생하면 버그로 이어질 수 있음
- Spring Boot에서는 allow-bean-definition-overriding=false 가 기본
💉 의존성 주입 방법 4가지
| 주입 방식 | 특징 | 추천 여부 |
| 생성자 주입 | 불변, 필수 의존성, 테스트 용이 | ✅ 적극 권장 |
| Setter 주입 | 선택적 의존성에 적합 | ⚠️ 조건부 사용 |
| 필드 주입 | 외부에서 변경 불가, 테스트 불가 | ❌ 비권장 |
| 일반 메서드 주입 | 유연하지만 잘 사용되지 않음 | 🚫 불가 |
@RequiredArgsConstructor
public class MyApp {
private final MyService myService;
}
- 생성자 주입을 손쉽게 구현하는 Lombok의 @RequiredArgsConstructor 활용 권장
🔢 @Primary / @Qualifier를 활용한 Bean 우선순위 조절
1️⃣ @Primary
- 기본적으로 주입될 Bean 지정
@Primary
@Component
public class MysqlDatabaseService implements DatabaseService {}
2️⃣ @Qualifier
- 구체적인 Bean 이름을 지정해 주입
@Component
@Qualifier("oracleService")
public class OracleDatabaseService implements DatabaseService {}
@Autowired
public ConflictApp(@Qualifier("oracleService") DatabaseService service) { ... }
✅ 자동 vs 수동 Bean 등록 - 언제 써야 할까?
| 상황 | 자동 등록 | 수동 등록 |
| 일반 비즈니스 로직 | ✅ 사용 | ❌ 지양 |
| 외부 라이브러리 객체 | 🚫 불가 | ✅ 필요 |
| 같은 타입 Bean 여러 개 | ⚠️ 충돌 | ✅ 명시 가능 |
'SPRING' 카테고리의 다른 글
| Bean Validation (1) | 2025.03.25 |
|---|---|
| Spring Validation (0) | 2025.03.25 |
| Spring과 객체 지향 설계 (0) | 2025.03.25 |
| Spring SOLID원칙 (0) | 2025.03.25 |
| Spring Boot 일정 관리 프로젝트 고민 기록 (1) | 2025.03.25 |