학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 똑같이 따라쳤는데 이렇게 나오네요ㅠㅠㅠ 이유가 뭘까요..
질문 1. 아래코드에서 ClientBean 이 내부 메서드에서 prototypeBean 을 사용할 수 있는 이유? static class ClientBean{ ... } 의 코드에서는 스프링 빈으로 prototypeBean 을 등록하는 부분이 없는데 어떻게 logic() 메소드에서 prototypeBean.addCount(); 를 사용할 수 있는 것인가요? 🤔 제 생각에는 void singletonClientUsePrototype() 의 코드인 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); 으로 빈으로 등록이 되는 것 같아서 코드를 다음과 같이 수정 후 실행해 보았습니다. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class); 👉 그러자 실행이 안되는 것을 확인 할 수 있었습니다. 질문 2. singletonClientUsePrototype() 메소드에서 등록된 빈이 ClientBean에 어떻게 영향을 주는 것인가요? 🤔 ClientBean 코드의 ApplicationContext applicationContext; 의 의존성 주입을 통해 이루어지는 것 같은데 이 코드에서는 어떤 것이 applicationContext 에 해당되는 것인가요..? 따로 해당 인스턴스타입으로 등록된 빈이 없는 것 같은데 헷갈립니다ㅜㅜ public class SingletonWithPrototypeTest1 { @Test void singletonClientUsePrototype(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); ClientBean client1 = ac.getBean(ClientBean.class); int count1 = client1.logic(); assertThat(count1).isEqualTo(1); System.out.println("count1 = " + count1); ClientBean client2 = ac.getBean(ClientBean.class); int count2 = client2.logic(); System.out.println("count2 = " + count2); assertThat(count2).isEqualTo(1); } @Scope("singleton") static class ClientBean { @Autowired ApplicationContext applicationContext; public int logic() { PrototypeBean prototypeBean = applicationContext.getBean(PrototypeBean.class); prototypeBean.addCount(); return prototypeBean.getCount(); } } @Scope("prototype") static class PrototypeBean { private int count = 0; public void addCount() { count++; } public int getCount() { return count; } @PostConstruct public void init() { System.out.println("PrototypeBean.init" + this); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } } }
1. 생성자 주입을 선택해라! 강의에서 4분22초에서 에러가 왜 나는건가요? 매개변수를 3개를 줘서 그런건가요? 2.@Autowired 필드 명, @Qualifier, @Primary 1분 56초에서 basic scan에서 왜 오류가 나는건가요? orderserviceimpl에서 discountplicy를 ratediscountplicy로 바꾸면 오류가 안나는데 왜 오류가 안나는건가요?
위 사진은 @SpringBootApplication 이 달린 Core3Application을 실행해본 후 스프링컨테이너 내부에 어떤 스프링빈이 있는지 확인하는 코드입니다. 여기서 궁금한 점이 Core3Application을 실행하면서 MemoryMemberRepository 와 같이 @Component 어노테이션이 붙은 클래스들은 @SpringBootApplication 에 있는 컴포넌트 스캔에 의해서 한 번, AutoAppConfig가 스프링빈으로 등록되면서 AutoAppConfig의 컴포넌트스캔이 작동하여 총 두 번 중복으로 등록되어진다고 생각되는데 이 경우에는 왜 빈 충돌 오류 메세지가 발생하지 않았는지 궁금합니다.
필터에서요. public class ComponentFilterAppConfigTest { @Test void filterScan(){ ApplicationContext ac= new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class); BeanA beanA =ac.getBean("BeanA",BeanA.class); Assertions.assertThat(beanA).isNull(); BeanB beanB =ac.getBean("BeanB",BeanB.class); org.junit.jupiter.api.Assertions.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 = MyExcludeComponent.class) ) static class ComponentFilterAppConfig{ } } org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'BeanA' available 에러 왜나는 건가요? BeanA beanA =ac.getBean("BeanA",BeanA.class); 여기서 BeanA beanA =ac.getBean("beanA",BeanA.class);이렇게 하면 에러가 안나는데요. BeanAclass를 호출하는거 아닌가요? 2. 윗 부분 추가 질문있습니ㅏㄷ. org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class,()->ac.getBean("BeanB",BeanB.class)); (NoSuchBeanDefinitionException 이 뒤에 class 왜붙이는거에요? 그냥ac.getBean("BeanB",BeanB.class) 실행 시 에러값(NoSuchBeanDefinitionException)이 있을 때 예외처리하는거 아닌가요? class로 또 참조하는게 있나요? 3. 중복 등록과 충돌 spring.main.allow-bean-definition-overriding=true 이걸 작성하지 않는이상 수동빈 등록할 때 오류가 나는걸로 이해해도 되나요?
싱글톤 패턴강의에서 질문있습니다. (싱글톤 컨테이너 강의 SingletonTest.class파일에서나옴) ApplicationContext ac= new AnnotationConfigApplicationContext(Appconfig.class); 웹 애플리케이션과 싱글톤강의 SingletonTest class 에서 나옴 Appconfig appConfig=new Appconfig(); 컨테이너에 등록된 모든 빈 조회강의 ApplicationContextBasicFindTest class에서 나옴 AnnotationConfigApplicationContext ac =new AnnotationConfigApplicationContext(Appconfig.class); 3가지 차이가 뭐에요? 세개 다 Appconfig.class를 참조하는것 같은데요. 2. 강의 자료 싱글톤 컨테이너2번째 장에 아래와 같이 나왔는데요. 고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸된다! 메모리 낭비가 심하다. 해결방안은 해당 객체가 딱 1개만 생성되고, 공유하도록 설계하면 된다. 싱글톤 패턴 public class SingletonService { private static final SingletonService instance = new SingletonService(); public static SingletonService getInstance(){ return instance; } private SingletonService(){ } public void logic(){ System.out.println("싱글톤 객체 호츌"); } } 위에께 강의 자료 3페이지에 나온 코드인데 해당 객체가 딱 1개만 생성되었는데요. 2페이지에 나온 코드(스프링 없는 순수한 DI 컨테이너 테스트코드)가 메모리 낭비가 심하니까 위코드로 인해 메모리가 절약하는걸로 이해해도 되나요? 3.강의 자료 싱글톤 컨테이너4번째 장에 아래와 같이 나왔는데요. 의존관계상 클라이언트가 구체 클래스에 의존한다. DIP를 위반한다.( 클라이언트가 구체 클래스에 의존해서 OCP 원칙을 위반할 가능성이 높다. dp랑 ocp가 어디가 위반되었다는건가요? 혹시 인텔리제이에서 SingletonService 이렇게 작성하길 원할 때 대문자가 자동으로 변환되는건가요?아니면 시프티키 눌러서 대문자로 직접 변환하고 소문자로 변환하는건가요? 강의 자료 싱글톤 컨테이너에서 10페이지와 11페이지에 걸쳐진 테스트 코드에서 질문입니다. MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class); 위부분을 MemberServiceImpl memberService = ac.getBean("memnberService", MemberServiceImpl.class); 이렇게 바꿔쓰면(이름부분에m추가하면)no bean이라고 컴파일 에러가 나옵니다. 근데 MemberServiceImpl.class파일에 memberService 이런 함수명이 없는데(강의자료에도 없음) 컴파일할 떄 어디서 참조되는건가요? 6. @Configuration과 싱글톤 8분에 강의 중에 memberRepository가 5번 호출됬다가 3번 호출됬다가 그러시는데 MemberServiceImpl.class에서 public MemberRepository getMemberRepository(){ return memberRepository; } 이거 호출되는것 같은데 appconfig파일에 @Bean public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); } 이부분이 왜 호출되는거에요? 그리고 @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } 이부분이 어떻게 5번이 호출되는건가요? @Configuration과 바이트코드 조작의 마법 7분 41초에 memorymemberrepasitory가 등록이 되어있어서 한번만 호출되어있다고 하셨는데 그 코드상에서 언제 등록이 된건가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. 영한님과 똑같이 코드를 작성했는데 AllBeanTest실행 시 java.lang.NullPointerException 오류가 발생합니다ㅠ -AllBeanTest 실행 console
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 3주 정도만에 강의 들어가서 실습하려 하는데 원래 빨간 줄이 생겨 실행해보니 위 에러 코드가 떴습니다. 구글링 하여 Gradle Refresh 첫번째 방법으로 라이브러리가 꼬인 경우가 많으니 Gradle Refresh를 해준다. (IntelliJ 오른쪽 Gradle Tab -> refresh모양 버튼 클릭) Project Structure → Problem build가 깨지면 해당 페이지에 Problem이 표시된다. 라이브러리가 꼬인 케이스인데 여기서 수동으로 삭제해줄 수도 있다. (상위 File 탭 -> Project Structure -> Problem) File → Cache 삭제 IntelliJ Cache를 삭제해보자. (상위 File 탭 -> Invalidate Cache ~ 클릭) 위 3가지 방식을 활용하여 고쳐보려고 하였는데요 빨강 줄은 사라지고 오류 코드는 보이지 않게 되었지만 스프링 부트가 실행이 안되는 것 같습니다(톰캣 서버가 열리지 않습니다) 이유가 너무 궁금합니다.. 알려주시면 감사하겠습니다 수정) 코드의 차이는 전혀 없다고 자신하며 오랜만에 들어왔기에 인텔리제이 업데이트를 한 번 한 것 같습니다. 그 이유 때문일 수도 있을까? 라는 의문이 있지만 답변에 도움이 될 수 있게 추가하였습니다
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 스프링 빈 조회 - 기본 1분 19초 ac.getBean("memberService", MemberService.class); 입력하면 자동으로 MemberService memberService=가 자동으로 입력되는데 어떻게 하신건가요? 스프링 빈 조회 - 동일한 타입이 둘 이상 3분 49초 @Test @DisplayName("타입으로 조회시 같은 타입이 둘 이상있으면 중복 오류가 발생한다") void findBeanByTypeDuplicate(){ MemberRepository bean =ac.getBean(MemoryMemberRepository.class); } 타입만 지정했다고 하셨는데 이게 무슨 뜻이에요? 3. 스프링 빈 조회 - 동일한 타입이 둘 이상-5분 49초에서 아래와 같이 오류가 나는 위치가 아래인거는 알겠는데 정확히 이유가 뭔가요? 강의에서 아래와 같은 오류를 일부로 유발 시킨 건 알겠는데 클래스 타입이 같아도 에러 안난다고 했는데 왜 에러가 나나요? @Configuration static class SameBeanConfig{//static을 쓰는 이유는 ApplicationContextSameBeanFindTest 안에서만 사용하겠다. @Bean public MemberRepository memberRepository1(){ return new MemoryMemberRepository();//클래스 타입이 같아도 에러 안남. } @Bean public MemberRepository memberRepository2(){ return new MemoryMemberRepository();//클래스 타입이 같아도 에러 안남. } } org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemoryMemberRepository' available: expected single matching bean but found 2: memberRepository1,memberRepository2 스프링 빈 조회 강의 에서 질문이요. 첫번째 테스트에 부분에 MemberRepository bean =ac.getBean(MemberRepository.class); 이걸 넣으면 아래와 같이 에러가 나는데요. 근데 이거는 bean에 할당하는건데 에러가 날 이유가 없지 않나요? 할당하는 것만으로도 왜 에러가 나는지 궁금합니다. package hello.core.beanfind; import hello.core.Appconfig; import hello.core.discount.DiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; 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.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; import static org.junit.jupiter.api.Assertions.assertThrows; public class ApplicationContextSameBeanFindTest { AnnotationConfigApplicationContext ac =new AnnotationConfigApplicationContext(SameBeanConfig.class); @Test @DisplayName("타입으로 조회시 같은 타입이 둘 이상있으면 중복 오류가 발생한다") void findBeanByTypeDuplicate(){ MemberRepository bean =ac.getBean(MemberRepository.class); assertThrows(NoUniqueBeanDefinitionException.class,() ->ac.getBean(MemberRepository.class)); } @Test @DisplayName("타입으로 조회시 같은 타입이 둘 이상있으면 빈 이름을 지정하면 된다.") void findBeanByName(){ MemberRepository memberRepository = ac.getBean("memberRepository1",MemoryMemberRepository.class); assertThat(memberRepository).isInstanceOf(MemberRepository.class); } @Configuration static class SameBeanConfig{//static을 쓰는 이유는 ApplicationContextSameBeanFindTest 안에서만 사용하겠다. @Bean public MemberRepository memberRepository1(){ return new MemoryMemberRepository();//클래스 타입이 같아도 에러 안남. } @Bean public MemberRepository memberRepository2(){ return new MemoryMemberRepository();//클래스 타입이 같아도 에러 안남. } } } No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memberRepository1,memberRepository2 스프링 빈 조회 강의에서 8분 20초에 아래처럼 key와 value부분이 나뉘어져있는데 키는 메소드 이름인것 같은데 벨류는 뭔가요? 스프링 빈 조회 - 상속 관계 3분까지 따라 쳤는데 실수로 제가 bean을 한개만 등록했는데 실행해보니 아래와 같은 에러가 나옵니다. 이거는 예외 상황이 발생하지 않아서 오류가 생긴걸로 이해해도 되나요? package hello.core.beanfind; import hello.core.discount.DiscountPolicy; import hello.core.discount.RateDiscountPolicy; 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.assertThrows; 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(); } } } 에러사항: org.opentest4j.AssertionFailedError: Expected org.springframework.beans.factory.NoUniqueBeanDefinitionException to be thrown, but nothing was thrown. 스프링 빈 조회 - 상속 관계 6분 하위 타입으로 조회한다는것이 class TestConfig 에서 return new RateDiscountPolicy(); 이부분과 이름이 같은걸로 조회한다는걸로 이해해도 되나요? @Test @DisplayName("특정 하위 타입으로 조회")//안좋은 방법 void findBeanBySubType(){ RateDiscountPolicy bean=ac.getBean(RateDiscountPolicy.class); assertThat(bean).isInstanceOf(RateDiscountPolicy.class); } @Configuration static class TestConfig{ @Bean public DiscountPolicy rateDiscountPolicy(){ return new RateDiscountPolicy(); } @Bean public DiscountPolicy fixDiscountPolicy(){ return new FixDiscountPolicy(); } } 스프링 빈 조회 - 상속 관계 8분 @Test @DisplayName("특정 하위 타입으로 조회")//안좋은 방법 void findBeanBySubType(){ RateDiscountPolicy bean=ac.getBean(RateDiscountPolicy.class); assertThat(bean).isInstanceOf(RateDiscountPolicy.class); } assertThat(bean).isInstanceOf(RateDiscountPolicy.class); 위 코드에서 assert 부분이 아래와 같은 의미를 갖는거 같은데 인스턴스 검사는 왜하는거에요? rateDiscountPolicy 가 RateDiscountPolicy 클래스의 인스턴스인지를 검사합니다. 스프링 빈 설정 메타 정보 마지막부분에서 아래처럼 말씀하셨는데요. 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하는 것 정도만 이해하면 된다. 추상화라는게 아래 사진처럼 나열한다는것으로 이해하면되는건가요? (위 질문 사항에서 추가 질문)빈을 직접 등록한다는게 강의에서 appconfig파일에 나와있는것처럼 직접 등록하는건가요? public class Appconfig { @Bean public MemberService memberService(){ return new MemberServiceImpl(memberRepository()); //멤버서비스임플을 만들고 MemoryMemberRepository()만들어서 주입을 시켜줄꺼야. } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService(){ return new OrderServiceImpl(memberRepository(),DiscountPolicy()); }//멤버레파지토리와 디스카운트폴리시 쓰는데 @Bean public DiscountPolicy DiscountPolicy(){ // return new FixDiscountPolicy(); return new RateDiscountPolicy(); }// 디스카운트 바꾸면 여기만 바뀌면 됨됨 } 11.컨테이너에 등록된 모든 빈 조회 5분 34초에 보통 Object bean = ac.getBean(beanDefinitionName); 이부분 Object object 로 설정하는데 bean으로 다시 설정한 이유가 있나요? 아래는 전체 코드입니다. @Test @DisplayName("애플리케이션 빈 출력하기") void findApplicationBean(){ String[] beanDefinitionNames=ac.getBeanDefinitionNames(); for (String beanDefinitionName : beanDefinitionNames) { BeanDefinition beanDefinition=ac.getBeanDefinition(beanDefinitionName);//빈에대한 정보들 if(beanDefinition.getRole()==BeanDefinition.ROLE_APPLICATION) { Object bean = ac.getBean(beanDefinitionName); System.out.println("name = " + beanDefinitionName + "object= "+ bean); } } } }
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 이 질문을 주변 사람에게 해봤더니 @Autowired는 의존성 주입과 관련된 부분이라 자동이든 수동이든 상관없이 @Autowired를 사용한다는 얘기를 들어서요..하지만 수동일땐 @Autowired를 사용안하던 것 같은데... 수동일 때도 @Autowired를 쓰긴 쓰나요..?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하십니까 롬복을 불러와서 implementation 까지 다 설정해줘서 프로젝트 안에서 사용할 수 있다는 것까지는 알겠습니다. 플러그인을 추가적으로 다운로드 해주는 이유는 무엇인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/) [질문 내용] Scope 하여 Autowired를 하면 빨간 하이라이트로 뜨면서 에러 메시지가 표시 됩니다. 테스트는 잘되는데 왜 메시지가 표시되는지 모르겠습니다...