inflearn logo
강의

Course

Instructor

Spring Introduction: Learning by Example (Revised Edition)

Dependency Injection

순환참조와 bean 주입에 대한 질문입니다!

407

tjrwn0716

14 asked

0

순환참조에 있어서 생성자 주입이 컴파일 타임에서 잡아낼 수 있는 이유가 빈을 주입하는 순서가 달라서라고 인터넷 서칭을 하다 알게 되었는데요,

이해한 바로는 생성자 주입은 빈을 생성 + 주입을 동시에 하고,

세터 주입, 필드 주입은 빈을 생성하고, 주입하는 단계가 나뉘어 있어 컴파일 타임에 잡지 못한다고 이해를 했는데, 맞을까요?

만약 맞다면, 생성자 주입 또한 생성 + 주입 시에 빈팩토리에서 찾아서 없다면 생성 후에 넣으면 되는 것인데, 왜 컴파일 오류가 나는지 이해가 가지 않습니다. 만약 순환참조로 생성조차 안된다면 세터주입, 필드주입 또한 실행되지 않는게 맞지 않나요?? (아래는 제가 참고한 블로그의 글입니다)

관련해서 공식문서를 참고해보고 싶은데, 어느부분을 찾아봐야 할지 잘 모르겠습니다 ㅠ

java spring

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴이에요.

순환참조와 빈 주입에 관한 질문이시군요!

순환참조는 빈들 간에 서로 참조하는 경우를 말하는데요, 이 때 생성자 주입을 사용하면 순환참조를 컴파일 타임에서 잡아낼 수 있습니다. 생성자를 호출하는 시점에서 모든 빈들이 생성되기 때문인데, 이 때 모든 빈들이 생성이 되어있는 상태이기 때문에 순환참조를 발생시킬 가능성이 없습니다.

그리고 생성자 주입외에도 다른 주입 방법들도 빈들 간의 순환참조를 해결할 수 있습니다. 예를 들어, Setter 주입은 생성자 주입과 달리 빈으로 생성된 이후에 주입이 되므로 순환참조가 발생할 수 있다는 단점이 있습니다.

반면에, 순환참조로 인해 컴파일 오류가 발생하는 이유는 빈들의 생성과 주입이 모두 끝난 후에도 순환참조 때문에 상호 참조할 수 없고, 빈 생성 과정에서도 순환참조가 발생하지 않으므로 빈 주입에 대한 순환참조는 컴파일 타임에 확인할 수 없다는 점이죠.

공식 문서에서 순환참조에 대한 내용은 “Circular Dependencies”라는 제목으로 나와 있습니다. 자세한 내용은 아래 링크를 참고해보시기 바랍니다.
https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-dependency-resolution

jar 안되는 분들 참고하세요

0

359

1

mvnw 오류

0

463

1

./mvnw package 오류

0

421

2

java -jar target/*.jar 명령어 오류..

0

446

2

./mvnw package 오류

0

279

0

./mvnw package 오류

0

210

1

실행 상태에서 변경내용이 바로 반영되나요 ??

0

225

1

도와주세용 ㅜㅜ

0

206

1

./mvnw package 오류

0

318

1

클론 받은 내용과 수업내용이

0

399

1

./mvnw package 오류

0

1144

2

jdk 버전이 자꾸 낮다면서 오류가 발생합니다.

0

891

1

age가 화면에 표시가 안됩니다.

0

395

0

에러가 뜨는데 어떻게 해야할지 도저히 모르겠어요

0

1642

1

PetClinicApplication() 함수에서 run 을 하고 싶습니다...

0

520

0

h2와 hsqldb가 어떤차이가 있는건지 궁금합니다

0

1244

0

예제가 이전과 다르네요

0

370

0

메이븐으로 설정했는데 그래들이 같이 보일수 있나요?

0

573

1

LogAspect

0

326

1

구현체가 2개 이상일때 생성자 주입

0

366

1

의존성 주입 방법들 장단점

0

493

1

인스턴스의 생명주기와 제어권

0

311

1

IoC 컨테이너 안에 있는 객체들끼리만 의존성 주입

0

372

1

ExampleRepository exampleRepository = new ExampleRepository()

0

247

1