Spring에서 객체가 주입되지 않을 때는 생성자 문제가 아니라 애초에 컨테이너가 그 객체를 모른다는 경우가 많다. 객체를 Bean으로 등록하는 대표 방식은 컴포넌트 스캔과 Java 설정이며, 둘은 경쟁 관계가 아니라 등록 대상이 다르다.
컴포넌트 스캔은 애플리케이션 코드를 찾는다
@Component, @Service, @Repository, @Controller를 붙인 클래스는 컴포넌트 스캔 범위 안에 있으면 자동 등록 대상이 된다.
@Service
class MemberService {
private final MemberRepository repository;
MemberService(MemberRepository repository) {
this.repository = repository;
}
}생성자 주입을 쓰면 필요한 의존성이 코드에 드러나고, 테스트에서 가짜 구현을 넣기도 쉽다. 필드 주입은 짧아 보이지만 객체가 언제 완성되는지와 테스트 대체가 불명확해지기 쉬워 새 코드에서는 피하는 편이 좋다.
이 예제는 MemberRepository도 등록돼 있다는 전제다. MemberService가 스캔 범위 밖에 있거나 @Service가 빠지면 생성자 코드는 멀쩡해 보여도 컨테이너에 서비스 Bean이 없어 주입이 실패한다. 먼저 등록 여부와 스캔 시작 패키지를 확인하자.
Java 설정의 @Bean은 외부 라이브러리와 조립에 적합하다
같은 MemberService를 자동 스캔 대신 명시적으로 조립할 수도 있다. 아래 방식을 고르면 앞 코드의 @Service는 제거하고 한 경로로만 등록한다.
@Configuration
class AppConfig {
@Bean
MemberService memberService(MemberRepository repository) {
return new MemberService(repository);
}
}Spring이 이미 알고 있는 MemberRepository를 매개변수로 받아 서비스를 만든다. 이 방식은 구현을 교체하거나 생성 설정을 한곳에서 결정할 때 유용하다. Clock처럼 직접 만든 클래스가 아닌 라이브러리 타입도 같은 @Bean 방식으로 등록할 수 있다. 핵심은 어느 방식이 더 최신인지가 아니라 누가 객체 생성과 선택을 책임지는지다.
스캔 범위는 넓을수록 편하지 않다
메인 애플리케이션 클래스의 패키지를 최상위에 두면 하위 패키지가 기본 스캔 범위에 들어간다. 아무 패키지나 넓게 스캔하면 테스트용 설정이나 다른 모듈의 Bean까지 등록될 수 있다. 위 예제에서 @Service와 @Bean을 동시에 남겨 두면 같은 타입의 Bean이 두 개가 된다. 주입 오류가 나면 @Primary로 급히 덮기 전에 두 등록 경로 중 어느 것을 의도했는지부터 확인하자.
환경별 구현을 바꾸려면 이름이나 조건을 명시하고, 운영용 비밀값을 설정 클래스에 하드코딩하지 않는다. 설정은 코드로 읽히지만 비밀을 안전하게 보관하는 장소는 아니다.
등록 여부는 컨텍스트 테스트로 확인한다
Bean 등록은 애플리케이션 시작 시점에 실패할 수 있으므로 최소한의 컨텍스트 테스트가 도움이 된다.
@SpringBootTest
class ContextTest {
@Autowired MemberService memberService;
@Test
void service_is_registered() {
assertThat(memberService).isNotNull();
}
}테스트가 통과하면 서비스가 등록돼 있다는 뜻이지, 어느 방식으로 등록됐는지까지 증명하지는 않는다. @Service를 지운 상태에서는 설정 클래스의 @Bean이 있는지, 설정을 지운 상태에서는 스캔 범위에 @Service가 있는지 각각 확인하자. 두 경로를 모두 남긴 테스트는 의도치 않은 중복을 놓칠 수 있으므로 Bean 개수도 확인하는 편이 좋다. 모든 테스트를 무거운 컨텍스트 테스트로 만들 필요는 없고 서비스 규칙은 단위 테스트로 분리한다.
핵심 요약
컴포넌트 스캔은 애플리케이션 클래스의 역할 기반 등록에, @Bean Java 설정은 외부 타입과 명시적인 조립에 적합하다. 생성자 주입으로 의존성을 드러내고, 스캔 범위를 의도적으로 관리하자. 중복 Bean 오류는 애너테이션을 더 붙이기 전에 등록 경로부터 확인하는 것이 안전하다.
작성자
기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

