Bean 수동 등록, 중복 빈 해결하기

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