월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 기본편
5분대부터 말씀하신 테스트에 대한 질문
안녕하세요 영한님. 강의 너무 잘 듣고 있습니다.다름이 아니라 강의 듣다가 테스트 코드의 중요성을 말씀해주셨는데, 궁금한 점이 있어서요 단위 테스트를 작성하는 것이 좋다단위 테스트는 스프링이나 DB를 활용하는 것이 아니다이렇다면, 단위 테스트할 때는 Fake 객체를 사용해서 단위테스트를 작성해야 하는 걸까요? 인터페이스로 역할과 구현이 분리된 상태에서 MemberRepository의 구현체를 프로덕션에서 사용하는 MemoryMemberRepository, 테스트 환경에서 사용할 FakeMemberRepository로 분리해서 사용하는 걸까? 하는 궁금함이 있어 여쭈어봅니다 항상 좋은 강의 감사합니다!!
- 미해결스프링 핵심 원리 - 기본편
10분쯤 에러....
뭐가 문제일까요?? 해결하고 집에 가고 싶어요ㅠㅠㅠ
- 미해결스프링 핵심 원리 - 기본편
다양한 의존관계 주입 방법에서 AutoAppConfigTest를 실행하면,
왜 OrderServiceImpl 가 실행되나요?? memberService가 실행되고 끝 아닌가요?
- 해결됨스프링 핵심 원리 - 기본편
강의 7분,9분에서 출력이 안돼요
김영한 강사님처럼 system.out.println 결과가 안 뜹니다
- 미해결스프링 핵심 원리 - 기본편
static 영역 및 객체 생성
강의자료에 'static 영역에 객체 instance를 미리 하나 생성해서 올려둔다.'라고 되어있는데요. heap 영역에 SingletonService 인스턴스를 생성하고 이 인스턴스에 주소값이 static 영역에 저장된다는 말이 맞을까요?? static 변수라도 객체 인스턴스는 heap 영역에 저장되는게 맞을까요?
- 해결됨스프링 핵심 원리 - 기본편
컴포넌트 스캔 getBean()에 관한 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.각 구현 클래스에 @Component 표기하고 테스트 코트에서 AutoappConfig를 설정 정보로 입력하는 것까지는 이해가 갑니다. 다만 , @Bean과 다르게 @Component는 각 구현클래스에 작성했는데 getBean에 왜 (MemberService.class)가 들어가고 검증코드 또한 MemberService.class인지 이해가 가지 않습니다.
- 미해결스프링 핵심 원리 - 기본편
13분 에러나요......
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [C:\Users\songsyl\Desktop\study\core\out\production\classes\Hello\core\order\OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'Hello.core.discount.DiscountPolicy' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}원인이 뭘까요?
- 미해결스프링 핵심 원리 - 기본편
Eclipse에서 public @Bean method 창
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.Eclipse를 사용 중인데, public method를 Bean으로 지정해줄 때마다 이런 창이 뜨면서 public을 지워도 된다는데, 그 지워도 되는 정확한 이유가 궁금합니다. 제가 생각하기로는 빈 생성 시의 디폴트값이 public이라 그런 것 같은데 이게 맞는지도 궁금합니다.감사합니다!
- 해결됨스프링 핵심 원리 - 기본편
Bean Configuration / Dependency Injection 에 관해 질문드립니다 :)
안녕하세요 영한님,Dependency Injection에 관해서 궁금한점이 있어 질문드립니다. 제가 실무중이나 code review중에 아래같은 코드를 자주봤는데 지금까지는 그냥 그런가보다 하고 넘어갔지만, 그래도 강사님께 좀 자세한 mechanism을 들으면 좀더 개념확립에 도움이 될것같아서 질문드립니다.//SecretVault.java @Component public class SecretVault { private final String secret = "Secret123"; public SecretVault() { } public String getSecret() { return this.secret; } } //SecretService.java public class SecretService { private SecretVault vault; public SecretService() { } public SecretService(SecretVault vault) { super(); this.vault = vault; } public String revealSecret() { return vault.getSecret(); } } //CoreApplication.java @SpringBootApplication public class CoreApplication { public static void main(String[] args) { SpringApplication.run(CoreApplication.class, args); } @Bean SecretService secretService(SecretVault vault) { return new SecretService(vault); } } //테스트 클래스 //JUnit Test Pass //MiscTest.java @SpringBootTest public class MiscTest { @Autowired ApplicationContext ac; @Test void testSecret() { SecretService service = (SecretService) ac.getBean("secretService"); Assertions.assertEquals(service.revealSecret(), "Secret123"); } }테스트 결과, secretService bean안에 vault 필드가 제대로 주입되어있습니다. 빈 생성하는 method parameter가 spring이 관리하는 bean이면 저절로 찾아서 넣어주나요? 저는 method parameter bean이 같은 configuration 클래스 안에서 생성되었을 경우에만 가능한걸로 알았는데, 위 예제의 dependency injection이 어떻게 일어나는지 궁금합니다.
- 해결됨스프링 핵심 원리 - 기본편
테스트 오류 관련 질문
java.lang.IllegalStateException: Failed to load ApplicationContext for [MergedContextConfiguration@6c302a1d 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@b5cc23a, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@758f4f03, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@9cd25ff, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer@70ab80e3, org.springframework.boot.test.context.SpringBootTestAnnotation@699a8e45], 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:1625) 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:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'memberServiceImpl' defined in file [C:\Users\uniti\OneDrive\바탕 화면\Developer\Back End\Spring\core\basic\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 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 CoreApplicationTests 에서 위와 같이 오류가 납니다
- 해결됨스프링 핵심 원리 - 기본편
MemberApp, OrderApp에 의해 각각 두개의 스프링 컨테이너가 생성됐다 생각하면 될까요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요.전 섹터의 마지막강의 "스프링으로 전환하기"에서 스프링을 이용해 DI를 적용하면서MemberApp, OrderApp에 각각 ApplicationContext ac = new ... 를 사용했는데 이떄,MemberApp, OrderApp클래스 각각 서로 다른 스프링 컨테이너를 띄었다 생각하면될까요?
- 미해결스프링 핵심 원리 - 기본편
DIP구현 중, AOP과의 이슈가 발생하여 질문 드립니다
안녕하세요! 알려주신 내용을 바탕으로 제 개인프로젝트에 적용해서 리팩토링을 해보고있는데요! DIP를 위배하지않기위해@Getter @Configuration public class IamportConfig {@Value("${secret.sec.key}")private String secretKey ;@Value("${api.api.key}")private String apiKey ;@Bean public IamportClient iamportClient(){ return new IamportClient(apiKey, secretKey); } }이런식으로 IamportConfig를 선언해서 주입을 해주었고실제 코드에는private final PurchaseService purchaseService;private final ItemService itemService;private final IamportClient iamportClient;private final RedissonClient redissonClient;private final JwtUtil jwtUtil;private final IamportConfig iamportConfig;이렇게 선언했습니다!이후 @PostMapping("/api/payment/cancel") private boolean cancelPayment(@RequestBody RefundRequestDto refundRequestDto) throws JsonProcessingException { RestTemplate restTemplate = new RestTemplate(); String url = "https://api.iamport.kr/payments/cancel"; // 요청 파라미터 설정 MultiValueMap<String, String> formData = new LinkedMultiValueMap<>(); formData.add("impUid", refundRequestDto.imp_uid()); formData.add("checksum", String.valueOf(refundRequestDto.checksum())); formData.add("reason", refundRequestDto.reason()); // 요청 헤더 설정 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); String token = getAccessToken(new PaymentRequestDto.getToken(iamportConfig.getApiKey(), iamportConfig.getSecretKey())); headers.set("Authorization", "Bearer " + token); // 요청 객체 생성 HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers); // 요청 보내기 ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class); // 응답 처리 if (response.getStatusCode() == HttpStatus.OK) { // 각 아이템에 대해 수량 롤백 진행 purchaseService.rollbackItemsQuantity(refundRequestDto.imp_uid()); // 주문 상태 변경 purchaseService.ChangeStatusToCancelled(refundRequestDto.imp_uid()); return true; } else { return false; } } 이런 코드를 사용하는과정에서 String token = getAccessToken(new PaymentRequestDto.getToken(iamportConfig.getApiKey(), iamportConfig.getSecretKey()));이부분의 iamportConfig 가 null로 나오는 문제가 발생했습니다.다방면으로 답을 찾아보다가 AOP를 전부 주석처리하니까 해결되더라구요. 그래서 AOP의 적용범위에서 해당 컨트롤러를 제외시켰는데 해결이 되었습니다.이를통해 좀 알아보니까 AOP가 실행되는 시점은 새로운 PaymentRequestDto 인스턴스가 생성되기 전 이므로AOP 프록시 객체가 cancelPayment를 감쌀때 PaymentRequestDto는 null이게 된다.(AOP 로직이 @Value로 주입된 프로퍼티 값에 접근하기 전에 실행되어 값을 정상적으로 참조할 수 없는 상황이 발생)라는 결론에 다다르게 되었는데, 제가 잘 이해한게 맞을까요?...!
- 해결됨스프링 핵심 원리 - 기본편
스프링 빈 상속 관계에서 6분쯤 라이브코딩하는데
강사님과 똑같이 쳤는데 빨간줄이 뜨네요 뭐가 문제일까요?
- 미해결스프링 핵심 원리 - 기본편
김영한 선생님 인텔리제이 테마 설정 질문입니다
스프링 잎사귀모양이랑 클래스마다 C로 표시되게 하는 테마는 어떻게 설정할 수 있을까요? 얼티밋에서만 가능한 설정이더라도 알려주시면 감사드리겠습니다.
- 해결됨스프링 핵심 원리 - 기본편
수동 빈 등록 VS 자동 빈 등록
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]수동 빈 등록 VS 자동 빈 등록을 테스트 하던 과정 속에의문점이 생겨서 질문 드립니다!AutoAppConfig를 설정 정보로 스프링 컨테이너에 넘기면1. @CompoentScan으로 @Compoent가 붙은스프링 빈들이 컨테이너에 등록 생성자 주입을 하고 있으니DI가 필요한 클래스들은 스프링 빈 등록과 동시에 DI이때 MemoryMemberRepository는memoryMemberRepository라는 이름으로 빈 등록2. AutoAppConfig에서 팩토리 메서드 방식으로수동 스프링 빈 등록 과정 진행 이때 이름을 memberRepository2 , memberRepositorymemoryMemberRepository이렇게 3번 메서드 이름을 바꿔서 진행했습니다.처음 memberRepository2로 실행했을 때는expected single matching bean but found 2: memoryMemberRepository, memberRepository2이런 에러가 발생했습니다.memberRepository와 memoryMemberRepository는에러 발생 x 수동 설정에서 생성한 객체가 사용된다는우선순위 테스트까지 완료memoryMemberRepository는 오버라이딩 된 상태memberRepository는 2개의 MemoryMemberRepository의 인스턴스가 있는 상태테스트 결과에 생기는 의문점은 자동 빈 등록 vs 자동 빈 등록에서는 이름이 같으면 에러가 발생하는데메서드 이름을 동일하게 하면 오버라이딩 된 상태로 스프링 빈에 등록 메서드 이름을 아예 다르게 하면 에러 발생이름을 부모 타입으로 캐멀 케이스를 지켜서 이름을 하면각각 다른 이름으로 같은 타입의 스프링 빈 생성왜 이런 결과가 나오는 걸까요?전부 오버라이딩 설정은 false로 진행했습니다.
- 해결됨스프링 핵심 원리 - 기본편
ac.getBean 관련 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요.MemberService memberService = ac.getBean("memberService", MemberService.class);MemberService memberService = ac.getBean(MemberService.class);이 두 코드엔 무슨 차이가 있는 건가요?위의 코드로 AutoAppConfigTest를 실행하면 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'memberService' available 오류가 뜨고, 아래의 코드로 같은 테스트를 실행하면 통과합니다.
- 미해결스프링 핵심 원리 - 기본편
싱글톤 컨테이너 섹션 중 5강
안녕하세요, 현재 섹션5 중 5강을 듣고 있습니다. 싱글톤 테스트 하던 도중 memberRepository 란 빈이 등록 되지 않았다는 오류가 발생했더라구요. 어디서 에러 생긴건지 알 수 있을까요? 아래는 제 깃입니다.https://github.com/bukwon/core
- 미해결스프링 핵심 원리 - 기본편
Map, List로 빈 조회 시 질문
안녕하세요 AllBeanTest에서 List랑 Map으로 AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); 여기서 FixDiscountPolicy랑 RateDiscountPolicy를 어떻게 스프링빈으로 등록하는지 이해가 되지않습니다. 4강 스프링 빈 조회 - 동일한 타입이 둘 이상 에서 동일한 타입의 스프링빈이 두개 이상일시 에러가 발생하고, 이를 방지하기위해 빈 이름을 지정하는걸로 나와있는데 어떻게 두개를 같이가져와 map. list에 저장 할 수 있는건가요? 그리고 rateDiscountPolicy에 @MainDiscountPolicy 어노테이션이 설정되있으면 FixDIscountpolicy대신 RateDiscountPolicy만 우선으로 가져오는걸로 이해를 햇었는데 제 생각이 어디가 잘못된건지 이해가 되지않습니다. ㅠ
- 미해결스프링 핵심 원리 - 기본편
컴포넌트 스캔의 싱글톤 관리 방식
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 에3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 김영한님 스프링 강의를 듣다가 궁금한점이 생겼습니다. 컴포넌트 스캔 방식이 아닌 직접(수동) 스프링 빈을 등록하는 방식은 설정 정보 클래스에 @Configuration 어노테이션이 붙어있지 않으면 싱글톤으로 관리가 안 되는 걸로 알고 있습니다. 그래서 @Configuration를 붙이면 그 설정 클래스를 CGLIB 라이브러리가 확장시켜서 싱글톤으로 관리하는 건데 이렇게 하면 설정 클래스 이름에 CGLIB가 붙죠 컴포넌트 스캔 방식을 활용하면 @Configuration을 안 붙여도 컴포넌트 붙은 클래스들을 자동으로 스캔해서 싱글톤으로 관리 해주는걸 확인했습니다. 그래서 @ComponentScan 이 붙은 클래스 또한 Test에서 실제 사용하는 클래스 이름을 꺼내보면 CGLIB 이름이 붙은 클래스일 거라고 예상을 했는데 예상과 다르게 보통 클래스들과 이름이 동일했습니다.제 추측은 @Component 어노테이션이 CGLIB라이브러리와 같은 역할을 하는 걸까? 라는 생각을 했는데 실제 컴포넌트 스캔 방식의 싱글톤 유지 방식은 어떤 걸까요?
- 해결됨스프링 핵심 원리 - 기본편
컨테이너 생성
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]여기에 질문 내용을 남겨주세요. 강의에서 AllBeanTest 클래스에서 스프링 컨테이너 생성할 때, 구성 정보로 AutoAppConfig.class 외에도 DiscountService.class를 넣어주셨습니다.이렇게 넣어준 이유는 AllBeanTest 클래스는 Test 코드로 AutoAppConfig의 하위폴더에 속하지 않아, 따로 DiscountSerVice.class를 구성 정보로 넣어주신건가요?의존관계 자동 주입 범위를 알고 싶습니다. 구성 정보로 넣은 클래스가 속한 폴더를 포함해 하위 폴더에서 Annotation을 알맞게 기입한 클래스를 빈으로 등록하고 의존관계를 주입시켜주는게 맞을까요? DiscountService 클래스는 자동등록을 통해 빈으로 등록된건가요? 아니면 수동 등록을 통해 빈으로 등록된건가요? 전자라면 왜 @Component가 없는지 후자라면 왜 @Bean이 없는지 알고 싶습니다.