![Thumbnail](https://cdn.inflearn.com/public/courses/325969/cover/2868c757-5886-4508-a140-7cb68a83dfd8/325969-eng.png)
25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 기본편
섹션 3 질문
섹션 3 에서 AppConfig를 이용하여 test 코드 수정하는 장면에서 이해가 안되는 부분이 있어서 질문드려요.Before each가 매 테스트가 실행되기전에 실행되는것 까지는 이해가 가는데 왜 appConfig를 이용하여 구현체 연결해줄때 before each가 사용되어야하는지 잘이해가안갑니다. 이 테스트를 할때 beforeEach를 굳이 사용하여야 하는 이유가있을까요? 제 생각에는 안쓰고 테스트가 여러개 있어도 상관없을거 같은데. 예시와 함께 설명해주시면 이해가 더 잘될 것 같습니다 :)감사합니다
- 미해결스프링 핵심 원리 - 기본편
인터페이스 질문.
안녕하세요 지금 막 섹션 2강을 다들은 학생입니다.강의를 보면서 따라서 코딩을 치다보니 궁금한 점들이 생겨서 질문남깁니다.MemberSerive와 OrderService는 각각의 구현객체가 하나씩 밖에 없고 구현객체가 하나밖에 없을시에는 Impl 구현객체클래스에 impl을 붙인다고 하셨는데, 구현객체가 어차피 하나밖에 없을경우에는 굳이 Interface를 안만들고 구현객체 클래스만 만들어도 되는거 아닌가요?지금 Interface를 만든이유가 나중에 추후에 확장 혹은 수정이 있기때문에 저렇게 코드를 짜놓은건가요? 감사합니다
- 미해결스프링 핵심 원리 - 기본편
[질문 아님. 질문 많이 하시는 내용 정리] 빈생성과 초기화(라이프사이클)
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니오2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]빈 생성 -> 초기화 순서에서 빈 생성이 어디까지인지 저를 포함해서 헷갈리는 분들이 많이 계신 거 같습니다. 다른 분들 질문도 많이 있어 정리하여 공유합니다. 중요한 내용은 @Bean 어노테이션이 붙은 함수의 리턴 값이 빈으로 등록되는 것이고 이게 곧 빈 등록 부분입니다. 이해하셨다면 아래는 안 읽으셔도 됩니다.@Configuration static class LifeCycleConfig { @Bean public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); networkClient.setUrl("http://hello-spring.dev"); return networkClient; } }해당 코드에서 @Bean 어노테이션이 등록되어 있는데요. 이 코드는 라이프 사이클 중 빈 생성입니다. 초기화랑은 관계가 없습니다. 빈 생성 과정을 구체적으로 보면, 스프링 컨테이너가 빈 이름은 networkClient 으로 networkClient() 호출 결과(return networkClient;)의 객체를 등록하게 됩니다.(객체 참조값이 등록되겠죠)코드 중간에 setUrl 을 호출해주기 때문에, url은 세팅이 된 상태로 빈 생성이 되어있게 되구요.이후 초기화(강의 내용 중 @PostConstruct을 포함한 세가지 방법)는 별도의 프로세스로 진행됩니다. 해당 코드와 무관하다는 뜻입니다.참고차 비슷한 질문도 링크 남겨놓습니다https://www.inflearn.com/questions/378705
- 미해결스프링 핵심 원리 - 기본편
스프링돌릴떄 디버그 로깅뜨는부분
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]실행은 잘되는데 이런개 너무 많이뜨는데 제가 뭐 잘못만진건가요 ?
- 해결됨스프링 핵심 원리 - 기본편
섹션 10. 빈스코프 질문 2
public class PrototypeTest { @Test void PrototypeBeanTest() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); System.out.println("find PrototypeBean1"); PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class); System.out.println("find PrototypeBean2"); PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class); System.out.println("prototypeBean1 = " + prototypeBean1); System.out.println("prototypeBean2 = " + prototypeBean2); assertThat(prototypeBean1).isNotSameAs(prototypeBean2); } static class PrototypeBean { @PostConstruct public void init() { System.out.println("PrototypeBean.init"); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } } }결과prototypeBean1 = hello.core.scope.PrototypeTest$PrototypeBean@29caf222prototypeBean2 = hello.core.scope.PrototypeTest$PrototypeBean@29caf222 강의에서 프로토타입 스코프를 코드로 작성하고 실행하는 도중 깜빡하고 스코프 애노테이션을 넣는 걸 깜빡했습니다.그런데 prototypeBean1 과 prototypeBean2 의 참조값이 같게 나왔습니다.@Configuration을 적지 않았는데 왜 싱글톤이 적용이 된 건지 잘 이해가 가지 않습니다...AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class);위 코드에서 AnnotationConfigApplicationContext를 생성할 때 PrototypeBean 정보를 넘겨주면 내부적으로 빈 등록 과정이 진행되기 때문입니다.감사합니다.라고 답변을 받았는데,답변에 대한 질문: PrototypeBean.class의 정보를 넘겨주는데 PrototypeBean 클래스에 @Configuration을 적지 않으면 싱글톤이 적용이 안되는 거 아닌가요??ㅠㅠ
- 해결됨스프링 핵심 원리 - 기본편
섹션 7. 조회한 빈이 모두 필요할 때, List, Map
이렇게 한 상태에서 코드 돌리실 때 강의에서는 돌아가는데 제가 하니까 오류가 뜹니다...ㅠㅠ선생님께서도 fix하고 rate 모두 @Component 붙이셨고..강의에서 rate에서 @MainDiscountPolicy 제거하셨는데 어떻게 오류없이 돌아가는 건가요ㅠㅠ 왜 저만 오류가....이 강의에서 소스코드가 없어서 선생님하고 어느 부분이 다른지 확인하기도 어렵습니다ㅠㅠ어느 부분에서 잘못된 건지 확인 가능할까요...ㅠㅠhttps://drive.google.com/file/d/1zr_OjcriS2xs6HdrWQCUmuPCV4iAfGaw/view?usp=drive_link 혹은 소스코드를 받을 수 있으면 확인해보고싶습니다... @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); } static class DiscountService { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); }Error creating bean with name 'orderServiceImpl' defined in file [E:\study\core\build\classes\java\main\hello\core\order\OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [E:\study\core\build\classes\java\main\hello\core\order\OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:795) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:237) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1357) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:962) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:93) at hello.core.autowired.AllBeanTest.findAllBean(AllBeanTest.java:22) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1596) Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:218) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1420) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:904) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:782) ... 17 more No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy at app//org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:218) at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1420) at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1353) at app//org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:904) at app//org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:782) at app//org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:237) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1357) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1194) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:562) at app//org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:522) at app//org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:337) at app//org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at app//org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:335) at app//org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) at app//org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:975) at app//org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:962) at app//org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624) at app//org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:93) at app//hello.core.autowired.AllBeanTest.findAllBean(AllBeanTest.java:22) at java.base@21.0.3/java.lang.reflect.Method.invoke(Method.java:580) at java.base@21.0.3/java.util.ArrayList.forEach(ArrayList.java:1596) at java.base@21.0.3/java.util.ArrayList.forEach(ArrayList.java:1596)
- 미해결스프링 핵심 원리 - 기본편
섹션 7. 옵션처리
@Component class Ex1 { private final Member member; @Autowired(request = false) public Ex1(Member member) { this.mamber = member; } }@Aurowired(request = false)를 사용하면 생성자 호출이 되지 않으니까->Ex1은 스프링 빈으로 아예 등록 조차 안 되는 게 맞는 건가요? @NullableOptional<Member>만약 request = false를 사용하지않고,Nullable과 Optional을 사용하면 Ex1은 스프링 빈으로 등록되는 게 맞나요?? 그리고 수정자 주입같은 경우는@Component class Ex1 { private final Member member; @Autowired public void setEx1(Member member) { this.mamber = member; } }member가 스프링 빈에 등록되어 있지 않으면 Ex1을 스프링 빈에 member가 주입되지 않은 상태로 저장하고,member가 스프링 빈에 등록되어면 그때서야 Ex1에 자동으로 주입을 해주는 게 맞나요?
- 미해결스프링 핵심 원리 - 기본편
request 스코프 관련 문의
안녕하세요, 몇가지 질문이 있습니다. 선생님의 코드대로 쳤는데 제 인텔리제이에서는 왜 다음과 같은 에러가 발생하는지 모르겠습니다.왜 LogDemoController가 static 컨텍스트라고 떠서 이런 에러가 발생하는지 모르겠습니다.제가 봤을땐 static이 아닌데 말이죠 (MyLogger, Controller, Service 모두 static은 없음)여기까지의 소스 코드를 1차 첨부합니다. (에러 발생 코드)package hello.core.common; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import java.util.UUID; @Component @Scope(value="request") public class MyLogger { private String uuid; // unique id private String requestURL; public void setRequestURL(String requestURL){ this.requestURL = requestURL; } public void log(String message){ System.out.println("[" + uuid + "] " + "[" + requestURL + "]" + message); } @PostConstruct public void init(){ uuid = UUID.randomUUID().toString(); System.out.println("[" + uuid + "] " + "[" + requestURL + "] request scope bean create : " + this); } @PreDestroy public void close(){ System.out.println("[" + uuid + "] " + "[" + requestURL + "] request scope bean close : " + this); } /* 로그를 출력하기 위한 클래스 request 스코프로 지정했으며, HTTP 요청당 하나씩 생성되고, HTTP 요청이 끝나는 시점에 소멸된다. 이 빈이 생성되는 시점에 자동으로 @PostConstruct 초기화 메서드를 사용해서 uuid를 생성해서 저장해둔다. 이 빈은 HTTP 요청 당 하나씩 생성되므로, uuid를 저장해두면 다른 HTTP 요청과 구분할 수 있다. requestURL은 빈이 생성되는 시점에는 알 수 없으므로 외부에서 setter로 입력받는다. */ }package hello.core.web; import hello.core.common.MyLogger; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequiredArgsConstructor public class LogDemoController { private final LogDemoService logDemoService; private final ObjectProvider<MyLogger> myLoggerProvider; // 스프링 컨테이너가 뜨면서 의존관계 주입을 해야하는데 mylogger는 request scope이라 아직 고객 요청이 없어서 에러 @RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request){ String requestURL = request.getRequestURL().toString(); // 고객이 요청한 url을 받을 수 있음 MyLogger myLogger = myLoggerProvider.getObject(); // 주입 시점에 주입 받을 수 있음 myLogger.setRequestURL(requestURL); myLogger.log("controller test"); LogDemoService.logic("testId"); return "OK"; } }package hello.core.web; import hello.core.common.MyLogger; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class LogDemoService { private final ObjectProvider<MyLogger> myLoggerProvider; public void logic(String id) { MyLogger myLogger = myLoggerProvider.getObject(); myLogger.log("service id = " + id); } }어쨋든 이 문제를 해결하지 않으면 소스 코드 실행이 되지 않습니다. 따라서 intelliJ 가이드에 따라 static으로 만들어주고 실행을 하면 또 에러가 발생합니다.private final ObjectProvider<MyLogger> myLoggerProvider;위 구문 초기화를 하라는 가이드에 = Null을 해주면 소스 코드 실행 시 (디버깅 결과) myLoggerProvider.getObject() 에서 널포인트 익셉션이 터집니다.여기까지 상황의 코드를 2차 첨부합니다.package hello.core.web; import hello.core.common.MyLogger; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequiredArgsConstructor public class LogDemoController { private final LogDemoService logDemoService; private final ObjectProvider<MyLogger> myLoggerProvider; // 스프링 컨테이너가 뜨면서 의존관계 주입을 해야하는데 mylogger는 request scope이라 아직 고객 요청이 없어서 에러 @RequestMapping("log-demo") @ResponseBody public String logDemo(HttpServletRequest request){ String requestURL = request.getRequestURL().toString(); // 고객이 요청한 url을 받을 수 있음 MyLogger myLogger = myLoggerProvider.getObject(); // 주입 시점에 주입 받을 수 있음 myLogger.setRequestURL(requestURL); myLogger.log("controller test"); LogDemoService.logic("testId"); return "OK"; } }package hello.core.web; import hello.core.common.MyLogger; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class LogDemoService { private static final ObjectProvider<MyLogger> myLoggerProvider = null; public static void logic(String id) { MyLogger myLogger = myLoggerProvider.getObject(); myLogger.log("service id = " + id); } } 어떻게 해결해야할까요? 제가 잘못 타이핑한 부분이 있다면 말씀 부탁드립니다.
- 미해결스프링 핵심 원리 - 기본편
싱글톤 패턴 문제점
싱글톤 패턴의 문제점중 하나로 클라이언트가 구체 클래스에 의존해서 DIP와 OCP원칙을 위반할 수 있다고설명이 되어 있는데 궁금한 부분이 여기서 말하는 클라이언트가 아래와 같이 강의 중에 설명한 코드 중private static final SingletonService instance = new SingletonService()를 의미하는건지혹은 두 번째 코드에서 SingletonService singletonService1 = SingletonService.getInstance()과 같이 SingletonService 객체에서 객체를 가져오는 것을 의미하는 건가요? 그리고 강사님께서 싱글톤 패턴을 테스트에 위치하여 작성하였고 해당 SingletonService 클래스의 싱글톤을 구현한 코드를 해당 클래스 안에 작성하셨는데 스프링을 사용하지 않는다는 가정하에 싱글톤으로 컨테이너 객체를 관리할 때 SingletonService는 인터페이스고 해당 인터페이스를 구현하는 구현 클래스에 싱글톤 구현부들 작성하는게 맞을까요?
- 해결됨스프링 핵심 원리 - 기본편
UnsatisfiedDependencyException & NoUniqueBeanDefinitionException 2
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberServiceImpl' defined in file [E:\java-spring-basic-review\myStudy\out\production\classes\hello2\myStudy\member\MemberServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'hello2.myStudy.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository ... Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello2.myStudy.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository질문 한 번 올렸는데 ai답변이 와서 거기서 본 링크쪽으로도 갔는데 문제를 모르겠습니다...3시간 동안 찾아보고 해결해보려하는데 되지 않습니다... 도와주세요.https://drive.google.com/file/d/1cBsUxNQ27kT1rdo6R-s0iuNEGOC7paFG/view?usp=drive_link혹시몰라 파일도 올립니다ㅠㅠ 정말 알 수가 없습니다...
- 해결됨스프링 핵심 원리 - 기본편
UnsatisfiedDependencyException & NoUniqueBeanDefinitionException
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberServiceImpl' defined in file [E:\java-spring-basic-review\myStudy\out\production\classes\hello2\myStudy\member\MemberServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'hello2.myStudy.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository ... Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello2.myStudy.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository 복습하는 중에 전체 테스트를 돌렸는데 MyStudyApplicationTests에서만 오류가 납니다.정말 해결하려 노력해보았으나, 머리박고 헤드뱅이 100바퀴 돌정도로 모르겠습니다.생각해봤을 때, appConfig와 AutoAppConfig에서 같은 타입의 빈이 2개 생성돼서 오류가 나는 거 같은데...정확히 어디가 잘 못된 건지 고칠 방법이 뭔지 알 수가 없습니다...도와주세욤....
- 미해결스프링 핵심 원리 - 기본편
테스트 로그
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.테스트를 실패하면 로그가 나오는데 성공하면 영상처럼 로그가 안나오는데 따로 설정이 필요한가요?
- 해결됨스프링 핵심 원리 - 기본편
섹션 5
@Test @DisplayName("싱글톤의 주의할 점") void statefulServiceSingleton() { ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); StatefulService statefulService1 = ac.getBean("testConfig", StatefulService.class); StatefulService statefulService2 = ac.getBean("testConfig", StatefulService.class); statefulService1.order("userA", 10000); statefulService2.order("userB", 20000); assertThat(statefulService2.getPrice()).isSameAs(20000); } 오류 메시지 java.lang.AssertionError: Expecting actual: 20000 and: 20000 to refer to the same object이렇게 테스트 했더니 오류가 뜹니다!ㅠㅠㅠAssertions.assertThat().isSameAs()Assertions.assertThat().isEqualsTo()두 개의 차이점이 궁금합니다!
- 미해결스프링 핵심 원리 - 기본편
jdk 오류 질문드립니다
섹션3 - 스프링으로 전환하기 부분 9:47[질문 내용]세팅에서 Gradle(Default)랑 Intellij IDEA 둘 다 변경해봤는데도 오류뜹니다도와주세요 ㅎ그흑
- 해결됨스프링 핵심 원리 - 기본편
섹션 4
public class ApplicationContextSameBeanFindTest { ApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class); @Test @DisplayName("타입으로 조회 -> 같은 타입이 둘 이상 있으면 중복 오류 발생") void findBeanByTypeDuplicate() { MemberRepository bean = ac.getBean(MemberRepository.class); System.out.println("bean = " + bean); } @Configuration class SameBeanConfig { @Bean MemberRepository memberRepository1() { return new MemoryMemberRepository(); } @Bean MemberRepository memberRepository2() { return new MemoryMemberRepository(); } } }너....무 기본적인 질문같지만 아직 부족해서 질문드립니다!ㅠㅜ현재는 복습중입니다. 본문:이 테스트 코드를 실행하면 오류가 납니다.->UnsatisfiedDependencyExceptionApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class); 여기서 중첩 클래스로 SameBeanConfig를 만들었습니다.그런데 SameBeanConfig에 static을 붙이지 않으면 왜 오류가 뜨는지 잘 모르겠습니다....이전 강의에서 만들었던 AppConfig는 static클래스가 아닙니다.그럼에도 AnnotationConfigApplicationContext()에 설정 정보로 넘겨줘도 실행하는데 지장은 없었습니다. 한 마디로 AppConfig도 객체를 따로 생성해서 넘긴 게 아니라 AppConfig.class로 넘겼습니다.그러면 SameBeanConfig.class도 정상 작동해야하는 게 아닌가...합니다....
- 미해결스프링 핵심 원리 - 기본편
start.spring.io 에서 dependencies 에 아무것도 추가를 안하면
start.spring.io 에서 dependencies 에 아무것도 추가를 안하면 spirng 프레임워크를 사용하는 것이 되나요 ? 아니면 start.spring.io 에서 dependencies 여부 상관없이 여기서 프로젝트를 다운받고 하게 되면 다 spring boot 프레임워크인건가요 ?
- 해결됨스프링 핵심 원리 - 기본편
섹션 10. 빈 스코프 질문
public class PrototypeTest { @Test void PrototypeBeanTest() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); System.out.println("find PrototypeBean1"); PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class); System.out.println("find PrototypeBean2"); PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class); System.out.println("prototypeBean1 = " + prototypeBean1); System.out.println("prototypeBean2 = " + prototypeBean2); assertThat(prototypeBean1).isNotSameAs(prototypeBean2); } static class PrototypeBean { @PostConstruct public void init() { System.out.println("PrototypeBean.init"); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } } }결과prototypeBean1 = hello.core.scope.PrototypeTest$PrototypeBean@29caf222prototypeBean2 = hello.core.scope.PrototypeTest$PrototypeBean@29caf222 강의에서 프로토타입 스코프를 코드로 작성하고 실행하는 도중 깜빡하고 스코프 애노테이션을 넣는 걸 깜빡했습니다.그런데 prototypeBean1 과 prototypeBean2 의 참조값이 같게 나왔습니다.@Configuration을 적지 않았는데 왜 싱글톤이 적용이 된 건지 잘 이해가 가지 않습니다...
- 해결됨스프링 핵심 원리 - 기본편
섹션 8. 빈 생명주기 콜백
@Bean에 초기화 소멸 메서드 등록할 때 질문입니다!public class NetworkClient { private String url; public NetworkClient() { System.out.println("생성자 호출, url = " + url); } public void setUrl(String url) { this.url = url; } //서비스 시작시 호출 public void connect() { System.out.println("connect: " + url); } public void call(String message) { System.out.println("call: " + url + " message = " + message); } //서비스 종료시 호출 public void disConnect() { System.out.println("close + " + url); } public void init() { System.out.println("NetworkClient.init"); connect(); call("초기화 연결 메시지"); } public void close() { System.out.println("NetworkClient.close"); disConnect(); }@Configuration static class LifeCycleConfig { @Bean(initMethod = "init", destroyMethod = "close") public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); networkClient.setUrl("http://hello-spring.dev"); return networkClient; } } 결과생성자 호출, url = null NetworkClient.init connect: http://hello-spring.dev call: http://hello-spring.dev message = 초기화 연결 메시지 13:33:10.029 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing NetworkClient.close close + http://hello-spring.dev스프링 빈에 하기위해 networkClient객체가 생성되고 의존관계 주입까지 끝난 다음에 networkClient.setUrl("http://hello-spring.dev"); 로 url을 초기화하기 전에init() 메서드가 실행되는 걸로 이해를 했는데, 그럼 init() 메서드가 connect 호출 할 때 url은 여전히 null일테니 url의 초기화가 먼저 일어나야 합니다.그런데 초기화 콜백은 스프링 빈이 객체를 생성하고 의존관계 주입이 완료된 후,초기화가 되기 전에 일어나는 거 아닌가요..이럼 앞뒤가 안 맞는데 제가 놓치고있는 부분을 알려주시면 감사하겠습니다.
- 미해결스프링 핵심 원리 - 기본편
connect()에 url이 null이 안나오는이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요 이 강의와 이전강의를 돌려가면서보는중인데도 햇갈리는게있어서 제가 생각하는게 맞는지 궁금해서 질문드립니다.1. 바로이전강의내용에서는 connect() 와 call()를 afterPropertiesSet()에 넣지않은상태에서 코드를 실행하면 url이 null이 뜨는상태였습니다. 그 이유가 그러면 connect() 와 call()함수가 빈 라이프사이클인 "스프링 빈 생성" 중 NetworkClient 생성자안에 있어서 url을 set하기 전 단계에 실행되서 null이 뜨는거고, null이 안뜨고 url이 제대로 나오는 상황은 빈이 완벽하게 생성이 된 이후에 connect() call()이 실행되서 인가요? 제 질문이 잘 전달이된건지 잘 모르겠네요. 빈생성이 되기 전에 connect한거랑 빈생성이완벽하게된후(url도 set된상황) 그 차이인가요?2. 그리고 바로전강의에서 상태출력을 빈생성과정에 출력하신거라 null이 나오는거지 결국 setUrl은 결국 실행되서 url의 최후 상태는 null이 아니지않나요? 그냥 라이프사이클에 중점을두시는 강의인거맞나요?
- 해결됨스프링 핵심 원리 - 기본편
섹션 7. 조회한 Bean 모두 필요 Map, List
public class AllBeanTest { @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(DiscountPolicy.class); } static class DiscountPolicy { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired public DiscountPolicy(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } }테스트를 실행하면policyMap = {}policies = []출력이 됩니다.실행되면서new AnnotationConfigApplicationContext(DiscountPolicy.class);의 스프링 컨테이너가 DiscountPolicy를 빈으로 등록하는데,DiscountPolicy는 @Autowired로 생성자 주입을 받습니다. 그런데 스프링 컨테이너의 스프링 빈에는Map<String, DiscountPolicy> policyMapList<DiscountPolicy> policiespolicyMap와 policies는 생성된 적이 없어서 등록된 빈이 없을테고, final이 붙은 필드에는 초기화가 되지않아서 오류가 나야하지 않나요?어떻게policyMap = {}policies = []처럼 객체가 들어가 있을 수가 있나요??