탐색 위치와 기본 스캔 대상에 대해서 강의를 듣다고 궁금한게 생겨서 글을 남겼습니다 SpringBootApplication이 @ComponentScan을 가지고 있고 저희가 사용할려는 Config도 같은 위치에 있으면 굳이 @ComponentScan을 달아주지않아도 컴포넌트스캔은 동작하지않는거랑 만약에 같은 레벨의 위치에서 두개가 있다면 충돌이 발생할 것같은데 테스트 코드에서는 문제가없었습니다 혹시 그이유는 new AnnotationConfigApplicationContext(AutoAppConfig.class); 위의 코드처럼 AutoAppConfig.class라고 지정해서 일까요?? 그러면 이경우에는 CoreApplication은 사용되지않고 AutoAppConfig만 사용해서 동작하는 걸까요?
기존 스프링 빈 방식으로 등록을 하면 등록해야 할 스프링 빈이 수십,수백개가 되어 일일이 등록하기가 귀찮고, 설정 정보도 커지고 누락하는 문제가 발생하여 컴포넌트 방식을 사용한다고 배웠습니다. 그런데 컴포넌트 방식도 사용하려고 하면 @Component와 의존 관계 주입인 @Autowired를 넣어줘야 하는데, 동일한 문제가 발생하는게 아닌지 궁금합니다. 2.excludeFilters로 @Configuration 어노테이션이 붙은 클래스를 제거해주고 있는데, 앞서 정의했던 AppConfig 때문인가요? 만약 AppConfig가 없다고 가정하면 excludeFilters를 굳이 삽입하지 않아도 되는지 궁금합니다. @Autowired 과정이 getBean(MemberRepository.class)와 동일하다고 하는데, 이해가 가지 않습니다. 필터 부분 코드가 전체적으로 이해가 가지 않습니다. package hello.core.scan.filter; import java.lang.annotation.*; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyIncludeComponent { } 여기서 target,retention,documented가 어떤 역할을 하는건가요? package hello.core.scan.filter; import org.junit.jupiter.api.Assertions; 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.springframework.context.annotation.ComponentScan.Filter; public class ComponentFilterAppConfigTest { @Test void filterScan() { ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class); BeanA beanA = ac.getBean("beanA", BeanA.class); assertThat(beanA).isNotNull(); Assertions.assertThrows( NoSuchBeanDefinitionException.class, () -> ac.getBean("beanB", BeanB.class)); } @Configuration @ComponentScan( includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class), excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class) ) static class ComponentFilterAppConfig { } } 여기서도 beanA가 왜 추가되고, beanB가 왜 포함되지 않는지 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [C:\Users\kyoun\OneDrive\바탕 화면\개발\core\out\production\classes\hello\core\order\OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:802) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:241) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1356) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1193) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:563) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:946) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:616) at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:93) at hello.core.scan.AutoAppConfigTest.basicScan(AutoAppConfigTest.java:14) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1878) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1404) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1348) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:911) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789) ... 17 more Process finished with exit code -1 이렇게 오류가 뜨는데 뭐가 문제일까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. request 스코프 빈의 포록시 기반 동작 원리에 대해서 강의도 듣고, 따로 찾아봐서 정리했는데 맞는지 봐주세요. !! 스프링 컨테이너가 초기화될 때, ScopedProxyMode.TARGET _CLASS 설정을 사용하면, 스프링은 원본 클래스를 상속받는 프록시 클래스의 인스턴스를 생성한다. 이 프록시 클래스는 원본 클래스의 모든 메서드를 오버라이드하고, 오버라이드된 각 메서드에는 실제 원본 빈의 메서드를 호출하는 위임 로직이 포함되어 있다. 생성된 프록시 객체는 스프링 빈으로 스프링 컨테이너에 등록되고, HTTP 요청이 있을 때, 클라이언트가 프록시 객체의 메서드를 호출하면, 메서드 내의 위임 로직이 활성화되어 실제 해당 HTTP 요청에 맞는 원본 빈의 해당 메서드를 (찾아) 실행한다. 만약, 해당 HTTP 요청에 맞는 실제 원본 빈이 스프링 컨테이너에 없으면, 위임 로직은 새로운 원본 빈 인스턴스를 생성하여 스프링 컨테이너에 등록한 후, 그 인스턴스의 메서드를 실행한다. 맞나욤.. ㅎㅎ
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? ( 예 /아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? ( 예 /아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? ( 예 /아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 안녕하세요. 해당 부분들을 공부하면서 제 자신의 정리가 확실하지 않아서 여쭤보고 싶습니다. 오버라이딩 된 Child.method()가 아닌 Parent.method()를 받으려면 super와 부모클래스의 업캐스팅을 통하여 해결하면 되다고 이해하면 될지 여쭤봅니다.
안녕하세요 강사님 해당 강의를 모두 수강 후 객체지향 강의 듣기 전 다시 한번 복습을 하고 있는데 while 문 1 + 2 + 3 10 + 11 + 12 이런 기본적인 문제도 이해가 되지 않아 while 문을 작성하는데 너무 많은 시간이 소유 됩니다..ㅠ 지금 상황에서 while문 강의등 기본 자바 강의의 모든 예제를 쉽게 풀 떄 까지 복습 후 다음 객체 지향을 수업을 들어야 할지 , 기본 구조만 이해하고 다음 강의를 들어도 될지 궁금합니다 정말 불안한 것은 내년 1월에 2개의 강의가 나오는데 이와 비슷하게 뒤로 갈 수록 객체지향 및 부족한 것들은 분명히 자꾸 누적일 될 것이고 다시 기본 자바 부터 듣어야 하나..? 언제 진도를 나가지..? 라는 생각이 들거 같습니다 ㅠ
안녕하세요 <다형성과 캐스팅>을 듣다 질문이 생겨서 남겼습니다. package poly.basic; public class CastingMain1 { public static void main(String[] args) { //부모 변수가 자식 인스턴스 참조(다형적 참조) Parent poly = new Child(); //x001 //단 자식의 기능은 호출할 수 없다 //poly.childMethod(); //다운캐스팅(부모 타입 -> 자식 타입) Child child = (Child)poly; //x001 child.childMethod(); } } <참고로 캐스팅을 한다고 해서 Parent poly의 타입이 변하는 것은 아니다. 해당 참조값을 꺼내고 꺼낸 참조값이 Child 타입이 되는 것이다. 따라서 poly의 타입은 Parent로 기존과 같이 유지된다> 이 부분을 해당 참조값(x001)을 꺼내고 꺼낸 참조값을 사용해 인스턴스 안에서 실행할 타입을(Parent -> Child) "나는 Child 클래스부터 시작해서 기능을 찾을거야~" 라고 컴파일러에게 알려준다. 따라서 poly의 타입은 Parent로 기존과 같이 유지된다. 이렇게 이해하면 될까요? "꺼낸 참조값이 Child 타입이 되는 것이다." 여기 해석이 조금 어렵습니다 !...
안녕하세요 강사님 항상 좋은 강의 감사드립니다. 기본형과 참조형 문제와 풀이 첫 번째 부분에서 부분적으로 이해되는 부분이 있었고 이해가 안되는 부분이 있었습니다. 그리고 완성된 코드를 보고 나름대로 분석을 해보았습니다. 분석을 하면서 배웠던 내용에 대한 회상이 있었습니다. 분석에 대한 오류나 이런 부분에 있어서 틀린 부분이 있는지 여쭤보고 싶습니다.. 그리고 배웠던 내용을 기반으로 응용된 문제나 기능을 직접 코드로 작성해보고 싶은데 "이러이러한 기능을 써야지" "배열을 통해서 응용해야지" 이런 문제 해결에 대한 부분은 어떻게하면 조금 더 효율적인 설계를 할 수 있는지 여쭤보고 싶습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] //부모 변수가 자식 인스턴스 참조(다형적 참조) Parent poly = new Child(); Child child = (Child) poly; child.ChildMethod(); child.parentMethod(); //호출 가능 다운캐스팅으로 부모 타입의 poly를 자식타입으로 변경하여 자식 클래스의 childMethod를 호출 가능하였습니다. 그런데 바로 child.parentMethod도 호출이 가능하던데 다운캐스팅, 업캐스팅 시 부모, 자식의 기능을 모두 불러올 수 있는 것인가요? 부모와 자식의 기능을 모두 호출 가능한 이유가 무엇인지 이해가 되지 않습니다.
안녕하세요! ElectricCar electricCar = new ElectricCar(); electricCar.move(); 이렇게 하면 호출한 electricCar 의 타입은 ElectiricCar 라서 인스턴스 내부의 ElectricCar 타입에서 시작한다고 하셨습니다. 그래서 electricCar.move(); 를 실행하면 ElectricCar 의 move() 메서드가 실행돼서 전기차를 빠르게 이동합니다. 이렇게 전기차로 출력이 됩니다. Car electricCar = new ElectricCar(); electricCar.move(); 그럼 이렇게 타입이 Car 타입이면 인스턴스 내부의 Car 타입에서 move() 메서드를 실행시켜 "차를 이동합니다."가 출력될 것이라고 생각했는데 전기차를 빠르게 이동합니다. 여기서도 전기차를 빠르게 이동합니다.가 출력됩니다. 어째서 Car 타입에서 move() 메서드를 실행하지 않고 ElectricCar 의 move() 메서드를 실행하게 되는건가요? 감사합니다!! 😊
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 안녕하세요. "프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결" 강의를 보던 도중에 궁금한 것이 있어 질문을 남깁니다. 강의에서 singleton object가 prototype object를 주입받을 때 생길 수 있는 문제를 이야기 하면서 해결방법을 알려줍니다. ObjectProvider를 이용해서 prototype object를 singleton object method 내부에서 매번 생성하는 방법으로 말이죠. 그런데 이 방법도 제가 보기에는 조금 복잡해 보입니다. singleton object가 prototype object에 의존하는 방식을 역전하면 더 간단해지지 않을까요? 반대로 prototype object가 singleton object에 의존한다면 provider를 사용할 필요가 없어집니다. 클라이언트가 직접 prototype object를 destroy 하면 되지요. 이에 대해 어떻게 생각하시나요? provider와 비교했을 때 장단점을 알 수 있을까요?
안녕하세요 영한님! 질문은 처음 드리는거 같습니다~ 기본형과 참조형 '문제와 풀이' 시간에 ProductOrder를 리팩토링하는 부분에서 질문이 있습니다. 리팩토링 하는 과정에서 for문 안에서 수행하던 print와 totalAmount를 계산하는 로직을 각각 메서드로 나누었는데요, 이렇게 되면 한번만 수행되던 반복문이 메서드로 나누면서 각각 수행되어 2번이 되는데 이런 부분은 for문이 한번 더 돌게되어 오는 성능이슈보다, 깔끔하게 리팩토링 되는 부분이 더 이점이 큰 부분일까요? 사실 현업에서 업무를 할때도, for안에서 여러가지 로직이 수행되면 한번에 파악하기가 어려워서 나눠야지 싶어서 나누었지만, 한번만 돌던 반복문이 여러번 돌게 될 수 있어서 망설여지는 부분이 있었습니다. 이 부분 질문드립니다! 감사합니다~