30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 기본편
프로토타입 스코프 10분 56초
@Autowired 하니깐 저는 빨간색으로 줄쳐지는데 이거 왜이런건가요?
- 미해결스프링 핵심 원리 - 기본편
런타임 구현객체 결정에 대하여
안녕하세요 영한강사님! 매번 큰 도움을 받고있습니다.이번 질문은 '객체 지향 설계와 스프링' 챕터의 마지막 소 챕터인 '객체 지향 설계와 스프링'의 4:40초 대 언급하신 말씀에 대한 질문입니다.말씀하신 바로는 런타임에 클라이언트가 의존하는 인터페이스의 구현체가 바뀔 수 있다고 하셨는데, 문맥에 따라서 구현객체가 바뀔 수 있다는 뜻인가요? 예를 들어주신 MemoryMemberRepository와 JdbcMemberRepository도 런타임에 바뀌어서 들어갈 수 있다고 하셨는데, 저는 컴파일 시점에 구현체가 결정되야 한다고 생각했거든요. 아니면 제가 런타임에 대해 오해를 하고 있는걸까요?항상 감사합니다 ^^
- 미해결스프링 핵심 원리 - 기본편
김영한님 효율적인 로드맵이 뭔가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 지금 다음으로 강의에서는 기본편인 여기까지만 듣고 바로 JPA로 넘어가서 야생형으로 학습하시는걸 추천하셨는데, 유튜브 영상을 보면 고급전까지 스프링 강의를 다 들은다음에 JPA로 넘어가라고하시네요? 제가 이해를 잘못한건가요? 아니면 말씀이 달라지신건지요
- 미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔 - 필터 수강 중 질문
안녕하세요. 스프링 핵심 원리 기본편 중 컴포넌트 스캔의 필터 강의를 수강하던 중 에러가 생겼습니다. 에러는 해결했지만 궁금한 점이 생겨 질문 드립니다. 구분선을 기준으로 안에 있는 말들은 모두 상황의 이해를 돕기 위한 말들이니 질문만 보고 싶으시면 구분선 밖 마지막 말만 보셔도 괜찮으실 거라 생각합니다. 제가 작성한 코드는 다음과 같고 강의의 제목과 같이 컴포넌트 스캔의 필터 부분을 학습하기 위한 예제 코드입니다. package hello.core.scan.filter; import java.lang.annotation.*; @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyIncludeComponent { }MyIncludeComponent라는 애노테이션을 생성하고 package hello.core.scan.filter; import org.springframework.stereotype.Component; @MyIncludeComponent public class BeanA { }위와 같이 해당 애노테이션이 붙는 클래스 BeanB를 생성하고 package hello.core.scan.filter; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; 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.*; import static org.springframework.context.annotation.ComponentScan.*; public class ComponentFilterAppConfigTest { @Test void filterScan(){ ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class); BeanA beanA = ac.getBean("beanA", BeanA.class); assertThat(beanA).isNotNull(); // BeanB beanB = 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{ } }위와 같이 테스트 코드를 만들어 실행하였습니다.ComponenScan을 이용해 MyIncludeComponent 애노테이션이 붙은 클래스를 자동으로 빈으로 등록시키고 조회하는 테스트 코드입니다.(MyExcludeComponent 애노테이션이나 해당 애노테이션을 붙힌 BeanB 클래스는 현재 질문과 관계가 없다고 판단해 코드를 생략하였습니다.)그런데 해당 테스트 코드를 실행하니 beanA라는 이름의 빈을 컨테이너에서 찾을 수 없다는 에러가 떴습니다.여러 방법으로 찾아보던 중 @ComponentScan 애노테이션의 includeFilters 속성과 @MyIncludeComponent 애노테이션을 올바르게 사용하여도, BeanA 클래스가 스프링 컨테이너에 등록되지 않는 경우가 생길 수 있고 이를 해결하기 위해선 @Component 애노테이션이나 @Service, @Repository 등과 같은 스프링이 제공하는 스테레오 타입 애노테이션 중 하나를 BeanA 클래스에 추가하여 해당 클래스를 스프링 빈으로 등록해야 한다는 해결책을 발견했고 그대로 따라했습니다. BeanA 클래스에 @Component 애노테이션을 붙혀 테스트 코드를 그대로 다시 실행하였고 에러는 해결이 되었습니다. 그래서 BeanA 클래스의 @Component 애노테이션을 다시 제거한 후 테스트 코드를 돌렸는데 성공하였습니다. 이런 일이 왜 발생하는지 제대로 이해가 안 되어서 질문 드립니다.@ComponentScan 애노테이션의 includeFilters 속성과 @MyIncludeComponent 애노테이션을 올바르게 사용하여도, BeanA 클래스가 스프링 컨테이너에 등록되지 않는 경우가 생길 수 있는 것인가요? 또 어떤 원리로 이렇게 등록이 안 되는 경우가 생기는지가 궁금합니다!
- 해결됨스프링 핵심 원리 - 기본편
LogDemoService 의 필요 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요! 좋은 강의 잘 보고 있습니다. 감사합니다.LogDemoController 에서 MyLogger 의 log 함수를 통해 로그를 잘 출력하는 부분은 이해하였습니다. 다만 LogDemoService 가 왜 필요한지는 잘 모르겠더라구요. (제가 Spring 초보라서 그런듯합니다만 ^^;;)@Controller @RequiredArgsConstructor public class LogDemoController { private final LogDemoService logDemoService; private final MyLogger myLogger; @RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request) { String requestURL = request.getRequestURL().toString(); myLogger.setRequestURL(requestURL); myLogger.log("controller test"); logDemoService.logic("testId"); return "OK"; } }
- 해결됨스프링 핵심 원리 - 기본편
중복 타입 조회
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. "타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다" 예제의 경우 memberRepository1()과 memberRepository2()에 return 값이 둘다 MemmoryMemberRepository()여서(둘다 타입이 memberRepository여서) 타입 중복이 된것으로 이해했는데 맞을까요? 2. "특정 타입을 모두 조회하기"에서 key값은 빈 이름이고, value값인 beansOfType.get(key)값은 빈 객체가 맞을까요?
- 미해결스프링 핵심 원리 - 기본편
appConfig.xml 파일 오류 부탁 드립니다.
discountPolicy부분에서 오류가 나는데 잡히지가 않습니다.오류메시지는 다음과 같습니다.org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderService' defined in class path resource [appConfig.xml]: Unsatisfied dependency expressed through constructor parameter 1: Ambiguous argument values for parameter of type [hello.core.discount.DiscountPolicy] - did you specify the correct bean references as arguments? AppConfig.java 파일입니다.빨간색 부분에 어떤 문제가 있을까요?XmlAppContext.java 파일 입니다.public class XmlAppContext { @Test void xmlAppContext() { ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml"); MemberService memberService = ac.getBean("memberService", MemberService.class); assertThat(memberService).isInstanceOf(MemberService.class); } }
- 미해결스프링 핵심 원리 - 기본편
조회한 빈이 모두 필요할때 강의 5분 32초
오류를 해결하려면 어떻게 해야 하나요?
- 미해결스프링 핵심 원리 - 기본편
전체 테스트 오류
그림과 같이 저는 여기저기서 오류가 나는데, 해결을 못하고 있습니다..rateDiscountPolicy로 바꿔서 하니 안되는데, 왜이런지 모르겠어요.
- 해결됨스프링 핵심 원리 - 기본편
test 쪽만 들어가면 앞에 이상한 코드가 잔뜩 들어가는데 도저히 수정을 못하겠습니다.
강사님 화면은 위쪽처럼 깔끔한데 저는 아래쪽에 DEBUG라는 메시지가 잔뜩 나옵니다. 여기저기 아무리 뒤져봐도 해결책을 찾지 못하고 있습니다. 설정 파일을 잘못 건드려서 그런걸까요?
- 해결됨스프링 핵심 원리 - 기본편
@Bean 설정 정보를 통한 빈 생명주기 콜백 등록 질문드립니다
@Configuration public class LifeCycleConfig { @Bean(initMethod = "init", destroyMethod = "close") public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); ... } }위와 같이 @Bean에 initMethod와 destroyMethod를 명시하여 빈 생명주기 콜백을 등록하는 방식에서, 중요한 장점으로 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다는 점을 꼽아주셨습니다. 그런데 혹시 그게 어떻게 가능한가요?명시한 initMethod와 destroyMethod를 반환되는 빈 객체 내부 메소드에서 찾는 것 같은데, 그러면 그 외부 라이브러리 클래스 내부에 메서드를 작성해서 해당 메서드 명을 명시해주어야 할 필요가 있지 않은가요?아니면 혹시 해당 외부 라이브러리 클래스를 상속 받는 별도의 클래스를 작성한 뒤, 해당 클래스에 init, close 메소드를 구현한 뒤, 그 클래스를 빈으로 등록하는 방식일까요? 아니라면 어떤 식으로 등록할 수 있나요? 만약 상속해서 구현하는 방식이라면, InitializingBean, DisposableBean 인터페이스를 구현하는 방식도, 외부 라이브러리 클래스를 상속 받는 클래스를 작성한 뒤, 해당 클래스가 InitializingBean, DisposableBean을 구현하게끔 하고 그 클래스를 빈으로 등록하면 안되나요? (@PostConstruct와 @PreDestory로 등록하는 방식도 마찬가지로 외부 라이브러리 클래스를 상속 받은 뒤 구현할 수 없는 건가요?) 이러한 경우 어떠한 문제가 발생하나요? 직접 코드를 수정할 수 없는 외부 라이브러리에 빈 생명주기 콜백을 등록할 수 있는지 여부로 장단점이 나뉘었는데, 상속해서 등록하는 방식이라면 모두 다 가능하지 않은가 싶어서 질문 드리게 되었습니다. 잘못 이해한 부분이 있다면 알려주시면 감사드리겠습니다. 관련 강의'섹션 8. 빈 생명주기 콜백' - 빈 등록 초기화, 소멸 메서드
- 미해결스프링 핵심 원리 - 기본편
프로젝트 생성 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]입문 강의를 듣고 기본편으로 넘어왔는데 프로젝트 생성에서 자꾸 오류가 발생해서 질문드립니다 입문편에서 생성한 프로젝트에서는 오류가 뜨지않았었는데 그냥 입문편에서 생성한 프로젝트로 기본편 강의를 들어도 문제없을까요?
- 해결됨스프링 핵심 원리 - 기본편
빈 생성 주기와 콜백
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 빈 생성 주기와 콜백에 대해 질문이 있습니다. 강의 자료와 수업중에 스프링 빈의 생명 주기에 대해 다음과 같이 말씀해 주셨는데요.스프링 컨테이너 생성 > 스프링 빈 생성 > 의존관계 주입 > 초기화 콜백 > 사용 > 소멸전 콜백 > 스프링 종료 여기서 콜백은 콜백 함수를 등록했을 때 이 함수가 작동하는? 걸 뜻한다고 이해했습니다. 질문 1 : 콜백에 대해 제가 이해한 것이 맞을 까요? 라이프 사이클에 명시된 '초기화 콜백'과 '소멸전 콜백'은 콜백 함수가 실행되는 시점이다. 질문 2 : 질문 1이 맞다면, 콜백 함수는 필수적인가요? 질문 3 : 콜백이 필수가 아니라면, 콜백을 하지 않은 경우 빈의 라이프 사이클은스프링 컨테이너 생성 > 스프링 빈 생성 > 의존관계 주입 > 빈 초기화 > 사용 > 빈 소멸 > 스프링 종료 이렇게 되는 것이 맞을 까요?
- 미해결스프링 핵심 원리 - 기본편
프로토타입 빈이 클라이언트가 관리하기 시작할 때, 질문 있습니다
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]프로토타입 빈은, 스프링 컨테이너가 DI까지 완료 후에 클라이언트에게 반환되며 이후의 관리주체는 클라이언트가 한다고 이해했습니다.=> 이게 이해는 가는데.... 아래의 의문점이 해결이 안 되서 질문 드립니다.1) client가 프로토타입 빈을 관리한다면, server의 memory에는 프로토타입 빈 객체 정보가 남아있지 않는 건지 궁금합니다. 1) -1 만약에 server의 memory에 프로토타입 빈 정보가 남아있다면, 클라이언트가 어떤 식으로 관리를 하는 건지 문의드립니다. (서버에 정보가 남아있으니, 클라이언트가 관리를 하게 되면 서버와의 통신비용?이 클라이언트 빈에 비해 증가할 거 같다는 생각이 듭니다. 제가 생각한 것이 맞는지 문의드립니다) 1)-2 만약에 클라이언트가 프로토타입 빈을 종료시키지 않는다면, server의 메모리에 프로토타입 빈 정보가 소멸되지 않고 계속 존재해야 하는 건지 문의드립니다.=> 이로 인해 memory 이슈? 가 생길 거 같다는 생각도 드는데, 혹시 제가 생각하는 것이 맞는지 문의드립니다! 1)-3 혹시나 실무적으로 쓰이는 예시를 정말 사소하게라도 1가지 알고 싶습니다. 언뜻 앞선 질문들을 보니, 실무에서 잘 쓰이지 않는다고는 파악했지만 이게 내용 자체가 이론적이라고 많이 느껴져서.... 문의드립니다!
- 해결됨스프링 핵심 원리 - 기본편
AutoAppConfig에서 @Configuration 사용과 excludeFilters속성 관련해서 질문 드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요!수업을 듣던중에 궁금한 부분이 생겨서 질문남깁니다.질문 1. AutoAppConfig에서 @Configuration을 사용한 이유가 궁금합니다.AppConfig에서 @Configuration을 사용한 이유는스프링 빈을 등록할 때, 이미 등록된 빈을 싱글톤으로 보장하기 위함이라고 이해했습니다.실제 테스트 코드를 통해 @Configuration을 사용하지 않았을 때,MemberServiceImpl의 MemoryMemberRepository와 OrderServiceImpl의 MemoryMemberRepository가 다른 인스턴스임을 확인했는데요.AutoAppConfig에서는 ComponentScan을 통해 자동으로 스프링 빈을 등록하고, 실제로 @Configuration을 사용하지 않아도 싱글톤이 적용되는 것 같았습니다.제가 AutoAppConfig에서 @Configuration을 사용하지 않아도 싱글톤이 적용되는지 확인한 방법은1. MemoryMemberRepository의 생성자에 로그를 통해 몇 번 호출되는지 확인 -> 1번 호출2. 테스트 코드로 MemberServiceImpl의 MemoryMemberRepository와 OrderServiceImpl의 MemoryMemberRepository가 같은 인스턴스인지 확인 -> 같은 인스턴스위 2가지 방법으로 확인했습니다.사용하는 것과 사용하지 않는 것은 AutoAppConfig를 스프링 빈으로 등록하냐, 안 하냐의 차이인 거 같은데스프링이 구동될 때, AutoAppConfig를 통해 컴포넌트 스캔을 하고, @Component가 붙은 클래스들을 스프링 빈으로 등록한 후, 더 이상 사용하지 않는다면 AutoAppConfig를 빈으로 등록하지 않아도 되지 않나?라는 생각이 들어서요...혹시 다른 이유가 있는지도 궁금합니다.질문 2. excludeFilters속성을 사용하는 클래스는 대상에서 제외되는지 궁금합니다.추가로 AutoAppConfig의 ComponentScan의 속성에서 excludeFilters로 @Configuration을 적용했는데,AutoAppConfig에도 @Configuration 어노테이션이 붙어있는데 AutoAppConfig는 스프링 빈으로 등록되는 것을 확인했습니다.원래 @ComponentScan의 excludeFilters 속성은 자기 자신 클래스는 제외하고 적용되는 건가요?
- 미해결스프링 핵심 원리 - 기본편
스프링빈과 컴포넌트 스캔 방식
정형화되지 않은 구현체 같은 것은 스프링 bin으로 직접 등록 해야 하고, 정형화된 것은 컴포넌트스캔 방식으로 사용해야 하는 것으로 알고 있습니다. 이렇게 스프링 등록하는 방식이 있던데 각각 왜 그런 방식으로 등록을 해야 하는지 좀더 자세히 설명 부탁드립니다.
- 미해결스프링 핵심 원리 - 기본편
전체 테스트
인텔리제이에서 전체 테스트 실행해보고 싶은데 @Configuration과 바이트코드 조작의 마법 강의 15분 3초를 봐도 잘 모르겠어요 단축키가 있나요?
- 미해결스프링 핵심 원리 - 기본편
생성자 주입, 수정자 주입 테스트 코드
7. 의존관계 자동 주입에서 생성자 주입을 사용해서 단위테스트를 진행하면 NPE가 아닌 컴파일 오류가 발생한다고 하셨는데, 이게 단순히 생성자 주입을 사용해서인가요? 아니면 final 키워드를 사용해서인가요?
- 미해결스프링 핵심 원리 - 기본편
Controller 를 왜 사용했는지 궁금합니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 :)빈 스코프 - request 스코프 예제 만들기 10:23에서 LogDemoController 클래스를 만드실 때 @Component가 아닌 @Controller를 사용하셨는데 어떤 이유로 인해 컴포넌트 대신 컨트롤러를 사용하셨는지 궁금합니다!추가로 두 기능들의 사용 용도의 차이점도 궁금합니다!강의 잘 보고 있습니다 영한님 ㅎㅎ 감사합니다.
- 미해결스프링 핵심 원리 - 기본편
스프링 빈 조회
스프링 빈을 왜 test 코드를짜서 검증을 해야하나요? 프레임워크가 자동적으로 컨테이너에 잘 등록했을 텐데 검증하는게 이해가 안가서요