묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
bean 주입관련 로그 출력이 안됩니다...
[질문 내용]‘스프링 핵심 원리 - 기본편’커리큘럼의 섹션3 ->스프링으로 전환하기 강의에서, 4분 56초쯤 보시면 런타임 후에 bean등록하는 내용을 설명해주시는데요.저는 해당 로그가 출력이 안됩니다 ㅠ참고로 JDK17버전, springframework.boot는 3.3.1버전으로 프로젝트를 생성했습니다…그리고 혹시 Preferences의 build, run설정이 IntelliJ IDEA로 해놔서 그런가? 해서 gradle로 바꿔서 Refresh하고 재런타임해봤는데도 동일했고요…또 챗지피티로 검색해서나온 제가 올린 이미지의 3번내용 vm option를 부여해봐도 안됩니다…물론 기존 비슷한 질문에 대해 해결책으로 낮은 버전으로 하면 된다고 되어 있는데 어차피 버전 상관없이 로그출력될수있도록 설정이 맞춰져있다면 출력이 되어야 하는거잖아요..? 그래서 지금 진행하는 버전으로 시도해보고 싶어서요... 어떻게 해야 해결이 될까요..?https://drive.google.com/file/d/1XNU4xQnzjefJlXhUMkGRNKzQ_aT02-yJ/view?usp=drive_link해당 프로젝트의 공유파일링크입니다. 접근권한에 대해 docs내용에 해당 공유부여자의 이메일이 안나와있어 공유대상자를 추가하진 못했습니다. 댓글로 말씀주시면 바로 접근권한 부여드리도록 하겠습니다.
-
미해결
스프링 빈 등록
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); }실무에서 활용할 때 이 두 함수 관련해서 주의점이 있을까요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
스프링빈과 의존관계에서 방법의 차이가 무엇인가요
스프링 빈과 의존관계에서, (1)컴포넌트 스캔과 자동 의존관계 설정 / (2) 자바 코드로 직접 spring 빈 등록하기총 2가지 방법으로 설명해주셨고 2가지 방법 모두 알아야한다고 말씀해주셨는데, 두 방법이 사용되는 상황이 다른가요?? 각 방법이 어떤 차이가 있고 장단점이 있다면 궁금합니다!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 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 접근 기술
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가 무슨역할인지 모르겠습니다 항상 답변해주셔서 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
@Configuration 없이 @Bean만 사용할 때에 대한 질문
안녕하세요! 진짜 영한님 강의는 최고네요. 감사합니다. 듣다가 질문이 생겼는데요. `@Configuration`을 주석처리하고 `@Bean`만 남겼을 때 빈으로 등록되긴 하는데 여러개가 등록(싱글톤 X)된다고 하셨잖아요. 여기서 헷갈리는 이유는, "Bean은 스프링컨테이너에서 관리되는 싱글톤 객체이다."라는 이론적 내용과, "같은 이름의 Bean이 여러개 생성되기도 한다"라는 이 강의의 실험 결과과 충돌해서인데요. 엄밀한 정리를 하고 싶어서 질문드려요. 일단은 "같은 이름의 Bean이 여러개 생성되기도 한다"가 먼저 가능성 측면에서 맞는 얘기고, "Bean은 스프링컨테이너에서 관리되는 싱글톤 객체이다."는 정상적(일반적)인 방식으로 Bean을 등록한다면이라는 전제가 깔렸을 때 맞는 얘기일 거로 생각 됩니다. 그럼, 아래 내용중에는 무엇이 맞는 걸까요? 영한님이 보여주신 실험처럼, `@Configuration`을 누락하면 동일한 Bean이 여러번 생성되는 경우가 있는데 이 때, 1. `memberRepository`라는 메서드가 3번이나 호출되었는데, 새로 생성될 때마다 기존에 먼저 생성되었던 빈을 덮어쓰기(override)한다. 고로 생성만 N번 될 뿐이지, 결과적으로는 스프링 내에서는 싱글톤으로 존재한다.(* 만일 이게 맞다면 컴파일타임/런타임 모두 에러가 안나고, 동작 자체에는 문제가 없겠네요. 리소스는 많이 잡아먹겠지만요.) 2. `memberRepository`라는 메서드가 3번이나 호출되어 총 3개의 인스턴스가 빈으로 각각 등록되었다. 고로 이름을 같지만 3개의 빈이 실제로 모두 존재한다. (* 만일 이게 맞다면, 이 경우 빈을 사용하기 위해 주입할 때 컴포넌트 스캔 결과, ConflictingBeanDefinitionException이 뜨게 되겠네요.) --- 앗. 질문이 잘못된 부분이 있어서 수정했습니다.
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
안녕하세요! 질문이 있습니다.
안녕하세요! 항상 좋은 강의 감사드립니다 :D 강의를 보면서 궁금한 점이 생겨 질문 드립니다. Spring bean 같은 경우에는 @Configuration 대상 클래스에 대한 프록시 객체를 생성하여 싱글톤을 보장하여 Spring container에서 관리된다는 것으로 배웠는데요. Servlet은 어떤식으로 Servlet Container내에서 싱글톤을 보장하는 것인가요??
-
미해결스프링 핵심 원리 - 기본편
안녕하세요! 질문이 있습니다.
안녕하세요! 영한님, 좋은 강의 감사드립니다 :) 강의를 수강하다가 궁금한 점이 생겨 질문드립니다. 스프링 빈이 스프링 컨테이너에 로딩되는 시점에 대한 궁금증인데요. 컴파일된 바이트 코드가 Class loader에 의해 JVM 내로 로딩되는 시점에 Spring container가 먼저 생성되고, @Bean이나 @Component 등의 어노테이션이 붙은 메서드나 클래스를 찾아서 객체(bean)를 생성한 이후에 Spring container 내에 등록 시키고, 의존관계를 주입해주는 등의 일련의 과정으로 동작하는 것이 맞을까요?
-
미해결스프링 핵심 원리 - 기본편
의존관계 자동 주입 - 조회한 빈이 모두 필요할 때, 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.각각의 의존관계를 쭉 주입 이렇게 이해를 했는데 맞을까요 ..? 각각의 매커니즘을 제대로 이해한 게 맞는지 의문이 들어 질문드립니다!