월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨스프링 핵심 원리 - 기본편
NetworkClient에서 setUrl 질문합니다!
[질문 내용]안녕하세요 강의 듣다 헷갈려서 질문 드립니다..! NetworkClient() 객체가 생성되면서 생성자를 호출하고 그 뒤에 setUrl로 url를 지정해도 출력에 포함이 안되고 null이 출력된 게 의존 관계 주입이 안돼서 그렇게 나오는 건가요?? 강의노트 보면 객체 생성 후 외부에서 수정자 주입을 통해 setUrl()을 호출해야지 url이 존재한다는데 이 말이 잘 이해가 안되는데 NetworkClient 클래스에서 public void setUrl(String url) {this.url = url;} 이 코드를 통한 수정자 주입을 통해 호출해야 한다는 말씀인지 궁금합니다..!
- 해결됨스프링 핵심 원리 - 기본편
12분경 memberRepository예측 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]선생님께서 12분쯤에 memberRepository가 3번 호출될 것이라 예상하셨었는데 저는 memberService에서 왜 memberRepository가 2번 호출되는지 잘 이해가 안갑니다. memberService에서 MemberServiceImpl의 매개변수를 통해 memberRepository로 건너가기 때문에 memberRepository가 한번만 호출된 뒤 orderService가 호출되어야하는 것 아닌가요?쉽게 얘기해서 선생님은 memberServicememberRepositorymemberRepositoryorderServicememberRepository위의 순서를 예상하셨는데저는memberServicememberRepositoryorderServicememberRepositorymemberRepository이런 순서가 될 것으로 예측했습니다. 제가 착각한 부분이 있다면 알려주시길 바랍니다.감사합니다.
- 미해결스프링 핵심 원리 - 기본편
스프링부트와 레거시를 사용할때 View부분의 확장자가 바뀌는이유가 뭔가요?
수업의 내용과는 무관하지만 궁금한점이 있어 질문드립니다스프링 레거시의 경우에는 .jsp 파일로 view부분을 처리하고 부트의 경우에는 .jsp로 처리할수있지만 html로 처리하기를 권장하는데 그이유(속도,편의성)?가 궁금합니다.
- 미해결스프링 핵심 원리 - 기본편
setter주입
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]간단하게 질문드리겠습니다. Component scan을 사용하며 setter주입 시 @autowired 애너테이션을 붙여주면 자동 주입이 되는 걸로 알고 있습니다. 그런데 만약 Configuration으로 수동 빈 등록을 하면, 의존관계는 Configuration애너테이션이 붙은 설정 앱에서 setXX메서드로 직접 의존관계를 등록해주면 되는건가요?
- 해결됨스프링 핵심 원리 - 기본편
@Configuration과 싱글톤강의를 따라하는데 값이 다르게 나옵니다.
@Configuration 어노테이션 안의 AppConfig 클래스에서 memberService와 orderService에 들어가는 memberRepository 설정이 각각 new로 MemoryMemberRepository를 생성한다 하더라도 그 MemberRepository들은 같은 싱글톤으로 있다는 강의 내용은 전부 이해했습니다.그런데 강의 내용 그대로 따라 코딩을 하였는데 결과값은 각각 다른 MemberRepository를 갖게 되더라구요... 그래서 제가 잘못한 것이 있는지 알 수 있을까 해서 질문드립니다.AppConfig@Configuration public class AppConfig { @Bean public static MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public static DiscountPolicy discountPolicy() { // return new FixDiscountPolicy(); return new RateDiscountPolicy(); } @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } }MemberServiceImplpublic class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } @Override public void join(Member member) { memberRepository.save(member); } @Override public Member findMember(Long memberId) { return memberRepository.findById(memberId); } // 스프링의 @Configuration 싱글톤 테스트를 위한 Getter public MemberRepository getMemberRepository() { return memberRepository; } }OrderServiceImplpublic class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itemPrice); return new Order(memberId, itemName, itemPrice, discountPrice); } // 스프링의 @Configuration 싱글톤 테스트를 위한 Getter public MemberRepository getMemberRepository() { return memberRepository; } }ConfigurationSingletonTestpublic 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); System.out.println("memberService -> memberRepository = " + memberService.getMemberRepository()); System.out.println("orderService -> memberRepository = " + orderService.getMemberRepository()); System.out.println("memberRepository = " + memberRepository); assertThat(memberService.getMemberRepository()).isSameAs(memberRepository); assertThat(orderService.getMemberRepository()).isSameAs(memberRepository); } }결과제가 강의 내용을 이해한대로라면 저렇게 3개가 같은 MemoryMemberRepository를 가져야 할것같은데 제가 뭔가 잘못 작성한것이 있을까요...?
- 해결됨스프링 핵심 원리 - 기본편
xml 방식의 설정은 어떻게 싱글톤을 보장하나요?
[질문 내용]xml 방식의 설정으로 MemberRepository 객체를 출력해보면 MemberServiceImpl 과 OrderServiceImpl, MemberRepository 모두 같은 인스턴스를 공유하고 있는데 xml 의 BeanDefinition을 확인하려고 해도 GenericXmlApplicationContext 구현체는 getBeanDefinition() 함수를 제공하지도 않네요... 궁금합니다.
- 해결됨스프링 핵심 원리 - 기본편
테스트에서 @BeforeEach 안에 AppConfig를 생성하고 사용하는 이유
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 단위 테스트 도중에 @BeforeEach 사용시 어떤 이점이 있는지 궁금해서 질문 드립니다.public class orderServiceTest { AppConfig appConfig = new AppConfig(); MemberService memberService = appConfig.memberService(); OrderService orderService = appConfig.orderService(); }이렇게 사용하는 것보다 @BeforEach 어노테이션을 사용해서public class orderServiceTest { MemberService memberService; OrderService orderService; @BeforeEach public void beforeEach(){ AppConfig appConfig = new AppConfig(); memberService = appConfig.memberService(); orderService = appConfig.orderService(); }이렇게 작성하는게 좋다고 말씀하셨는데제 생각에는 그 이유가 1번 처럼 작성하면 다른 테스트 진행시 기존의 선언되어 있는 meberService 객체에 남아있는 데이터?가 있어서 오류가 날 수 있어 초기화와 같은 목적으로 @BeforeEach를 사용하여 매번 테스트를 실행시킬때마다 새롭게 의존관계 주입을 하는 것 같은데정확한 의미를 알고 싶어서 질문 드립니다.
- 미해결스프링 핵심 원리 - 기본편
@Bean 파라미터 있을 경우 빈 생성/등록 순서
@Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl( memberRepository(), discountPolicy()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } ... }CGLIB이 AppConfig를 상속한 클래스를 만들어 참조할 빈이 등록되어 있으면 반환, 없으면 생성/등록하도록 조작한다고 이해했습니다. 위 방식과 다르게 @Configuration 클래스를 분리하겠습니다.@Configuration public class AppConfig { @Bean public MemberService memberService (MemoryMemberRepository memoryMemberRepository) { System.out.println("@@ AppConfig.memberService"); return new MemberServiceImpl(memoryMemberRepository); // return new MemberServiceImpl(getMemoryMemberRepository()); } } @Configuration public class TestConfig { @Bean public MemoryMemberRepository memoryMemberRepository() { System.out.println("@@ Testconfig.memoryMemberRepository"); return new MemoryMemberRepository(); } }테스트를 몇 번 해보니 memberService 빈 등록 시 memoryMemberRepository()가 알아서 먼저 호출된다는 걸 확인했습니다. 질문입니다.파라미터가 있을 경우 memoryMemberRepository 빈(파라미터)이 memberService 빈보다 먼저 생성/등록된다는 게 항상 보장되는 건가요?이런 방식에 위험이 있나요?
- 미해결스프링 핵심 원리 - 기본편
AppConfig에 질문이 있습니다.
@Configuration에 @Component가 있으면 메서드들은 자동으로 빈으로 등록되는 것으로 강의를 보면서 이해했습니다. 그러면 AppConfig에서 @Bean을 메서드마다 붙이지 않아도 @SpringbootApplication에 있는 @ComponentScan이 자동으로 component들을 빈으로 등록해줘서 의존관계 주입이 되는 거 아닌가요? 내가 잘못 이해하고 있는 거면 답변 부탁드립니다.
- 미해결스프링 핵심 원리 - 기본편
getBeanDefinitionNames()관련해서 질문이요
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.컨테이너에 등록된 모든 빈을 조회할때Object bean=ac.getBean(beanDefinitionName);으로 bean을 찾았습니다.근데 밑 내용에서 스프링 컨테이너 에서 스프링 빈을 찾는 가장 기본적인 조회방법은 ac.getBean(빈이름,타입), ac.getBean(타입)으로 찾습니다.즉 매개변수를 하나로 찾으려면 ac.getBean(타입)으로 찾아야한다는 말과 같습니다.ac.getBean(beanDefinitionName)은 beanDefinitionName을 출력했을때 타입이 아니라 빈 이름인것 같은데 이게 어떻게 된걸까요?
- 미해결스프링 핵심 원리 - 기본편
제가 이해한게 맞을까요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.제가 이해한게 맞는지 확인 좀 해주세요!스프링 빈의 이벤트 라이프 사이클은스프링 컨테이너 생성-> 스프링 빈 생성-> 의존관계 주입-> 초기화 콜백 ->사용 ...이렇게 되는데NetworkClient 예제에서는 초기화라는게 networkClient.setUrl("http ...") 이 아닌 connect() 와 call("초기화 연결 메세지") 이다즉 의존 관계 주입이후 connect와 call을 호출 하는 것이 목적이다.그렇기 때문에 @Beanpublic NetworkClient networkClient(){에서 return networkClient를 하기 전, networkCludent.setUrl(...)을 한 후에 networkClient.connect(), networkClient.call()을 한다면출력창에 찍히는 것은 같을지 몰라도 그 의미가 다르다. 왜냐하면 빈이 등록(return networkClient)이전에 호출한 함수이기 때문이다. 우리가 원하는 것은 의존관계 주입이후에 connect와 call을 하는 것이기 때문에 NetworkClient tmp=ac.getBean(NetworkClient.class);tmp.connect(); tmp.call();을 하는 것과 이론적으로 같다. 하지만 이렇게 하는게 귀찮으므로(?)1)인터페이스(InitializingBean)2)설정 정보에 초기화 메서드, 종료 메서드 지정, 3) @PostConstruct,@PreDestroy 애노테이션을 지원한다. 이게 맞나요??아 이거 뭔가 아닌것같은데 ㅠㅠ
- 미해결스프링 핵심 원리 - 기본편
NoUniqueBeanException 에러
https://www.inflearn.com/questions/776767/nouniquebeandefinitionexception-%EC%97%90%EB%9F%AC해당 글이랑 똑같은 에러, 상황인데 혹시 해결되셨나요? 답변이 없어서요 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
- 미해결스프링 핵심 원리 - 기본편
ObjectProvider<MyLogger> myLoggerProvider 질문
안녕하세요 계속 고민하고 구글링하고 하다가 정리가 확실히 안되서 질문드립니다 ㅠ우선 https://www.inflearn.com/questions/743070/provider 여기에 나와있는 답변을 바탕으로 어느정도 정리가 되었습니다.하지만 여기서 드는 고민이 있습니다. 1. 그럼 LogDemoController,LogDemoService 는 @RequiredArgsConstructor 때문에 생성자에서 (두개의 클래스 안에 공통으로 있는) 필드ObjectProvider<MyLogger> myLoggerProvider를 주입받아야 되는데 ObjectProvider<MyLogger> myLoggerProvider는 .getObject()나오기 전까지 스프링컨테이너에 아무일도 안일어나는건가요?? 1번이 맞다면 대기하였다가 이 .getObject()이 실행될때 해당 빈(Mylogger)을 찾아서 반환을 해주고 그때서야 스프링컨테이너에 LogDemoController,LogDemoService 이 두개의 빈이 등록되는건가요???
- 해결됨스프링 핵심 원리 - 기본편
@Autowired 사용법 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]<컴포넌트 스캔과 의존관계 자동 주입 시작하기>강의에 질문 드립니다. 강의를 보면 RateDiscountPolicy에 @Component를, OrderServiceImpl에서 @Autowired를 이용하여 의존성을 주입해주고 있는데요. "스프링이 DiscountPolicy에 대해 아는 정보가 RateDiscountPolicy밖에 없기 때문에(@Component) @Autowired를 사용하여 의존관계를 주입하지 않아도 알아서 의존관계를 설정해주지 않을까?라는 궁금증이 생겨 아래 테스트를 작성해보았습니다. >> 위 설정으로 테스트를 작성하고 수행했을 때, 테스트가 통과되는 것을 확인했습니다.예상대로 아래 로그와 같이 스프링이 OrderServiceImpl과 RateDiscountPloicy의 의존관계를 설정해주고 있었습니다.>> 질문 1. 위 케이스대로면 생성자만 만들고, @Autowired설정 없이 의존관계를 주입하고 싶은 구현체만 @Component로 등록하면 되지 않을까요? >> 질문 2. @Autowried를 꼭 사용해야 하는 이유가 있을까요? 예를 들어 구현체 여러개가 빈으로 등록되어야 한다든지..(이 경우는 컴파일 에러가 나는 것 같은데 다른 설정법이 있는건가요?)
- 미해결스프링 핵심 원리 - 기본편
on-demand시 * 모든패키지 설정이 안되네용? 버전차이인가요?
[질문 내용]이전 강의부터 궁금했던 부분인데Assertions라던지 static 메소드 호출 후 Add On-demend static Import를 하게되면 강의에서는 import 문의 끝이 Assertions.*로 되는데저는 Assertions.assertThat으로 적용됩니다.혹시 자바 버전차이일까요? 아니면 따로 설정을 해줘야하는건가요?이렇게되면 assertThat만 바로 호출이가능하고 나머지 다른 메소드들은 Assertions 클래스를 다시 선언하고 접근해야 하더라구요그래서 따로 *로 지정하면 자동으로 assertThat으로 변경됩니다...혹시 왜그런것인지 해결방안을 알 수 있나요?
- 미해결스프링 핵심 원리 - 기본편
PrototypeBean 두번 생성되는 이유가 궁금합니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.강의 자료와 강의에서 하신 말씀을 보면 둘 다 PrototypeBean이 두 번 생성된다고 되어있습니다.그런데 강의 중에 이런 말씀을 하셨습니다."ClientBean은 싱글톤 타입이고 PrototypeBean은 ClientBean이 관리하니까 생성이 한번만 된다"이 말씀을 들을때는 저도 이해가 되고 동의가 되었는데 두번 생성된다는 말은 무슨말인지 모르겠습니다.
- 미해결스프링 핵심 원리 - 기본편
스프링 핵심원리 기본편 request 빈 스코프 만들기 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요, 스프링 핵심원리 기본편 request 빈 스코프 만들기 예제 강의 11:52초 부분 강의 시청 중입니다.예제를 따라서 아래와 같이 코딩을 하였고, variable logDemoService not initialized in the default constructor 오류를 마주쳐서 해결 방법을 문의드립니다 ㅠㅠ소스 코드는 아래와 같습니다.package hello.core.web; import hello.core.common.MyLogger; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; @Controller @RequiredArgsConstructor public class LogDemoController { private final LogDemoService logDemoService; private final MyLogger myLogger; @ResponseBody @GetMapping("log-demo") public String logMemo(HttpServletRequest request) { String requestURL = request.getRequestURL().toString(); myLogger.setUuid(requestURL); myLogger.log("controller test"); logDemoService.logic("testId"); return "OK"; } }확인 부탁드리겠습니다 ㅠㅠ
- 미해결스프링 핵심 원리 - 기본편
이해안되는 곳이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.의존관계 주입 방법에서 오더서비스 의존관계 주입을 하였습니다.그러고 난 다음 확인 하기 위해 오더서비스임플 생성자에 sout문장을 넣은거 같습니다.근데 오토앱컨피트테스트는 빈에서 멤버서비스를 가지고 오는것으로 보이는데 실행을 하니 오더 서비스에 생성자에 추가한 sout문장들이 출력이 되었습니다 저는 오더서비스의 생성자에 추가한 문장들이 나오지 않습니다. 원래 멤버서비스 객체를 받아온거 아닌가요? 왜 오더서비스 sout문장이 나오는지 잘 모르겠습니다 ㅜ
- 미해결스프링 핵심 원리 - 기본편
@Autowired 오류입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]먼저, 항상 좋은 강의 감사드립니다!@Autowired에서 빨간줄이 뜨고Autowired members must be defined in valid Spring bean (@Component|@Service|...) 라는 문구가 뜨게됩니다 어떻게 해결해야 하나요?
- 해결됨스프링 핵심 원리 - 기본편
@Configutation 질문
ApplicationContext로 class를 등록하고 등록된 빈들을 조회해보니 싱글톤이 보장되는 것을 확인했습니다.근데 @Configuration을 사용하지 않고 @Bean만 사용하면 주입받는 객체들이 싱글톤을 유지하지 않게되는데@Configuration이 주입관계있는 빈들까지 싱글톤을 보장해주는 것 맞나요..?