묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 기본편
ObjectProvider와 new 객체 생성의 차이
해당 강의에서 ObjectProvider를 사용하여 DL 방식으로 컨테이너에서 PrototypeBean 객체를 찾고 PrototypeBean은 prototype 스코프이므로 새로운 객체를 생성하고 반환해준다고 이해했습니다.새로운 객체를 생성하여 반환하는 것이라면 굳이 ObjectProvider를 사용하지 않고 new 객체를 생성하여 사용해도 되지 않을까요? 이 부분이 궁금해서 질문드립니다.제 생각에는 ObjectProvider를 사용하면 만약 prototype 스코프의 객체가 다른 객체를 자동으로 주입받아야 할 때 new 객체는 사용자가 의존관계를 주입해주어야 하므로 문제가 생깁니다. 따라서 스프링의 DI 기능을 사용하기 위해 사용하는 것 같다고 생각됩니다.<ObjectProvider 사용> @Scope("singleton") static class ClientBean { @Autowired private ObjectProvider<PrototypeBean> prototypeBeanProvider; public int logic() { PrototypeBean prototypeBean = prototypeBeanProvider.getObject(); prototypeBean.addCount(); return prototypeBean.getCount(); } }<new 객체 사용> @Scope("singleton") static class ClientBean { public int logic() { PrototypeBean prototypeBean = new PrototypeBean(); prototypeBean.addCount(); return prototypeBean.getCount(); } }
-
미해결스프링 핵심 원리 - 기본편
@PostConstruct 호출시점 질문드립니다 :)
[질문 내용]request 객체는 스프링 컨테이너에 요청하는 시점에 생성되므로, 클라이언트가 브라우저에 url을 입력하고 전송하는 시점을 의미하는 것으로 이해하고 있습니다. 예제의 실행 결과를 보면 @PostConstruct가 호출된 결과보다 컨트롤러 메서드의 myLogger.getClass()를 호출한 결과가 먼저 출력되는 것을 확인할 수 있습니다. 컨트롤러 메서드가 실행되자마자 request객체가 생성되기 때문에 즉시 @PostConstruct가 호출되고 나머지 컨트롤러의 문장들이 실행되어야 할 것 같은데 실제로는 그런 결과가 나오지 않아서 이유가 궁금해 질문 남깁니다.
-
해결됨스프링 핵심 원리 - 기본편
안녕하세요 지금까지 배웠던 내용을 정리하고 있는데 맞게 정리를 한건지 궁금해서 질문을 합니다.
[질문 내용]스프링 컨테이너에 스프링 빈을 등록 할때 등록이 되는 빈들은 스프링 컨테이너가 관리해줬으면 하는 객체들을 저장하는 거다. 그리고 스프링 컨테이너에 스프링 빈을 등록하는 가장 큰 이유는 의존관계 주입을 스프링 컨테이너에 맡겨서 좋은 객체지향 약속들을(OCP, DIP) 지키기 위해서다.스프링 빈이 등록 될때 키 : 값 => 빈 이름 : 빈 객체로 저장이 된다. 스프링 빈에 등록을 할때는 @Configuration과 @Bean을 이용해서 수동으로 등록을 할 수 있고 @ComponetScan을 사용해서 @Componet, @Service, @Controller, @Repository가 붙은 클래스들을 자동으로 등록을 할 수가 있다.수동으로 등록을 할때에는 빈 이름은 메소드 이름이 빈 객체는 해당 메소드가 반환하는 객체가 자동으로 등록을 할때에는 빈 이름은 클래스 이름이(클래스 이름 맨 앞에는 소문자) 빈 객체는 해당 클래스의 객체가 저장이 된다.수동으로 등록 할때 주의 할 점은 @Bean만 쓰면 스프링 빈으로 등록이 되지만 싱글톤으로 관리 되지는 않는다 싱글톤으로 관리 되기 위해서는 @Configuration과 @Bean을 같이 써야 한다.감사합니다.
-
미해결스프링 핵심 원리 - 기본편
주문과 할인 도메인 실행과 테스트 강의에서 OrderServiceImpl.java
package hello.core.order; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.member.Member; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; import org.springframework.core.annotation.Order; public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository = new MemoryMemberRepository(); private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); @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); } }주문과 할인 도메인 실행과 테스트 강의에서 OrderServiceImpl.java 입니다java: org.springframework.core.annotation.Order is abstract; cannot be instantiated이런 오류가 뜨는데 어떻게해야할까요?
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
안녕하세요 강사님 질문이 있습니다,.
1강에서 객체 인스턴스화하여 사용할 때 가변변수로 선언을 하셨는데 불변변수로 사용안하신 이유가 따로 있을까요!?
-
미해결스프링 핵심 원리 - 기본편
AutoAppConfig 실행오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]AutoAppConfig의 basicScan 테스트 코드를 실행했더니 다음 오류가 뜹니다.구글링해도 딱히 제 상황과 맞는 답을 찾을 수가 없어 질문합니다. 다음은 로그를 복사붙여넣기 했습니다./Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home/bin/java -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=56873:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/kdj/.m2/repository/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2.jar:/Users/kdj/.m2/repository/org/junit/platform/junit-platform-engine/1.8.2/junit-platform-engine-1.8.2.jar:/Users/kdj/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar:/Users/kdj/.m2/repository/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2.jar:/Users/kdj/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/junit/lib/junit5-rt.jar:/Applications/IntelliJ IDEA.app/Contents/plugins/junit/lib/junit-rt.jar:/Volumes/T7 Shield/P/core/out/test/classes:/Volumes/T7 Shield/P/core/out/production/classes:/Volumes/T7 Shield/P/core/out/production/resources:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-test/2.7.15/b9bf93cbd1c5d5d09dd798fca143e55cb0662777/spring-boot-starter-test-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter/2.7.15/6ea75176edb5ba47addd6143b3e0fec25811be1d/spring-boot-starter-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test-autoconfigure/2.7.15/f59ccd8f7db4c88bee112e59875a40767456664e/spring-boot-test-autoconfigure-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test/2.7.15/5a8442fcfc1750958460c55b255223434600aaf6/spring-boot-test-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-test/5.3.29/dc55cc20f39ba89b46d59aa948c818c642da1848/spring-test-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/5.3.29/528eafe4cef7bccf3df290dd99ac5833a9756183/spring-core-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/com.jayway.jsonpath/json-path/2.7.0/f9d7d9659f2694e61142046ff8a216c047f263e8/json-path-2.7.0.jar:/Users/kdj/.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:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.assertj/assertj-core/3.22.0/c300c0c6a24559f35fa0bd3a5472dc1edcd0111e/assertj-core-3.22.0.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest/2.2/1820c0968dba3a11a1b30669bb1f01978a91dedc/hamcrest-2.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter/5.8.2/5a817b1e63f1217e5c586090c45e681281f097ad/junit-jupiter-5.8.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-junit-jupiter/4.5.1/f81fb60bd69b3a6e5537ae23b883326f01632a61/mockito-junit-jupiter-4.5.1.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.mockito/mockito-core/4.5.1/ed456e623e5afc6f4cee3ae58144e5c45f3b3bf/mockito-core-4.5.1.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.skyscreamer/jsonassert/1.5.1/6d842d0faf4cf6725c509a5e5347d319ee0431c3/jsonassert-1.5.1.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.xmlunit/xmlunit-core/2.9.1/e5833662d9a1279a37da3ef6f62a1da29fcd68c4/xmlunit-core-2.9.1.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-autoconfigure/2.7.15/ca07c5ec0347342e207de3d26c0b686d43be60d5/spring-boot-autoconfigure-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot/2.7.15/4e09424cc410ca255bbea2657a8da0b54b381b2a/spring-boot-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-logging/2.7.15/1f4bece73c6e002fd0c113de552a746ab603b9be/spring-boot-starter-logging-2.7.15.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/jakarta.annotation/jakarta.annotation-api/1.3.5/59eb84ee0d616332ff44aba065f3888cf002cd2d/jakarta.annotation-api-1.3.5.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/1.30/8fde7fe2586328ac3c68db92045e1c8759125000/snakeyaml-1.30.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-jcl/5.3.29/4f84fbeec60adb1a50734b6077836e53844f0134/spring-jcl-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/net.minidev/json-smart/2.4.11/cc5888f14a5768f254b97bafe8b9fd29b31e872e/json-smart-2.4.11.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.7.36/6c62681a2f655b49963a5983b8b0950a6120ae14/slf4j-api-1.7.36.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/jakarta.activation/jakarta.activation-api/1.2.2/99f53adba383cb1bf7c3862844488574b559621f/jakarta.activation-api-1.2.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-params/5.8.2/ddeafe92fc263f895bfb73ffeca7fd56e23c2cce/junit-jupiter-params-5.8.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/5.8.2/4c21029217adf07e4c0d0c5e192b6bf610c94bdc/junit-jupiter-api-5.8.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy/1.12.23/d470526e8c4566c04e9ae5d3ccb62d1a7aa58986/byte-buddy-1.12.23.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy-agent/1.12.23/1cba11fdb72c383edacb909f79ae6870efd275e4/byte-buddy-agent-1.12.23.jar:/Users/kdj/.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:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/5.3.29/c374a72716d19220ca142efaab910adf5717c5d0/spring-context-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.12/d4dee19148dccb177a0736eb2027bd195341da78/logback-classic-1.2.12.jar:/Users/kdj/.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:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.slf4j/jul-to-slf4j/1.7.36/ed46d81cef9c412a88caef405b58f93a678ff2ca/jul-to-slf4j-1.7.36.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/net.minidev/accessors-smart/2.4.11/245ceca7bdf3190fbb977045c852d5f3c8efece1/accessors-smart-2.4.11.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.apiguardian/apiguardian-api/1.1.2/a231e0d844d2721b0fa1b238006d15c6ded6842a/apiguardian-api-1.1.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-commons/1.8.2/32c8b8617c1342376fd5af2053da6410d8866861/junit-platform-commons-1.8.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.opentest4j/opentest4j/1.2.0/28c11eb91f9b6d8e200631d46e20a7f407f2a046/opentest4j-1.2.0.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aop/5.3.29/397c588ce63ba4c185a8c1bd2f1e9139075b3bf1/spring-aop-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/5.3.29/be40f557f3fa52c703f00e127ff639f8cf499617/spring-beans-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.springframework/spring-expression/5.3.29/44ac795a057c4a6360063801c54a2d148e5a2808/spring-expression-5.3.29.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.2.12/1d8e51a698b138065d73baefb4f94531faa323cb/logback-core-1.2.12.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.2/f42d6afa111b4dec5d2aea0fe2197240749a4ea6/log4j-api-2.17.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.3/8e6300ef51c1d801a7ed62d07cd221aca3a90640/asm-9.3.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-engine/5.8.2/c598b4328d2f397194d11df3b1648d68d7d990e3/junit-jupiter-engine-5.8.2.jar:/Users/kdj/.gradle/caches/modules-2/files-2.1/org.objenesis/objenesis/3.2/7fadf57620c8b8abdf7519533e5527367cb51f09/objenesis-3.2.jar:/Users/kdj/.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.scan.AutoAppConfigTest,basicScan06:23:36.656 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@618425b506:23:36.669 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor'06:23:36.736 [main] WARN org.springframework.context.annotation.AnnotationConfigApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [/Volumes/T7 Shield/P/core/out/test/classes/hello/core/beanfind/ApplicationContextSameBeanFindTest$SameBeanConfig.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [/Volumes/T7 Shield/P/core/out/test/classes/hello/core/beanfind/ApplicationContextSameBeanFindTest$SameBeanConfig.class]; nested exception is java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:457) at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:316) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276) at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128) at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:295) at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:249) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:206) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:174) at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:748) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) at org.springframework.context.annotation.AnnotationConfigApplicationContext.<init>(AnnotationConfigApplicationContext.java:93) at hello.core.scan.AutoAppConfigTest.basicScan(AutoAppConfigTest.java:17) 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)Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at org.springframework.asm.ClassReader.readStringish(ClassReader.java:3733) at org.springframework.asm.ClassReader.readClass(ClassReader.java:3748) at org.springframework.asm.ClassReader.accept(ClassReader.java:456) at org.springframework.asm.ClassReader.accept(ClassReader.java:426) at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:48) at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103) at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:123) at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:429) ... 84 moreProcess finished with exit code 255
-
미해결스프링 핵심 원리 - 기본편
프로토타입 스코프 강의 16:20초 질문입니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강사께서 @AutowiredApplicationContext applicationContext; 이렇게 빈을 생성하는 과정 없이 바로 컨테이너를 주입받으셨는데, ApplicationContext는 스프링이 제공하는 기본 빈이기 때문에 가능한 부분인가요?
-
미해결스프링 핵심 원리 - 기본편
스프링 컨테이너가 관리하는 빈
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]제가 이해하고 있는것이 맞는지 봐주실 수 있을까요?스프링 컨테이너가 관리하는 빈이어야 @PostConstruct, @PreDestroy 메서드가 호출될 수 있다. 따라서 프로토타입 빈처럼 초기화 이후에 스프링 컨테이너가 관리하지 않는 빈은 @PreDestroy가 호출되지 않는다.
-
미해결스프링 핵심 원리 - 기본편
Configuration과 바이트코드 조작의 마법 강의 질문입니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요?예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용] 왜 저는 싱글턴 적용이 되지 않는걸까여? AppConfig에 @Configuration 애너테이션도 빠뜨리지 않았는데 테스트 결과 MemberRepository의 주소가 서로 다르게 나옵니다. 캡처 첨부할게요!
-
미해결스프링 핵심 원리 - 기본편
@Configuration과 싱글톤 강의에서 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]강의의 9분 5초에 해당하는 내용입니다.System.out.println("memberService = " + memberService.getMemberRepository()); System.out.println("orderService = " + orderService.getMemberRepository()); System.out.println("memberRepository = " + memberRepository); System.out.println("memberService = " + memberService.getMemberRepository()); System.out.println("orderService = " + orderService.getMemberRepository()); System.out.println("memberRepository = " + memberRepository); 강의 내용과 똑같이 ConfigurationSingletonTest에서 실습했는데 저는 이 3개의 주소가 모두 다르게 나왔네요. 어디서 문제가 생긴건지 알 수 있을까요
-
미해결스프링 핵심 원리 - 기본편
OCP와 DIP의 차이점
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]DIP와 OCP가 상당히 비슷해보여서 구분이 잘 가질 않네요. 제가 정리한 바로는 이런데 혹시 맞나 해서 질문드립니다.1. '클라이언트가 다형성을 사용하여 인터페이스에만 의존하게 DIP를 지켰다. AppConfig가 OCP를 이용해 확장에는 열려있고 변경에는 닫혀있게 수정했다.'2.추가적으로 DIP, IoC, OCP 모두가 맞물려있는 것 같다는 생각이 듭니다... ㅜ
-
미해결스프링 핵심 원리 - 기본편
인텔리제이 내장jdk사용
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]java11jdk를 따로 설치하지않고 인텔리제이에 내장된jdk를 사용해도되나요??
-
미해결스프링 핵심 원리 - 기본편
강의 자료에 오타가 있어요~
첫화면 위에서 두 번째 줄 '받아드릴 수 있게' → '받아들일 수 있게' 입니다잇
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
안녕하세요 나도코딩 선생님 :)
안녕하세요 나도코딩 선생님 :)곧 추석인데 잘 지내고 계신가요? 선생님 강의 복습하면서 보고있는데 항상 감사드립니다!다름이 아니라, 저도 해당 글쓴님과 같은 의문점이 들어 답변 주신 부분을 확인하였는데요, https://www.inflearn.com/questions/950351답변 주신 해당 부분을 반복해서 읽고 있는데 명확하게 이해가 되지 않아 질문드리는 점 양해 부탁드립니다(__ __)제가 이해한 바로는 Resolution()의 경우, null값으로 반환되어 if문을 getter로 작성하셨고, Price()의 경우는 특정 값 반환으로 인해 if문을 setter로 작성하신 점으로 이해해도 될까요? 추후 코드를 작성할 시 getter와 setter 중 어떤 조건으로 어디에 조건문을 작성하는 것일지 알고싶어 여쭈어봅니다!편안한 연휴 보내시길 바라며, 감사합니다! 전달값이 없는 단순한 getter 메소드는 일반적으로 그냥 인스턴스 변수의 값을 반환하는 역할을 수행합니다.하지만 getResolution() 과 같이 getter 메소드에 조건을 추가하는 이유는 해당 인스턴스 변수의 값이 특정 조건을 만족하지 않을 경우에 대응하는 로직을 제공하기 위해서입니다. 이러한 접근 방식은 일반적으로 값을 반환하는 단순한 getter 메소드에서는 유용합니다.이런 방식을 사용하는 이유는 몇 가지가 있는데요. 1. 안정성인스턴스 변수의 값이 null일 때 getter 메소드가 null을 반환하면, 클라이언트 코드에서 해당 값의 null 여부를 체크하여 잠재적인 문제(=NullPointerException)를 방지하는데 도움이 됩니다.2. 기본값 제공해당 인스턴스 변수가 기본값인 경우, 또는 아직 값이 설정되지 않은 경우를 대비하여 기본 메시지나 기본값을 반환할 수 있습니다.3. 클라이언트 코드 간소화클라이언트 코드에서 추가적인 null 체크나 예외 처리를 하지 않도록 도와줍니다.4. 의도 표현인스턴스 변수가 특정 조건을 만족하지 않을 때 어떤 동작을 하는지 미리 설명하는 역할을 합니다. 이번에는 setPrice() 에 대해 설명 드릴게요.setter 메소드는 주로 인스턴스 변수 값을 설정하는 역할을 합니다.하지만 때로는 값의 유효성을 검사하거나 특정 조건을 만족하지 않을 때 기본값이나 다른 값으로 설정해야 할 경우가 있는데 이때 setter 메소드에서 조건을 확인하고 특정 동작을 수행하는 것은 올바른 접근 방법일 수 있습니다.setPrice() 메소드는 price 인스턴스 변수를 설정하는데, 만약 price가 100,000보다 작으면 100,000으로 설정하고, 그렇지 않으면 주어진 price 값을 그대로 price 인스턴스 변수에 설정합니다. 이렇게 setter 메소드에 조건을 추가하여 값을 검증하고 처리하면 코드의 안정성과 유효성을 높일 수 있습니다. 예를 들어, price가 음수가 될 수 없거나 특정 범위를 벗어나면 이를 감지하고 기본값이나 다른 유효한 값으로 설정할 수 있게 되지요.
-
해결됨코틀린 고급편
추상클래스의 공변 / 반공변, 추상 제네릭 일급컬랙션 리팩토링 에 대한 질문입니다.
믿고보는 태현님강의 다른강의 듣다가 사두고 이제서야 초반을 달리고 있습니다. 역시나 그간 알다가 까먹고 했던부분 확실하게 다지고 가는 느낌이 듭니다.저는 공변/반공변 예제 중 [꺼내기 / 저장] 각각의 기능만 하는 두가지 일급컬랙션을 따라하다가, 추상클래스 AbstractCage 를 둔다면 어떨지 아래처럼 한번 구성했었습니다. abstract class AbstractCage<T>( protected val things: MutableList<T>, )/** 초기화를 통해 아무거나 저장 후, 꺼낼수만 있는 케이지 */ private class ProduceCage<out T>( vararg things: T ) : AbstractCage<T>(mutableListOf(*things)) { // ProduceCage T는 'out(공변)' 이지만 AbstractCage T는 무공변 선언되어 대입불가. fun getFirst(): T = this.things.first() fun getAll(): List<T> = this.things.toList() }/** 아무거나 저장 만 가능한 케이지 */ private class ConsumeCage<in T>( vararg things: T ) : AbstractCage<T>(mutableListOf(*things)) { // ConsumeCage T는 'in(반공변)' 이지만 AbstractCage T는 무공변 선언되어 대입불가. fun put(vararg things: T) { this.things.addAll(things) } }문제는 상속받을때의 : AbstractCage<T>(..things) 선언부에 부모 T 타입이 무공변이라 자식 T 타입이 적절치 못하다고 애러가 나는데요,생각해보니 양쪽의 하위타입에서 이도저도 아닌 T 타입을 강요하는데, 이런 방식이 좋은 접근방식인가? 하는 의구심도 들고, 현업에서나, 또는 올바른 접근방법이 궁금해 질문하게 되었습니다. AbstractCage 의 타입파라미터를 <in T1, out T2> 이렇게 두는것도 이상하구요,이렇게 일급컬랙션 의 공통부분을 만들어야 될때 어떻게 접근해서 풀어내실지 의견이 궁금해서 남기게 되었습니다.읽어주셔서 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
prototype 스코프 사용 시 proxymode
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]request 스코프 사용 시 @Scope 에서 proxymode 추가하는 것으로, 코드가 간단해지는 것을 보고, prototype 스코프에도 적용해보려고 했는데, 오류가 발생하였습니다.질문게시판에서 답변이 되는 글을 찾아서 궁금증은 풀렸는데요, (https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8&unitId=55396&tab=community&category=questionDetail&q=560062)그렇다면 결론적으로 prototype 스코프에서는 proxymode를 사용할 수는 없고, provider를 사용하는 것이 최선일까요? 감사합니다
-
미해결스프링 핵심 원리 - 기본편
무상태
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]싱글톤을 사용할 때는 상태를 유지하지 않는 무상태로 설계해야 하는데, 무상태라는 말을 어떻게 이해해야 할까요?하나의 객체를 공유하면서 각자 변경은 할 수 있어야 하는데..
-
미해결스프링 핵심 원리 - 기본편
@Component와 @AutoWired를 사용했을때 정책에 변경이 생기면 구체화 클래스를 손봐야 하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]할인정책 같이 변경이 일어날 수 있는 상황에서 그냥 AppConfig에서는 @Bean에서 단지 return값을 바꿔주는 걸로 OrderServiceImpl라는 구체화 클래스에 변경 없이 의존관계주입을 바꾸어 주었는데 @Component로 빈 저장소에 저장한 뒤 @AutoWired로 자동의존관계 주입을 해줄때1. RateDiscountPolicy와 FixDiscountPolicy 둘다 @Component로 빈 저장소에 저장을 하는 것인지1-1. 만약 둘다 저장해서 @AutoWired하는 경우 어떤 정책을 사용할지는 OrderServiceImpl 생성자에 @Qualifier라는 에노테이션을 사용한다고 gpt가 알려 주더라구요 그럼 할인 정책을 바꾸게 되면 OrderServiceImpl 구체화 클래스에 변경이 일어나니 좋지 않는 코드이지 않은가 라는 의문과아니면 그냥 사용 할 정책만 @Component해서 자동의존주입하는게 맞는건지 궁금합니다 혹시 제가 이상한 질문을 한거라면 그냥 강의나 다시보라고 말씀해주시면 감사드리겠습니다.
-
해결됨코틀린 고급편
lateinit 키워드 관련해서 질문드립니다!
안녕하세요! 수업 듣다가 급혼란(?)이 찾아와서 질문을 드리려고 합니다!lateinit 키워드는 primitive 타입에서는 사용할 수 없는 이유가 컴파일 되었을 때 null을 저장할 수 없어서 라고 설명을 해주셨는데요. 그러다보니 lateinit var name: String 이 코드에 대해서 갑자기 혼란이 찾아왔습니다. String? 이 아니기 때문에 name에도 null은 들어갈 수 없는 것은 확정적인데, 이러면 Int, Long 이런 것과 뭐가 다른가 하는 순간적인 혼란이 찾아오네요.코틀린에서의 String을 바이트 코드 디컴파일하면 어차피 자바 String이 되기 때문에 자바에서의 String은 null이 될 수 있기 때문에 코틀린에서 String은 String?이 아니어도 바로 lateinit을 사용할 수 있게 되는가 하는 생각도 해봤는데 이게 맞는지는 모르겠네요..ㅠ뭔가 되게 간단한 것 같은데 헷갈려서 질문을 드려서 죄송하네요 ㅠ
-
미해결스프링 핵심 원리 - 기본편
간단한 질문 하나 드립니다. (빈 타입에 대하여)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 강의를 듣다가 약간 헷갈리는 부분이 있어 간단한 질문드립니다.getBean() 메소드의 매개변수로, '빈 이름'과 '타입'이 있다고 이해했습니다. 여기서 '타입'이 정확히 무엇을 의미하는지 헷갈립니다.@Bean 애노테이션이 붙은 메소드의 리턴 타입을 의미하는 것일까요?@Bean public MemberRepository memberRepository1() { return new MemoryMemberRepository(); } @Bean public MemberRepository memberRepository2() { return new MemoryMemberRepository(); }예를 들어 위 코드의 경우, 둘 다 MemberRepository 타입을 반환하기 때문에 빈 타입으로 MemberRepository이 저장되는 것인가요? 그리고 동일한 타입 둘 이상인 경우 발생하는 NoUniqueBeanDefinitionException도 @Bean에 등록된 반환타입이 동일하기 때문에 발생하는 것인지도 궁금합니다.추가적으로 앞 강의에서 getBean()을 사용할 때 구체 타입(예: MemoryMemberRepository.class)을 사용할 수도 있다고 했는데, 이건 MemoryMemberRepository의 부모가 MemberRepository이기 때문인가요?