30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 기본편
5. 싱글톤 컨테이너 > @Configuration과 바이트코드 조작의 마법 > NoUniqueBeanDefinitionException
5. 싱글톤 컨테이너 > @Configuration과 바이트코드 조작의 마법 진행 중, 최종 확인을 위해 java Run을 진행했을 때 NoUniqueBeanDefinitionException 오류가 나옵니다. 해당 프로젝트를 압축하여 다음 링크에 올려두었습니다. 확인 부탁드리겠습니다. 감사합니다. https://drive.google.com/file/d/1bmEbBnSeiU_y_vEvmizju_MUVcFVRwpw/view?usp=sharing 에러 로그 : No qualifying bean of type 'salt.core.discount.DiscountPolicy' available: expected single matching bean but found 2: rateDiscountPolicy,fixDiscountPolicyorg.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'salt.core.discount.DiscountPolicy' available: expected single matching bean but found 2: rateDiscountPolicy,fixDiscountPolicy
- 미해결스프링 핵심 원리 - 기본편
기본편 - 프로젝트 생성 에러입니다 ㅠ
오후 2:04:11: Executing ':CoreApplication.main()'...> Task :compileJava UP-TO-DATE> Task :processResources UP-TO-DATE> Task :classes UP-TO-DATE> Task :CoreApplication.main() . ____ _ /\\ / ___'_ __ (_)_ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.7.12)2023-06-01 14:04:14.123 INFO 8400 --- [ main] hello.core.CoreApplication : Starting CoreApplication using Java 11.0.18 on DESKTOP-NU98GMA with PID 8400 (C:\study\core\build\classes\java\main started by Lenovo in C:\study\core)2023-06-01 14:04:14.126 INFO 8400 --- [ main] hello.core.CoreApplication : No active profile set, falling back to 1 default profile: "default"2023-06-01 14:04:14.917 INFO 8400 --- [ main] hello.core.CoreApplication : Started CoreApplication in 1.443 seconds (JVM running for 2.169)Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.See https://docs.gradle.org/7.6.1/userguide/command_line_interface.html#sec:command_line_warningsBUILD SUCCESSFUL in 3s3 actionable tasks: 1 executed, 2 up-to-date오후 2:04:15: Execution finished ':CoreApplication.main()'.이렇게 에러가 발생하는데 프로젝트 생성 어떻게 해야하나요 ㅠ
- 미해결스프링 핵심 원리 - 기본편
memberService에서 궁금한 점이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]memberService 인터페이스에서 join(Member member)가 있는데, member 클래스 자체를 파라미터로 받는 것이 어떤 의미가 있는 것인지 궁금합니다.
- 미해결스프링 핵심 원리 - 기본편
특정 타입을 모두 조회하기 테스트에서 값이 1개만 나옴
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. @Test @DisplayName("특정 타입을 모두 조회하기") void findAllBeanByType() { Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class); for (String key : beansOfType.keySet()) { System.out.println("key = " + key + " value = " + beansOfType.get(key)); } System.out.println("beansOfType = " + beansOfType); assertThat(beansOfType.size()).isEqualTo(2); } @Configuration static class SameBeanConfig { //여기서 스태틱은 이 클래스에서만 사용하겠다는 뜻 @Bean public MemberRepository memberRepository1() { return new MemoryMemberRepository(); } @Bean public MemberRepository memberRepository2() { return new MemoryMemberRepository(); } } 이 코드에서 강사님은 2개의 값으로 테스트를 통과하는데 저는 key = MemberRepository value = hello.core.member.MemoryMemberRepository@68dc098bbeansOfType = {MemberRepository=hello.core.member.MemoryMemberRepository@68dc098b}이렇게 나와서 1개만 나와서 테스트를 실패해서요 지금 이전에 만든 MemoryMemberRepository를 보고 있는거 같은데 어떻게 SameBeanConfig를 보게 만들 수 있나요?
- 해결됨스프링 핵심 원리 - 기본편
스프링부트 3.x 로그관련
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]스프링 전환하기 4분 49초의 내용입니다.현재 스프링부트 3. 버전으로 강의를 수강하고있는데MemberApp을 실행하였을때 Spring에서 자동으로 만들어주는 Creating shard instance.. 부분 빈 생성로그가 뜨질 않습니다. 2.7버전으로 프로젝트를 생성하였을 경우 로그가 뜨는데 3.x버전으로도 뜨게 하는 설정은 없을까요?
- 미해결스프링 핵심 원리 - 기본편
[기본편]섹션2 - 회원 도메인 실행과 테스트
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]마지막에 의존관계가 인터페이스 뿐만 아니라 구현까지 모두 의존하는 문제점이 있다고 하셨는데, 인터페이스는 MemberRepository를 의미하고 구현의존은 MemoryMemberRepository를 말씀하신건가요?그리고 '추상화에도 의존하고 구체화에도 의존함'이라고 하셨는데 이건 어떤 의미일까요?
- 미해결스프링 핵심 원리 - 기본편
회원등급이 추가되면 OCP 위반인가요?
안녕하세요!문득 궁금증이 생겨서 질문합니다.예제에서는 Basic, VIP 이렇게 2개의 회원등급이 enum에 존재하고 DiscountPolicy 구현클래스는 각 등급에 따른 분기로 할인정도를 조절합니다. (VIP의 경우 10%할인, 1000원 할인)만약 회원등급이 추가된다면 DiscountPolicy 구현클래스의 코드를 모두 수정해야 하는데, 이 경우 OCP위반이라고 하나요?아니면 어쩔 수 없는 비즈니스 로직이 변경된 경우인가요?
- 해결됨스프링 핵심 원리 - 기본편
DiscountPolicy 동적으로 의존성 변경
항상 좋은 강의, 감사히 보고 있습니다.강의에서 AppConfig에서 DiscountPolicy를 FixDiscountPolicy로 고정합니다.만약 상황에 따라 정률, 정액할인 정책을 동적으로 적용한다고 한다면 어떤식으로 설계하면 좋을까요?쿠폰에 따라 할인정책이 달라지는 경우 어떻게 해야 될까요..?
- 미해결스프링 핵심 원리 - 기본편
5. 싱글톤 컨테이너 > @Configuration과 싱글톤 > 참조값 문의
아래 코드 실행 시 print해주는 참조값이 셋 다 같아야 하는데 모두 각각 다릅니다. 어떤 부분 때문에 실습 영상에서는 같게 나온 세 참조값이 모두 다르게 나왔는지 원인 파악 문의드립니다. 해당 프로젝트 실습 링크는 다음과 같습니다. https://drive.google.com/file/d/1bmEbBnSeiU_y_vEvmizju_MUVcFVRwpw/view?usp=sharing package salt.core.singleton; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import salt.core.AppConfig; import salt.core.member.MemberRepository; import salt.core.member.MemberServiceImpl; import salt.core.order.OrderServiceImpl; import static org.assertj.core.api.Assertions.*; public class ConfigurationSingletonTest { @Test void configurationTest() { ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberServiceImpl 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("orderService -> memberRepository = " + memberRepository2); System.out.println("memberRepository = " + memberRepository); // assertThat(memberService.getMemberRepository()).isSameAs(memberRepository); // assertThat(orderService.getMemberRepository()).isSameAs(memberRepository); // 셋 다 같아야 하는데 셋 다 참조가 다름 // memberService -> memberRepository = salt.core.member.MemoryMemberRepository@5af5def9 // orderService -> memberRepository = salt.core.member.MemoryMemberRepository@3a45c42a // memberRepository = salt.core.member.MemoryMemberRepository@36dce7ed } }
- 미해결스프링 핵심 원리 - 기본편
필드 주입 vs 생성자 주입
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]필드 주입으로 구현했을경우 테스트 코드 작성 시 유연하게 변경이 불가하다고 이해했습니다.그렇다면 생성자 주입으로 구현했을경우 테스트 코드 작성 시 아래와 같이 의존관계를 유연하게 변경 가능하기 때문에 생성자 주입은 필드 주입의 단점을 보완 가능한 것이 맞을까요?// 생성자 주입으로 DI 주입 void fieldInjectionTest() { OrderServiceImpl orderService = new OrderServiceImpl(new JpaRepository, new RateDiscountPolicy); orderService.createOrder(1L, "itemA", 20000); }
- 미해결스프링 핵심 원리 - 기본편
스프링핵심원리이해2-객체지향원리적용 편 질문
회원관리(가입,조회) 서비스, 주문서비스(할인, 주문)(OrderServiceImpl)에서역할을 담당하는 인터페이스를 바라보게 해야하는데, 현재코드는 구현체도 바라보게 했다는 점에서 코드의 수정이 필요하다는 강사님 말씀은 이해가 됩니다!다만, 여기서 강사님 표현으로 '클라이언트'코드도 수정이 이루어져야 한다고 말씀하셨는데,클라이언트코드라는 용어가 조금 혼동이 됩니다.클라이언트 코드에 대해서 설명 한번 부탁드립니다!
- 미해결스프링 핵심 원리 - 기본편
스프링컨테이너의 동작 순서와 autowired어노테이션
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1 . 컴퍼넌트 스캔 및 autowired어노테이션을 사용할 때 스프링컨테이너 파라미터로 넘겨진 설정클래스의 컴퍼넌트스캔 어노테이션을 통해 스프링 컨테이너가 컴퍼넌트가 붙은 클래스를 빈으로 모두 등록한 후에 스프링컨테이너가 의존관계주입을 하는 단계에서 autowired를 통해 의존관계주입을 하자나요 근데 스프링컨테이너가 이 autowired어노테이션을 어떤식으로 찾는건가요? 2 . 스프링컨테이너는 빈을 다 등록한 후에 의존관계주입이 이루어진다하셨는데 memberSerivceImpl 랑 orderServiceImpl의 의존관계주입을 둘 다 수정자방식으로 autowired어노테이션을 붙여서 수정자에다 모두 콘솔을 넣고(memberimpl의 수정자메서드에는 콘솔 1 order에는 콘솔2) 실행시켜봤는데 로그에 autoConfig rateDiscountPolicy memberServiceImpl memoryMemberRepository 1 orderServiceImpl 2 이런식으로 나오는데 위에 논리라면 1이 orderService까지 다 생성된후에 1이 나와야하는거 아닌가요??3 . 위랑 비슷한 예인데 수동(config,Bean)을 이용할때에도 원래는 스프링컨테이너가 빈을 다 등록한뒤에 의존성주입이 이루어진다고 하셨는데 이것저것 해봐서 로그를 봤는데 로그는 빈을 등록하면서 의존성주입에 필요한 빈을 등록하고 의존성주입이 이루어지는 방식으로 되던데 이것도 이해가 잘 안됩니다.
- 해결됨스프링 핵심 원리 - 기본편
스프링 빈에 DTO 클래스를 등록하는 경우도 있을까요?
현재 스프링 빈 싱글톤 방식 파트 강의를 수강 중입니다.강의 중 싱글톤 방식의 문제점에 대해 아래와 같이 이해하였습니다. public class StatefulService { // private int price; // 상태를 유지하는 필드 public int order(String name, int price){ System.out.println("name = " + name + " price" + price); //this.price = price; //여기가 문제! return price; } // public int getPrice() { //// return price; // } } @Test void statiefulServicesingleton() { ApplicationContext ac = new AnnotationConfigApplicationContext(testConfig.class); StatefulService statefulService1 = ac.getBean(StatefulService.class); StatefulService statefulService2 = ac.getBean(StatefulService.class); //ThreadA : A사용자가 10000원 주문 //statefulService1.order("userA", 10000); int userAPrice =statefulService1.order("userA", 10000); //ThreadB : B사용자가 20000원 주문 //statefulService2.order("userB", 20000); int userBPrice =statefulService2.order("userA", 10000); //ThreadA : 사용자A가 주문 금액 조회 // int price = statefulService1.getPrice(); // 10000원 조회해야 하는데?? System.out.println("price = " + userAPrice); // Assertions.assertThat(statefulService1.getPrice()).isEqualTo(20000); Assertions.assertThat(userAPrice).isEqualTo(10000); }스프링 빈에 등록된 인스턴스(StatefulService)에 공유필드(price)가 있는 경우,추가로 참조하는 인스턴스(statefulService2)로 인해 값이 변경될 수 있고 큰 버그를 초래할 수 있다. 위와 같은 개념을 익히다보니 자연스럽게 DTO의 공유필드가 떠올랐습니다.처음에는 DTO는 일반적으로 필드를 사용하니 문제 되지 않나? 했는데 스프링 빈에 등록된 경우에만 문제가 된다고 이해하였습니다. (제가 잘못 이해했는지도 궁금합니다 ㅎㅎ)그렇다면 혹시 DTO를 스프링 빈에 등록하는 경우가 만에 하나라도 있을까요?DTO를 스프링 빈에 등록한다면 동일한 문제가 생길 것 같아서요.
- 해결됨스프링 핵심 원리 - 기본편
서비스 계층에서 인터페이스와 Impl 구분에 대해서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 다른 사람의 코드를 읽던 중에 궁금한 것이 생겨서 질문 남깁니다.제가 읽은 코드에는 ~~Service(인터페이스) 와 ~~ServiceImp로 작성을 했습니다. 이 전에도 이런 구조를 사용하는 코드를 종종 봤습니다. 저는 지금까지 그냥 바로 인터페이스 없이 ~~Service를 만들고 비즈니스 로직을 작성 했습니다.제가 찾아본 결과로는 인터페이스와 구현을 구분하는 이유는 2가지 였습니다.OCP 법칙을 더 잘 지키기 위해서추상과 구현을 OCP 법칙을 지키고 다형성을 확보하기 위해서AOP Proxy과거 스프링에서 AOP를 사용할 땐 JDK Dynamic Proxy를 사용하기 때문에 인터페이스가 필요했다. 하지만 지금은 GCLIB를 사용할 수 있기 때문에 사실상 의미를 잃었다.추가적으로 인터페이스를 나누고 인터페이스에 javadoc용 주석을 남겨두면 유지보수 측면에서 읽기에 더 나은 부분이 있지 않을까 정도 생각해 보았습니다.서비스 계층에서 인터페이스와 구현을 나누는 것과 하나의 서비스 클래스에 구현하는 것 중에 대부분의 경우 어떤 것을 더 권장하시는지 궁금합니다. 감사합니다!
- 미해결스프링 핵심 원리 - 기본편
xml 관련 질문 드립니다.
[질문 내용]처음 스프링을 배울 때 spring legacy 프로젝트로 배웠습니다. 따라서 root-context.xml, servlet-context.xml 방식으로 배웠습니다. 이전에 질문 드렸을때, "SpringApplication.run() 메서드는 기본적으로 @SpringBootApplication이 위치한 패키지와 하위 패키지를 시작점으로 모든 클래스를 스캔합니다 따라서 @Configuration, @Component, @Service, @Repository 등의 애노테이션이 있는 클래스를 찾아서 스프링 애플리케이션의 컨텍스트를 생성하는데 사용합니다." 라고 답변을 받았습니다. 하지만 legacy 프로젝트를 실행할때에는 @SpringBootApplication을 따로 적지 않았는데, 어떻게 해당 xml(root, servlet)에서 bean을 읽어오는지 의문이 듭니다. 추가로 xml로 작성하였을때도 SpringApplication.run() 메서드가 자동으로 읽는지도 문의드립니다.
- 미해결스프링 핵심 원리 - 기본편
MemberServiceTest에서 MembeService를 AppConfig에서 꺼내기 애매한 이유
24:18 쯤 MemberServiceTest.java 코드 작성 중에MembeService를 AppConfig에서 꺼내기 애매하다고 하셨는데 그 이유가 궁금합니다!@BeforeEach로 각 테스트마다 AppConfig에서 MembeService를 생성해주는게 왜 좋은지 질문드립니다!
- 미해결스프링 핵심 원리 - 기본편
asserThat이 되지 않습니다.
================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]게시판에서 assertThat 관련 질문 나온 것들 다 봤는데도 assertThat이 되지 않습니다.build.gradle에 testImplementation 'org.assertj:assertj-core:3.11.1' 이것도 추가해봤지만 되질 않습니다..alt+enter를 치면 사진처럼 math어쩌구 저거만 뜹니다. 어떻게 해야할까요?
- 미해결스프링 핵심 원리 - 기본편
NoUniqueBeanDefinitionException 예외를 처리했는데도 발생하는 이유
안녕하세요. 스프링 빈 조회 - 동일한 타입이 둘 이상부분을 듣고있는데, 궁금한 점이 생겨서요 ! AnnotationConfigApplicationContext package hello.core.beanfind; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import static org.junit.jupiter.api.Assertions.*; public class ApplicationContextExtendsFindTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); @Test @DisplayName("부모 타입으로 조회시 자식이 둘 이상 있으면, 중복 오류가 발생한다") void findBeanByParentTypeDuplicate() { DiscountPolicy bean = ac.getBean(DiscountPolicy.class); assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(DiscountPolicy.class)); } @Configuration static class TestConfig { @Bean public DiscountPolicy rateDiscountPolicy() { return new RateDiscountPolicy(); } @Bean public DiscountPolicy fixDiscountPolicy() { return new FixDiscountPolicy(); } } } 위 코드의 findBeanByParentTypeDuplicate 테스트를 실행했을 때, 자식이 둘 이상이고, DiscountPolicy bean = ac.getBean(DiscountPolicy.class); 부분이 있어서 오류가 발생하는 것은 이해했습니다! 그런데, assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(DiscountPolicy.class)); 이렇게예외를 처리하는 구문이 있는데도, 왜 테스트가 pass 되지 않는 것인지 궁금합니다 !! 에러를 왜 못잡아낼까요 ??
- 미해결스프링 핵심 원리 - 기본편
스프링 컨테이너 관련 질문 드립니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]커뮤니티 내 질문을 읽다가 의문이 들어서 질문드립니다.ApplicationContext를 굳이 만들지 않아도 main 메서드 내 SpringApplication.run() 메서드 내부에서 컨테이너를 생성한다고 답변 주신걸 보았습니다.하지만 ApplicationContext를 만들 때 AppConfig.class로 커스텀한 config파일을 지정하는 걸로 보이는데, SpringApplication.run() 메서드는 따로 클래스를 지정 하지 않아도 @Configuration 애노테이션이 있는 모든 클래스를 스캔하는건가요?
- 미해결스프링 핵심 원리 - 기본편
18:00 AppConfig 오류 관련 질문
18:00 정도에 basicScan() 테스트를 실행하면서 AppConfig 클래스의 OrderServiceImpl의 생성자 관련 오류가 발생한 이유가 궁금합니다. basicScan()에서 ac 를 만드는 과정에 인자로 들어간 것은 AutoAppConfig.class인데 왜 AppConfig 클래스에서 오류가 발생하나요?