묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
싱글톤의 DIP 위반
다른 질문들에서 해답을 찾지 못해 질문을 올립니다. AppConfig의 memberService()에서 return new MemberServiceImpl(memberRepository()); 대신에 return new MemberServiceImpl.getInstance();로 사용하는 것은 클라이언트가 구현체(싱글톤객체)에 의존하게 되므로 DIP가 위배된다 라는 것이 강의의 내용인데요..AppConfig와 같은 구성에 사용되는 클래스는 어쩔 수 없이 구현체에 의존을 해야만 하는 것 아니었나요?실제로 싱글톤 사용 전인return new MemberServiceImpl(memberRepository());방식에서도 MemberServiceImpl이라는 구현체를 의존하고 있었고 이전까지의 내용에서는 이를 두고 DIP를 위반한다고 보지는 않았던 거 같은데 말이죠.오랜만에 공부하려니 쉽지가 않네요.. 답변 부탁드립니다 ㅠ ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ ( 자답 )혹시 아래 내용이 맞는지 확인 부탁드립니다. 싱글톤 반영 전에는 AppConfig에서 return new MemberServiceImpl(memberRepository());를 통해 MemberRepository의 구현체까지 AppConfig 내부에서 모두 결정됨. 즉, 클라이언트 (MemberServiceImpl) 가 MemberRepository의 구현체에 의존하지 않음 -> DIP 충족인 것이고,싱글톤 반영 후 AppConfig에서 return MemberServiceImpl.getInstance()할 경우 클라이언트 (MemberServiceImpl)의 내부 코드에서 다시 MemoryMemberRepository.getInstance() 를 호출해야한다.즉, 클라이언트가 구현체에 의존하게 된다.-> DIP 위반 제가 너무 AppConfig 안에서만 생각해서 인지부조화가 발생한 것 같은데.. 이렇게 받아들이는게 맞을까요?
-
미해결스프링 핵심 원리 - 기본편
getId()를 찾을 수 없다고 나옵니다.
안녕하세요. 아래 이미지와 같이 수행 했을 때 getId()가 자꾸 오류가 발생하는데 어떻게 해결 해야 되는지 문의드립니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
객체지향 마무리 질문있습니다.
class Marine { public: // 특정 마린 객체에 종속적 int _hp; void TakeDamage(int damage) { _hp -= damage; } static void SetAttack() { s_attack = 100; } // 특정 마린 객체와 무관 // 마린이라는 '클래스' 자체와 연관 static int s_attack; // 설게도 상으로만 존재 }; int GenerateId() { // 생명주기 : 프로그램 시작/종료 (메모리에 항상 올라가 있음) // 가시범위 : // 정적 지역 객체 static int s_id = 1; return s_id++; } 강의에서 나오는 Marine클래스와 GenerateId()함수입니다. 강의 중 GenerateId()함수를 여러번 부를 경우 정적 지역 객체인 s_id가 계속해서 1로 초기화 되는 것이 아닌, 처음 함수를 부를 때만 1으로 초기화 되고 그 다음부터는 ++만 연산해서 1, 2, 3, ... 과같이 s_id가 계속해서 증가하는 모습을 보였습니다. 그래서 저는 Marine클래스의 SetAttack()도 처음에만 100으로 세팅해주는것인가? 라는 생각이 들어 Marine::SetAttack(); cout << m1.s_attack << endl; Marine::s_attack = 7; cout << m1.s_attack << endl; Marine::SetAttack(); cout << m1.s_attack << endl; 이렇게 실행해 보았으나, 출력이 100 7 100으로 다시 초기화가 된 것을 확인하였습니다. 왜 SetAttack()은 부를때마다 초기화가 진행되고 GenerateId()는 그렇지 않은 것인가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
service와 controller의 역할에 대한 질문이 있습니다.
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]service와 controller의 역할에 대한 질문이 있습니다. 강의를 듣고 활용해던 도중 의문점이 생겼습니다. 한참 찾아봤는데 아직도 모르겠어서 질문드립니다. 저의 기존 코드에서는 어떤 컨트롤러의 post 요청에서 A,B,C 엔티티가 반드시 순서대로 생성된후 저장되어야 합니다. (참조관계 떄문에 그렇습니다) 기존에 저는 컨트롤러에서 A 엔티티 생성 -> AService.createA() 한 후 B, C도 동일한 과정을 거칩니다. 이러니까 컨트롤러가 서비스의 역할을 해버린다고 생각했습니다. 그래서 컨트롤러는 그냥 dto를 넘겨주고 서비스에서 위의 작업을 하려했습니다. 그랬더니 몇가지 문제가 생겼습니다. 1. service에서 repository만을 사용하면 코드 중복이 심함(create 할때 복잡한 중복검증 로직이 있는대, 그것까지 전부 다시 해야함) 2. service에서 service를 주입받아서 하자니 순환참조, 나말고 코드 이해도 낮은 다른사람이 손대면 실수할 가능성 높음 등등의 문제가 생김 그래서 그냥 원래대로 냅두려니 controller가 너무 크고 service가 하는게 그냥 repository로 요청 보내기인 경우가 대부분임 그래서 질문은 1. 적절한 방법이 뭘까요? 2. 복잡하고 큰 규모의 서버 코드를 보고싶은데 좋은 예시를 어디서 찾을수 있을까요? 3. 제가 해결방법으로 여러 service를 주입받아서 사용만하는 service를 만들어서 컨트롤러에 있던 코드를 거기로 옮겨서 컨트롤러에 비즈니스 로직이 생기는걸 없에고 순환참조, 코드 중복 등을 제거 해봤는데 이게 맞는건가요? 4. MSA와 상관있는 문제일까요?
-
미해결스프링 핵심 원리 - 기본편
도메인 설계를 잘하고 싶어요 (학습에 대한 고민 상담)
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예...아니오...애매합니다ㅠㅠ2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 아니오3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 선생님의 강의를 재밌게 듣고 있습니다. 백엔드에 대한 기초 지식 하나 없다가 자바 기본서 하나 읽고 바로 선생님의 강의를 들었어요. 그래서 중간에 많이 버벅대긴 하지만 레고를 맞추는 듯 즐겁게 진행중입니다. '주문과 할인 도메인 설계' 까지 선생님꽈 쭉 공부를 진행하던 중... 고민이 생겼는데요, 분명 선생님의 설명을 들으면 설계가 정말 기가 막히게! 이해가 되지만, 스스로 설계를 해볼 수 있겠나? 물으면 대답을 못하겠어요. 알고리즘에 대한 공부를 제대로 안 하고 바로 넘어와서 이런 걸까요? 사실 프로그래밍을 배우면서 늘 '보면 이해 되는데 직접 못하겠어' 라고 느낀 적이 상당히 많았는데요... 여태까진 이 막막함을 견디고 하다보면 뭔가 나중에 이해가 되긴 되었지만. 가끔 너무 막막할 땐 어떻게 해야 할지 모르겠네요. 학습을 할 때 나무가 아닌 숲을 바라보는 어떤 비결이 있을까요? 학습법에 대해 조언을 구하고 싶습니다! 선생님의 강의를 좀 더 제대로 곱씹고 이해하고 싶어요. 좋은 강의 감사합니다! 덕분에 저 꽤 멀리까지 왔어요ㅎㅎ 선생님 강의를 듣다가 문득 뒤를 돌아보면 정말 깜짝 놀란답니다!
-
해결됨스프링 핵심 원리 - 기본편
커스텀 어노테이션을 클래스 형태로 등록하는 이유
안녕하세요 강의에서 직접 애노테이션(MyIncludeComponent, MyExcludeComponent) 을 인터페이스로 선언한다고 배웠습니다. 그런데 테스트코드 ComponentFilterAppConfigTest 클래스의 @ComponentScan 내부에서는 MyIncludeComponent.class 로 등록하더라구요, 인터페이스로 선언했는데 왜 .class 를 붙여 등록하는지 궁금합니다..!
-
미해결스프링 핵심 원리 - 기본편
Bean 메타정보 관련 동작, 스프링 컨테이너에 등록되는 과정이 궁금합니다.
안녕하세요. 항상 양질의 답변 글을 달아주셔서 너무 감사합니다. 다름이 아니라 이전 강의를 복습하면서, 제가 궁금한 부분이 있어 질문 드리고 싶어 글을 적습니다. Bean Definition을 통해서 스프링 컨테이너에 등록되는 과정이 궁금한데, 한번 이런 흐름으로 가는데 틀린 부분이 없는지 봐주실 수 있을까요? 전체 흐름이 맞는지, 그리고 각 과정에서 잘못 알고 있는 부분은 없는지 한번 알려주시면 감사하겠습니다. 1. 스프링부트가 시작되면 @Configuration이 붙은 AppConfig 클래스를 자동으로 스캔해서 스프링 컨테이너에 넣는다 2. 스프링 컨테이너, 여기서는 ApplicationContext의 구현체인 AnnotationApplicationContext가 AppConfig.class 정보를 AnnotatedReader를 통해서 읽은 다음 @Bean이 붙은 Bean Definition을 만든다. 3. 만들어진 Bean Definition을 AnnotationApplicationContext에서 읽어서 빈 객체를 생성해서 내부 빈 저장소에 저장한다. 이 때, 각 메서드는 @ComponentScan에서 생성자 주입과는 다르게 동작한다 (생성자 주입은 빈 객체를 생성하면서 의존관계 주입 설정 완료) 4. 의존관계 주입 단계에서 각 Bean Definition을 참고해서 Bean 간의 의존 관계를 설정해준다. 이 때, 생성 방식은 Bean Factory Interface의 구현체인 AnnotationContext로 했기 때문에 Bean Factory Method 방식으로 Bean Definition이 생성되었다. 앞뒤 내용을 조합해보면, 이렇게 될 것 같은데.. 혹시 틀린 부분이 없을지 같이 한번 봐주실 수 있으실까요? 항상 많은 가르침 주셔서 너무 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
Proxy Mode 객체 관련 문의드립니다.
안녕하세요. 항상 좋은 답변 주셔 감사합니다. Proxy Mode 객체 관련 문의드릴 것이 있어 질문글을 적습니다. 영한님께서 강의 중에 Proxy Mode 객체는 계속 생성이 되니, 싱글톤 스코프처럼 사용 시 문제가 발생할 수 있으니 주의를 해야한다고 말씀을 해주셨는데... 조금 헷갈려서.. 관련해서 질문드리고 싶습니다. 1. Proxy Mode를 사용했을 때, CGLIB를 활용한 빈 객체는 스프링 컨테이너가 생성될 때 최초로 단 한 번만 생성된다. 프록시 객체가 호출되면, 호출될 때 마다 진짜 객체를 만든다. 위의 내용처럼 이해를 하는 것이 맞을까요? 그리고 싱글톤 스코프처럼 사용 시 문제가 발생할 수 있다는 것은 프록시 객체는 단 한번 생성되나, 진짜 객체는 매번 생성되고 소멸되니 그것에 대한 COST가 비싸다는 것으로 이해를 하면 될까요? 2. 이 강의해서 사용된 REQUEST 스코프의 동작 방식이 궁금합니다. 사용된 코드 동작방식을 보면 HTTP REQUEST가 들어오면 REQUEST SCOPE 객체를 만들고 나갈 때까지객체를 유지하고, 나간다면 다음으로 들어온 HTTP REQUEST를 입력받아서 동작하는 것처럼 보입니다. 즉, 항상 HTTP REQUEST SCOPE 객체는 스프링 컨테이너에 하나만 존재하는 것처럼 보입니다. 그런데 예를 들어 정말 동시에 HTTP REQUEST가 들어오면, 어떻게 동작하는지 알 수 있을까요? 동시에 들어오면 HTTP REQUEST SCOPE 빈이 스프링 컨테이너에 다수 개가 생성될 것 같아서... 기존에 컨트롤러와 서비스가 동작하던 것처럼 동작하지 않을 것 같습니다. 항상 좋은 답변 달아주셔서 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
static class의 생성자 주입 의존관계 주입 관련
안녕하세요, 항상 강의 잘 보고 있습니다. 강의 복습하던 도중, 도무지 동작이 이해가 안되는 부분이 있어 문의드리고자 글을 적습니다. static class DiscountService { private final Map<String, DiscountPolicy> discountPolicyMap; private final List<DiscountPolicy> discountPolicyList; // AutoWired를 활용한 주입. public DiscountService(Map<String, DiscountPolicy> discountPolicyMap, List<DiscountPolicy> discountPolicyList) { this.discountPolicyMap = discountPolicyMap; this.discountPolicyList = discountPolicyList; } 문의 드리고자 하는 부분은 위의 생성자 부분입니다. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); 위처럼 DiscountService.class를 AnnotationConfigContext에 등록하면, 스프링 컨테이너에서 DiscountService.class에 대한 스프링 빈을 등록하는 것으로 알고 있습니다. DiscountService의 생성자를 통해 스프링 빈을 등록할 때, discountPolicyMap, discountPolicyList는 어디서 주입을 받는지 모르겠습니다. 왜냐하면 다른 클래스 코드에서 @ComponentScan을 통해서 등록하는 것은 FixDiscountPolicy, RateDiscountPolicy 빈 객체를 등록하는 것이지 MAP 혹은 LIST 형태로 빈 객체를 등록하지 않는 것으로 알고 있기 때문입니다. 그렇다면 지금 스프링 컨테이너의 빈 저장소에는 FixDiscountPolicy와 RateDiscountPolicy만 빈 객체로 저장이 되어있을텐데, 이 녀석들이 어떻게 discountPolicyMap 형태로 변경이 되어서 생성자 주입이 되는지 동작을 세분화해서 알려주시면 너무 감사드리겠습니다. 항상 좋은 답변 주셔서 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
AutoAppConfig에서 @Configuration을 @Component로 해도 무관한가요?
안녕하세요 ! AutoAppConfig 클래스에서 @Configuration을 사용하는 이유가 너무 궁금했는데, 이전에 질문글에 답변을 보고 @ComponentScan 기능이 AutoAppConfig 클래스가 스프링 빈으로 등록돼야 활성화 되기 때문이라고 이해했습니다. (@Configuration 내부에 @Componet가 있기 때문에) 질문 1. 보통 애노테이션을 사용할 때 @Service, @Controller처럼 내부에 들어있는 기능은 비슷하지만 해당 클래스가 가진 역할을 명시하는 역할도 하는 것 같아요 ! AutoAppConfig도 사실 @Component를 사용해도 되지만 개발자들이 더 명시적으로 이해할 수 있도록 @Configuration을 사용하게 된건가요? (이전 강의를 통해서 스프링 빈을 컨테이너에 등록해서 싱글톤을 위함인 이유는 알고 있습니다 ㅎㅎ , 그런데 @Bean을 사용해도 싱글톤이 유지되는데 @Configuration을 사용하는 이유는 잘 모르겠네요.. ㅠㅠ 이것또한...명시적인 이해를 위함일까요??) 질문 2. CoreApplication 클래스 즉, 실행 클래스에 @SpringBootApplication 애노테이션 내부를 보면 @ComponentScan이 있는데요 ! AutoAppConfig에서 @ComponentScan을 해준 이유는, 스프링 빈을 등록할 범위를 제한하기 위함이었나요? ㅎㅎ 사실 처음에는, @ComponentScan을 하게되면 스프링 컨테이너에 @Component가 붙은 클래스가 스프링 빈으로 등록되는데, AutoAppConfig에서 컴포넌트 스캔 어노테이션을 붙이게 되면, 해당 클래스에 빈이 등록되는..터무니 없는 생각을 하게 되었습니다 ㅋㅋ... 보통 실무에서 @Configuration @ComponentScan 조합을 사용하는지, 아니면 CoreApplication에서 @SpringBootApplication 애노테이션으로 빈을 등록하게 되는 경우가 많은지 궁금하네요 ㅎㅎ 혹시 제가 언급한 것 중에 잘못된 지식이 있다면 가감없이 지적 부탁드리겠습니다 !! 긴 글 읽어주셔서 감사합니다 ㅎㅎ
-
미해결스프링 핵심 원리 - 기본편
findById(Long memberId)가 궁금합니다
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 안녕하세요 선생님 강의 즐겁게 잘 보고 있습니다! 4:40부터 회원저장소와 회원서비스 인터페이스에 메서드를 작성하는 것부터 흐름이 진행되기 시작하는 곳을 무작정 외우려다가 이해하고 싶어서 질문드립니다. 1. Member의 getId()를 쓰지않고 findById()를 쓰신 이유가 궁금합니다. 2. 1이 어떻게 가능한건지 잘 이해가 가지 않습니다. 저의 어떤 기초지식이 부족해서 이해를 못하는 건지 파악이 안 되는 상황이고 도움을 요청드립니다
-
미해결스프링 핵심 원리 - 기본편
프로토 타입 스코프 강의 질문 있습니다.
1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요, 강의 내용 중에 이해가 가지 않는 부분이 있어 질문드리고자 질문 글을 작성했습니다. @Scope("singleton") static class SingletonBean{ @PostConstruct public void init(){ System.out.println("SingletonBean.init"); } @PreDestroy public void destroy(){ System.out.println("SingletonBean.destroy"); } } 안녕하세요, 강의 내용 중 이해가 가지 않는 부분이 있어 문의드리고자 글을 작성했습니다. 위의 코드는 싱글톤 스코프로 테스트 코드를 작성하는 강의 내용입니다. 제가 이해가 잘 되지 않는 부분은 테스트 코드에 어노테이션으로 싱글톤 스코프를 단 것이 어떻게 ComponentScan의 대상이 되는지 이해를 할 수 없어서입니다. 수업에서 Component Scan으로 읽어온다고 설명해주셔서 더 의문이 있습니다. 앞에서 배웠을 때는 AutoAppConfig 같은 class를 따로 만든 후, 해당 클래스에 ComponentScan을 위한 값을 설정하고, 그 Scan을 바탕으로 @Component 어노테이션을 포함한 것들을 자동으로 Scan해서 빈을 등록하는 것으로 이해하고 있습니다. 하지만 위의 코드는 테스트 코드 자체에 어느 곳에도 ComponentScan이 들어가지 않았는데, 어떻게 ComponentScan으로 자동 빈이 등록되는 것인지 과정을 자세히 알려주실 수 있으실까요? AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class); 강의 중에는 위의 코드에서 클래스 명을 직접 넣는 것 자체가 ComponentScan이라고 하신 것 같은데, 앞선 강의에서 @Configuration + @Bean을 직접 등록하거나, @ComponentScan을 직접 등록한 것과 비교했을 때 ApplicationContext를 만드는데 코드상 차이점이 없어 보입니다. 혹여나 질문 내용이 잘 이해가 안되시면 피드백 주시면, 좀 더 내용을 보완해서 다시 한번 질문글 적겠습니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
조회한 빈이 모두 필요할때 ( Map, List) 질문사항
static class DiscountService { private final Map<String, DiscountPolicy> policyMap; // map으로 모든 DiscountPolicy 하위 구현체들 주입받기 @Autowired public DiscountService(Map<String, DiscountPolicy> policyMap) { this.policyMap = policyMap; }} DiscountPolicy의 구현체에는 fixDiscountPolicy, RateDiscountPolicy가 존재합니다.Map을 이용해서 이 두가지 구현체를 모두 주입 받는 방법이 강의내용이였는데, 어떤 원리로 이게 다 주입되었는지 모르겠습니다.단순히 Map, List처럼 배열(?) 자료형으로 DiscountPolicy(인터페이스)를 주입받으면 스프링에서 알아서 모두 주입해주는것인가요?질문 내용을 정리하지면,생성자를 통해서 주입한 policyMap변수에 어떻게 2가지 객체가 주입되었는지 모르겠고, 자세히는 Map의 String 키값이 어떻게 빈이름으로 저장되고, 벨류가 2가지 각 개체의 참고값을 저장한건지 모르겠습니다..ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
TestConfig에 @Configuration 빠져도 싱글톤으로 관리되는 이유
안녕하세요 1.싱글톤관련되서 스프링컨텍스트에서 빈을 싱글톤으로 관리하려면 클래스에 @Configuration을 붙여야하는데 TestConfig클래스에 이 애노테이션을 붙이지 않아도 싱글톤으로 관리되는지 궁금합니다.결과론적으로는 붙이지 않아도 싱글톤으로 관리되는데 왜 그런지 궁금합니다 static class TestConfig { -> 아래처럼 되어야 싱글톤으로 관리할수 있는게 아닌지요? @Configuration static class TestConfig { 2. 다른 테스트코드에서 사용되는 static config 클래스에는 @Configuration을 붙였는데 여기만 뺀 이유가 있는지요?
-
미해결스프링 핵심 원리 - 기본편
프로젝트
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요 좋은 강의 너무 진짜 감사드립니다 마무리를 하면서 야생형코스에서 프로젝트를 해보는것이 좋다고 말씀하셨는데 해보는 범위는 프론트부터 백엔드(디비)까지 다 포함해서 말씀하신건지와 추천해주실만한 프로젝트가 있을까요?
-
미해결스프링 핵심 원리 - 기본편
필드 주입의 문제점에 대해 궁금한게있습니다.
20:20 정도부터 나오는 필드주입에서 궁금한점이 있습니다. 김영한님 말씀중에선 강의예제중, @Autowired private MemberRepository memberRepository;@Autowired private DiscountPolicy discountPolicy; 위처럼 필드주입을 하게되면 memberRepository 나discountPolicy 의 값을 변경할수없고 테스트코드에서 순수한 자바로 테스트할수있는 방법이 없다고 하셨습니다. 그런데 제 생각으로는 그렇게 생각하면 기본방법인 생성자 주입도 결국 생성되고나면 변경할수없고 순수한 자바로 테스트할수있는 방법이 없는것 같다고 생각이 되었습니다. 왜냐면 둘다 현재 수동설정이 아닌 어노테이션을 통한 자동설정으로 이루어지고있으므로 무얼 넣어줄지는 해당 구현체의 어노테이션을 추가,삭제해주지않는이상 바꿀수 없다고 생각했기 때문입니다. 이부분에대해서 설명주시면 감사하겠습니다!
-
미해결스프링 핵심 원리 - 기본편
싱글톤컨테이너의 싱글톤 방식에 대해 질문있습니다!
싱글톤 컨테이너의 방식에 궁금한점이 있어 질문드립니다 스프링 컨테이너를 통해 수많은 회원들의 요청이 들어와도 같은 빈객체를 주게된다고 들었습니다. 그렇다면 똑같은 객체를 사용하게되면 모든 회원들이 처음 등록된 빈의 같은 회원정보를 사용하게되어 내 회원정보가 이상하다거나 계산내역이 기존사람의것이 되는등등 문제가 발생되는것이 아닌가요?
-
미해결스프링 핵심 원리 - 기본편
@RequiredArgsConstructor , @Primary 질문있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 영한님 항상 좋은강의 감사합니다 다름이아니라 질문이있는데 @Component를 FixDisCountPolicy와 RateDisCountPolicy 둘다 주어졌을때 오류가 발생하는데 이때 OrderServiceImpl에는 @RequiredArgsConstructor를 붙이고 DiscountPolicy중 우선순위를 가질것에 @Primary를 붙이는 즉@RequiredArgsConstructor,@Primary 두가지만 사용하면 코드의 수정없이 가장 효율적이라고 생각되는데 제 생각이 맞는지 궁금합니다
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔 관련 질문
@Component 를 붙인 것들은 모두 @ComponentScan의 자동 빈 등록의 대상이 됩니다. 그런데 basePackageClasses 의 범위가 있다면 해당 패키지 내부에서만 빈 등록 대상을 찾게됩니다. 1. @SpringBootApplication 에는 이미 @ComponentScan이 있습니다. 해당 부트의 basePackageClass 를 변경하지 않는 한 임의의 Configration 내부에 Bin 을 쓰든 Component 안에 Bin을 주입하든 사실상 이미 부트가 모든 Component 를 관리하고 있어서 위 시점에서는 수동 주입한다는 개념이 없는것이 맞는건가요. 2. 위 질문과 비슷한 질문인데요.. 제가 임의의 스프링부트에 Aconfig 와 Bconfig 를 만들었다고합시다. 그리고 동일하게 컴포넌트 스캔을 이용하여 각각 다른 패키지를 basePackageClass 를 지정했다고 한다면 이게 어떤 의미가 있는걸까요? @SpringBootApplication 에는 디펄트로 하위 모든 컴포넌트를 찾아서 자동등록을 하는데..
-
미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔관련 질문드립니다 ㅎㅎ
안녕하세요~~ 강의 잘 보고있습니다. 최고의 강사!! 궁금증이 생겨서 질문 드립니다 ㅎㅎ @SpringBootApplication이 붙은 CoreApplication을 통해 동작하면 ComponentScan을 하는데 AppConfig와 AutoAppConfig의 @Configuration이 붙어있잖아요,, @Configuration을 따라 들어가니까 @Component가 있어서 아 그럼 얘도 컴포넌트 스캔 대상이구나 라고 생각했어요. 그래서 여기서 더 나아가서 생각해보니까 복잡해졌는데요,,, AppConfig와 AutoAppConfig 둘 중 컨테이너에 등록하는 순서가 있나요??? 왜이런 질문이 나왔냐면,,, 강의내용 코딩따라했을 때 코드 기준으로 AppConfig는 excludeFilters가 없고 AutoAppConfig에는 excludeFilters로 @Configuration 애노테이션 등록된것을 제외하였는데 먼저 등록하는 순서라는게 존재한다면 순서에 따라 먼가 다를것 같습니다... AppConfig먼저 1. AppConfig의 빈등록절차 진행 2. AutoAppConfig의 빈등록절차를 진행하려고 보니까 @Configuration이 붙은애들을 제외 시켰네? 이미 @Configuration이 붙은 AppConfig빈등록 다 해놨는데 어쩌지 가 될 것 같아서요,,,, AutoAppConfig먼저 1. AutoAppConfig의 exclude로 Configuration했으니 "@Configuration붙은애들 진행시키지마" 가 되겠고 2. 컴포넌트 스캔으로 @Component붙은것들(@Repository, @Controller, @Component 등) 빈등록진행, AutoAppConfig에 @Bean이 붙은 애들 빈등록 3. AppConfig 빈등록 제외 이렇게되면 깔끔하게 너 하지마 이것만 한다 라는 먼가 질서가 생기는데 제가 너무 깊이 생각했나 싶어요,, 죄송합니다 헷갈림으로 인해 헷갈리고 헷갈려서 헷갈려요,,,