묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
ConfigurationSingletonTest 에러가 납니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 실행후 에러가 나는데 혹시 원인이 어떤걸까요...?? 전체 코드와 에러 첨부합니다...ㅠㅠpackage hello.core.singleton;import hello.core.AppConfig;import hello.core.member.MemberRepository;import hello.core.member.MemberServiceImpl;import hello.core.order.OrderServiceImpl;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import static org.assertj.core.api.Assertions.assertThat;public 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); MemberRepository memberRepository1 = memberService.getMemberRepository(); MemberRepository memberRepository2 = orderService.getMemberRepository(); System.out.println("memberService -> memberRepository1 = " + memberRepository1); System.out.println("orderService -> memberRepository2 = " + memberRepository2); System.out.println("memberRepository = " + memberRepository); assertThat(memberService.getMemberRepository()).isSameAs(memberRepository); assertThat(orderService.getMemberRepository()).isSameAs(memberRepository); }@Test void configurationDeep(){ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); AppConfig bean = ac.getBean(AppConfig.class); System.out.println("bean = " + bean.getClass()); }} "C:\Program Files\Java\jdk-11\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.4\lib\idea_rt.jar=60814:C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\Lets Go Rust\.m2\repository\org\junit\platform\junit-platform-launcher\1.8.2\junit-platform-launcher-1.8.2.jar;C:\Users\Lets Go Rust\.m2\repository\org\junit\platform\junit-platform-engine\1.8.2\junit-platform-engine-1.8.2.jar;C:\Users\Lets Go Rust\.m2\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;C:\Users\Lets Go Rust\.m2\repository\org\junit\platform\junit-platform-commons\1.8.2\junit-platform-commons-1.8.2.jar;C:\Users\Lets Go Rust\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.4\lib\idea_rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.4\plugins\junit\lib\junit5-rt.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2023.1.4\plugins\junit\lib\junit-rt.jar;C:\core (1)\core\out\test\classes;C:\core (1)\core\out\production\classes;C:\core (1)\core\out\production\resources;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-test\2.7.13\c937a5716d02d8dcd64f742d12607993873e7a5a\spring-boot-starter-test-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter\2.7.13\5617ca04b06778877fb80d146dd2d0dd6adb23a8\spring-boot-starter-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-test-autoconfigure\2.7.13\1de71639f25f4948cbe50904a1118e060c91f6a5\spring-boot-test-autoconfigure-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-test\2.7.13\be93829dcb79b788678654deefbb675045a60fb0\spring-boot-test-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-test\5.3.28\3a6ce360d853c9083f82196e0a4ced4ab2fe5c6b\spring-test-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-core\5.3.28\5b7ec246fef72fdfbb0b4123956715ca89cc6ddf\spring-core-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\com.jayway.jsonpath\json-path\2.7.0\f9d7d9659f2694e61142046ff8a216c047f263e8\json-path-2.7.0.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\jakarta.xml.bind\jakarta.xml.bind-api\2.3.3\48e3b9cfc10752fba3521d6511f4165bea951801\jakarta.xml.bind-api-2.3.3.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.assertj\assertj-core\3.22.0\c300c0c6a24559f35fa0bd3a5472dc1edcd0111e\assertj-core-3.22.0.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.hamcrest\hamcrest\2.2\1820c0968dba3a11a1b30669bb1f01978a91dedc\hamcrest-2.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.jupiter\junit-jupiter\5.8.2\5a817b1e63f1217e5c586090c45e681281f097ad\junit-jupiter-5.8.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.mockito\mockito-junit-jupiter\4.5.1\f81fb60bd69b3a6e5537ae23b883326f01632a61\mockito-junit-jupiter-4.5.1.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.mockito\mockito-core\4.5.1\ed456e623e5afc6f4cee3ae58144e5c45f3b3bf\mockito-core-4.5.1.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.skyscreamer\jsonassert\1.5.1\6d842d0faf4cf6725c509a5e5347d319ee0431c3\jsonassert-1.5.1.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.xmlunit\xmlunit-core\2.9.1\e5833662d9a1279a37da3ef6f62a1da29fcd68c4\xmlunit-core-2.9.1.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-autoconfigure\2.7.13\1b6b9605b1b116e32c372f3b9e15abf7bb17038c\spring-boot-autoconfigure-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot\2.7.13\d009fa51c7792c9e510da7e69329baf39591707d\spring-boot-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-starter-logging\2.7.13\8a5e9bd6fa8341193a977d408b9a44faaa684c8d\spring-boot-starter-logging-2.7.13.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\jakarta.annotation\jakarta.annotation-api\1.3.5\59eb84ee0d616332ff44aba065f3888cf002cd2d\jakarta.annotation-api-1.3.5.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.yaml\snakeyaml\1.30\8fde7fe2586328ac3c68db92045e1c8759125000\snakeyaml-1.30.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-jcl\5.3.28\d67e8b213aa08a0f3d71e547fb4345372d819d36\spring-jcl-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\net.minidev\json-smart\2.4.11\cc5888f14a5768f254b97bafe8b9fd29b31e872e\json-smart-2.4.11.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\1.7.36\6c62681a2f655b49963a5983b8b0950a6120ae14\slf4j-api-1.7.36.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\jakarta.activation\jakarta.activation-api\1.2.2\99f53adba383cb1bf7c3862844488574b559621f\jakarta.activation-api-1.2.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.jupiter\junit-jupiter-params\5.8.2\ddeafe92fc263f895bfb73ffeca7fd56e23c2cce\junit-jupiter-params-5.8.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.jupiter\junit-jupiter-api\5.8.2\4c21029217adf07e4c0d0c5e192b6bf610c94bdc\junit-jupiter-api-5.8.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy\1.12.23\d470526e8c4566c04e9ae5d3ccb62d1a7aa58986\byte-buddy-1.12.23.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.12.23\1cba11fdb72c383edacb909f79ae6870efd275e4\byte-buddy-agent-1.12.23.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\com.vaadin.external.google\android-json\0.0.20131108.vaadin1\fa26d351fe62a6a17f5cda1287c1c6110dec413f\android-json-0.0.20131108.vaadin1.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-context\5.3.28\edf8ebfd637e3e10ec7fed697eb69f2a5229748a\spring-context-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-classic\1.2.12\d4dee19148dccb177a0736eb2027bd195341da78\logback-classic-1.2.12.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-to-slf4j\2.17.2\17dd0fae2747d9a28c67bc9534108823d2376b46\log4j-to-slf4j-2.17.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.slf4j\jul-to-slf4j\1.7.36\ed46d81cef9c412a88caef405b58f93a678ff2ca\jul-to-slf4j-1.7.36.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\net.minidev\accessors-smart\2.4.11\245ceca7bdf3190fbb977045c852d5f3c8efece1\accessors-smart-2.4.11.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.apiguardian\apiguardian-api\1.1.2\a231e0d844d2721b0fa1b238006d15c6ded6842a\apiguardian-api-1.1.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.platform\junit-platform-commons\1.8.2\32c8b8617c1342376fd5af2053da6410d8866861\junit-platform-commons-1.8.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.opentest4j\opentest4j\1.2.0\28c11eb91f9b6d8e200631d46e20a7f407f2a046\opentest4j-1.2.0.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-aop\5.3.28\aada0ea72a3efee5f02f264f90329f7eddedf321\spring-aop-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-beans\5.3.28\4d232acbb7031963688cf28b1b34134937892c4f\spring-beans-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.springframework\spring-expression\5.3.28\d049216b1a73b939b36bbf5cc7ce734cace7b245\spring-expression-5.3.28.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-core\1.2.12\1d8e51a698b138065d73baefb4f94531faa323cb\logback-core-1.2.12.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.apache.logging.log4j\log4j-api\2.17.2\f42d6afa111b4dec5d2aea0fe2197240749a4ea6\log4j-api-2.17.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.ow2.asm\asm\9.3\8e6300ef51c1d801a7ed62d07cd221aca3a90640\asm-9.3.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.jupiter\junit-jupiter-engine\5.8.2\c598b4328d2f397194d11df3b1648d68d7d990e3\junit-jupiter-engine-5.8.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.objenesis\objenesis\3.2\7fadf57620c8b8abdf7519533e5527367cb51f09\objenesis-3.2.jar;C:\Users\Lets Go Rust\.gradle\caches\modules-2\files-2.1\org.junit.platform\junit-platform-engine\1.8.2\b737de09f19864bd136805c84df7999a142fec29\junit-platform-engine-1.8.2.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 hello.core.singleton.ConfigurationSingletonTest,configurationTest14:44:00.952 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@5d7148e214:44:00.986 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'14:44:01.350 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor'14:44:01.356 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'14:44:01.358 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor'14:44:01.371 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalCommonAnnotationProcessor'14:44:01.405 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'appConfig'14:44:01.447 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'memberService'call AppConfig.memberService14:44:01.512 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'memberRepository'call AppConfig.memberRepository14:44:01.514 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'orderService'call AppConfig.orderService14:44:01.517 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'discountPolicy'memberService -> memberRepository1 = hello.core.member.MemoryMemberRepository@74a6a609orderService -> memberRepository2 = hello.core.member.MemoryMemberRepository@5a411614memberRepository = hello.core.member.MemoryMemberRepository@5a411614java.lang.AssertionError: Expecting actual: hello.core.member.MemoryMemberRepository@5a411614and actual: hello.core.member.MemoryMemberRepository@74a6a609to refer to the same object at hello.core.singleton.ConfigurationSingletonTest.configurationTest(ConfigurationSingletonTest.java:32) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) 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:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) 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 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)Process finished with exit code -1
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
유튜브에서 제공되는 것 이후의 나머지 강의에 대한 소스코드는 어디서 받을 수 있나요?
9시간 분량 이후의 결제 후 강의 분량에 대한 소스코드는 어디서 받을 수 있나요?그리고 현재 클래스 강의까지 거의 수강 다해가는 중인데강의 제목이 기본편이라 이후에 심화편은 언제 나오는지 궁금합니다
-
미해결스프링 핵심 원리 - 기본편
AutoAppConfig 필요성
@ComponentScan 으로 bean을 찾아서 등록하는 과정에 대해서는 이해를 했습니다.근데 AppConfig, AutoAppConfig가 모두 없는 상태에서도 bean이 자동 등록되는건 @SpringBootApplication 어노테이션을 사용하는 class가 존재하기 때문이라고 봐도 되는건가요?(@ComponentScan을 포함하므로) 위 예제에서 AutoAppConfig를 보여주신 예는 컴포넌트 스캔의 예를 보여주신거고 실제 구현에서 자동 스캔을 위해 AutoAppConfig를 따로 두지는 않아도 되는걸까요?
-
미해결자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 1(기초편)
강의노트 어디서 볼 수 있을까요?
강의 하단에도 없고다운받을 수 있는 첨부파일도 존재하지 않으며노트 탭에선 제 노트만 계속 뜨네요첨부파일이 삭제가 되신거 같은데이런경우 어떻게 해야 하나요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
형변환과 업캐스팅/다운캐스팅
정수형에서 실수형으로// int > long > float > double (정밀한 데이터 = 자동 형변환)실수형에서 정수형으로// double > float > long > int (큰 -> 작은 = 수동 형변환) 데이터 단위 형변환은 업캐스팅/다운캐스팅과 관련이 없는 개념인거죠? 뒤에까지 듣고 앞을 다시 듣다보니 int는 작은녀석이고, double은 큰범위의 녀석이니 형변환이 필요한거 아닌가? (반대는 큰녀석을 작은녀석으로 형변환 하니 자동으로 된다)하고 의문이 들어서요 업캐스팅/다운캐스팅은 클래스, 메소드가 있는 상황에서 발생하는거죠?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
쓰레드 질문입니다!
안녕하세요? Thread 질문하려 합니다.직원 청소 시작 (Thread) 메소드는 CleanThread에서 사용하여(즉 Thread 클래스 상속) 작성하였는데사장 청소 시작은 Thread 클래스에서 상속 받지 않고 바로 Thread 클래스에서 메소드를 작성한 이유를 알고 싶습니다!
-
미해결스프링 핵심 원리 - 기본편
SingletonWithPrototypeTest1에서의 @RequiredArgsConstructor 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하십니까? 김영한 선생님의 강의를 학습을 하고 있는 학생입니다. 제가 학습을 잘못하여 생긴 오류인지 현재의 저의 상태에서는 이 궁금증을 풀 수가 없고 chatgpt 또한 답변을 해주지 않아서 오히려 더 궁금해졌습니다.싱글톤에서의 프로토타입 빈 사용에서의 테스트코드를 작성하다 문득 롬복을 사용하면 컴파일 시점에서 생성자가 생성이 되고 생성자가 1개이기 때문에 명시하지 않아도 스프링에 의해 @Autowired가 붙어 진행되는걸로 이 전 롬북 영상에서 그렇게 이해를 하였습니다. 그래서 아 롬복도 한번 써봐야지를 하고 진행을 했는데? 아니나 다를까 제 생각과는 많이 다르더군요. 그래서 제 학습이 지금 뭔가 잘못된거 같기도 한데 잘 모르겠습니다.1번째인 아래의 코드는 작동을 하고 2번째 코드에서는 variable prototypeBean not initialized in the default constructor 왜 이러한 에러가 나는지 궁금합니다.첫번째 코드두번째 코드감사합니다.
-
해결됨자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
isAdult() 함수를 custom getter를 활용한 프로퍼티 변환
안녕하세요. 강의 정말 잘 듣고 있습니다!isAdult() 함수를 custom getter를 활용한 프로퍼티 변환에 대한 부분인데요..fun isAdult(): Boolean { return age >= 20 } fun isAdult2() = age >= 20 val isAdult5 get() = this.age >= 20 var isAdult6 get() = this.age >= 20 set(value) {} var isAdult7 = false get() = this.age >= 20isAdult() 함수를 변환하는 여러가지 방법들을 시도해 보았는데요. 다 동일한 결과를 얻더라구요.isAdult2() 는 return 하는게 단일값 이면 block 을 없애고 반환 타입도 생략한 방법이고isAdult5는 수업시간에 보여주신 custom getter를 활용한 방법입니다. Q1. isAdult를 val 이 아닌 var로 바꿔봤고 아래 코드처럼 써보니 빨간줄이 뜨더라구요.var isAdult8 get() = this.age >= 20val은 getter만 있어야 되지만, var은 setter도 있어야 하는건가 싶어서 isAdult6처럼 custom setter도 명시를 하니까 빨간줄이 사라지더라구요.그래서.. 'var로 프로퍼티를 선언했고, custom getter를 명시했다면, custom setter를 반드시 명시해줘야 하는건가?' 라고 이해하려 했는데, isAdult7의 경우 따로 custom setter를 명시해주지 않아도 빨간줄이 뜨지 않더라구요.어떤 방식으로 이해해야 할지 감이 안오네요.요약: isAdult8는 왜 안되고 isAdult6과 isAdult7은 왜 되는건가요?Q2.val person2 = Person("KIM", 10) println(person2.isAdult5) // false person2.age = 20 println(person2.isAdult5) // true 제가 지금까지 이해하기로는 val은 자바에서 final 같은거라 한번 값이 초기화되면 값을 변경 못해야 될것 같은데,, isAdult5 처럼 val로 선언했을때 isAdult5가 false를 한번 가리키게 되면 계속 false만 가리키고 있어야할것 같은데, Person의 age 값을 10에서 20으로 변경하면 val로 선언한 isAdult5이 true로 변경이 되네요. 물론 성인 여부를 확인해야 되는 기능상 age가 바뀌면 그에 따라 결과도 바뀌는것이 당연히 자연스러운것이긴 한데, 문법적으로 val 프로퍼티의 값이 어떻게 변경될 수 있는지 의아합니다.요약: val 프로퍼티 인데도 왜 값이 변경될 수 있나요? final 개념으로 이해하면 안되는 건가요감사합니다.
-
미해결스프링 핵심 원리 - 기본편
bean 등록 범위
@Beanpublic MemberService memberService(){return new MemberServiceImpl();} 위 코드에서 스프링 컨테이너는 memberService라는 빈 이름과 return 되는 구현 객체 MemberServiceImpl에 대해 매핑 테이블을 두는 것으로 이해했는데요,그럼 bean으로 등록되는 class는 MemberServiceImpl 뿐인건가요?MemberService는 Type이기 때문에 또 자동 등록되는건가요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
질문있습니다
convertUSD(converter, 2);강의 내용 중 위의 코드가다시 아래의 코드로 변하던데, 이부분이 이해가 되지 않습니다. convertUSD(public void convert(int USD) { System.out.println(USD + " 달러 = " + (USD * 1400) + " 원"); }, 2);converter은 객체이고, 아래의 코드는 함수인데 왜 이꼴이 되는걸까요?
-
미해결스프링 핵심 원리 - 기본편
memberService.getMemberRepository(); 오류가 나요 도와주세
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.여긴 memberServiceImpl.classpackage hello.core.member;public 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); }//test public MemberRepository getMemberRepository() {return memberRepository; }}요긴 ConfigurationSingletonTest.classpackage hello.coresingleton;import hello.core.AppConfig;import hello.core.member.MemberRepository;import hello.core.member.MemberService;import hello.core.member.MemberServiceImpl;import hello.core.order.OrderServiceImpl;import org.junit.jupiter.api.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import static org.assertj.core.api.Assertions.assertThat;public class ConfigurationSingletonTest {@Test void configurationTest() {ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class); OrderServiceImpl orderService = ac.getBean("orderService", OrderServiceImpl.class); MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class); MemberRepository memberRepository1 = memberService.getMemberRepository(); //여기 MemberRepository memberRepository2 = orderService.getMemberRepository(); System.out.println("memberService -> memberRepository = " + memberRepository1); System.out.println("memberService -> memberRepository = " + memberRepository2); System.out.println("memberRepository = " + memberRepository); assertThat(MemberService.getMemberService()).isSameAs(memberRepository); //여기 assertThat(orderService.getMemberRepository()).isSameAs(memberRepository); }}오류내용Cannot resolve method 'getMemberRepository' in 'MemberService'Cannot resolve method 'getMemberService' in 'MemberService' 그대로 적었는데 왜 그런지 모르겠어요
-
미해결스프링 핵심 원리 - 기본편
순환참조 재질문 드립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]https://www.inflearn.com/questions/964547첫번째 방법은 이해했는데두번째 방법 조금 더 상세한 설명 부탁드리겠습니다Member 엔티티에 쿠폰발급 서비스 로직을 추가 하라는 말씀이실까요 ?
-
미해결스프링 핵심 원리 - 기본편
"역할과 구현의 분리" 이 한마디에 OOP 설계의 우주가 열린 기분이네요.
겨우 섹션1만 봤을 뿐인데 뭔가 설계에 있어서 북극성을 본 느낌. 왜 코드 몇줄보다 철학을 먼저 다루었는지 알것같다.controller,클래스 등(사용자) - 서비스 (자동차회사) - 인터페이스 들(자동차표준협회) - 구현체(자동차 부품업체 들)인터페이스1 (악셀,브레이크, 변속기, 오디오 등) - 업체 A -> 업체 B인터페이스 2( 자율주행, 카엔터테인먼트) - ...인터페이스 3(썬파노라마, 자동잠금장치 등등 ) - ...단일상속, 다중상속 서비스(자동차회사)
-
해결됨자바 기초부터 마스터하기 with 은종쌤 (Do it 자바 프로그래밍 입문) - Part 2(마스터편)
iterator 관련 질문입니다.
안녕하세요.iterator관련 해서 간단하게 질문 드립니다.hasNext() 와 next() 함수 모두 다음에 있는 요소에 관한 함수지 않습니까?코드를 작성하다가 문득 든 생각인데 이터레이터가 위치한 인덱스의 다음 인덱스를 뜻한다면 첫번째 원소는 어떻게 다룰 수 있는걸까?라는 의문이 들어서 질문글을 작성하게 되었습니다.1)여기서 다음의 뜻이 이터레이터가 위치한 인덱스를 말하는것인가요?아니면 이터레이터가 위치한 인덱스의 다음 인덱스를 말하는것인가요? 물론 전자여야 모든 뜻이 말이 되고 이해가 가기 때문에 전자겠지만자바 사이트에서 함수 정의를 보면 next라고 적혀 있어서 혹시나 해서 질문드립니다.전자가 맞다면 왜 하필 햇갈리게 next라고 했을까요? 2)그리고 hasNext가 이후에 요소가 있는지를 체크하는 함수라면 이터레이터가 arrayList의 마지막 인덱스에 위치할땐 false값을 리턴해서 마지막번째 원소를 다룰 수 없게 되지 않나요?혹시 arrayList도 마지막 원소에 c의 문자열 처럼 마지막에 null값이 항상 있기 때문에 마지막 원소까지 hasNext함수가 다룰 수 있는건지 궁금합니다. 다음이라는 단어 때문에 간단하던것들이 갑자기 모두 햇갈리네요.
-
해결됨스프링 핵심 원리 - 기본편
순환참조 질문드립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]예)회원서비스 (MemberService)쿠폰 서비스 (CouponService)(회원가입 시)회원 서비스에서 쿠폰 서비스를 주입받아 사용(이벤트 추가)쿠폰 서비스에서 특정 회원에게 쿠폰 발급을 위해 회원서비스 주입받아 사용회원서비스 <-> 쿠폰 서비스이런 로직이 있을 시 순환 참조 오류가 나는데어떤 방법이 가장 효율 적인지 질문드립니다.
-
미해결스프링 핵심 원리 - 기본편
주문과 할인 도메인 실행과 테스트 강의중 궁금한점이 생겨 질문드립니다.
public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository = new MemoryMemberRepository(); private final DiscountPolicy discountPolicy = new FixDiscountPolicy();public class OrderApp { public static void main(String[] args) { MemberService memberService = new MemberServiceImpl(); OrderService orderService = new OrderServiceImpl();public class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); 현재 주문 관련 다이어그램에서 주문을 하고 할인을 적용하기 위해서 회원을 조회해야 하니회원저장소(인터페이스)에서 회원을 조회하게 되어 있습니다. 그래서 위의 코드 OrderServiceImpl을 보면 MemberRepository를 의존하여 구현체를 작성하였습니다. 하지만 여기서, 회원 저장소가 아닌 회원서비스(MemberSerivce인터페이스)를 의존한다면 이것은 좋지 못한 설계인지 궁금하여 질문드립니다. 혹은 같은 서비스 계층끼리의 의존은 좋지 못한 설계라면 제 생각이 잘못되었다고 생각합니다. [이 질문을 하게 된 이유는 MeberSerivceImpl은 MemberRepository를 의존하는데 그렇게 된다면 서비스 계층의 인터페이스를 사용하여 이 서비스계층을 통하여 리포지토리 계층까지의 기능을 모두 쓸 수 있다는 점에서 장점이 있지 않을까생각하였습니다. MemberServiceImpl 클래스에서 MemberRepository를 의존하며 그의 구현체를 얼마든지 바꿀수 있기 때문에 상관없지 않을까라고 생각하였습니다.]감사합니다.
-
미해결스프링 핵심 원리 - 기본편
MemoryMemberRepository는 무상태인가요?
1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]스프링 빈은 항상 무상태로 설계해야 한다고 하셨는데,MemoryMemberRepository 는 store 필드에 Member객체와 id가 저장되지 않나요?이는 무상태 설계가 아닌 것 같은데 아무 문제가 없나요?
-
미해결스프링 핵심 원리 - 기본편
롬복 동기화 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.롬복 코드 복붙 후에 동기화 시켜도 계속 실패가 뜨고 실패 로그는 안뜨는데 어떤 문제 인걸까요? 플러그인에 롬복은 있습니다 외부 라이브러리에는 없어요
-
미해결스프링 핵심 원리 - 기본편
강의 자료 오타 수정
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]빈 스코프 pdf에서클라이언트가 myLogger.logic()을 호출하면 이라고 나와있는데 myLogger에는 logic() 메서드가 존재하지 않습니다.
-
미해결스프링 핵심 원리 - 기본편
생성자 필수정보
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의에서 "생성자는 필수 정보(파라미터)를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가진다."라는 내용이 있는데 여기서 필수 정보에 예제의 url은 들어가지 않는 것으로 알고 있습니다. 그럼 필수 정보의 예로는 뭐가 있을까요?? final이 붙은 필드들도 필수정보로 봐도 괜찮을까요??