묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
필드 주입의 순환 참조 탐지 시기
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 강의를 듣고 관련 질문들을 찾아보아도 해결되지 않아 문의 남깁니다.스프링에서 생성자 주입을 사용하는 경우 스프링 컨텍스트가 시작하며 순환 참조를 탐지하고 예외를 발생시키는 것으로 알고 있습니다. 그래서 이를 피하기 위해 좋지 않은 예시인 것은 알지만 필드 주입 or setter 주입을 사용할 수 있는 것으로 알고 있습니다.헌데 코드처럼 필드 주입을 통해 AService가 BService의 객체를 필드 주입으로 설정하고, BService 또한 AService의 객체를 필드 주입하도록 설정했습니다. 이 때, 스프링 컨텍스트가 시작되며 해당 순환 참조와 관련된 메소드 호출이 일어나기 전에 스프링이 미리 이를 감지하고 예외를 던져버리는데 제가 이해한 내용이 잘못된 것인지 의문이 생깁니다... IDE는 인텔리제이를 쓰고 있고, 스프링부트 버젼은 2.7.8입니다@Controller public class TestController { @Autowired private AService aService; @GetMapping("/test") public void test() { } } @Service public class AService { @Autowired private BService bService; @Transactional public void test() { ; } } @Service public class BService { @Autowired private AService aService; @Transactional public void test2() { } }
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
forwardRef가 어떻게 동작하는지 궁금합니다.
15일 전에 질문을 작성하였는데 못 보신 것 같아서 다시 글 올립니다. 밑의 글은 예전 글을 그대로 가져왔습니다. 순환참조를 해결하기 위해서 forwardRef를 사용하는 것은 알겠습니다. 그런데 어떻게 동작하길래 이 함수가 순환참조 문제를 해결할 수 있는 것인가요? 이름만 들어서는 참조를 앞으로 한다는 것 같은데 구체적으로 어떻게 동작하는지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
의존관계 주입과 Bean의 생명주기에 대해 질문드립니다!
안녕하세요 강사님. 빈 의존관계 주입에 대한 강의를 들은 후, 주입 방식을 필드주입 -> 생성자 주입 으로 바꾸면서 발생한 오류에 대해 질문드립니다. ServiceA와 ServiceB는 서로 순환 참조관계였습니다. 필드 주입을 사용한 코드는 아래와 같습니다. @Service public class ServiceA{ @Autowired ServiceB B; } @Service public class ServiceB{ @Autowired ServiceA A; } 위의 코드에서는 문제없이 동작하던 코드가 The dependencies of some of the beans in the application context form a cycle: ┌─────┐ | serviceA defined in file [C:\Users\qazxs\Desktop\demo\build\classes\java\main\com\example\demo\ServiceA.class] ↑ ↓ | serviceB defined in file [C:\Users\qazxs\Desktop\demo\build\classes\java\main\com\example\demo\ServiceB.class] @Service @RequiredArgsConstructor public class ServiceA{ private final ServiceB B; } @Service @RequiredArgsConstructor public class ServiceB{ private final ServiceA A; } 강의에서 Bean의 생명주기는 "스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> ... " 의 순서로 진행된다고 배웠습니다. 필드 주입의 경우 생성자 없이 이미 생성된 빈들의 의존관계는 순환참조가 있더라도 주입이 가능하고,생성자 주입의 경우 "스프링 빈 생성"단계(생성자)에서 순환 참조가 있을 경우 스프링 빈을 정상적으로 생성하지 못해 오류가 발생한다고 히해해도 될까요? 늘 좋은 강의 감사합니다. 강의를 들을 수록 수정할 코드가 보이는게 보람이 있습니다 ㅎㅎ