월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 기본편
AutoAppConfig 필요성
@ComponentScan 으로 bean을 찾아서 등록하는 과정에 대해서는 이해를 했습니다.근데 AppConfig, AutoAppConfig가 모두 없는 상태에서도 bean이 자동 등록되는건 @SpringBootApplication 어노테이션을 사용하는 class가 존재하기 때문이라고 봐도 되는건가요?(@ComponentScan을 포함하므로) 위 예제에서 AutoAppConfig를 보여주신 예는 컴포넌트 스캔의 예를 보여주신거고 실제 구현에서 자동 스캔을 위해 AutoAppConfig를 따로 두지는 않아도 되는걸까요?
- 미해결스프링 핵심 원리 - 기본편
SingletonWithPrototypeTest1에서의 @RequiredArgsConstructor 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하십니까? 김영한 선생님의 강의를 학습을 하고 있는 학생입니다. 제가 학습을 잘못하여 생긴 오류인지 현재의 저의 상태에서는 이 궁금증을 풀 수가 없고 chatgpt 또한 답변을 해주지 않아서 오히려 더 궁금해졌습니다.싱글톤에서의 프로토타입 빈 사용에서의 테스트코드를 작성하다 문득 롬복을 사용하면 컴파일 시점에서 생성자가 생성이 되고 생성자가 1개이기 때문에 명시하지 않아도 스프링에 의해 @Autowired가 붙어 진행되는걸로 이 전 롬북 영상에서 그렇게 이해를 하였습니다. 그래서 아 롬복도 한번 써봐야지를 하고 진행을 했는데? 아니나 다를까 제 생각과는 많이 다르더군요. 그래서 제 학습이 지금 뭔가 잘못된거 같기도 한데 잘 모르겠습니다.1번째인 아래의 코드는 작동을 하고 2번째 코드에서는 variable prototypeBean not initialized in the default constructor 왜 이러한 에러가 나는지 궁금합니다.첫번째 코드두번째 코드감사합니다.
- 미해결스프링 핵심 원리 - 기본편
bean 등록 범위
@Beanpublic MemberService memberService(){return new MemberServiceImpl();} 위 코드에서 스프링 컨테이너는 memberService라는 빈 이름과 return 되는 구현 객체 MemberServiceImpl에 대해 매핑 테이블을 두는 것으로 이해했는데요,그럼 bean으로 등록되는 class는 MemberServiceImpl 뿐인건가요?MemberService는 Type이기 때문에 또 자동 등록되는건가요?
- 미해결스프링 핵심 원리 - 기본편
memberService.getMemberRepository(); 오류가 나요 도와주세
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.여긴 memberServiceImpl.classpackage hello.core.member;public class MemberServiceImpl implements MemberService {private final MemberRepository memberRepository; public MemberServiceImpl(MemberRepository memberRepository) {this.memberRepository = memberRepository; }@Override public void join(Member member) {memberRepository.save(member); }@Override public Member findMember(Long memberId) {return memberRepository.findById(memberId); }//test public MemberRepository getMemberRepository() {return memberRepository; }}요긴 ConfigurationSingletonTest.classpackage hello.coresingleton;import hello.core.AppConfig;import hello.core.member.MemberRepository;import hello.core.member.MemberService;import hello.core.member.MemberServiceImpl;import hello.core.order.OrderServiceImpl;import org.junit.jupiter.api.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import static org.assertj.core.api.Assertions.assertThat;public class ConfigurationSingletonTest {@Test void configurationTest() {ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class); OrderServiceImpl orderService = ac.getBean("orderService", OrderServiceImpl.class); MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class); MemberRepository memberRepository1 = memberService.getMemberRepository(); //여기 MemberRepository memberRepository2 = orderService.getMemberRepository(); System.out.println("memberService -> memberRepository = " + memberRepository1); System.out.println("memberService -> memberRepository = " + memberRepository2); System.out.println("memberRepository = " + memberRepository); assertThat(MemberService.getMemberService()).isSameAs(memberRepository); //여기 assertThat(orderService.getMemberRepository()).isSameAs(memberRepository); }}오류내용Cannot resolve method 'getMemberRepository' in 'MemberService'Cannot resolve method 'getMemberService' in 'MemberService' 그대로 적었는데 왜 그런지 모르겠어요
- 미해결스프링 핵심 원리 - 기본편
순환참조 재질문 드립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]https://www.inflearn.com/questions/964547첫번째 방법은 이해했는데두번째 방법 조금 더 상세한 설명 부탁드리겠습니다Member 엔티티에 쿠폰발급 서비스 로직을 추가 하라는 말씀이실까요 ?
- 미해결스프링 핵심 원리 - 기본편
"역할과 구현의 분리" 이 한마디에 OOP 설계의 우주가 열린 기분이네요.
겨우 섹션1만 봤을 뿐인데 뭔가 설계에 있어서 북극성을 본 느낌. 왜 코드 몇줄보다 철학을 먼저 다루었는지 알것같다.controller,클래스 등(사용자) - 서비스 (자동차회사) - 인터페이스 들(자동차표준협회) - 구현체(자동차 부품업체 들)인터페이스1 (악셀,브레이크, 변속기, 오디오 등) - 업체 A -> 업체 B인터페이스 2( 자율주행, 카엔터테인먼트) - ...인터페이스 3(썬파노라마, 자동잠금장치 등등 ) - ...단일상속, 다중상속 서비스(자동차회사)
- 해결됨스프링 핵심 원리 - 기본편
순환참조 질문드립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]예)회원서비스 (MemberService)쿠폰 서비스 (CouponService)(회원가입 시)회원 서비스에서 쿠폰 서비스를 주입받아 사용(이벤트 추가)쿠폰 서비스에서 특정 회원에게 쿠폰 발급을 위해 회원서비스 주입받아 사용회원서비스 <-> 쿠폰 서비스이런 로직이 있을 시 순환 참조 오류가 나는데어떤 방법이 가장 효율 적인지 질문드립니다.
- 미해결스프링 핵심 원리 - 기본편
주문과 할인 도메인 실행과 테스트 강의중 궁금한점이 생겨 질문드립니다.
public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository = new MemoryMemberRepository(); private final DiscountPolicy discountPolicy = new FixDiscountPolicy();public class OrderApp { public static void main(String[] args) { MemberService memberService = new MemberServiceImpl(); OrderService orderService = new OrderServiceImpl();public class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); 현재 주문 관련 다이어그램에서 주문을 하고 할인을 적용하기 위해서 회원을 조회해야 하니회원저장소(인터페이스)에서 회원을 조회하게 되어 있습니다. 그래서 위의 코드 OrderServiceImpl을 보면 MemberRepository를 의존하여 구현체를 작성하였습니다. 하지만 여기서, 회원 저장소가 아닌 회원서비스(MemberSerivce인터페이스)를 의존한다면 이것은 좋지 못한 설계인지 궁금하여 질문드립니다. 혹은 같은 서비스 계층끼리의 의존은 좋지 못한 설계라면 제 생각이 잘못되었다고 생각합니다. [이 질문을 하게 된 이유는 MeberSerivceImpl은 MemberRepository를 의존하는데 그렇게 된다면 서비스 계층의 인터페이스를 사용하여 이 서비스계층을 통하여 리포지토리 계층까지의 기능을 모두 쓸 수 있다는 점에서 장점이 있지 않을까생각하였습니다. MemberServiceImpl 클래스에서 MemberRepository를 의존하며 그의 구현체를 얼마든지 바꿀수 있기 때문에 상관없지 않을까라고 생각하였습니다.]감사합니다.
- 미해결스프링 핵심 원리 - 기본편
MemoryMemberRepository는 무상태인가요?
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]스프링 빈은 항상 무상태로 설계해야 한다고 하셨는데,MemoryMemberRepository 는 store 필드에 Member객체와 id가 저장되지 않나요?이는 무상태 설계가 아닌 것 같은데 아무 문제가 없나요?
- 미해결스프링 핵심 원리 - 기본편
롬복 동기화 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.롬복 코드 복붙 후에 동기화 시켜도 계속 실패가 뜨고 실패 로그는 안뜨는데 어떤 문제 인걸까요? 플러그인에 롬복은 있습니다 외부 라이브러리에는 없어요
- 미해결스프링 핵심 원리 - 기본편
강의 자료 오타 수정
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]빈 스코프 pdf에서클라이언트가 myLogger.logic()을 호출하면 이라고 나와있는데 myLogger에는 logic() 메서드가 존재하지 않습니다.
- 미해결스프링 핵심 원리 - 기본편
생성자 필수정보
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에서 "생성자는 필수 정보(파라미터)를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가진다."라는 내용이 있는데 여기서 필수 정보에 예제의 url은 들어가지 않는 것으로 알고 있습니다. 그럼 필수 정보의 예로는 뭐가 있을까요?? final이 붙은 필드들도 필수정보로 봐도 괜찮을까요??
- 미해결스프링 핵심 원리 - 기본편
의존관계를 잘 모르겠습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. 콜백 메서드(의존관계가 끝나면 호출되는 함수)는 의존관계가 전부 설정되었다고 어떻게 알 수 있나요?? 수업중에 만든 NetworkClient.class에서 의존관계는 누구인가요? 제가 이해한 바로는 의존관계는 @Autowired를 통해 알려지는 것 같은데 (생성자가 1개인 경우 암묵적으로 있음) 생성자에서 관련있는 변수가 없기 때문에 여기에서 의존관계에 있는 변수는 없다고 보면 될까요?
- 미해결스프링 핵심 원리 - 기본편
화면 확대
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]맥북 확대 어떻게 하시는지 궁금합니다! 스크롤로 하시는건가요 트랙패드로 하시는건가요?
- 미해결스프링 핵심 원리 - 기본편
조회한 모든 빈
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]모든 빈을 조회하기 위해 임의의 클래스를 생성하여, 해당 클래스의 생성자에 autowired로 빈을 등록하려 할 때, 해당 빈과 의존성이 있는 discountPolicy가 등록된다는 것은 알겠습니다.그런데, 이렇게되면 싱글톤 보장이 되는건가..? 라는 의문이 들었습니다.스프링에서는 싱글톤을 보장하기 위해서 discountPolicy 중에 하나만을 빈 팩토리에 등록할텐데, 여기에 임시로 만든 클래스에서는 결국 ratediscountPolicy와 fixDiscountPolicy가 모두 등록되는 상황이므로, 싱글톤이 보장되는건가요..?조금 생각해보면, 사실 싱글톤은 하나의 객체를 가지고 있는거여서 해당이 안될 것 같다는 생각도 들었지만, 확실하지 않아서 질문드립니다. 추가적으로, 한 interface의 두개의 객체를 빈 팩토리에 등록하려고 하면 에러가 뜨는 것으로 알고 있는데, 이 Map에서는 어떻게 두 개의 구체 클래스를 모두 가져올 수 있는지 궁금합니다. 감사합니다.
- 미해결스프링 핵심 원리 - 기본편
order 관련 코드가 이해가 안됩니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요강사님 코드를 계속 따라오다 코드를 한번 쭉 훑어 보는 시간을 가졌는데 갑자기 이해가 안되어 강의를 다시 봤는데도 헷갈려 질문 드립니다. OrderApp 클래스에서 OrderService orderService = applicationContext.getBean("orderService", OrderService.class); Order order = orderService.createOrder(memberId,"itemA",10000); 라고 사용할 수 있는 이유가 뭔가요??orderService는 인터페이스 이고,orderService에 있는 메소드는 추상 메소드라서 그 내용이 구현되지 않은 상태이므로, orderService.createOrder 메소드를 바로 사용할 수 없는 것 아닌가요?? OrderServiceImpl 클래스에서코드:private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy;//인터페이스에만 의존하도록 설계. 이렇게 해서 구체적인 구현체에는 신경을 안씀. @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository=memberRepository; this.discountPolicy=discountPolicy; } @Override public Order createOrder(Long memberId, String itemName, int itempPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itempPrice); return new Order(memberId, itemName, itempPrice, discountPrice); }코드에서. 아래 코드가 잘 이해가 안됩니다.private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy;//인터페이스에만 의존하도록 설계. 이렇게 해서 구체적인 구현체에는 신경을 안씀.MemberRepository라는 인터페이스를 위와 같이 사용하고 구성하는 이유가 명확하게 잘 와닿지 않습니다.이렇게 설계하는 이유가 아래 첨부한 사진과 같을 것이라고 예상은 되는데.. 설명 부탁드리겠습니다.private final MemberRepository memberRepository;private final DiscountPolicy discountPolicy;// 코드에서인터페이스에 private와 final을 붙인 이유가 무엇인가요??MemberRepository라는 것은 멤버들의 ID가 저장되어 있기 때문에 모든 클래스들이 접근하고 수정될 수 있어야 하는 것 아닌가요?? 그리고 자바 스프링에서 인터페이스의 역할은 무엇인지 알 수 있을까요??아래와 같은 사진과 같이 설계하는 것이 의존성 주입을 위해서 라는 것은 어렴풋이 이해하겠습니다..근데 명확하게 인터페이스가 어떤 역할을 한다는 것이 잘 이해가 안됩니다. 인터페이스란 말 그대로 "클래스에서 어떤 값을 가져올 때, 인터페이스에 정의된 형식을 통해서 값을 가져온다?"이런 느낌으로 이해하면 될까요?? 5.그리고 이걸 종합적으로 이해하면자바 스프링에서는 "빈과 인터페이스와 직접적으로 연결된 느낌(?)이고, 인터페이스의 구체적인 내용(메소드 등)은 그 인터페이스를 현재 사용하는 자바 클래스(구현체)에서 정의한다." 이렇게 이해하는게 맞나요?즉, 인터페이스를 정의 해놓고, 상황에 따라 필요한 구현체를 갈아 끼운다라는 표현이 맞는건가요?? 모르는 부분이 많아 횡설수설 적었네요 죄송합니다.더위 조심하시고 설명 부탁드립니다.
- 해결됨스프링 핵심 원리 - 기본편
Extract Method 창이 안 생깁니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네[질문 내용]Ctrl + Alt + m 누르고 다시 m 눌러도 안되고 Geforce Experience를 들어가서 게임 내 오버레이 기능을 OFF하면 된다는데 전 그것도 안 깔려져 있습니다. 어떻게 하면 해결할까요?
- 미해결스프링 핵심 원리 - 기본편
ComponentFilterAppConfigTest.java 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요! 실행하면 에러가 나는데 왜그런걸까요...??package hello.core.scan.filter;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.AssertionsKt;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.NoSuchBeanDefinitionException;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.FilterType;import static org.assertj.core.api.Assertions.assertThat;import static org.junit.jupiter.api.Assertions.assertThrows;import static org.springframework.context.annotation.ComponentScan.*;public class ComponentFilterAppConfigTest {@Test void filterScan(){ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class); BeanA beanA = ac.getBean("beanA", BeanA.class); assertThat(beanA).isNotNull(); assertThrows(NoSuchBeanDefinitionException.class, () -> ac.getBean("beanB", BeanB.class)); }@Configuration @ComponentScan(includeFilters = @Filter(classes = MyExcludeComponent.class), excludeFilters = @Filter(classes = MyExcludeComponent.class))static class ComponentFilterAppConfig{}} 에러코드는 이렇습니다...!"C:\Program Files\Java\jdk-11\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.4\lib\idea_rt.jar=63502:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\Lets Go Rust\.m2\repository\org\junit\platform\junit-platform-launcher\1.8.2\junit-platform-launcher-1.8.2.jar;C:\Users\Lets Go Rust\.m2\repository\org\junit\platform\junit-platform-engine\1.8.2\junit-platform-engine-1.8.2.jar;C:\Users\Lets Go Rust\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\Lets Go Rust\.m2\repository\org\junit\platform\junit-platform-commons\1.8.2\junit-platform-commons-1.8.2.jar;C:\Users\Lets Go Rust\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.4\lib\idea_rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.4\plugins\junit\lib\junit5-rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.4\plugins\junit\lib\junit-rt.jar;C:\core (1)\core\out\test\classes;C:\core (1)\core\out\production\classes;C:\core (1)\core\out\production\resources;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-test\2.7.13\c937a5716d02d8dcd64f742d12607993873e7a5a\spring-boot-starter-test-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter\2.7.13\5617ca04b06778877fb80d146dd2d0dd6adb23a8\spring-boot-starter-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-test-autoconfigure\2.7.13\1de71639f25f4948cbe50904a1118e060c91f6a5\spring-boot-test-autoconfigure-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-test\2.7.13\be93829dcb79b788678654deefbb675045a60fb0\spring-boot-test-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-test\5.3.28\3a6ce360d853c9083f82196e0a4ced4ab2fe5c6b\spring-test-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-core\5.3.28\5b7ec246fef72fdfbb0b4123956715ca89cc6ddf\spring-core-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\com.jayway.jsonpath\json-path\2.7.0\f9d7d9659f2694e61142046ff8a216c047f263e8\json-path-2.7.0.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\jakarta.xml.bind\jakarta.xml.bind-api\2.3.3\48e3b9cfc10752fba3521d6511f4165bea951801\jakarta.xml.bind-api-2.3.3.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.assertj\assertj-core\3.22.0\c300c0c6a24559f35fa0bd3a5472dc1edcd0111e\assertj-core-3.22.0.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.hamcrest\hamcrest\2.2\1820c0968dba3a11a1b30669bb1f01978a91dedc\hamcrest-2.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.jupiter\junit-jupiter\5.8.2\5a817b1e63f1217e5c586090c45e681281f097ad\junit-jupiter-5.8.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.mockito\mockito-junit-jupiter\4.5.1\f81fb60bd69b3a6e5537ae23b883326f01632a61\mockito-junit-jupiter-4.5.1.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.mockito\mockito-core\4.5.1\ed456e623e5afc6f4cee3ae58144e5c45f3b3bf\mockito-core-4.5.1.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.skyscreamer\jsonassert\1.5.1\6d842d0faf4cf6725c509a5e5347d319ee0431c3\jsonassert-1.5.1.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.xmlunit\xmlunit-core\2.9.1\e5833662d9a1279a37da3ef6f62a1da29fcd68c4\xmlunit-core-2.9.1.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-autoconfigure\2.7.13\1b6b9605b1b116e32c372f3b9e15abf7bb17038c\spring-boot-autoconfigure-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot\2.7.13\d009fa51c7792c9e510da7e69329baf39591707d\spring-boot-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-logging\2.7.13\8a5e9bd6fa8341193a977d408b9a44faaa684c8d\spring-boot-starter-logging-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\jakarta.annotation\jakarta.annotation-api\1.3.5\59eb84ee0d616332ff44aba065f3888cf002cd2d\jakarta.annotation-api-1.3.5.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.yaml\snakeyaml\1.30\8fde7fe2586328ac3c68db92045e1c8759125000\snakeyaml-1.30.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-jcl\5.3.28\d67e8b213aa08a0f3d71e547fb4345372d819d36\spring-jcl-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\net.minidev\json-smart\2.4.11\cc5888f14a5768f254b97bafe8b9fd29b31e872e\json-smart-2.4.11.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\1.7.36\6c62681a2f655b49963a5983b8b0950a6120ae14\slf4j-api-1.7.36.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\jakarta.activation\jakarta.activation-api\1.2.2\99f53adba383cb1bf7c3862844488574b559621f\jakarta.activation-api-1.2.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.jupiter\junit-jupiter-params\5.8.2\ddeafe92fc263f895bfb73ffeca7fd56e23c2cce\junit-jupiter-params-5.8.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.jupiter\junit-jupiter-api\5.8.2\4c21029217adf07e4c0d0c5e192b6bf610c94bdc\junit-jupiter-api-5.8.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy\1.12.23\d470526e8c4566c04e9ae5d3ccb62d1a7aa58986\byte-buddy-1.12.23.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.12.23\1cba11fdb72c383edacb909f79ae6870efd275e4\byte-buddy-agent-1.12.23.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\com.vaadin.external.google\android-json\0.0.20131108.vaadin1\fa26d351fe62a6a17f5cda1287c1c6110dec413f\android-json-0.0.20131108.vaadin1.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-context\5.3.28\edf8ebfd637e3e10ec7fed697eb69f2a5229748a\spring-context-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-classic\1.2.12\d4dee19148dccb177a0736eb2027bd195341da78\logback-classic-1.2.12.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-to-slf4j\2.17.2\17dd0fae2747d9a28c67bc9534108823d2376b46\log4j-to-slf4j-2.17.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.slf4j\jul-to-slf4j\1.7.36\ed46d81cef9c412a88caef405b58f93a678ff2ca\jul-to-slf4j-1.7.36.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\net.minidev\accessors-smart\2.4.11\245ceca7bdf3190fbb977045c852d5f3c8efece1\accessors-smart-2.4.11.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.apiguardian\apiguardian-api\1.1.2\a231e0d844d2721b0fa1b238006d15c6ded6842a\apiguardian-api-1.1.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.platform\junit-platform-commons\1.8.2\32c8b8617c1342376fd5af2053da6410d8866861\junit-platform-commons-1.8.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.opentest4j\opentest4j\1.2.0\28c11eb91f9b6d8e200631d46e20a7f407f2a046\opentest4j-1.2.0.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-aop\5.3.28\aada0ea72a3efee5f02f264f90329f7eddedf321\spring-aop-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-beans\5.3.28\4d232acbb7031963688cf28b1b34134937892c4f\spring-beans-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-expression\5.3.28\d049216b1a73b939b36bbf5cc7ce734cace7b245\spring-expression-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-core\1.2.12\1d8e51a698b138065d73baefb4f94531faa323cb\logback-core-1.2.12.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.17.2\f42d6afa111b4dec5d2aea0fe2197240749a4ea6\log4j-api-2.17.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.3\8e6300ef51c1d801a7ed62d07cd221aca3a90640\asm-9.3.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.jupiter\junit-jupiter-engine\5.8.2\c598b4328d2f397194d11df3b1648d68d7d990e3\junit-jupiter-engine-5.8.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.objenesis\objenesis\3.2\7fadf57620c8b8abdf7519533e5527367cb51f09\objenesis-3.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.platform\junit-platform-engine\1.8.2\b737de09f19864bd136805c84df7999a142fec29\junit-platform-engine-1.8.2.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 hello.core.scan.filter.ComponentFilterAppConfigTest,filterScan11:18:23.674 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@5869572511:18:23.708 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'11:18:24.012 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'11:18:24.018 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'11:18:24.020 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'11:18:24.024 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'11:18:24.048 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'componentFilterAppConfigTest.ComponentFilterAppConfig'org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'beanA' available at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:874) at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1358) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:309) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1162) at hello.core.scan.filter.ComponentFilterAppConfigTest.filterScan(ComponentFilterAppConfigTest.java:24) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)
- 미해결스프링 핵심 원리 - 기본편
생성자 주입
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 생성자 주입에서는 생성자가 하나만 있을 때, 자동으로 생성자 주입을 진행한다고 했습니다. 그렇다면 생성자가 많을 때, 의존관계가 최대한 많은 곳에 @Autowired를 넣는 것이 좋은거 아닌가요??그래야 의존성이 많이 주입돼서, 싱글톤을 많이 관리할 수 있다고 생각했기 때문입니다. 또한 생성자를 사용할 때, 다양한 생성자를 싱글톤으로 관리하고 싶은 경우는 어떻게 사용하는지 궁금합니다.
- 미해결스프링 핵심 원리 - 기본편
빈 생명주기 콜백 강의 관련 질문!!!!
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]빈 생명주기 콜백 강의를 듣고 있는데요 정확히 초기화 콜백이 뭔지 잘 이해가 되지 않아서요ㅠㅠ@Bean(initMethod = ~) 이렇게 초기화, 소멸 메서드를 지정할 경우 강의에서 보여주신 예시처럼 LifeCycleConfig 클래스를 보면NetworkClient networkClient = new NetworkClient();networkClient.setUrl(~);return networkClient;인데 왜 setUrl 메서드가 수행되고나서 초기화 메서드인 init() 메서드가 수행되는 건가요??초기화 메서드는 객체가 생성되고 의존관계가 주입된 후 수행된다고 했는데 NetworkClient 클래스 코드를 보면 객체를 생성하기위해 생성자를 실행시키는건 알겠는데 그 다음에 이 클래스에서 의존관계를 어디에 주입한다는 건가요?? @Autowired 를 안썼는데 의존관계 주입이 그냥 되는건가요??객체를 생성하고 의존관계를 주입했다면 setUrl 메서드보다 초기화 메서드인 init 메서드가 먼저 실행되어야 하는거 아닌가요??