30%
61,600원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 기본편
싱글톤 DIP 위반 관련하여 질문합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.강의에서 싱글톤 패턴 문제점 중에 의존관계상 클라이언트가 구체 클래스에 의존한다(DIP 위반)라고 하셨는데 제가 제대로 이해하고 있는지 알고 싶습니다.제가 생각하기에는 AppConfig.class파일을 다음과 같이 구성하고, public class AppConfig { public MemberService memberservice(){ return MemberServiceImpl.getInstance(); } public MemberRepository memberRepository(){ return MemoryMemberRepository.getInstance(); } }MemberSeriveImpl은 MemberRepository를 참조하고 있기 때문에 생성자를 통하여 DI를 하기 때문에, 다음과 같이 코드를 작성하였습니다.public class MemberServiceImpl { private final MemberRepository memberRepository; private final static MemberService memberService = new MemberServiceImpl(); public MemberService getInstance(){ return memberService; } private MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = MemoryMemberRepository.getInstance(); } } 그 결과 Client인 MemberServiceImpl 입장에서는 MemoryMemberRepository를 주입하기 위하여 어쩔수 없이 구체 클래스(MemoryMemberRepository.class)를 의존할 수 밖에 없는것 같습니다.(싱글톤 패턴을 유지하기 위해 미리 의존관계등을 미리 세팅해야됨)제가 제대로 이해한건지 맞는지 알고싶습니다
- 해결됨스프링 핵심 원리 - 기본편
CoreApplicationTests 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]CoreApplicationTests 부분에서 오류가 나는데 강사님과는 다른 오류가 나서 질문 드립니다. Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberServiceImpl' defined in file [D:\core\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 memoryMemberRepo를 매칭해야 하는데 2개가 존재해서 그런 것 같은데(맞는지는 잘 모르겠습니다)MemberService에는 아무런 Annotation도 붙이지 않았는데 왜 그런 걸까요? (작성한 코드 이미지 첨부합니다) 추가Appconfig 의 @Bean 이 붙은 메소드에 모두 @Primary를 붙여서 어찌저찌 해결은 했는데무슨 이유로 저 오류가 나는건지 궁금합니다
- 해결됨스프링 핵심 원리 - 기본편
혹시 오타인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]의존관계 자동 주입.pdf의 14페이지에서@Qualifier 수정자 자동 주입 예시 코드 부분에서리턴 타입이 DiscountPolicy로 써져 있는데,setter이니깐 리턴 타입이 void여야 맞지 않나요?혹시 오타인가 싶어서 말씀드립니다. +)15페이지 @Primary 수정자 코드,17페이지 애노테이션 만들기 수정자 코드에서도 똑같이 void가 아니라 DiscountPolicy로 되어 있습니다.
- 미해결스프링 핵심 원리 - 기본편
기본 configuration 선택에 대해 질문이 있습니다!
안녕하세요..!현재 섹션7 - 생서자 주입을 선택해라! 듣고있습니다.1.4분 52초 쯤에 OrderServiceImple 테스트 할때 Config 파일을 지정하는 코드가 없는데 자동으로 AppConfig 가 선택된 이유가 무엇인가요? AutoAppConfig도 만들어놨고 OrderServiceImple에 @Component 애노테이션도 붙여줬는데요..! 2.그리고 같은 시점에서,java: constructor OrderServiceImpl in class hello.springbasic.order.OrderServiceImpl cannot be applied to given types; required: no arguments found: hello.springbasic.member.MemoryMemberRepository,hello.springbasic.discount.DiscountPolicy reason: actual and formal argument lists differ in length이 오류가 나는 이유가 무엇인지 궁금합니다! OrderServiceImpl 에는 제가 만들어놨던 생성자를 주석처리해서 기본 생성자(파라미터 없는 생성자) 밖에 없는데, AppConfig에는 (OrderServiceImpl에서 이미 주석처리해버린) 파라미터 2개를 받는 생성자를 호출하고 있어서 에러가 난 게 맞나용?감사합니다!
- 미해결스프링 핵심 원리 - 기본편
도메인의 의미
간단한 질문이긴 한데 예를 들어 "회원 도메인" 여기서 "도메인"의 의미가 구체적으로 어떤 걸 의미하나요??대충 이해가 되긴 하지만 조금 추상적으로 느껴져서 질문 드립니다!
- 해결됨스프링 핵심 원리 - 기본편
오타인가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]의존관계 자동 주입.pdf의 6페이지 맨 위에@Autowired(required = false) public void setNoBean3(Optional<Member> member) { System.out.println("setNoBean3 = " + member); }이렇게 되어 있는데 (required = false)는 오타인가 싶어서 말씀드립니다. 그리고 5페이지에@Autowired(required=false): 자동 주입할 대상이 없으면 수정자 메서드 자체가 호출 안 됨 이 내용이 있는데, 수정자 메서드라고 적혀 있기는 하지만 일반 메서드 주입일 때도 마찬가지라고 생각하면 되는 거죠?수정자 메서드 주입 방식일 때 많이 쓰여서 그냥 수정자 메서드라고 적혀 있는 거라고 생각하긴 하는데 맞나요?
- 미해결스프링 핵심 원리 - 기본편
어플리케이션 빈 출력하기 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]4:52 부분부터 질문이 있습니다.일단 스프링 빈은 스프링 컨테이너에 등록된 객체를 말합니다. 이 말은 즉, 빈은 객체라고 할 수 있는 것 같습니다. BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);영한님께서 getBeanDefinition()메소드는 빈의 메타데이터를 가져오는 것이라고 설명해주셨습니다. 그렇기에 beanDefinition 에는 beanDefinitionName을 이름으로 가진 스프링 빈 객체의 메타 데이터가 저장되었다고 볼 수 있습니다. beanDefinition.getRole()==BeanDefinition.ROLE_APPLICATIONgetRole에 대한 설명으로 "스프링이 내부에서 사용하는 빈은 getRole() 로 구분할 수 있다."라고 나와있습니다.ROLE_APPLICATION에 대한 설명으로" ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈" 라고 나와있습니다.그렇다면 BeanDefinition.ROLE_APPLICATION을 통해 사용자가 정의한 빈(=사용자가 정의한 객체)가 반환이 되었을 것이며 타입을 맞춰야 하기에 beanDefintion.getRole()을 통해서 beanDefinition의 객체가 반환 될 것입니다.하지만 둘다 반환값이 int로 설정이 되어있어서 객체반환이라면 OBJECT로 반환되어야 할텐데 뭔가 이상했습니다. getRole과 Role_APPLICATION에 대한 설명이 제가 이해를 잘못한것 같은데 제가 어디서부터 이해가 틀린건지 , getRole과 ROLE_APPLICATION에 대해 좀 더 자세한 설명 부탁드리겠습니다...!
- 미해결스프링 핵심 원리 - 기본편
[섹션 7 - 옵션 처리] 전체 테스트 중 CoreApplicationTests 클래스의 contextLoads 테스트 실패 질문입니다.
안녕하세요.게시판을 둘러보니 비슷한 오류가 나시는 분들이 계신것 같은데 해결 되신 분이 없는 것 같아 질문드립니다.개발 환경Spring Boot : 3.2.0운영체제 : Mac OS XIDE : IntelliJ IDEA Ultimate 2023.2.5JDK : JDK 17빌드 툴 : Gradle 8.4문제강의를 따라가던 도중 전체 테스트를 진행하는 과정에서 CoreApplicationTests 클래스의 contextLoads 테스트가 NoUniqueBeanDefinitionException 오류를 발생시키며 실패합니다.org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository특이한점으로 GitHub에 올려놓은 코드를 내려받은 후 실행하면 테스트가 통과하고, 지금까지 했던 프로젝트를 실행하면 테스트가 실패합니다.테스트가 성공한 프로젝트도 아래처럼 컨텍스트를 주입받아 MemberRepository를 getBean으로 받아오는 테스트를 해보면 오류가 납니다.@SpringBootTest class CoreApplicationTests { @Autowired ApplicationContext ac; @Test void contextLoads() { MemberRepository bean = ac.getBean(MemberRepository.class); } }org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberRepository' available: expected single matching bean but found 2: memoryMemberRepository,memberRepository로그를 살펴보면 아래와 같습니다.expected single matching bean but found 2: memoryMemberRepository,memberRepository컴포넌트 스캔으로 등록한 빈과, AppConfig를 통해 등록한 빈이 겹치는 것 같습니다.아래는 유추한 내용입니다.컴포넌트 스캔이름을 변경해서 확인해봤습니다.다시 테스트를 돌려보면 로그가 아래처럼 찍힙니다.expected single matching bean but found 2: 메모리멤버레포지토리,memberRepository@Bean이름을 변경해서 확인해봤습니다.테스트를 돌려보면 로그가 아래처럼 찍힙니다.expected single matching bean but found 2: 메모리멤버레포지토리,앱콘피그에있는메모리레포지토리컴포넌트 스캔을 이용하여 MemberRepository 빈을 등록했는데 AppConfig 에서 @Bean 어노테이션이 붙은 메서드의 반환 객체도 빈으로 중복 등록 되어 발생한 것으로 생각됩니다.의문점AutoAppConfig 에서 Configuration 어노테이션이 붙은 클래스는 스캔의 대상에서 제외를 했는데 왜 중복해서 등록이 된 것일까요?검증을 위해 스프링 부트 통합 테스트를 진행해보았더니 AppConfig 가 빈으로 등록되어 있습니다.@SpringBootTest class CoreApplicationTests { @Autowired ApplicationContext ac; @Test void contextLoads() { AppConfig bean = ac.getBean(AppConfig.class); System.out.println(bean); } }hello.core.AppConfig$$SpringCGLIB$$0@37df14d1AppConfig 클래스의 코드입니다.@Configuration public class AppConfig { @Bean public MemberService memberService() { System.out.println("Call - AppConfig.memberService"); return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { System.out.println("Call - AppConfig.memberRepository"); return new MemoryMemberRepository(); } @Bean public OrderService orderService() { System.out.println("Call - AppConfig.orderService"); return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public DiscountPolicy discountPolicy() { // return new FixDiscountPolicy(); return new RateDiscountPolicy(); } }(+) 컴포넌트 스캔을 CoreApplication 으로 옮겨도 똑같이 오류가 발생합니다.추가 질문만약 위 의문이 해결되어 AppConfig 에서 생성한 객체들이 빈으로 등록되지 않고, 컴포넌트 스캔을 통하여 빈을 등록한다면 MemoryMemberRepository 는 memoryMemberRepository 이름으로 빈으로 등록됩니다. 그렇다면 MemberServiceImpl 에서는 memberRepository 를 주입받아야 하는데, 빈의 이름이 달라 주입이 불가능할 것 같습니다. 이 경우에는 @Component("memberReository") 로 수정해줘야 할까요? 감사합니다.
- 미해결스프링 핵심 원리 - 기본편
@autowire에 빨간줄이 뜨는데 원인을 모르겠네요.
프로토타입스코프 공부중인데요. prototypebeanprovicer쪽에 @Autowired시 빨간줄이 뜨고 에러메시지를 살피면 이렇게 나오는데 이유가 뭔지모르겠습니다.그리고 autowire제거해야되나싶어 제거시 테스트시 아예 에러가 나더라구요.(제거안할시는 잘작동해요!) 어떻게 해결해야될까요?
- 미해결스프링 핵심 원리 - 기본편
Process finished with exit code 0
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. Process finished with exit code 0 이 문장 안 나와도 상관 없나요? 감사합니다.
- 미해결스프링 핵심 원리 - 기본편
수정할 수 없는 외부 라이브러리의 초기화, 소멸 메서드 지정방식 질문입니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]아래에 같은 질문을 하신 분이 있는데 이해가 안돼서 추가 질문 드립니다. @Bean(initMethod = "init", destroyMethod = "close") public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); networkClient.setUrl("http://hello-spring.dev"); return networkClient; }강의에서 위처럼 빈 등록 초기화, 소멸 메서드를 지정했는데요.NetworkClient 를 외부 라이브러리라고 가정한다면, 우리는 외부 라이브러리를 수정해서 init 메서드와 close 메서드를 작성한 것이 아닌가요? 그래서 어떻게 고칠 수 없는 외부 라이브러리에 적용할 수 있는지 궁금합니다. 이것이 근본적인 궁금증이고 다음은 아래 질문 글을 참고했을 때 궁금한 점 입니다.별도의 클래스를 만들어서 그곳에서 init 메서드와 close 메서드를 작성한다음 빈으로 등록합니다. (별도의 클래스를 LifeConfig라고 하겠습니다)그 다음 외부 라이브러리를 빈으로 등록할 때@Bean(initMethod = "LifeConfig.init", destroyMethod = "LifeConfig.close") 가 아니라 @Bean(initMethod = "init", destroyMethod = "close")이렇게 사용해야 한다는 걸로 이해했습니다. 이게 어떻게 가능한지 궁금합니다. 빈으로 등록했다해도, 어느 빈에 init 메서드와 close 메서드가 있는지 어떻게 알 수 있나요?
- 해결됨스프링 핵심 원리 - 기본편
TestConfig에 @Configuration을 안 붙여도 되는 이유가 이거 맞나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]package hello.core.singleton; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import static org.junit.jupiter.api.Assertions.*; class StatefulServiceTest { @Test void statefulServiceSingleton() { ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); StatefulService statefulService1 = ac.getBean(StatefulService.class); StatefulService statefulService2 = ac.getBean(StatefulService.class); // ThreadA: 사용자A 10000원 주문 int userAPrice = statefulService1.order("userA", 10000); // ThreadB: 사용자B 20000원 주문 int userBPrice = statefulService2.order("userB", 20000); // ThreadA: 사용자A 주문 금액 조회 // int price = statefulService1.getPrice(); System.out.println("price = " + userAPrice); System.out.println(statefulService1); System.out.println(statefulService2); // Assertions.assertThat(statefulService1.getPrice()).isEqualTo(20000); } static class TestConfig { @Bean public StatefulService statefulService() { return new StatefulService(); } } } 원래 코드에서 System.out.println(statefulService1); System.out.println(statefulService2); 이 부분만 제가 추가했습니다. TestConfig에 @Configuration이 없으면, 컨테이너 내부에 등록되는 빈들이 싱글톤을 보장하지 않는다고 알고 있습니다. 그런데 이 코드를 실행한 결과, statefulService1과 statefulService2가 같은 객체라고 나왔습니다. 저는 당연히 다른 객체일 줄 알았거든요. TestConfig에 @Configuration이 없으면 싱글톤을 보장하지 않는다고 알고 있기 때문에.. 이게 왜 그런지 헷갈렸는데 제가 고민해 본 후의 결론은 다음과 같은데, 오류가 있는지 확인해 주시면 감사드립니다. ApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); 이 코드를 실행하면 TestConfig가 빈으로 등록되지만, TestConfig 내부에 @Bean으로 된 statefulService() 메서드로 반환되는 객체는 싱글톤을 보장하지 않는다.하지만 이 코드에선 statefulService()가 한 번밖에 호출되지 않았기 때문에 컨테이너 내부에 생성된 StatefulService 빈이 하나뿐이다.ac.getBean(StatefulService.class); 이 코드를 여러 번 실행하여 statefulService1, statefulService2, statefulService3 여러 개를 만든다고 해도, 컨테이너 내부의 하나의 객체를 조회한다.이렇게 생각했는데 혹시 잘못된 부분이 있는지 궁금합니다. 즉, 이 코드는 싱글톤을 보장하지 않는 게 맞지만, 내부에 생성된 객체 자체가 1개뿐이고 더 생성된 것이 없기 때문에, 같은 것을 계속 조회했을 뿐이므로 아래 코드를 실행하면 같은 객체를 출력하게 된다. System.out.println(statefulService1); System.out.println(statefulService2); 틀린 부분이 있다면 지적해 주시면 감사드립니다.
- 미해결스프링 핵심 원리 - 기본편
isEqulaTo / isSameAs
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]isEqulaTo는 값을 비교 / isSameAs는 참조(주소)값을 비교하는 걸로 알고 있습니다. 허나, 아래 질문게시글의 답변과 같이 객체의 경우, isEqulaTo는 isSameAs와 같이 참조를 비교하는 것을 알 수가 있습니다.그렇다면 아래 예시와 같이 String도 객체인데 왜 이 경우는 참조가 아닌 값을 비교하나요? (이 경우 테스트가 통과됩니다!)String a = new String("aa"); String b = new String("aa"); assertThat(a).isEqualTo(b);
- 미해결스프링 핵심 원리 - 기본편
static관련 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]"static method에 @Bean을 사용하게 되면 싱글톤 보장을 위한 지원을 받지 못한다" 그 이유에 대해서 자세히 알 수 있을까요? 비슷한 질문글들을 봐도 이유에 대한 정확한 설명은 없는 것 같아서요. 제가 찾아본 바로는 bean의 라이프사이클관리, 의존성 주입, 프록시 등등 있는데 무엇이 정확한 이유인지 잘 모르겠어서 질문남깁니다!!
- 미해결스프링 핵심 원리 - 기본편
Map형식으로 빈 주입 시
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Autowiredpublic DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) {this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies);}여기 생성자 주입을 통해서 각 빈들이 Map타입과 List타입에 담기는건 알겠는데 실제로 스프링이 빈들을 모아서 어떤 구현체에 담아주는 것인가요 ?
- 해결됨스프링 핵심 원리 - 기본편
싱글톤과 쓰레드
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]새로고침을 통해 Request를 반복적으로 수행함에있어서 각 요청의 원자성이 유지되는 이유가 궁금합니다.LogDemoService와 LogDemoController는 싱글톤으로 관리되고 스프링 컨테이너에 유일무이하게 존재한다고 이해하였습니다.sleep을 걸어준 후 로그를 확인해보면, 각 요청에 따른 request의 정보가 일관됨을 확인할 수 있는데,스프링 자체적으로 멀티쓰레드를 실행하여 각 request에 대응하는 Controller와 Service인스턴스를 따로 만드는 것인가요? 그럼에도 불구하고 싱글톤이라고 칭할 수 있는 것인가요?MyLogger를 Controller에서도 provider.getObject();하고 Service에서도 provider.getObject();를 하는데, 많은 Request가 있을때 MyLogger빈도 많이 생성이 될텐데 Contoller와 Service에서 같은 MyLogger빈을 사용하는 이유는 하나의 쓰레드에서 처리하기 때문으로 이해하였습니다. 제가 이해한게 맞나요? Controller와 Service간 파라미터 등으로 MyLogger와 관련된 정보를 교환하지 않았는데, 어떻게 수많은 MyLogger사이에서 일치하는 MyLogger를 DL해오는 것인지 이해가 잘 안됩니다. 만약 각 요청이 쓰레드별로 관리되고 각 쓰레드마다 단 하나의 MyLogger만 존재하는 것인지요...?
- 미해결스프링 핵심 원리 - 기본편
DI 컨테이너를 의미하는 오브젝트 팩토리와 ObjectFactory는 다른 건가요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]pdf로 복습하던 중 질문 있습니다.3. 스프링 핵심 원리 이해2 - 객체 지향 원리 적용.pdf의 24페이지에 다음과 같은 내용이 있습니다. "IoC 컨테이너, DI 컨테이너는 어샘블러, 오브젝트 팩토리 등으로 불리기도 한다." 그리고9. 빈 스코프.pdf의 16페이지에 다음과 같은 내용이 있습니다. "지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공하는 것이 바로 ObjectProvider이다. 참고로 과거에는 ObjectFactory가 있었는데, 여기에 편의 기능을 추가해서 ObjectProvider가 만들어졌다." 첫 번째의 경우엔 오브젝트 팩토리가 DI 컨테이너를 의미하고,두 번째의 경우엔 ObjectFactory는 DI 컨테이너가 아니라, DL 서비스를 제공하는 것을 의미하는 거로 이해했습니다. 그럼 여기서의 '오브젝트 팩토리'와 'ObjectFactory'는 다른 것을 의미하고 있는 거로 느껴지는데 맞나요? 둘 다 오브젝트 팩토리라서.. 이름만 같을 뿐 전혀 다른 개념이 맞는지 궁금합니다.
- 미해결스프링 핵심 원리 - 기본편
의존 관계 화살표와 연관 관계 화살표
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의 자료로 복습 중에 질문이 있습니다.소프트웨어 공학 책에 있는 화살표를 아래 그림에 적용해 보면MemberServiceImpl에서 MemberService로 향하는 화살표와 MemoryMemberRepository에서 MemberRepository로 향하는 화살표는 '구현 관계'를 나타낸 듯하고, AppConfig에서 MemberServiceImpl과 MemoryMemberRepository를 향하는 화살표는 '의존 관계'를 나타낸 듯하고, MemberServiceImpl에서 MemberRepository를 향하는 화살표는 '연관 관계'를 나타낸 것처럼 보이는데요 연관 관계 화살표로 표현된 MemberServiceImpl에서 MemberRepository로 향하는 관계는 의존 관계라고 봐도 되나요? MemberServiceImpl이 MemberRepository를 의존하고 있으니깐.. 연관 관계 화살표로 표현된 이유가 궁금합니다. 제가 UML 다이어그램을 제대로 공부하진 않았는데 의존 관계 주입에서의 의존 관계와, UML 다이어그램에서의 의존 관계는 조금 다른 건가요?
- 해결됨스프링 핵심 원리 - 기본편
스프링 컨테이너 생성 시 DI 컨테이너를 인스턴스로 생성하지 않고 .class로 생성하는 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 강의 내용 중 아래의 방법으로 스프링 컨테이너를 생성할 수 있었습니다.ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);그런데 AnnotationConfigApplicationContext는 new를 통해 런타임 시점에 초기화가 되는데 AppConfig는 왜 new AppConfig()가 아닌 AppConfig.class 로 클래스 명세만을 필요로하는지 궁금합니다.가령 아래와 같이 AppConfig를 런타임 시점에 생성하여 Bean을 등록하는 것도 가능해야 할 것 같은데 AppConfig.class로 스프링 컨테이너를 생성할 시 어떤 이점이나 효과가 있어서 AppConfig 인스턴스를 통해 스프링 컨테이너를 생성하는 것을 제한하였는지 궁금합니다.ApplicationContext applicationContext = new AnnotationConfigApplicationContext(new AppConfig());
- 미해결스프링 핵심 원리 - 기본편
AutoAppConfig 역할
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]new AnnotationConfigApplicationContext(AutoAppConfig.class);코드가 실행되면서 AutoAppConfig 자체가 빈으로 등록이 되면서 AutoAppConfig빈은 @ComponentScan이라는 어노테이션을 써주면서 컴포넌트를 스캔하는 역할을 하게 되는건가요?즉, AutoAppConfig빈은 ComponentScan라고 생각해두 되나요?