30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 기본편
수정자 주입
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]'생성자 주입을 선택하라!' 강의 5분쯤에 나온 NullPointerException이 왜 발생한 건지 궁금합니다.@Component public class OrderServiceImpl implements OrderService { private MemberRepository memberRepository; private DiscountPolicy discountPolicy; @Autowired public void setMemberRepository(MemberRepository memberRepository) { this.memberRepository = memberRepository; } @Autowired public void setDiscountPolicy(DiscountPolicy discountPolicy) { this.discountPolicy = discountPolicy; } }class OrderServiceImplTest { @Test void createOrder() { OrderServiceImpl orderService = new OrderServiceImpl(); orderService.createOrder(1L, "itemA", 10000); } }@Autowired를 해주었기 때문에 자동으로 의존관계 주입이 되는 거 아닌가요?추가) AnnotationConfigApplicationContext로 스프링 빈을 등록하지 않아서 그런 건가요?
- 미해결스프링 핵심 원리 - 기본편
주입할 스프링 빈이 없을 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]주입할 스프링 빈이 없을 경우가 어떤 것이 있는지 예시가 궁금합니다.
- 미해결스프링 핵심 원리 - 기본편
@Configuration 사용이유
@Configuration을 지워도 테스트가 통과되는데 @Configuration사용하는게 어떤 차이를 만드나요??
- 미해결스프링 핵심 원리 - 기본편
영상에서 싱글톤 패턴의 DIP 위반한다고 설명 하신것에 대해서 제가 이해했는지 궁금합니다.
[질문 내용]안녕하세요. 좋은 수업 잘 듣고 있습니다. 현재 설명하시는 singleton 코드에서 DIP문제가 발생 할 수 있다고 설명해주셨는데싱글톤 패턴의 DIP 위반이라고 설명하신 이유가싱글톤패턴을 사용하면 getInstance()를 public으로 선언하고 사용한다. (인스턴스를 직접참조하도록) 이러한 방식으로 인해서 클라이언트에서 getInstance()을 사용하면 된다. 그러면 클라이언트가 구체 클래스에 의존하게 되므로 DIP를 위반한다.이런식으로 생각을해도 괜찮을까요?? 다른 질문들을 보면서 싱글톤패턴이 꼭 DIP를 유발하지 않는 다는 것은 이해했습니다.항상 질문에 꼼꼼히 대답해주셔서 감사합니다.
- 미해결스프링 핵심 원리 - 기본편
스프링과 스프링 부트 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]간단하게 하나만 더 질문드리겠습니다. CoreApplication이외에 ctrl shift f10으로 진행했던 것은 자바코드로 스프링 프레임워크를 사용한 것이고, CoreApplication코드를 ctrl shift f10으로 진행한 것은 스프링부트로 스프링 프레임워크를 실행한 건가요?
- 미해결스프링 핵심 원리 - 기본편
lombok 또는 직접 생성한 생성자가 2개 이상일 경우 Autowired
Lombok의 @RequiredArgsConstructor 등을 사용해서 생성자를 하나만 만들었을 경우에는 생성자가 하나이므로 @Autowired를 생략해도 @Autowired가 적용된다고 이해하였습니다.그런데 Lombok이나 직접 생성자를 추가로 생성해서 생성자가 2개 이상일 경우 Lombok으로 만든 생성자에는 @Autowired 어노테이션을 어떻게 달아주어야하나요?감사합니다.
- 미해결스프링 핵심 원리 - 기본편
생성자 주입 방식으로 스프링 빈을 전체 가져올 때 이상한 빈이 끼어있어요
List<DiscountPolicy>로 DiscountPolicy를 구현하는 빈들을 생성자 주입 방식으로 받아서 프린트 로그를 찍어봤는데, org.apache.ibatis.binding.MapperProxy 라는애가 끼어있어요 예제와 다른 점은 어플리케이션 컨텍스트에서 빈을 가져온게 아니라 이미 스프링부트로 만든 프로젝트 전체에서 테스트해봤다는 것 뿐인데요, 왜 DiscountPolicy를 구현하지 않은 MapperProxy가 끼어있는지 제거할 방법은 없는지 궁금해요..
- 미해결스프링 핵심 원리 - 기본편
LogDemoService 에서 ObjectProvider를 쓰는 이유
LogDemoController 부분@Controller @RequiredArgsConstructor public class LogDemoController { private final LogDemoService logDemoService; private final ObjectProvider<MyLogger> myLoggerProvider; @RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request) { String requestURL = request.getRequestURL().toString(); MyLogger myLogger = myLoggerProvider.getObject(); myLogger.setRequestURL(requestURL); myLogger.log("controller test"); logDemoService.logic("testId"); return "OK"; } }여기서 이미 요청이후에MyLogger myLogger = myLoggerProvider.getObject();MyLogger타입 빈을 생성해서 myLogger 에 넣어준거 아닌가요??근데 왜 LogDemoService 부분에서@Service public class LogDemoService { //private final ObjectProvider<MyLogger> myLoggerProvider; private final MyLogger myLogger; @Autowired public LogDemoService(MyLogger myLogger) { this.myLogger = myLogger; } public void logic(String id) { //MyLogger myLogger = myLoggerProvider.getObject(); myLogger.log("service id = " + id); } }또 ObjectProvider를 해서 MyLogger 빈을 생성해서 찾아야하는 지 모르겠습니다.ObjectProvider를 사용하지않고 @Autowired를 사용하면 @Autowired가 생성자를 통해 MyLogger 타입으로 검색해서 LogDemoController 부분에서 생성된 myLogger 를 자동으로 의존관계주입하고 그것을필드로 주입 하는 거 아닌가요?? 왜 위에코드처럼 하면 오류가 나는지 모르겠습니다.ScopeNotActiveException: Error creating bean with name 'myLogger' @Autowired 는 싱글톤 빈만 찾을 수 있어서 그런건가요? MyLogger 이 request 스코프이니까??답변 주시면 정말 감사하겠습니다.
- 해결됨스프링 핵심 원리 - 기본편
스프링, 스프링부트
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]https://www.inflearn.com/questions/781242/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8 정확하게 궁금증이 풀리지 않아 다시 질문드립니다. 다시 한번 질문드리자면,제가 배우고 있는게 정확히 스프링인지 스프링 프레임워크인지 감이 안와요.말씀에 따르면, 본 강의 내에서 설정한 환경은 스프링 부트환경인거고, 이 안에서 제가 현재 학습하고 있는 모든 내용은 스프링 내용이 맞는거죠?또한 인텔리제이에서 단순히 ctrl shift f10을 이용해서 코드를 실행하는 것은 단순히 스프링을 사용하고 있는 것이고, 인텔리제이에서 CoreApplication 을 실행하는 것은 스프링 부트를 사용하는 것인가요?그렇다면 여기서 스프링 부트를 실행한 것은 스프링 부트로 스프링 프레임워크를 실행한 것으로 이해해도 무방할까요?
- 미해결스프링 핵심 원리 - 기본편
스프링? 스프링부트?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]간단하게 질문드립니다.스프링과 스프링부트의 차이를 모르고 지금까지 학습해왔는데요, 이 강의에서 영한님께서는 스프링부트를 통해 실행을 하고 그에 따른 빈 중복등록의 차이점을 언급해주셨습니다. 여기서 제가 궁금한 것은 스프링과 스프링부트의 차이점입니다. 지금까지 우리가 배운 컨테이너라든가 빈등록하는 것은 스프링 프레임워크를 사용한 것이고, 이 강의에서 처음으로 보여주신 스프링부트실행은 스프링 프레임워크와는 다른 것인가요? 만약 그렇다면 스프링 프레임워크만 사용할 때는 스프링부트의 CoreApplication을 실행하는 것처럼 어떤 실행방식이 있는 게 아니라, 지금까지 우리가 배운 컨테이너 생성(AnnotationConfigApplicationContext)과 이 곳에 빈을 등록하는 여러가지 방법들을 배운대로 사용하는 방식인거죠?
- 해결됨스프링 핵심 원리 - 기본편
@Autowired를 사용하는 setter가 AppConfig를 설정 정보로 갖는 test 클래스에서도 실행 가능한 이유
안녕하세요! 김영한 선생님의 스프링 핵심 원리 강의를 수강하고 있는 학생입니다:)다름 아니라 setter 주입의 예제 코드와 관련하여 궁금한 점이 생겨서 질문을 남기게 되었습니다.강의 13:26에 나와있는 코드와 동일하게 setter와 생성자에 화면 출력 기능을 추가하였습니다. 그 결과, AutoAppConfig.class를 설정 정보로 하는 test 클래스를 실행하면 설명해주신 내용과 같이 생성자를 통한 의존 관계 주입이 먼저 일어나고 setter를 통한 의존 관계 주입이 나중에 일어남을 확인할 수 있었습니다.더 나아가 AutoAppConfig.class가 아닌 AppConfig.class를 설정 정보로 하는 test 클래스를 실행하면 콘솔 화면에 어떤 내용이 출력될지 호기심이 생겨 test.java.hello.core.beanfind 패키지에 위치한 ApplicationContextBasicFindTest 클래스를 실행하였습니다. 실행 전에 저는 orderService라는 이름의 스프링 빈이 등록되는 과정에서 orderServiceImpl() 생성자가 호출되기 때문에 System.out.println("1. OrderServiceImpl.OrderServiceImp"); 코드가 실행될 것이라 예상하였습니다.또한,(1) AppConfig.class엔 setMemberRepository()와 setDiscountPolicy()를 호출하는 코드가 없고 (2) AppConfig.class는 @ComponentScan를 사용하지 않기 때문에 setMemberRepository()와 setDiscountPolicy()가 @Autowired를 사용하고 있더라도 의존 관계를 자동으로 주입할 수 없어 해당 메소드(setter) 내부에 기재되어있는 System.out.println("memberRepository = " + memberRepository); 코드와 System.out.println("discountPolicy = " + discountPolicy); 코드는 실행되지 않을 거라 예상했습니다.하지만 저의 예상과는 다르게 setMemberRepository()와 setDiscountPolicy()가 모두 실행되었고 제가 어느 부분에서 잘못 생각하고 있는지 도움을 구하고자 질문을 남기게 되었습니다.
- 해결됨스프링 핵심 원리 - 기본편
내부 클래스 static 질문입니다.(두번째)
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 이 없으면 오류가 나는게 (내부 클래스가 static이 없으면 오류가 나는게)ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);위에 코드에서 외부 클래스를 생성해야 내부 클래스를 생성할 수 는데 외부클래스를 스프링 컨테이너에 생성하지 않아서 그런 건가 하고 외부클래스와 내부클래스 모두 스프링 컨테이너에 넣어봤습니다.ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfigTest.class,ComponentFilterAppConfig.class);위에 코드처럼 해보니 잘돌아갔습니다.<질문 1>하지만 제 생각에는 컨테이너에 동시에 외부클래스, 내부 클래스 를 스프링 빈으로 자동 등록하는 건데 왜 되는 건지 모르겠습니다.==================================그래서 외부클래스를 등록하면 자동으로 하위 클래스인 내부 클래스가 등록 되어서 되는 건가해서외부 클래스만 넣어봤더니ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);아래와 같이 내부클래스가 작동되지 않았습니다.org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'beanA' available<질문 2>스프링은 상위 클래스를 넣으면 그에 해당하는 하위클래스 모두 따라 넣어진다고 배웠는데 내부 클래스는 외부클래스의 하위 클래스가 아닌 건가요?? 아래 글 참고하여 질문 드렸습니다https://www.inflearn.com/questions/257297
- 해결됨스프링 핵심 원리 - 기본편
@Autowired 질문입니다.
@Autowired는 자동 의존관계 주입하고 빈을 등록하는 건 아니다 라고 이해하면 될까요??(ComponentScan에 의해 컨테이너에 등록된 빈을 타입으로 조회하여 의존관계를 자동으로 주입한다)아래코드를@Component public class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; @Autowired public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } 저는 @ComponentScan 이 @Component 가 붙은 MemberServiceImpl 클래스와 MemorymemberRepository를 스프링 빈으로 등록하고 그 다음으로 생성자에 @Autowired가 MemberServiceImpl 과 의존관계를 가지는 memberRepository을 타입으로 검색해서 나온 MemorymemberRepository를 자동으로 의존 관계로 주입한다.라고 이해를 했는데 이게 맞는지 궁금합니다.답변해주시면 정말 감사하겠습니다.
- 미해결스프링 핵심 원리 - 기본편
추상화비용이 발생한다는 것이 궁금합니다 영환님!
영환님 인터페이스를 활용할 때 추상화 비용이라는 것이 발생한다고 하셨는데 구글링 검색해도 정확한 지식을 얻기 힘들어서 질문 드립니다.수업 내용의 기능을 확장할 가능성이 없다면, 필요할 때 리팩터링해서 인터페이스를 도입하는 방법 등 수업 내용은 이해했으나 추상화라는 비용이 정확히 무엇인지 궁금합니다!
- 미해결스프링 핵심 원리 - 기본편
@Coponent가 붙는 클래스는 무조건 public이어야 할까요?
@Repository class ReviewRepositoryImpl implements ReviewRepository {...}이런 식으로 class 접근제한자를 default로 하면 안되던데 왜 그런걸까요??저는 스프링 빈으로 구현체가 등록되고, 컨테이너에 있는 빈들이 자동으로 생성자 주입될테니, 구현 클래스를 숨기고 싶어 default로 변경했습니다! 항상 좋은 강의 감사합니다 :)
- 해결됨스프링 핵심 원리 - 기본편
JAVA 문법 질문 - 매개변수 객체 생성 / @RequestMapping 질문
@RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request) { String requestURL = request.getRequestURL().toString(); MyLogger myLogger = provider.getObject(); myLogger.setRequestURL(requestURL);위 코드는 강의에 나온 코드 입니다 . @RequestMapping : 특정 URL로 요청(Request)을 보내면 Controller에서 어떠한 방식으로 처리할지 정의 여기서는 "log-demo" 로 요청 하면 logDemo 메서드를 호출한다 위 코드와 아래 코드가 같다고 볼 수 있을까요 ? @RequestMapping("log-demo") @ResponseBody public String logDemo() { HttpServletRequest request = new HttpServletRequest; String requestURL = request.getRequestURL().toString(); MyLogger myLogger = provider.getObject(); myLogger.setRequestURL(requestURL); 매개변수로 넣었을 때랑 뭐가 다른지 잘 모르겠습니다
- 미해결스프링 핵심 원리 - 기본편
빈 이름으로 조회 테스트 관련 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]빈 이름으로 조회하는 test를 작성할 때 강사님께서 "memberService가 MemberServiceImpl의 인스턴스 이면 성공" 이라고 하셨는데1. AppConfig의 memberService 메소드가 실행되고 반환된 MemberServiceImpl이 memberService 객체에 저장됨그러므로 memberService가 MemberServiceImpl의 인스턴스임 성공의 의미가 맞을까요?아니면 AppConfig의 memberService 메소드가 MemberServiceImpl의 인스턴스라는 걸까요..? 이건 말이 안 된다고 생각해서요..
- 미해결스프링 핵심 원리 - 기본편
statefulService 참조를 2개 선언하는 이유
싱글톤 방식의 문제점 코드에서, @Test void statefulServiceSingleton() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); StatefulService statefulService1 = ac.getBean("statefulService", StatefulService.class); StatefulService statefulService2 = ac.getBean("statefulService", StatefulService.class); // 스레드 A: A 사용자가 10000원 주문 statefulService1.order("userA", 10000); // 스레드 B: B 사용자가 20000원 주문 statefulService2.order("userB", 20000); // ThreadA: A 사용자 주문 금액 조회 int price = statefulService1.getPrice(); //ThreadA: 사용자A는 10000원을 기대했지만, 기대와 다르게 20000원 출력 System.out.println("price = " + price); assertThat(statefulService1.getPrice()).isEqualTo(20000); }다음과 같이 statefulService1, statefulService2 로 StatefulService의 참조 변수를 2개 선언해주는데 이렇게 선언해주신 이유가 뭔가요? 다른 스레드라도 어차피 같은 참조를 호출하게 되지 않나요..? 단순히 스레드의 개념을 보여주시기 위해 Service 참조변수를 여러개 선언하신 건가요?
- 미해결스프링 핵심 원리 - 기본편
AppConfig 가 스프링 빈으로 등록되는 과정이 궁금합니다.
강의 내용을 보면 AppConfig 클래스의 경우 스프링 빈으로 등록이 될 때 임의의 클래스를 만들어서 AppConfig 를 한번 상속 받고 CGLIB 라이브러리를 이용해 바이트코드를 조작한 후 스프링 컨테이너에 빈으로 등록된다고 말씀하셨습니다.이전 강의에서는 스프링 컨테이너에 빈이 등록될 때 beandefinition이 먼저 생성되고 beandefinition에 등록된 메타정보를 바탕으로 빈을 생성하여 스프링 컨테이너에 등록된다고 말씀하셨었는데요.그렇다면 AppConfig 클래스의 경우에는beandefition 생성 -> 임의의 클래스 생성 후 상속 및 CGLIB 를 이용한 바이트코드 조작 ->스프링 컨테이너에 bean 등록과 같은 절차가 진행되는건가요??
- 미해결스프링 핵심 원리 - 기본편
NoUniqueBeanDefinitionException 에러
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: rateDiscountPolicy,getDiscountPolicy이 에러가 나서 원인을 찾아보니 AppConfig의 @Bean public DiscountPolicy getDiscountPolicy() { //return new FixDiscountPolicy(); return new RateDiscountPolicy(); }이 부분과@Component public class RateDiscountPolicy implements DiscountPolicy {}이 부분때문에 RateDiscountPolicy 빈이 2개로 등록되어서 그런 것 같아 AppConfig에서 @Bean어노테이션을 주석처리하니 정상적으로 테스트가 됐는데요. 궁금한 점은 AutoAppConfig 에서 AppConfig에 대한 부분은 제외를 시켰는데 왜 중복이 되는가입니다....@Configuration @ComponentScan( basePackages = "hello.core.member", excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) // 기존 AppConfig.java 때문에 컴포넌트 스캔 대상에서 제외시킴 public class AutoAppConfig {}