묻고 답해요
129만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결
스프링 빈 등록
public class AllBeanTest { @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); DiscountService discountService = ac.getBean(DiscountService.class); Member member = new Member(1L, "userA", Grade.VIP); int discountPrice = discountService.discount(member, 10000, "fixDiscountPolicy"); assertThat(discountService).isInstanceOf(DiscountService.class); assertThat(discountPrice).isEqualTo(1000); } static class DiscountService { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; public DiscountService(Map<String, DiscountPolicy> policyMap, List<DiscountPolicy> policies) { this.policyMap = policyMap; this.policies = policies; System.out.println("policyMap = " + policyMap); System.out.println("policies = " + policies); } public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); System.out.println("discountCode = " + discountCode); System.out.println("discountPolicy = " + discountPolicy); return discountPolicy.discount(member, price); } } } 이것들을 스프링빈으로 등록하면, 정확히 어떤 것들이 스프링 빈으로 등록되는건가요? 모든 필드, 메소드들이 다 등록되는건가요?
-
미해결스프링 핵심 원리 - 기본편
CoreApplication 실행시 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예강의초반의 설명에 따라 hello.core.CoreApplicaton을 실행하니MemberServiceImpl에서 생성자가 1개의 bean을 필요로 하는데 두개의 bean이 찾아졌다고 합니다. Description에따라 MemberServiceImpl, MemoryMemberRepository, AppConfig를 확인해보았지만강의와 다른 점을 찾지 못해 해결하지 못하였습니다. Action에 적힌 것처럼 @Primary를 붙이거나 @Qualifier을 붙여서 해결해야 하는 건가요?MemberServiceImplAppConfigMemoryMemberRepositoryAutoAppConfig
-
미해결실전! Querydsl
Projections.fields()와 Projections.bean() 질문입니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]>> 로컬 환경스프링부트 3.1.2hibernate-core 6.2.6안녕하세요!Projections.bean()은 setter를 이용해서 인스턴스를 만든다고 하셨는데, getter/setter를 전부 제거해도 테스트를 통과하고 인스턴스도 잘 초기화가 되어버렸습니다.좀 이상하기도 하고 bean()와 fields()가 동작 방식이 거의 같은 것 같아 확인해보니 new QBean<T>를 할 떄 fields()에는 fieldAccess 파라미터에 true를 인수로 넣는 차이밖에 없더라고요.public static <T> QBean<T> fields(Class<? extends T> type, Expression<?>... exprs) { return new QBean<T>(type, true, exprs); }라이브러리 코드를 보면fieldAccess가 true면 this.fields에 값을 바인딩하고 this.setters는 emptyList로 초기화하고 fieldAccess가 false일 경우 this.fields를 emptyList로 초기화하고 this.setters에 값을 바인딩하는데요.if (fieldAccess) { this.fields = initFields(bindings); this.setters = Collections.emptyList(); } else { this.fields = Collections.emptyList(); this.setters = initMethods(bindings); }실무에서 활용할 때 이 두 함수 관련해서 주의점이 있을까요?
-
미해결스프링 핵심 원리 - 기본편
Bean annotation 위치 질문
AppConfig.java에서 memberRepository와 discountPolicy에도 @Bean annotation을 붙이는 이유가 궁금합니다. 외부적으론 Service만 사용되고 Bean 로드 시에도 없어도 문제없이 실행되는것으로 보이는데, 특별한 이유가 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링빈과 의존관계에서 방법의 차이가 무엇인가요
스프링 빈과 의존관계에서, (1)컴포넌트 스캔과 자동 의존관계 설정 / (2) 자바 코드로 직접 spring 빈 등록하기총 2가지 방법으로 설명해주셨고 2가지 방법 모두 알아야한다고 말씀해주셨는데, 두 방법이 사용되는 상황이 다른가요?? 각 방법이 어떤 차이가 있고 장단점이 있다면 궁금합니다!
-
미해결스프링 핵심 원리 - 기본편
빈 Destroy관련 질문
안녕하세요. 강의를 듣다가 의문점이 들어서 질문 남깁니다. 지금까지는 빈의 스코프가 싱글톤으로 되어 있어 빈이 스프링 시작과 종료에 소멸 된다는 것까지 이해가 되었습니다. 그런데 싱글톤 스코프에서 Destroy 메소드를 어떤 상황에서 무엇을 위해 사용하지는 이해가 되지 않습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
코드로 직접 빈을 생성하는 부분에서 질문이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용] 먼저 좋은 강의 정말 감사하게 듣고 있습니다. @Configuration 어노테이션을 붙인 클래스에서 코드로 직접 빈을 생성하는 부분에 대한 질문입니다. @Bean public MemberService memberService() { return new MemberService(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } 이 부분에서 MemberService 객체와 MemberRepository 객체를 생성하면서 Bean으로 등록하는 것으로 보입니다. 그럼 memberService Bean은 memberRepository()를 호출하면서 Service 객체에 종속되는 MemberRepository 객체를 가지게 되고, MemberRepository Bean은 또 새로운 객체를 가지게 되어서, 결국 MemberRepository 객체가 두 개가 되는 게 아닌가요? (Service의 멤버로 하나, Repository Bean 하나) 강의 영상을 보니까 제 생각이 틀린 것 같은데, 이 부분에 대해 어떻게 작동하는 건지 이해가 잘 안 됩니다. 감사합니다.
-
해결됨스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Config를 이용한 Bean 수동 등록에서 Controller를 제외하는 이유
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요, 좋은 강의, 감사히 듣고 있습니다. SpringConfig 파일을 이용하여 Bean을 수동 등록하는 과정에서 Contorller가 제외되는 이유가 궁금하여 질문드립니다. 여기저기 찾아봤는데 만족할 만한 답변을 얻을 수 없어, 스스로 해석해보았습니다. 강의 내용을 바탕으로, Service와 Repository가 결국 의존성을 형성하는 주체가 Controller이기 때문에 Controller를 @Bean으로 수동 등록 하게되면, 각 클래스간의 의존관계가 어떻게 형성되는지, 무엇이 Controller인지를 Spring에서는 인지하지 못하기 때문이라고 생각했습니다. 이 부분이 맞는지, 다른 이유가 있다면 무엇인지 알려주시면 감사하겠습니다. 감사합니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Bean 등록해서 개발시 Around 컨디션, 그리고 Around(AOP) plugin
1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요! 너무 좋은 강의 완강 하면서 정말 재밌습니다. 다음 강의들도 정말 기대됩니다 :) 두가지 질문이 있어서 여쭤봅니다. 1. Around의 Parmeter AOP를 이용할 때, Bean 등록을 해서 이용했을때, 에러가 나서 질문 목록을 찾아보니, 다른 질문자분께서 이미 Around의 컨디션을 코딩해두셨더라고요 (조성백님의 AOP SpringConfig @Bean으로 등록시 에러) 그 글을 참고하고, Around에 Parameter(?)를 업데이트 해준 후에, 에러 없이 동작시킬 수 있었습니다. @Around("execution(* hello.hellospring..*(..)) && !target(hello.hellospring.SpringConfig)") public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { ... } hello.spring 패키지에 모두 적용되고 까지는 이해 되었는데 !target.... 이 부분이 어떻게 연관이 되었는지 궁금합니다. 또 이렇게 Around를 이 형식으로 해주어야만 빈등록을 해서 사용할 수 있는것인가요? 왜 Component 를 사용해서 Run 했을때와는 다른지 궁금합니다. 2. 두번째 질문은, 제 IntelliJ에서는 영한님처럼 Around안쪽 String이 하이라이트 되지 않고 syntax가 인식되지 않는것처럼 나오는데요(Around 안쪽 스트링이 모두 한 스트링으로, intelliJ default 초록색으로 보여집니다), 혹시 어떤 Plugin을 써야하거나 세팅을 다르게 해주어야하나요? 다시한번 좋은 강의 감사드립니다!
-
미해결스프링 핵심 원리 - 기본편
.class 의 의미
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요. getBean() 인수에서 타입을 작성할 때 예를들어 MemberRepository . class 라고 넘기는데 여기서 .class 라고 쓰는 이유가 있나요 파라미터에서 .class가 무슨역할인지 모르겠습니다 항상 답변해주셔서 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
26:30에 대한 질문
필드주입이나 세터주입에서 Autowired해주는 게 아니면 생성자주입때만 Autowired를 생략할 수 있다고 앞서 말씀하셨는데, 26:30에 나오는 건 어떻게 Autowired 없이 빈 주입이 가능했던 걸까요?!
-
미해결스프링 핵심 원리 - 기본편
@Configuration 없이 @Bean만 사용할 때에 대한 질문
안녕하세요! 진짜 영한님 강의는 최고네요. 감사합니다. 듣다가 질문이 생겼는데요. `@Configuration`을 주석처리하고 `@Bean`만 남겼을 때 빈으로 등록되긴 하는데 여러개가 등록(싱글톤 X)된다고 하셨잖아요. 여기서 헷갈리는 이유는, "Bean은 스프링컨테이너에서 관리되는 싱글톤 객체이다."라는 이론적 내용과, "같은 이름의 Bean이 여러개 생성되기도 한다"라는 이 강의의 실험 결과과 충돌해서인데요. 엄밀한 정리를 하고 싶어서 질문드려요. 일단은 "같은 이름의 Bean이 여러개 생성되기도 한다"가 먼저 가능성 측면에서 맞는 얘기고, "Bean은 스프링컨테이너에서 관리되는 싱글톤 객체이다."는 정상적(일반적)인 방식으로 Bean을 등록한다면이라는 전제가 깔렸을 때 맞는 얘기일 거로 생각 됩니다. 그럼, 아래 내용중에는 무엇이 맞는 걸까요? 영한님이 보여주신 실험처럼, `@Configuration`을 누락하면 동일한 Bean이 여러번 생성되는 경우가 있는데 이 때, 1. `memberRepository`라는 메서드가 3번이나 호출되었는데, 새로 생성될 때마다 기존에 먼저 생성되었던 빈을 덮어쓰기(override)한다. 고로 생성만 N번 될 뿐이지, 결과적으로는 스프링 내에서는 싱글톤으로 존재한다.(* 만일 이게 맞다면 컴파일타임/런타임 모두 에러가 안나고, 동작 자체에는 문제가 없겠네요. 리소스는 많이 잡아먹겠지만요.) 2. `memberRepository`라는 메서드가 3번이나 호출되어 총 3개의 인스턴스가 빈으로 각각 등록되었다. 고로 이름을 같지만 3개의 빈이 실제로 모두 존재한다. (* 만일 이게 맞다면, 이 경우 빈을 사용하기 위해 주입할 때 컴포넌트 스캔 결과, ConflictingBeanDefinitionException이 뜨게 되겠네요.) --- 앗. 질문이 잘못된 부분이 있어서 수정했습니다.
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
안녕하세요 영한님 @Transactional 및 open에 관하여 질문이 있습니다.
안녕하세요 영한님! 강의 내용을 코틀린 기반으로 작성해보고 있는데요! 조금 다른 부분들이 있긴 하지만 여러 리서치를 해보며 정상 동작하는 것들을 확인했는데 굉장히 특이한 문제를 만나서 조언을 구하고자 질문 드립니다. MemberService의 MemberRepository를 SpringConfig에서 의존성 주입을 해준 뒤 실제 메서드에서 해당 repository를 호출해보니 repository가 null이어서 접근할 수 없다는 메시지와 함께 에러가 발생하였습니다. 이에 대해 조금 조사해 본 결과 @Transactional를 추가하게 되면 구성된 의존성에 접근이 되지 않는 문제가 있었습니다. 그러나 이 생성자에서 받아온 의존성을 open 제한자로 변경하여 받아오면 접근이 되는 기묘한 현상이 발생하더군요! 관련해서 해결책을 찾은 경로는 여기였습니다. https://stackoverflow.com/questions/41298289/spring-boot-autowired-with-kotlin-in-service-is-always-null 혹시 강의 내용과는 조금 차이가 있지만 왜 이런 현상이 발생하는지 알 수 있을까요? 강의 너무 잘 듣고 있습니다. 항상 감사합니다!
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Bean 등록시 EntityManager 오류 질문드립니다.
안녕하세요. 핵심원리를 듣고 이번 강의를 들으면서 배운 것을 적용하려고 시도해보았습니다. Service interface와 Repository interface를 생성하여, componentscan을 사용하여 빈을 등록하려고 했습니다. 기존 service와 repository를 Impl로 바꾸어 @Component 어노테이션을 붙여 의존관계를 자동 주입하려고 했습니다. ``` @Component@Transactionalpublic class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository; @Autowired public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } ``` @Componentpublic class MemoryMemberMemberRepository implements MemberRepository { @PersistenceContext private final EntityManager em; @Autowired public MemoryMemberMemberRepository(EntityManager em) { this.em = em; }@Configuration @ComponentScan( excludeFilters = @ComponentScan.Filter(classes=Configuration.class))public class AppConfig {} @Testpublic void 회원가입() throws Exception{ //given AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); 해당 코드를 테스트를 시도하였지만 No qualifying bean of type 'javax.persistence.EntityManager' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {} 이라는 오류가 발생하였습니다. 개념이 많이 부족하여 질문을 제대로 했는지도 정확하지않고, 해당 오류가 왜 나는지 잘 모르겠습니다 ㅠㅠ
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요! 질문이 있습니다.
안녕하세요! 항상 좋은 강의 감사드립니다 :D 강의를 보면서 궁금한 점이 생겨 질문 드립니다. Spring bean 같은 경우에는 @Configuration 대상 클래스에 대한 프록시 객체를 생성하여 싱글톤을 보장하여 Spring container에서 관리된다는 것으로 배웠는데요. Servlet은 어떤식으로 Servlet Container내에서 싱글톤을 보장하는 것인가요??
-
미해결스프링 핵심 원리 - 기본편
안녕하세요! 질문이 있습니다.
안녕하세요! 영한님, 좋은 강의 감사드립니다 :) 강의를 수강하다가 궁금한 점이 생겨 질문드립니다. 스프링 빈이 스프링 컨테이너에 로딩되는 시점에 대한 궁금증인데요. 컴파일된 바이트 코드가 Class loader에 의해 JVM 내로 로딩되는 시점에 Spring container가 먼저 생성되고, @Bean이나 @Component 등의 어노테이션이 붙은 메서드나 클래스를 찾아서 객체(bean)를 생성한 이후에 Spring container 내에 등록 시키고, 의존관계를 주입해주는 등의 일련의 과정으로 동작하는 것이 맞을까요?
-
해결됨스프링 핵심 원리 - 기본편
AppConfig가 왜 실행되는지 궁금합니다.
안녕하세요 선생님 AppConfig.class관련하여 질문드리려고 합니다. 해당 영상에서 7:12부분에 call AppConfig.memberRepository call AppConfig.memberService callAppConfig.orderService 이 세라인이 호출되는 것을 볼 수 있습니다. 허나, 7:12까지의 상황은 AutoAppConfig.class에서 다른 클래스의 @Configuration이 선언된 모든 @Bean객체를 만들지 않는 것으로 알고 있습니다. @Configuration@ComponentScan( excludeFilters = @ComponentScan.Filter (type = FilterType.ANNOTATION, classes = Configuration.class))public class AutoAppConfig {} 따라서, AppConfig.class도 @Configuration이 정의 되어 있으므로 Bean객체를 만들지 않는 것으로 이해했습니다. 그런데 보시는 바와 같이 call AppConfig.memberRepository call AppConfig.memberService callAppConfig.orderService 이 세라인이 호출되는데... 왜 호출되는건지... 궁금합니다... 답변주시면 정말 감사드리겠습니다. 추가로, 선생님 강의 정말 감사드립니다. 요즘 정말 개발에 흥미를 느끼고 하루하루 알아가는 즐거움에 살고 있습니다. 선생님 덕에 개발에 흥미를 붙일 수 있어서, 정말 감사한 마음 뿐입니다. 이렇게 좋은 강의를 널리 알려주셔서 정말 감사드립니다. 앞으로도 좋은 강의 많이 부탁드리겠습니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
의존관계 자동 주입 - 조회한 빈이 모두 필요할 때, List, Map
안녕하세요 영한님 제목에 있는 강의를 듣던 도중 궁금 한 것이 생겨 질문 남깁니다. 다름이아니라 아래와 같이 코드를 구성하였을 때 DiscountService는 AnnotationConfigApplicationContext에 넣어줌으로써 Bean으로 등록 된다는 것은 이해가 됩니다. 하지만 DiscountService 클래스에 있는 policyMap 과policyList는 제 생각으로는 아무것도 등록이 안되어있는 것이 맞을 텐데 어떻게 FixDiscountpolicy와 RateDiscountPolicy가 들어가는지 이해가 잘 되지 않습니다. 이 필드들은 각각 Map과 List이고 제네릭(?)만 DiscountPolicy 인데 스프링 컨테이너가 "음 Map 과 List 가 DiscountPolicy로 표현이 되었네? 그럼 내가 DiscountPolicy 타입으로 된 Bean이 있나? 아 ! AutoAppConfig에서 ComponentScan으로 해보니까 FixDiscountpolicy, RateDiscountPolicy가 있네? 그럼 그냥 이거 넣어야 겠다." 이런 메커니즘으로 동작하는 것인가요?
-
미해결스프링 핵심 원리 - 기본편
빈 생성과 의존관계 주입시점에 대하여
헷갈리는 부분이 있어서 과정을 제대로 이해한게 맞는지 궁금합니다! A빈을 먼저 접근하고, A가 B를, B가 C를 의존한다는 가정입니다. 생성자 주입은 객체를 생성하면서 자연스럽게 생성자를 부르니까 1.A빈을 등록하기 전, 생성자의 파라미터에 있는 인자 B가 빈으로 등록됐는지 확인 2.B가 빈 등록이 되어있으면 의존관계 주입, 안되어 있으면 그 B를 찾아감 3.B빈을 등록하기 전, 생성자의 파라미터에 있는 인자 C가 빈으로 등록됐는지 확인 4.C가 빈 등록이 되어있으면 의존관계 주입, 안되면 C로 찾아감 5.C빈은 주입할 의존관계가 없음으로 C빈 등록 6.B빈 등록, C의존관계 주입 7.A빈 등록, B의존관계 주입 이렇게 이해를 했고 수정자 주입이나 필드 주입의 경우 1.A빈을 B빈이 없어도 우선 등록 2.B빈을 C빈이 없어도 우선 등록 3.C빈을 등록 4.각각의 의존관계를 쭉 주입 이렇게 이해를 했는데 맞을까요 ..? 각각의 매커니즘을 제대로 이해한 게 맞는지 의문이 들어 질문드립니다!