30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 기본편
OrderService 도메인 설계관련 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 저는 학습을 진행할 때, 요구사항만 보고 제 나름대로의 코드를 쳐보고 그 후, 영한님의 코드를 보면서 고칠 부분은 고치고 , 수정하는 방식으로 학습을 합니다. OrderService 내부에 MemberService를 이용하면 안되거나 혹은 단점이 있을까요?저는 memberService가 member와 관련된 로직을 처리하는걸 담당하기 때문에, memberService를 부르는게 맞다고 생각했습니다. 하지만, 강의에서는 memberRepository를 직접 부르는 형태로 구현을 하시더라구요.기능적인 차이는 없겠지만, 어떤게 더 좋은방식인지 고민하다가 ,질문을 올려봅니다!
- 해결됨스프링 핵심 원리 - 기본편
스프링 Checked Exception/ Unchecked Exception에 대한 질문입니다.
안녕하세요. 강의 잘 듣고 있습니다. 코드 작성하다가 예외처리에 대한 궁금증이 있어 질문드립니다.제가 알고있는 스프링 예외처리 정책은 Unchecked Exception은 같은 트랜잭션 내에서 Rollback 되고 Checked Exception은 필수로 try catch로 예외처리를 해서 Rollback이 안되는 것으로 알고 있습니다.Unchecked Exception도 try-catch로 잡아서 예외를 처리하려고 하는데 Unchecked Exception은 Checked Exception과는 다르게 중간에서 예외를 잡아도 가장 상위 메소드로 올라가서 예외가 발생되더라구요. 때문에 최상위 메소드에서 try-catch로 잡아줘야지만 예외가 잡히고 다음 스텝으로 넘어가던데 왜 중간에서 try - catch로 잡히지 않는 것인지 궁금합니다. 간단한 코드 첨부하겠습니다.class A { @Autowired private B b; @Transactional void aMethod(){ for(int i=0; i<10; i++){ b.bMethod(i); } } }class B { @Autowired private C c; @Transactional void bMethod(int i){ try{ c.cMethod(i); }catch(RuntimeException e){ //예외처리로직 } } }class C { @Autowired private CRepository cRepository; @Transactional void cMethod(int i){ if(i==5){ throw new RuntimeException(); }else{ cRepository.save(i); } } }위의 코드를 실행하면 B class의 try catch가 C에서 발생한 RuntimeException을 잡아서 계속 직행하지 못하고 A까지 예외가 올라가서 예외가 발생됩니다.try catch 블록을 A class로 옮기면 예외를 잡아서 console에 예외가 터지지 않고 정상 작동됩니다. Checked Exception은 저렇게 중간에 예외를 잡아도 예외가 상위 메소드로 올라가지 않고 처리되던데 Unchecked Exception은 왜 최상위 메소드까지 올라가서 처리를 해줘야하는지 궁금합니다.
- 해결됨스프링 핵심 원리 - 기본편
스프링 부트 버전
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]해당 강의에서 김영한님이 스프링 부트 버전 2.3.3 버전을 클릭하셨는데 현재 시점에서 Spring Initializr에 접속하면 선택 가능한 스프링 부트 버전 3.1.3, 3.0.10, 2.7.15입니다.이 중에서 2.7.15로 선택해서 강의 들으면 될까요??
- 미해결스프링 핵심 원리 - 기본편
'code' 질문입니다
12번째줄에서FixDiscountPolicy discountPolicy =new FixDiscountPolicy();이렇게써도 정상적으로 test에는 성공하던데, 선생님의 DiscountPolicy discountPolicy=new FixDiscountPolicy();와FixDiscountPolicy discountPolicy =new FixDiscountPolicy();뜻 차이는 뭔가요?그리고 선생님처럼 써야하는 이유는 무엇인지 궁금합니다.
- 해결됨스프링 핵심 원리 - 기본편
테스트 시, 로그 나오지 않는 현상 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]테스트 시에 선생님 화면처럼 관련 로그가 나오지 않는데, 어떻게 설정해야 하는지 궁금합니다![제 화면][선생님 화면]
- 해결됨스프링 핵심 원리 - 기본편
logback.xml 관련 에러 메시지 출력 문제
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. xml 부분을 듣고 있는데, 테스트는 통과하지만 logback 파일과 관련해서 에러 메시지가 뜹니다.로그 출력 문제로 logback.xml 파일을 추가했는데 혹시 원인을 알 수 있을까요?한 번 에러가 나니까 테스트를 실행할 때마다 계속 뜹니다. 해당 에러 메시지입니다.Failed to auto configure default logger context Reported exception: ch.qos.logback.core.joran.spi.JoranException: Problem parsing XML document. See previously reported errors. at ch.qos.logback.core.joran.event.SaxEventRecorder.recordEvents(SaxEventRecorder.java:65) at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:151) at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:110) at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:53) at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:64) at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:134) at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84) at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55) at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150) at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124) at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:417) at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362) at org.apache.commons.logging.LogAdapter$Slf4jAdapter.createLocationAwareLog(LogAdapter.java:130) at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:91) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59) at org.springframework.context.support.AbstractApplicationContext.<init>(AbstractApplicationContext.java:178) at org.springframework.context.support.GenericApplicationContext.<init>(GenericApplicationContext.java:114) at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:67) at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:91) at hello.core.beanDefinition.BeanDefinitionTest.<init>(BeanDefinitionTest.java:11) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) at org.junit.platform.commons.util.ReflectionUtils.newInstance(ReflectionUtils.java:550) at org.junit.jupiter.engine.execution.ConstructorInvocation.proceed(ConstructorInvocation.java:56) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.api.extension.InvocationInterceptor.interceptTestClassConstructor(InvocationInterceptor.java:73) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:77) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestClassConstructor(ClassBasedTestDescriptor.java:355) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateTestClass(ClassBasedTestDescriptor.java:302) at org.junit.jupiter.engine.descriptor.ClassTestDescriptor.instantiateTestClass(ClassTestDescriptor.java:79) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:280) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$4(ClassBasedTestDescriptor.java:272) at java.base/java.util.Optional.orElseGet(Optional.java:369) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$5(ClassBasedTestDescriptor.java:271) at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:31) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:102) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:101) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$2(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:90) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:57) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55) Caused by: org.xml.sax.SAXParseException; systemId: file:/C:/Users/Name/Desktop/%ec%8a%a4%ed%94%84%eb%a7%81%20%ea%b3%b5%eb%b6%80/core/core/out/production/resources/logback.xml; lineNumber: 1; columnNumber: 6; The processing instruction target matching "[xX][mM][lL]" is not allowed. at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1243) at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635) at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:324) at ch.qos.logback.core.joran.event.SaxEventRecorder.recordEvents(SaxEventRecorder.java:59) ... 89 more 18:12:13,063 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] 18:12:13,063 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/C:/Users/Name/Desktop/%ec%8a%a4%ed%94%84%eb%a7%81%20%ea%b3%b5%eb%b6%80/core/core/out/production/resources/logback.xml] 18:12:13,205 |-ERROR in ch.qos.logback.core.joran.event.SaxEventRecorder@2ddc9a9f - XML_PARSING - Parsing fatal error on line 1 and column 6 18:12:13,205 |-ERROR in ch.qos.logback.core.joran.event.SaxEventRecorder@2ddc9a9f - org.xml.sax.SAXParseException; systemId: file:/C:/Users/Name/Desktop/%ec%8a%a4%ed%94%84%eb%a7%81%20%ea%b3%b5%eb%b6%80/core/core/out/production/resources/logback.xml; lineNumber: 1; columnNumber: 6; The processing instruction target matching "[xX][mM][lL]" is not allowed. 아래는 logback.xml 파일입니다.<?XML version="1.0" encoding="UTF-8"?> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="STDOUT" /> </root> </configuration> 테스트가 패스는 되지만 혹시 추후 문제가 발생할까봐 질문 드립니다.
- 미해결스프링 핵심 원리 - 기본편
이클립스 프로젝트 설정
영한님 강의를 듣게 되며 인텔리제이 환경에서도 실행해보고 이클립스 환경에서도 해보았는데, 저와 같이 초보인 분들은 이클립스 프로젝트 세팅에 있어서 어려운 분들이 계실 수도 있을 것 같아서 블로그에 프로젝트 세팅과 관련하여 간단하게 작성한 내용 공유해봅니다!혹여나 문제가 되는 사항이 있다면 바로 삭제하도록 하겠습니다.좋은 강의 감사합니다.https://hmw0908.tistory.com/74
- 미해결스프링 핵심 원리 - 기본편
빈 조회 방법
bean 조회 기본 방법이빈이름, 빈타입빈타입이렇게 두가지 알려주셨는데요 beanDefinitionName으로 조회하는 Test 코드 예제가 있었는데이것은 빈 이름만으로 조회하는 케이스가 아닌가요?beanDefinitionName을 통한 조회와 그냥 빈의 이름으로 조회하는 것과 차이가 있는것인지 궁금합니다.만약 차이가 없다면 조회 기본 방법에 빈이름만으로 조회도 포함되어야 하는 것이 아닌지 궁금합니다.
- 미해결스프링 핵심 원리 - 기본편
스프링 공부방법
안녕하십니까 백엔드 스프링 공부를 막 시작한 학생입니다. 이번 학기 강의에서 프론트와 백엔드 팀원들과 웹 애플리케이션을 만들려고 합니다. 이에 도움을 받고자 무료강의를 수강하였습니다. 또한 제공해주시는 여러가지 로드맵과 게시판을 활용하여 방향을 잡고 문제를 해결하기도 했습니다. 모든 강의를 수강하고 이해하는데 시간을 투자하는 것이 당연하지만 당연한 부분을 수행하기 위한 동기부여또는 다른 의견을 듣고자 함에 질문글을 남깁니다.저는 준비된 것은 없지만 이번 프로젝트에 큰 기여를 하고 싶습니다. 한 학기 동안 어떤 강의를 집중적으로 들어야 할지, 어떤 강의 순서를 따라야 할지 궁금합니다.자바만 어느정도 알고 있으며 프론트와 백엔드가 연결되는 모습을 알지 못하며 데이터베이스에 대한 지식이 전무하기 때문에 생긴 막연한 질문이라고 생각합니다. 하지만 학생의 한 고민을 너그러이 이해해주시고 조언 남겨주시면 감사드리겠습니다.
- 미해결스프링 핵심 원리 - 기본편
저에게 효율적인 로드맵은 무엇일까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 자바8에 대한 기초를 다 배우고 현재 다른 강의인 자료구조영상과 함께 스프링 핵심원리 기본편 강의를 다 들었습니다.기초적인 지식은 쌓였다고 생각하는데 야생형 로드맵의 순서로는http 부터 mvc 강의를 듣고 db로 넘어가서 다듣고 그뒤 바로 활용1편을 들으라고 하는데 저같은 경우 핵심원리 기본편에 나온 개념들이 "그래서 코드를 작성하거나 설계를 할때 어떤식으로 적용되고 활용되는데?" 라는 궁금증이 계속있습니다. 빨리 보고싶기도 하고 그래서 그러는데야생형의 로드맵을 순서대로 따라가면 기초편에서 배운 핵심원리를 손에 익지도 않은 채로 까먹을거같아서 바로 활용1편인 스프링 부트와 jpa활용을 듣고 http부터 다시 순차적으로 들을까 생각중인데, 강의에서 김영한 선생님이 하신 말을 들어보면 활용1편을 듣기전에 웹 MVC가 기본이고 거기서 데이터처리 방식을 강의를 듣고 나서 활용1편으로 넘어가라고 하시더라구요. 야생형 로드맵을 순차적으로 듣고 활용1편을 들어도 핵심원리 기본편에서 들은 기초 개념들을 안까먹을까요? 아니면 웹 MVC로 넘어가도 핵심원리 기본편에서 하신 내용 그대로 이어지나요??
- 미해결스프링 핵심 원리 - 기본편
클라이언트 관련 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기서 말하는 클라이언트가 서버단의 컨트롤러인지 프론트엔드를 의미하는지 궁금합니다.추가로 만약 컨트롤러단에서 api 요청이 왔을때 멤버와 할인의 혼합정보 api 를 만들게 되면 별도의 서비스를 만들어야하는 건가요?(기존 있는 서비스를 활용하는 비지니스 로직 개발?)
- 미해결스프링 핵심 원리 - 기본편
영상 5:00대에 단위테스트의 대한 질문
영상에서는 @SpringBootTest 보다 단위테스트가 중요하다고 말씀하셨는데.. 실제 프로젝트에서는 그럼 Fake객체를 생각해 볼 수 있다고 생각됩니다.Fake객체를 사용하게 되면 Application Layer처럼 여러 객체들이 맞물려서 동작하는 과정에서 제대로 테스트를 했다고 볼 수 있나? 라는 의문이 드는데.. 영한님은 어떻게 생각하시는지 궁금합니다. AI의 답변 보다는 영한님의 개인적인 의견을 들어보고 싶습니다..!
- 미해결스프링 핵심 원리 - 기본편
TestBean에 @Configuration 어노테이션이 없어도되나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]public class AutowiredTest {@Test void AutowiredOption() {ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class); }static class TestBean {@Autowired(required = false)public void setNoBean1(Member noBean1) {System.out.println("noBean1 = " + noBean1); }@Autowired public void setNoBean2(@Nullable Member noBean2) {System.out.println("noBean2 = " + noBean2); }@Autowired public void setNoBean3(Optional<Member> noBean3) {System.out.println("noBean3 = " + noBean3); }}} 여기서 TestBean에 @Configuration 어노테이션이 없는데, ApplicationContext ac = new AnnotationConfigApplicationContext(TestBean.class);에 구성정보로 TestBean.class를 넘겨줄 수 있는 이유가 뭔가요?
- 미해결스프링 핵심 원리 - 기본편
request scope관련
request scope로 http요청을 받으면 쓰레드 풀로 비동기적으로 실행되는건가요?그리고 LogDemoController의 MyLogger myLogger = myLoggerProvider.getObject();와LogDemoService의 MyLogger myLogger = myLoggerProvider.getObject();가 어떻게 같을 수 있나요? objectProvider가 http요청에 따라 bean을 구분해서 가져올수있는건가요?
- 미해결스프링 핵심 원리 - 기본편
component scan에 관련해서
밑에 코드 중에 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class);이 코드가 이해가 안되서 질문 드립니다. 강사님이 이렇게 코드를 작성하면 자동으로 component scan이 된다고 하셨는데, 밑에 ClientBean과 PrototypeBean은 @Component어노테이션이 없습니다. 따라서 @Autowired도 안되는거 아닌가요?? package hello.core.scope; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import static org.assertj.core.api.Assertions.assertThat; public class SingletonWithPrototypeTest1 { @Test void singletonClientUsePrototype(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); ClientBean clientBean1 = ac.getBean(ClientBean.class); int count1 = clientBean1.logic(); assertThat(count1).isEqualTo(1); ClientBean clientBean2 = ac.getBean(ClientBean.class); int count2 = clientBean2.logic(); assertThat(count2).isEqualTo(2); } @Scope("singleton") static class ClientBean{ private final PrototypeBean prototypeBean; @Autowired public ClientBean(PrototypeBean prototypeBean) { this.prototypeBean = prototypeBean; } public int logic(){ prototypeBean.addCount(); return prototypeBean.getCount(); } } @Scope("prototype") static class PrototypeBean { private int count = 0; public void addCount() { count++; } public int getCount() { return count; } @PostConstruct public void init() { System.out.println("PrototypeBean.init = " + this); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } } }
- 미해결스프링 핵심 원리 - 기본편
싱글턴 빈 객체의 생명 주기
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]싱글턴 빈 객체의 경우 스프링의 생명주기와 함께 하나요? 즉 스프링이 빈을 등록할 때 생성이 되어서 스프링이 종료 될 때 빈도 destroy 되는 것일까요?
- 미해결스프링 핵심 원리 - 기본편
싱글톤의 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]멤버 서비스는 싱글톤을 사용해도 문제가 없다고 생각하는데 멤머 리파지토리(메모리 맴버 리파지토리)도 싱글톤을 사용해도 문제가 없나요?
- 해결됨스프링 핵심 원리 - 기본편
리스트는 출력이 되는데 맵이 출력이 안되요...
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]김영한 강사님의 스프링 핵심 원리 -기본편 을 수강중입니다. 리스트와 맵으로 받아오는 부분을 듣고 있는데 리스트는 정상 출력 되지만, 맵이 정상 출력이 되지 않습니다. 또한 @Autowired가 빨간줄이 뜨며 에러표시가 됨니다... 에러 메시지는 autowired members must be defined in valid spring bean 이렇습니다.
- 해결됨스프링 핵심 원리 - 기본편
에러의 이유를 모르겠어요 (UnsatisfiedDependencyException)
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]안녕하세요. 컴포넌트 스캔쪽 강의를 따라가는데 에러메시지가 나와서 원인을 찾아보려해도 도저히 보이지가 않아 질문드립니다. ㅠㅠ 에러 메시지.Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [/Users/jhj/Desktop/study/spring_standard_kyh/core/out/production/classes/hello/core/order/OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is 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: {}구글링 해본 결과, OrderServiceImpl의 생성자 주입 과정에서 첫번째 파라미터에 문제가 있는것 같습니다만, 아무리 찾아봐도 원인을 모르겠습니다....@Component public class OrderServiceImpl implements OrderService{ // private final MemberRepository memberRepository = new MemoryMemberRepository(); // private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); // private final DiscountPolicy discountPolicy = new RateDiscountPolicy(); // private DiscountPolicy discountPolicy; // 인테페이스에만 의존 하지만 널포인트 예외가 발생. // 해결하려면 누군가 객체를 생성해서 주입해주면 될것 같다? private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired 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); } //테스트 용도 public MemberRepository getMemberRepository() { return memberRepository; } } //----------------------------- @Component public class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; //생성자에 @Autowired를 사용하면, 스프링이 자동으로 생성자 주입 해줌. // ac.getBean(MemberRepository.class)를 한것과 같은 효과. @Autowired 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); } //테스트 용도 public MemberRepository getMemberRepository() { return memberRepository; } }
- 미해결스프링 핵심 원리 - 기본편
단축키 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]스프링 빈 조회 - 동일한 타입이 둘 이상 강의 7분 40초대에서 ac.getBeanOfType을 입력하시고 특정단축키를 입력하니 앞에 맵으로 선언되는 문장이 완성되던데 해당 단축키가 궁금합니다(윈도우)