• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

registerBean과 어셈블러(스프링 컨테이너)의 싱글톤 인스턴스 생성

24.02.01 17:46 작성 조회수 150

0

 안녕하세요

런타임시 스프링컨테이너(어셈블러)가 컨트롤러의 구현체(ex SimpleHelloService, ComplexHelloService)를 컨트롤러에 주입해줘야한다는 것을 알고있습니다.

이때 스프링 컨테이너는 클래스의 싱글톤 객체를 생성하여 주입하는 것으로 학습했습니다.

 

강의처럼 SimpleHelloService 클래스 만을 빈으로 등록하고 생성한다면, ComplexHelloService가 등장시

1. ComplexHelloService를 빈으로 등록하는 지

2. 싱글톤 객체의 구현체를 어떻게 선택하고 생성하는지

알고싶습니다. 감사합니다.

답변 1

답변을 작성해보세요.

0

컨트롤러가 어떤 빈(simple, complex)을 사용할 수 있는지, 그리고 그 중에서 어떤 빈을 실제로 주입 받아서 사용할지 결정하는 것은 꽤 많은 절차를 거칩니다.

@Configuration 클래스에서 @Bean 메소드를 만들고 그 안에서 컨트롤러 빈을 만든다면 코드로 Simple이든 Complex든 하나를 가져와서 생성자 등을 통해서 주입해주면 됩니다. 코드에서 선택을 한 것이죠.

만약 코드를 사용하지 않고 @Controller, @Service 등으로 자동 인식하게 한 뒤에 생성자 또는 setter의 파라미터 타입을 보고 주입 가능한 빈을 찾는 경우라면, 그 타입에 해당되는 빈이 딱 한 개만 등록되어있어야 합니다. 그 이상의 빈이 등록되어있으면 그 중에 어떤 걸 사용할지를 스프링 컨테이너는 알 길이 없어서 에러가 나게 됩니다.

이 경우에도 파라미터 이름과 빈 이름이 정확히 일치하는게 있으면 그게 선택될 수도 있고, @Primary가 붙은 서비스 빈이 하나만 있으면 그게 선택되기도 합니다. 파라미터 타입과 일치하는 빈 클래스 후보가 여러 개인 경우 추가 선택 방법을 제공하는 것이죠. @Bean 메소드처럼 명시적으로 주입해주는 경우가 아닐 때는, 그래서 스프링의 주입할 빈을 선택하는 알고리즘을 잘 기억할 필요가 있습니다.

Simple과 Complex 두 가지 구현을 굳이 만들어야 할 이유가 없다면, 하나만 빈으로 등록하게 하는게 바람직하고요. 이유가 있어서 두 가지를 다 빈으로 등록한다면, @Configuration에서 명시적으로 선택되게 하거나, @Primary, @Qualifier 등을 활용하는 세밀한 기법을 사용해야 합니다.

이에 대해서는 다음 문서를 읽으시면 도움을 받으실 수 있습니다.
https://docs.spring.io/spring-framework/reference/core/beans/annotation-config.html

원재님의 프로필

원재

질문자

2024.02.02

답변감사합니다! 이후 수업에서도 다뤄주시네요.

감사합니다.