SPRING

Spring Bean 등록과 의존성 주입

도원좀비 2025. 3. 25. 19:33

📌 @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