월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 기본편
static factory method로 빈 생성
스프링으로 전환하기 1:07 부터의 강의 내용에 추가로 공부하다가 생긴 의문점에 관한 내용입니다.스프링공식문서위의 공식문서에서는 빈을 생성하는 또다른 방법으로 정적 팩터리 메서드가 있다고 했습니다.public class StaticFactoryMethodBean { private String value; private StaticFactoryMethodBean(String value) { this.value = value; } public static StaticFactoryMethodBean createInstance(String value) { return new StaticFactoryMethodBean(value); } }이런 클래스가 있다고 가정하면, 두가지 종류의 빈을 만들 수 있습니다.@Configuration public class AppConfig { @Bean public StaticFactoryMethodBean factoryMethodBean() { return StaticFactoryMethodBean.createInstance("value"); } @Bean public static StaticFactoryMethodBean staticFactoryMethodBean() { return StaticFactoryMethodBean.createInstance("value"); } }여기서 생기는 궁금점이 있어서 질문드립니다.이 static 빈은 @Configuration 에 영향을 받지 않고, 프록시를 생성하지 않아 여러 기능들을 쓸 수 없다고 생각이 들었습니다.그럼에도 이걸 쓰는 경우가 있을까 해서 질문드립니다. 제 생각엔 외부 라이브러리나 이런거를 쓸 때, 쓸 거 같기도 하단 생각이 들었습니다. 혹시 실무에서도 쓰는 경우가 종종 있었는지 여쭈어봅니다.p.s 실제 두개 다 생성이 되는지에 대한 검증 테스트 완료(간단하게 main테스트로 진행)public class StaticFactoryMethodBeanMain { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); StaticFactoryMethodBean factoryMethodBean = context.getBean("factoryMethodBean", StaticFactoryMethodBean.class); System.out.println(factoryMethodBean); StaticFactoryMethodBean staticFactoryMethodBean = context.getBean("staticFactoryMethodBean", StaticFactoryMethodBean.class); System.out.println(staticFactoryMethodBean); } }
- 미해결스프링 핵심 원리 - 기본편
static Factory method로 빈 생성
스프링으로 전환하기 1:07 부터의 강의 내용에 추가로 공부하다가 생긴 의문점에 관한 내용입니다.스프링공식문서위의 공식문서에서는 빈을 생성하는 또다른 방법으로 정적 팩터리 메서드가 있다고 했습니다.public class StaticFactoryMethodBean { private String value; private StaticFactoryMethodBean(String value) { this.value = value; } public static StaticFactoryMethodBean createInstance(String value) { return new StaticFactoryMethodBean(value); } }이런 클래스가 있다고 가정하면, 두가지 종류의 빈을 만들 수 있습니다. (물론 따로 따로 생성. 동시에 두가지는 생성이 안됨.)(컴파일에러는 안나지만, 실제 실행을 시키면 런타임 에러 발생)@Configuration public class AppConfig { @Bean public StaticFactoryMethodBean factoryMethodBean() { return StaticFactoryMethodBean.createInstance("value"); } @Bean public static StaticFactoryMethodBean staticFactoryMethodBean() { return StaticFactoryMethodBean.createInstance("value"); } }여기서 생기는 궁금점이 있어서 질문드립니다. 이 static 빈은 @Configuration 에 영향을 받지 않고, 프록시를 생성하지 않아 여러 기능들을 쓸 수 없다고 생각이 들었습니다. 그럼에도 이걸 쓰는 경우가 있을까 해서 질문드립니다. 제 생각엔 외부 라이브러리나 이런거를 쓸 때, 쓸 거 같기도 하단 생각이 들었습니다. 혹시 실무에서도 쓰는 경우가 종종 있었는지 여쭈어봅니다.
- 해결됨스프링 핵심 원리 - 기본편
필드명을 빈이름으로 변경
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]파라미터 네임을 변경했는데 찾지 못했다고 오류가 뜨는데 어떻게 해야할까요? 혹시 제가 놓치는 부분이잇나요?
- 미해결스프링 핵심 원리 - 기본편
Autowired에 빨간불
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]@Autowired에 빨간불이 뜨면서 에러가 뜨는데 이유가 뭘까요?? Autowired members must be defined in valid Spring bean (@Component|@Service|...) package hello.core.scope; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Scope; import static org.assertj.core.api.Assertions.assertThat; public class SingletonWithPrototypeTest1 { @Test void prototypeFind() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class); prototypeBean1.addCount(); assertThat(prototypeBean1.getCount()).isEqualTo(1); PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class); prototypeBean2.addCount(); assertThat(prototypeBean2.getCount()).isEqualTo(1); } @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"); } } }
- 미해결스프링 핵심 원리 - 기본편
coreApplicationTests
coreApplicationTests를 실행하면 밑에 WARNING이라고 뜨는데 이거는 어떻게 처리해야하나요??ㅠㅠ뭔가 문제가 있는건가요.. 13:31:52.196 [main] INFO org.springframework.test.context.support.AnnotationConfigContextLoaderUtils -- Could not detect default configuration classes for test class [hello.core.CoreApplicationTests]: CoreApplicationTests does not declare any static, non-private, non-final, nested classes annotated with @Configuration.13:31:52.288 [main] INFO org.springframework.boot.test.context.SpringBootTestContextBootstrapper -- Found @SpringBootConfiguration hello.core.CoreApplication for test class hello.core.CoreApplicationTests . ____ _ /\\ / ___'_ __ (_)_ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.3.0)2024-05-30T13:31:52.657+09:00 INFO 27976 --- [core] [ main] hello.core.CoreApplicationTests : Starting CoreApplicationTests using Java 21.0.3 with PID 27976 (started by IDEAPAD in E:\study\core)2024-05-30T13:31:52.658+09:00 INFO 27976 --- [core] [ main] hello.core.CoreApplicationTests : No active profile set, falling back to 1 default profile: "default"2024-05-30T13:31:53.068+09:00 INFO 27976 --- [core] [ main] hello.core.CoreApplicationTests : Started CoreApplicationTests in 0.645 seconds (process running for 1.512)WARNING: A Java agent has been loaded dynamically (C:\Users\IDEAPAD\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.14.16\4a451ee6484abac3a498df0f3b33ed00a6fced4d\byte-buddy-agent-1.14.16.jar)WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warningWARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more informationWARNING: Dynamic loading of agents will be disallowed by default in a future releaseOpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appendedProcess finished with exit code 0
- 미해결스프링 핵심 원리 - 기본편
전체 테스트시 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]전체 테스트시 CoreApplicationTests에서 이런 오류가 발생합니다!! java.lang.IllegalStateException: Failed to load ApplicationContext for [MergedContextConfiguration@24db6ce testClass = hello.core.CoreApplicationTests, locations = [], classes = [hello.core.CoreApplication], contextInitializerClasses = [], activeProfiles = [], propertySourceDescriptors = [], propertySourceProperties = ["org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true"], contextCustomizers = [org.springframework.boot.test.autoconfigure.actuate.observability.ObservabilityContextCustomizerFactory$DisableObservabilityContextCustomizer@1f, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizer@56bc3fac, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@37ff4054, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@74cf8b28, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@718607eb, org.springframework.boot.test.context.SpringBootTestAnnotation@7d85fe52], contextLoader = org.springframework.boot.test.context.SpringBootContextLoader, parent = null] at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:180) at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:130) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:142) at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:98) at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:260) at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:163) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310) at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:735) at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) at java.base/java.util.Optional.orElseGet(Optional.java:364) 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.UnsatisfiedDependencyException: Error creating bean with name 'memberServiceImpl' defined in file [/Users/kimcheoljun/Desktop/CODING/BE/spring/core/out/production/classes/hello/core/member/MemberServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 0: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository 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:1355) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1192) 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:326) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) 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.boot.SpringApplication.refresh(SpringApplication.java:754) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) at org.springframework.boot.test.context.SpringBootContextLoader.lambda$loadContext$3(SpringBootContextLoader.java:137) at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:58) at org.springframework.util.function.ThrowingSupplier.get(ThrowingSupplier.java:46) at org.springframework.boot.SpringApplication.withHook(SpringApplication.java:1454) at org.springframework.boot.test.context.SpringBootContextLoader$ContextLoaderHook.run(SpringBootContextLoader.java:553) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:137) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:108) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:225) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:152) ... 17 moreCaused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository 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) ... 41 more
- 미해결스프링 핵심 원리 - 기본편
강의 테스트 오류내용 질문 / 소스코드 있음
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용][소스코드]https://drive.google.com/drive/folders/12UKQ6SBa5fZeSdpWkr36EDpLkZtXad4t?usp=sharing 강의를 듣는데 @Autowired 어노테이션에서 같은 타입이 2개이상 조회된 경우 필드명을 동일하게 해주면 해당 필드명에 맞는 빈을 주입한다고 했는데 빈이 적용되지 않는 오류가 납니다.. ㅠㅠ 테스트 코드를 아무리 돌려봐도 안되네요. 도와주세요!또한 rateDiscountPolicy로 바꿔도 강사님과는 다르게 전체 테스트를 돌려보았을 때 xml은 성공적으로 수행하는 모습입니다. 이것도 왜 그런지 잘 모르겠습니다.앞전 강의에서 전체 테스트를 돌렸을 때 CoreApplicationTests 에서 에러가 났는데, 여기서도 에러가 해결되지 않아 CoreApplication에 컴포넌트 스캔 및 excludeFilters 를 달아서 해결하였는데 이것도 왜 안되었던건지 궁금합니다.!!전체 테스트를 돌렸을 때 총 3개가 에러가 나는데 basicSacn 뿐 아니라 나머지 2개가 왜 에러나는지도 해결 부탁드리고 싶습니다!
- 미해결스프링 핵심 원리 - 기본편
빈 생명주기에서 @PostConstruct, @PreDestory는 필수인가요??
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 스프링 빈 생명주기를 공부하다가 헷갈리는 부분이 있어서 질문드립니다. 보통 스프링 빈 생명주기라고 함은 아래와 같이 설명하는데요.스프링컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료여기서 궁금한게, 초기화 콜백 과 소멸전 콜백 단계는 모든 스프링 빈의 생명주기에 필수단계인지 궁금합니다.DB 커넥션처럼 WAS 띄울 때 한번 연결하고 두고두고 쓸 것 들을 대상으로만 @PostConstruct 를 사용하는 것으로 알고 있는데, 대부분 인터넷에서 빈 생명주기를 설명할 때 초기화콜백, 소멸전 콜백을 꼭 포함시키길래 모든 스프링 빈 생명주기에 위 단계가 필요한 것인지 궁금하여 여쭤봅니다.
- 해결됨스프링 핵심 원리 - 기본편
NoSuchBeanDefinitionException 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]전체 테스트를 돌리면 @SpringBootTest 가 있는 파일만 계속 테스트를 실패합니다.처음에 빈 중복 오류가 떠서 AutoConfig MemberRepository부분을 중복 처리 해줬습니다.그 뒤부터 NoSuchBeanDefinitionException 이 발생하는데 이유를 모르겠습니다.AppConfig의 @Configuration 을 주석 처리해주면 AppConfig를 사용하는 테스트는 실패하지만 @SpringBootTest 는 성공을 합니다.근데 반대로 AutoConfig를 주석처리 해주면 NoSuchBeanDefinitionException 이 발생하면서 테스트가 실패하게 됩니다.구글 드라이브 링크 : https://drive.google.com/file/d/19IBnF5lB2F2pbS36CHo73stFQJMUhfdX/view?usp=sharing
- 미해결스프링 핵심 원리 - 기본편
자동주입 @Configuration
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]수동 주입을 사용하면 @Configuration을 설정 정보 클래스에 붙여줘야 싱글톤으로 유지된다고 배웠습니다. 자동 주입에서는 내부적으로 알아서 CGLIB 기술을 활용하여 싱글톤을 보장하는건가요?? 제가 생각하기에는 자동주입을 사용하는 경우에도 @Configuration 어노테이션이 예를 들어서 @ComponentScan이나 @Component 등 안에 들어가야 있을거 같은데 확인해보니까 없어서 약간 의아합니다.
- 미해결스프링 핵심 원리 - 기본편
자바빈 vs 스프링빈
자바빈 과 스프링빈은 용어에서 빈이라고 되어 있어서 헷갈리는데요, 그냥 다른 것이라고 생각하는데 더 나을까요?
- 미해결스프링 핵심 원리 - 기본편
다양한 의존관계 주입 방법에서 @Autowired시 객체 참조값 상이
생성자가 하나 일 때는 @Autowired가 없어도 자동으로 의존 관계가 주입 되어 객체가 생성된다는 것을 알고, 실제로 확인도 했습니다.궁금한 사항은, @Autowired가 있을 때는 고정으로 동일한 객체를 가져오는데 (지웠다 넣어도 619bfe29가 유지)memberRepository = hello.core.member.MemoryMemberRepository@619bfe29@Autowired를 삭제하면 다음과 같은 고정적인 객체 참조값을 가져옵니다. (넣었다 지워도 12dae582가 유지)memberRepository = hello.core.member.MemoryMemberRepository@12dae582새로 만들어지는 것이 아닌, @Autowired에 유무에 따라 다르지만, 왜 동일한 객체 참조 값을 유지할까요?
- 미해결스프링 핵심 원리 - 기본편
싱글톤 해결방안
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]싱글톤 문제를 해결하기 위한 방법으론 이번 강의에서 설명하는 상태를 무상태로 설계하는 방법, 스프링 고급강의에서 설명해주는 방식인 쓰레드 로컬도 싱글톤을 해결하기 위한 방법 중 하나인가요??
- 미해결스프링 핵심 원리 - 기본편
영상이 안 보입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 제목 그대로 인데요mac에서 강의를 듣던중에 다음강의로 넘어가니 그이후 강의부터는 영상이 안 보입니다모바일로는 보이는데 pc로 보려면 어떻게 해야할까요?
- 미해결스프링 핵심 원리 - 기본편
main에서 코드실행시 gradle에서 빌드되는거같아요 ㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요강의잘듣고있습니다!Main에서 코드실행시 스프링 로딩되면서 로그가 보여야하는데, 뭔가 Gradle 실행된는것같아요구글링해서 찾아봣는데 해결법을 찾을수가없어서 질문드립니다!메인 실행시 아래 화면처럼 나옵니다!확인부탁드립니다!
- 미해결스프링 핵심 원리 - 기본편
UnsatisfiedDependencyException와 NoUniqueBeanDefinitionException의 차이점
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 영한 쌤. @Autowired 시 동일한 타입의 빈이 2개 이상일 때를 확인하고 있던 중, 강의와는 다른 에러가 나와서 질문 드립니다. 강의에서는 현재 NoUniqueBeanDefinitionException 에러가 발생하고 있는데 저는 UnsatisfiedDependencyException 라는 에러가 발생합니다.NoUniqueBeanDefinitionException 의 경우에 동일한 타입의 빈이 중복으로 존재한다는 의미이고, UnsatisfiedDependencyException 의 경우에는 의존성이 들어오고 있지 않는 것이 문제라고 알고 있었습니다. 하지만 현재 매칭되는 빈이 2개라는 에러 메세지가 발생하며 UnsatisfiedDependencyException 에러가 발생했고, 두 에러의 차이점을 명확히 하고 싶어 문의를 드립니다. 두 에러가 같은 상황에서 혼용될 수 있는 에러인가요? org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [/Users/wooruk/workspace/younghan/spring/core/out/production/classes/com/hello/core/order/OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'com.hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy
- 해결됨스프링 핵심 원리 - 기본편
assertThat() 인자값 질문있습니다.
assertThat() 메서드에 대해서 찾아 봤는데, 매개변수 이름이 actual(실제값) 이더라구요. 그리고 isEqualTo() 메서드의 매개변수 이름은 expected(기대값)이구요.그러면 assertThat() 메서드를 호출할 때 인자값으로 테스트하고자 하는 값을, 그리고 isEqualTo() 메서드는 테스트의 결과로 기대되는 값을 넘기는게 맞지 않나요?여기 아래 코드에서 memberService.findMember(1L)로 찾아온 회원(findMember)이앞서 직접 만들어서 join으로 넘긴 member와 같아야 하는 거니까Assertions.assertThat(findMember).isEqualTo(member)가 맞는거 아닌가요?
- 미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔시 빈이름 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]컴포넌트 스캔시 빈 이름이 자동으로 구현된 클래스의 이름으로 설정되게 되는데요. 이 경우 DIP 위반과는 상관없는 건가요?? 예를 들어 memoryMemberRepository 처럼요.물론 타입으로 조회 시에는 MemberRepositoy.class로 조회가능하지만, 이름으로 조회시에는 클래스명(앞에 소문자)로 조회해야 되서요. 공부중 궁금해져서 질문 드립니다.
- 미해결스프링 핵심 원리 - 기본편
싱글톤 @Configuration
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]class StatefulServiceTest { @Test void statefulServiceSingleton() { ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); StatefulService statefulService1 = ac.getBean(StatefulService.class); StatefulService statefulService2 = ac.getBean(StatefulService.class); // Thread A : A 사용자 10000원 주문 // statefulService1.order("userA", 10000); int userAPrice = statefulService1.order("userA", 10000); // Thread B : B 사용자 10000원 주문 // statefulService2 .order("userB", 20000); int userBPrice = statefulService2.order("userB", 20000); // Thread A : A 사용자 주문 금액 조회 // int price = statefulService1.getPrice(); // System.out.println("price = " + price); System.out.println("userAPrice = " + userAPrice); System.out.println("userBPrice = " + userBPrice); } static class TestConfig { @Bean public StatefulService statefulService() { return new StatefulService(); } } }이 코드에서 TestConfig는 @Configuration 어노테이션을 붙이지 않았는데 어떻게 싱글톤이 보장된건가요?
- 미해결스프링 핵심 원리 - 기본편
등록된 bean 2개 이상일때 타입의 명칭 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. basicScan Test시 아래처럼 조회된 bean 2개 이상실때 명칭을 달리하면 해결된다고 하셨는데요.OrderServiceImpl에서 아래처럼 DiscountPolicy 명칭을 rateDisCountPolicy로 수정 하면 위와 같은 동일한 이슈가 발생되는걸 확인 했습니다. 그래서 명칭의 대소문자를 @Component 통해 등록된 rateDiscountPolicy로 변경했더니 정상적으로 테스트가 진행 됬는데요. 이유가 뭔가요?타입 명칭을 등록된 bean 명칭과 동일하게 해야하는건가요?혼란이 와서요 오류난 코드정상 작동 코드