inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

토비의 스프링 부트 - 이해와 원리

의존 오브젝트 DI 적용

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

335

원재

작성한 질문수 1

0

 안녕하세요

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

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

 

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

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

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

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

spring spring-boot spring-jdbc

답변 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

0

원재

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

감사합니다.

11강에서 cmd에서 spring shell에 $ init 하면 Fail 메세지

0

76

2

TestRestTemplate 을 통해 테스트 실행시 웹 요청 정보가 콘솔에 표시되지 않습니다.

0

85

1

섹션7. 자동구성 정보파일분리 강의 질문(@MyAutoConfiguration 붙힌 이유)

0

202

2

WebApplicationContext를 DispatcherServlet에 this로 넘기는 것

0

279

2

인프라 빈 구성 정보의 분리에서 EnableMyAutoConfiguration 질문드립니다.

0

211

2

질문드립니다.

0

233

2

spring boot 3.3.7로 학습중입니다.

0

371

2

Serverproperties 객체 생성 후 @Impor 어노테이션 사용 이유 용도

0

162

2

spring start io 에서 이제더이상 2.x버전은 지원하지 않는 것 같습니다.

1

298

2

Springboot 3.2 이상에서 파라미터 추론관련

0

918

4

binding error

0

222

3

Arrays.copyOf 메서드의 타입 세이프

1

156

2

MyOnClassCondition에 있는 matches method의 Invoke 횟수

1

233

3

인용구의 출처가 궁금합니다.

0

259

1

프로퍼티 빈의 후처리기 도입 AnnotationUtils의 사용

0

236

2

SimpleCacheConfiguration과 빈 등록

0

169

2

MyAutoConfigImportSelector 에서 생성자로 ClassLoader를 주입받을 수 있는 점

0

244

1

IntelliJ project jenerator spring initailizr

0

150

1

강의 자료 레퍼지토리에 업로드

0

216

1

강의자료

0

388

1

Hikari 라이브러리가 없으면 오류가 나는거 아닌가요

0

314

2

Tomcat 포트 프로퍼티 미설정시 랜덤 포트 설정 문의

0

476

5

@Import 로 Bean을 등록해야하는 기준이 뭔지 궁금합니다.

0

343

2

application.properties파일내 프로퍼티 이름

0

214

1