Spring Boot
스프링 빈(Bean) 수동 등록과 중복 빈 해결하기
💡 @Component로 자동 등록했던 빈을 직접 코드로 등록하는 방법과, 같은 타입의 빈이 여러 개 존재할 때 스프링이 어떤 빈을 선택하게 할지 결정하는 방법 공부하기
1. Bean을 수동으로 등록하는 방법
보통은 @Component를 써서 자동으로 빈을 등록하지만, 비즈니스 로직과 관련이 적은 기술적인 설정이나 외부 라이브러리를 빈으로 등록할 때는 수동 등록이 관리에 유리하다.
@Configuration과 @Bean 활용
수동 등록을 하려면 설정 클래스 위에 @Configuration을 붙이고, 메서드 위에 @Bean을 선언합니다.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
/**
* 애플리케이션의 비밀번호 암호화 방식을 설정하는 클래스
*/
@Configuration // 이 클래스가 Spring의 설정 정보를 담고 있는 클래스 선언
public class PasswordConfig {
/**
* 비밀번호를 암호화하는 PasswordEncoder를 Spring Bean으로 등록합니다.
* @return BCrypt 해시 알고리즘을 사용하는 PasswordEncoder 객체
*/
@Bean // 메서드가 반환하는 객체를 Spring 컨테이너가 관리하는 Bean으로 등록
public PasswordEncoder passwordEncoder() {
// BCryptPasswordEncoder는 비밀번호를 안전하게 해싱하기 위해 강력한 솔팅(Salting) 기법을 사용
// Spring Security에서 권장하는 가장 표준적인 암호화 방식
return new BCryptPasswordEncoder();
}
}
- @Configuration: "이 클래스는 스프링의 설정 정보야"라고 알려주는 역할.
- @Bean: 메서드가 반환하는 객체를 스프링 컨테이너가 관리하는 빈으로 등록하게 해준
2. 같은 타입의 Bean이 2개라면?
만약 인터페이스 하나를 구현한 클래스가 두 개(예: Pizza, Chicken)이고 둘 다 빈으로 등록되어 있다면, 스프링은 NoUniqueBeanDefinitionException 에러를 던진다 누구를 선택해야 될 지 모르기 때문.
해결 방법 3가지
① @Primary 사용 (추천)
가장 기본적으로 사용할 빈 위에 이 애너테이션을 붙입니다. 범용적으로 쓰이는 빈에 적합
@Component
@Primary
public class Chicken implements Food { ... }
② @Qualifier 사용
빈에 이름을 붙여주고, 사용할 곳에서 그 이름을 명시합니다. 특정 상황에서만 필요한 빈을 부를 때 좋다.
@Component
@Qualifier("pizza")
public class Pizza implements Food { ... }
// 사용할 때
public Consumer(@Qualifier("pizza") Food food) { ... }
③ 모든 빈을 다 받기
List나 Map을 사용하여 해당 타입의 모든 빈을 한 번에 주입받을 수도 있다.
정리
✔ 수동 등록은 기술적 설정이나 외부 라이브러리에 사용
✔ 빈 중복 시에는 우선순위인 @Primary를 먼저 고려
✔ 세밀한 조절이 필요할 때는 @Qualifier를 병행
'Spring > spring 숙련' 카테고리의 다른 글
| RestTemplate (0) | 2026.04.09 |
|---|---|
| Vaildation (1) | 2026.04.09 |
| Session/Cookie/Filter/Listener (0) | 2026.04.09 |
| 쿠키(Cookie)와 세션(Session) (1) | 2026.04.09 |
| 인증(Authentication) vs 인가(Authorization) (0) | 2026.04.09 |
