해결된 질문
작성
·
214
·
수정됨
1
public class AllBeanTest {
@Test
void finaAllBean() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);
DiscountService discountService = ac.getBean(DiscountService.class);
Member member = new Member(1L, "userA", Grade.VIP);
int discountPrice = discountService.discount(member, 1000, "fixDiscountPolicy");
assertThat(discountService).isInstanceOf(DiscountService.class);
assertThat(discountPrice).isEqualTo(1000);
int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy");
assertThat(rateDiscountPrice).isEqualTo(2000);
}
static class DiscountService {
private final Map<String, DiscountPolicy> policyMap;
private final List<DiscountPolicy> policies;
@Autowired // 생략가능 생성자가 하나이기 때문에!!!
public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {
this.policyMap = policyMap;
this.policies = policies;
System.out.println("policyMap = " + policyMap);
System.out.println("policies = " + policies);
}
public int discount(Member member, int price, String discountCode) {
DiscountPolicy discountPolicy = policyMap.get(discountCode);
return discountPolicy.discount(member, price);
}
}
}
첫번째 질문, AnnotationConfigApplicationContext을 해주게되면 스프링컨테이너로 등록을하고 ac를 통해 빈으로 등록된 AutoAppconfig.class와 DiscountService.class에 접근이 가능하다고 알고있습니다.
밑에보면 ac로 DiscountService.class에만 접근하고있어서 AutoAppconfig.class를 빼주었더니 밑에있는 discountprice에 discout에서 오류가 발생합니다. 이유가 무엇일까요?
두번째 질문, 밑에 DiscountService에 강의에서 생성자를 선언해주었습니다. 지금보면 어디에서 호출이되었는지와 어떻게 값을 넣어주었는지 궁금합니다. 제생각에는 AnntationConfigApplicationContext를 할때
API문서를 보니 refresh()의 finishBeanFactoryInitialization(beanFactory); 에서 AutoAppConfig.class, DiscountService.class 에 대한 값을 이미 생성되었다고 판단되었는데 이게맞을까요? 이게맞다면 1번질문이 결국 2번질문과 연관되어있을거같습니다
세번째 질문, map에 대해 공부를해봤는데 map<String, DiscountPolicy> 에서 만약 AutoAppconfig 가 들어가있다면 this.policyMap에는 AutoAppconfig가 들어가있는 상태이고 AutoAppconfig를 들여다보니 ComponentScan이 있어서 Component로 등록되어있는 RateDiscountPolicy, FixDiscountPolicy에 매개변수로 들어온 discountCode로 접근이 가능하다가 맞을꺼같은데 제가 이해한게맞을까요?
답변 2
0
안녕하세요. 박민성님, 공식 서포터즈 David입니다.
오류가 발생했다면 어떤 오류가 발생하였는지 오류 메시지 등을 제공해 주시면 답변에 큰 도움이 됩니다. 자세한 오류 메시지를 전달 부탁드려요.
전달 받은 클래스 정보를 토대로 스프링 컨테이너에서 빈을 생성하는 과정은 생각보다 복잡합니다. 이를 자세히 알고 싶으시다면 직접 코드를 따라가보시는 것을 추천드립니다. AnnotationConfigApplicationContext.register()를 참고해 주세요.
AutoAppConfig는 Map<String, DiscountPolicy>에 들어가 있지 않습니다. 해당 Map은 DiscountPolicy 타입의 빈을 모아둔 Map이 주입된 것입니다🙂
감사합니다.
AnnotationConfigApplicationContext.register()를 쭉 따라가보시면 전달 받은 클래스를 정보를 바탕으로 객체를 생성하는 로직이 있을 것입니다.
빈이 1개만 존재해도 Map에 저장되어 전달됩니다.
0
안녕하세요, 인프런 AI 인턴입니다.
박민성님의 질문에 대한 답변은 강의 내용에 관한 이해와 스프링 프레임워크의 기능을 묻는 것으로 보입니다. 강의에 대한 이해도를 높이기 위해서는 직접 강사님이 작성하신 답변을 참조하시는 것이 가장 좋습니다. 아래 링크들에서 유사한 내용에 대한 답변을 찾아보실 수 있습니다.
제목: “AllBeanTest에서 DiscountService 가 스프링 컨테이너에 올라갈 수 있는 이유”
AllBeanTest에서 DiscountService 가 스프링 컨테이너에 올라갈 수 있는 이유
제목: “제 머리에있는 큰맥락이 맞는지 확인하고싶습니다”
제 머리에있는 큰맥락이 맞는지 확인하고싶습니다
제목: “조회한 빈이 모두 필요할 때, List, Map 강의 질문있습니다.”
조회한 빈이 모두 필요할 때, List, Map 강의 질문있습니다.
위의 내용들을 통해 강의 내용에 대한 이해를 높이고, 각 질문에 대한 답변을 얻으실 수 있을 것입니다.
답변감사드립니다
2번을 공부해봤는데 discountservice를 호출하는 코드는 없는거같은데 어떻게 초기화를한거죠?
3번에서 this로 값을 저장하는데 값을 하나만 넘어와면 string이랑 discountpolicy중에 어떤값으로 할당되어 this.policymap = policymap으로 되는건가요?