묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
Appconfig 질문 / 생성자 호출
public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); } public OrderService orderService() { return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy()); } }Appconfig 에서orderService() 조회하면(호출하면) ( 생성자니까 Appconfig 객체가 생성되면 호출된다 ) ( MemoryMemberRepository() 객체 생성 ,FixDiscountPolicy() 객체 생성 )--> 이 생성된 객체의 참조값을 OrderServiceImpl 객체 생성할 때 생성자로 전달 public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy;OrderServiceImpl 에 생성자 호출 - 참조값이 넘어감 OrderServiceImpl 객체의MemberRepository 에 MemoryMemberRepository 할당DiscountPolicy 에 FixDiscountPolicy 할당나중에 할인 정책이 변경되어 수정해야한다면 OrderServiceImpl 변경하지않고 AppConfig 에서만 변경하면 됨 public OrderService orderService() { return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy()); } 제가 자바 기초 문법 (생성자? ) 을 깊이 몰라서 ,, ㅜ 이렇게 이해했는데맞는지 확인 부탁드립니다 !!
-
미해결스프링 핵심 원리 - 기본편
내부 클래스 static 질문입니다.
@Configuration @ComponentScan( includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class), excludeFilters= @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyExIncludeComponent.class) ) class ComponentFilterAppConfig{ } } 이 코드 static class ComponentFilterAppConfig{ }에서 static 이 있는 이유가 궁금하여 빼서 돌려보니org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'componentFilterAppConfigTest.ComponentFilterAppConfig': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hello.core.scan.filter.ComponentFilterAppConfigTest' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}이런 오류가 나왔습니다.구글링을 해보니 제생각에는CommponentFilterAppConfigTest.class에서 빈을 찾지 못하여 발생한 것 같은데 보통 어노테이션을 지정하지 않으면 이런 오류가 나온다고 하더군요https://sas-study.tistory.com/385하지만 저는 단지 static 만 뺏을 뿐인데 이런 오류가 왜 나는지 궁금했습니다.마우스를 올려보니Inner class 'ComponentFilterAppConfig' may be 'static'이런 글이 있었습니다.그래서 찾아보니 https://siyoon210.tistory.com/141'외부 참조'로 인한 단점때문에 내부 클래스는 가능한 static으로 만들어야 합니다. 라고 하고'외부 참조'로 인한 2가지 단점은아래 와 같다고 하더군요참조값을 담아야 하기 때문에, 인스턴스 생성시 시간적, 공간적으로 성능이 낮아진다.외부 인스턴스에 대한 참조가 존재하기 때문에, 가비지 컬렉션이 인스턴스 수거를 하지 못하여 메모리 누수가 생길 수 있다.그러면 종합에서 생각한게 빈을 찾지 못하는건 외부참조가 가능해서인가? 라는 의문이 들었습니다.그리고 정확한 이유가 궁금해졌습니다.<전체 코드>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 = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class), excludeFilters= @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyExIncludeComponent.class) ) static class ComponentFilterAppConfig{ } }정리하자면 이 코드에서 static class ComponentFilterAppConfig{ } 가 static 이 없으면 왜 오류가 나는지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
프로젝트 생성 관련 질문있습니다.
안녕하세요. 혹시 스프링 프로젝트를 새로 만들 때마다 initializer로 매번 generate을 해서 라이브러리를 매번 다운 받아야 하는 걸까요???
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
Switch case 관련 질문
안녕하세요.switch case(후반전) 강의 3분 30초 부분에서 궁금한 점이 생겨 질문을 남깁니다. 제가 알기로는 switch case를 사용할 때, 그 case에 해당하는 경우에만 수행 동작을 실행하는 걸로 알고 있습니다. 이 영상에서도 마찬가지로 grade를 1이라고 가정할 때, case 1은 조건을 만족하므로 price에 1000을 더해주었습니다. 하지만 그 이후 case 2를 만족하지 않음에도 불구하고 1000을 더해주고, case 3도 만족하지 않지만 1000을 더한 결과 값이 출력 되었습니다.즉, break를 넣으면 switch문을 빠져나갈 수 있다는 것은 알고 있으나, 왜 break가 없어졌다는 이유로 다음 case의 수행 동작이 실행되는지 잘 모르겠습니다. 이와 관련하여 매커니즘을 조금 더 자세히 설명해주시면 감사할 것 같습니다..!
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
Thread 질문
선생님이 하신거랑 똑같이 했는데 저는 컴파일결과가 사장청소와 직원청소가 섞여서 안나오네요... package chap_12; import chap_12.clean.CleanThread; public class _01_Thread { public static void main(String[] args) { // 하나의 프로세스 (Process) // 쓰레드 (Thread) // 1 3 5 7 9 // ---복도--- // 2 4 6 8 10 // cleanBySelf(); CleanThread cleanThread = new CleanThread(); // cleanThread.run(); // 직원 청소 cleanThread.start(); cleanByBoss(); // 사장 청소 } public static void cleanBySelf() { System.out.println("-- 혼자 청소 시작 --"); for (int i = 1; i < 10; i++) { System.out.println("(혼자) " + i + "번방 청소 중"); } System.out.println("-- 혼자 청소 끝 --"); } public static void cleanByBoss() { System.out.println("-- 사장 청소 시작 --"); for (int i = 1; i <= 10; i += 2) { System.out.println("(사장) " + i + "번방 청소 중"); } System.out.println("-- 사장 청소 끝 --"); } } package chap_12.clean; public class CleanThread extends Thread { public void run() { System.out.println("-- 직원 청소 시작 (Thread) --"); for (int i = 2; i <= 10; i += 2) { System.out.println("(직원) " + i + "번방 청소 중 (Thread)"); } System.out.println("-- 직원 청소 끝 (Thread) --"); } } ------------ 결과 --------------------- -- 사장 청소 시작 -- (사장) 1번방 청소 중 (사장) 3번방 청소 중 (사장) 5번방 청소 중 (사장) 7번방 청소 중 (사장) 9번방 청소 중 -- 사장 청소 끝 -- -- 직원 청소 시작 (Thread) -- (직원) 2번방 청소 중 (Thread) (직원) 4번방 청소 중 (Thread) (직원) 6번방 청소 중 (Thread) (직원) 8번방 청소 중 (Thread) (직원) 10번방 청소 중 (Thread) -- 직원 청소 끝 (Thread) -- Process finished with exit code 0
-
미해결은종쌤과 자바로 디자인 패턴 쉽게 시작하기
수업내용을 개인 블로그에 정리하여 게시해도 될까요?
선생님 안녕하세요! 자바 강의부터 디자인패턴 강의까지 선생님의 수업으로 많은 것을 배우고 있는 수강생입니다. 선생님의 디자인패턴 강의를 복습차 정리하여 개인 블로그에 올려도 괜찮을지 문의드립니다. 허락하신다면, 강의에서 배운 디자인패턴 내용을 제가 이해한 부분 중심으로 정리하고, 예시코드 일부를 함께 게시하려고 합니다! (해당 강의 링크를 출처로 기재하겠습니다)혹시 강의 자료와 내용의 저작권과 관련된 문제가 생길 수 있다면 게시하지 않겠습니다!
-
미해결스프링 핵심 원리 - 기본편
CoreApplication을 실행 후,테스트 코드까지 같이 실행되어 문제가 발생했습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]CoreApplication을 실행하면 테스트 코드 속 내용까지 실행되는 것 같습니다...1. BeanDefinitionOverrideException 오류CoreApplication 실행 후 다음과 같은 오류가 떴습니다.BeanDefinitionOverrideException: Invalid bean definition with name 'rateDiscountPolicy' defined in class path resource [com/example/core/beanfind/ApplicationContextExtendsFindTest$TestConfig.class]해당 ApplicationContextExtendsFindTest 테스트 파일 속 TestConfig의 @Configuration을 제거하자 정상 작동 되었습니다.2. 1번 문제 해결 후 로그 보니 NetworkClient 관련 테스트 로그가 뜹니다.위 사진을 보면 앞에서 lifecycle 강의할 때 쓴 테스트 코드가 실행돼서 `call: http://hello-spring.dev message = 초기화 연결 메시지`같은 것이 출력된 것으로 추측하고 있습니다.결론: 이처럼 테스트 코드까지 실행돼서(제 추측) 문제가 생겼고, 앞으로 진행하면서도 에로사항이 될 것 같습니다.이를 어떻게 해결하면 좋을지 여쭤봅니다. 프로젝트 파일 링크:https://drive.google.com/file/d/1PFJv9O46d9ny42RcxwIcFQjcoMA2oBK-/view?usp=sharing
-
해결됨스프링 핵심 원리 - 기본편
스프링 컨테이너 생성시 타입
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);이렇게 생성 타입을 ApplicationContext로 하는 것과 AnnotationConfigApplicationContext로 하는 것 차이와 어떤 방법이 더 나은지 알 수 있을까요?
-
미해결스프링 핵심 원리 - 기본편
discount 에 대해서.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. discount 메서드가 제가 제대로 이해한게 맞나요?public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); // map 에서 해당 key 값을 주입 System.out.println("discountCode = " + discountCode); System.out.println("discountPolicy = " + discountPolicy); return discountPolicy.discount(member,price); }DiscountPolicy discountPolicy = policyMap.get(discountCode);이 부분이 policyMap 에 있는 key값이 스프링 빈 이름이고 그에 해당하는 value를 가져와서 부모인 DiscountPolicy discountPolicy 에 구현체인 fix나 rate 값을 넣고 discountPolicy.discount(member,price); }fix나 rate discountPolicy 를 실행하기 위한 값member,price 값을 넣어주는 메서드가 맞을까요 ? 2. list, policies를 이용한 discount 실행 시 코드 DiscountService discountService = ac.getBean(DiscountService.class);실행 시 DiscountService에 있는 출력 결과가 fix는 key, value 값을 제대로 조회해 주는데 policyMap = {fixDiscountPolicy=hello.core.discount.FixDiscountPolicy@246f8b8b, rateDiscountPolicy=hello.core.discount.RateDiscountPolicy@278bb07e}rate의 경우 value 만 출력이 되는데 private final List<DiscountPolicy> policies;policies를 사용 시 어떻게 코드를 짜야 할까요 ??int listNum = 0; if(discountCode == "fixDiscountPolicy"){ listNum = 0; }else{ listNum = 1; } DiscountPolicy discountPolicy = policies.get(listNum);list 등록 순서를 알아서 이렇게 짜긴 했는데 더 간단한 방법이 있나 질문 남깁니다.
-
미해결스프링 핵심 원리 - 기본편
memberRepository가 다른 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]memberRepository가 다르게 나와서 다른 분들의 질문 답변을 보고 해결했습니다.Appconfig의 memberRepository가 static으로 선언되어 있기 때문이더라구요. 그래서 궁금한점이, 왜 static으로 선언되면 singleton이 되지 않나요?항상 친절한 답변 감사드립니다^^!ㅎㅎ
-
미해결스프링 핵심 원리 - 기본편
순수한 자바 테스트 코드
필드 주입을 사용하면 생기는 문제점에 관한 내용을 보다가 궁금한 것이 생겨서 질문드립니다.스프링의 @Autowired 가 동작하지 않는 순수한 자바 테스트 코드에서, @Autowired가 붙은 필드, setter함수, 생성자는 @Autowired가 없는 순수 자바 코드로 동작한다고 생각하면 되나요? 예를 들어,OrderServiceImpl 클래스에는 필드 or setter 함수 or 생성자에 @Autowired 가 붙어있는데,OrderServiceTest 클래스에서는 순수한 자바 코드만으로 테스트를 수행하려고 할 때, OrderServiceImpl 클래스의 필드 or setter or 생성자를 @Autowired가 없다고 생각하고 갖고와서 쓸 수 있는지 궁금합니다. 또, 이 상황에서 테스트코드에서 따로 @Autowired에 의해서 발생하는 오류는 없는지 궁금합니다.
-
해결됨스프링 핵심 원리 - 기본편
static SingletonService getInstance() 질문입니다.
다른 사람분 질문 답변중에public class SingletonService { //1. static 영역에 객체를 딱 1개만 생성해둔다. private static final SingletonService instance = new SingletonService(); //2. public으로 열어서 객체 인스터스가 필요하면 이 static 메서드를 통해서만 조회하도록 허용한다. public static SingletonService getInstance() { return instance; } //3. 생성자를 private으로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다. private SingletonService() { } public void logic() { System.out.println("싱글톤 객체 로직 호출"); } }이 코드의 static SingletonService getInstance()에 대한 글을 읽고 궁금한점이 생겨 질문드립니다.안녕하세요, lsj59285 님! 공식 서포터즈 codesweaver 입니다. 우선 멤버변수 instance 가 private 접근 제어자 이기에 외부에서 이 멤버변수에 직접 접근할 수 없습니다. 게다가 생성자도 private 이기에 객체를 생성하여 사용할 수도 없지요. instance에 접근할 수 있는 방법이 필요한데 그게 getInstance() 메서드 입니다. 인스턴스를 생성하지 않고 접근해야 하니 static 이어야 하고요. 그리고 getInstance() 에서 멤버변수 instance 에 접근하는데요 이 때, static 영역에서 instance (힙 영역)을 참조할 수 없습니다. static 은 프로그램에서 유일한 영역이고, 인스턴스는 N개로 늘어날 수 있습니다. 즉 1:N 관계를 갖습니다. 그래서 인스턴스가 static 영역을 참조할 순 있으나, static이 인스턴스를 참조할 순 없습니다. (어떤 인스턴스를 지칭하는지 알 수 없기 때문에) 그래서 instance 도 static 영역에 두어 getInstance() 메서드가 접근할 수 있도록 한 것입니다. 감사합니다. getInstance()가 static 메서드라서 instance 도 static 영역에 두었다고 하셨는데 instance는 공유할 수 있도록 static 영역으로 먼저 보냈 게 아닌가요??...getInstance()를 static영역으로 보낸건 생성자가 private니까 객체생성이 안되서 인스턴스 메서드를 사용을 못하니까 그런거 아닌가요??...답변주시면 정말 감사하겠습니다.
-
해결됨스프링 핵심 원리 - 기본편
OrderService와 MemberService는 왜 서로 다른MemoryMemberRepository를 사용하는 건지 궁금합니다!
AppConfig에서 다음과 같이 각각 MemberService와 OrderService를 생성자에서 각각 따로MemoryMemberRepository를 새로 생성하는데 이렇게 하면 클라이언트는 같은 리포지토리를 공유를 안하지 않나요?? 서로다른 서비스가 같은 리포지토리를 공유하여 사용하는게 아니고 각각의 리포지토리를 사용한다고 생각하니 의문이 들어서 질문드립니다!!아니면 우선 DIP를 지키기 위한 코드를 보여주려고 이렇게 짜신건 지 궁금합니다!
-
미해결스프링 핵심 원리 - 기본편
스프링부트 빈 이름 조회
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]스프링부트에선 강의에서처럼 ac를 통한 조회를 못하는데 빈 이름을 어떻게 조회할 수 있을까요?
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
기본생성자 질문드리겠습니다.
BlackBox(){}BlackBox(String modelName, String resolution, int price, String color){}위와같이 매개변수가 없는 기본생성자매개변수가 있는 생성자가 있는 경우에 해당 클래스를 참조하는 객체를 생성하는 경우BlackBox b2 = new BlackBox("하양이", "UHD", 300000, "화이트");이와같이 매개변수가 있는 생성자를 참조하는 객체를 만든다면 메소드가 오버로딩이 되어 기본생성자를 호출하지 않는건가요? 매개변수가 있는 생성자와 없는 기본생성자 둘다 없는 경우에는 에러가 나지 않는데. 매개변수가 있는 생성자만 생성을 한뒤해당 메소드를 참조하는 객체를 생성하는 경우 BlackBox b2 = new BlackBox("하양이", "UHD", 300000, "화이트");와같이 형식을 맞춰 해당 객체를 생성하는 오류가 나는 이유를 알고싶습니다.
-
미해결스프링 핵심 원리 - 기본편
스코프와 프록시 scope request 관련 질문입니다.
안녕하세요.MyLogger와 같은 기능을 현업에 적용 해보려고 합니다.각 서비스는 물론 클라이언트의 요청을 구분하기 위해 MyLogger가 필요하지만, 모든 서비스에서 MyLogger 라는 서비스를 선언을 해주는게 맞을까? 의문이 들었습니다.혹시 다른분들의 질문이 있나 찾아보던 중 https://www.inflearn.com/questions/288770/%EC%8B%A4%EB%AC%B4%EC%97%90%EC%84%9C-scope-request-%EB%A5%BC-%EB%A7%8E%EC%9D%B4-%EC%82%AC%EC%9A%A9%ED%95%98%EB%82%98%EC%9A%94더 나은 방법이 있다는걸 알게 되었습니다.해당 방법이 AOP 와 프록시를 이용한 기술인지 궁금하여, 질문드립니다.
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
질문 드리겠습니다.
강의를 듣는 중 갑자기 의문이 들어서 질문드립니다.main메소드는 해당 클래스파일을 실행하는경우 가장 먼저 실행되는 메소드로 알고있습니다.근데 blackBox.java의 경우에는 main메소드를 생성하지 않고 개별의 메소드만 생성하여 다른 파일에서 객체를 생성하여 해당 메소드를 호출하여 사용하고있습니다.그렇다면 main메소드가 없다면 해당 클래스는 자체적으로 자신의 메소드를 수행시킬 수 없는것일까요?
-
미해결스프링 핵심 원리 - 기본편
NoSuchBeanDefinitionException 오류
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hello.core.order.OrderServiceImpl' available오류가 나온다면 AutoAppConfig에서 @ComponentScan( basePackages = "hello.core.member", <- 이 부분을 지우면 된다!! // memeber를 포함한 하위 패키지를 기준으로 찾기 때문에 // order에 대한 것 NoSuchDefiniton이 나오게된다. excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) )
-
해결됨스프링 핵심 원리 - 기본편
localhost:8080 만 쳐도 localhost:8080/hello페이지로 넘어갑니다
다른 강의 듣느라 아무것도 설정안한 화이트 에러페이지가 떠야되는데 옛날에 실습했던 이 부분이자꾸 떠요 크롬에서 캐시삭제해봐도 똑같습니다 이럴땐 아예 그 프로젝트를 삭제하면 해결이 될까요? 아님 어디를 고쳐야할까요..<!DOCTYPE HTML> <html> <head> <title>Hello</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> Hello <a href="/hello">hello</a> </body> </html>
-
해결됨스프링 핵심 원리 - 기본편
3분 경 필드 명을 빈 이름으로 변경하였을 경우에 대한 설명
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]3분 10초 경 강의 중에 생성자의 파라미터를 rateDiscountPolicy로 변경하고 필드 명을 빈 이름으로 변경하는 예시를 설명 중 필드명을 생성자의 파라미터 이름과 다르면 오류가 나온다고 하였는데 실제로 보니 fix로 바꾸어서 확인해보았는데 따로 오류는 나지 않더라구요.그래서 생각해보았는데 일단 순서상 생성자 주입이 먼저 일어나니 이 때 파라미터명을 보고 rateDiscountPolicy가 주입이 일어나고 이후 3번째 필드 주입된 곳은 앞서 주입했던 rateDiscountPolicy가 다시 들어간 것인가요?콘솔을 보니 fixDiscountPolicy는 의존 주입이 일어나지 않아서 이렇게 생각해보았습니다.