묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
코드가 완전히 같은데 한쪽은 오류가 발생하고 다른쪽은 오류가 발생하지 않습니다.(git push하고 git clone한 코드결과가 다릅니다)
왼쪽과 오른쪽은 완전히 동일한 코드입니다. 오른쪽 컴파일러 코드를 깃 push해서 올리고 다른폴더에 git clone해서 실행한게 왼쪽 컴파일러 입니다. (추가적으로 인텔리제이로도 프로젝트를 비교해 봤는데 소스코드에 관해선 동일합니다) 그런데 도대체 왜 오른쪽은 오류가 뜨고 왼쪽은 오류가 뜨지 않는지 궁금합니다. 오류 내용은 맨 아래에 있고 test core에 contextLoads에서 발생한 내용입니다. 오류 내용으로 보건데 memberImple에서 memberRepository의 의존성을 주입하는데 memberRepository랑 MemoryMemberRepository두개의 빈이 존재해서 둘 중 어떤걸 써야 할 지 모르겠다 라는 것 같습니다. 코드는 아래랑 같은데 이게 원래 저 오류가 뜨는게 맞는건지 아닌지도 잘 모르겠습니다. 혹시 이게 롬복관련 강의진행하고 컴퓨터를 다른 컴퓨터로 다시 옮겨서 진행해서 롬복때문인가 싶어서 셋팅도 하고 컴파일러도 껐다가 켜봤습니다. appconfig에서 MemberRepository가 등록이 되고 AutoAppConfig에서 MemoryMemberRepository가 등록이 되는것 같은데 이름이 다르니까 싱글톤이 적용이 안되는것 같고 이게 MemberServiceImpl 에서 @Autowired로 DI되면 둘 중 어떤걸 해야하는지 모르니까 오류를 내뱉는것 같은데 제가 생각한게 맞는지 궁금합니다.제가 생각한게 맞다면 왜 왼쪽은 성공했는지틀렸다면 어디가 어떻게 틀렸는지 중간에 싱글톤 개념같이 언급한 부분은 맞는 생각인지왜 왼쪽은 성공하고 오른쪽은 틀렸는지이렇게가 궁금합니다.추가로 오른쪽 컴파일러에서 원래 실습에서 진행한 테스트 코드에서는 오류가 안뜨고 core에서만 오류가 떴는데 오류가 왜 뜨는지 시험해 보다가 test()테스트케이스를 만들어서 한개의 스프링 컨테이너에 appconfig랑 autoappconfig랑 둘 다 불러오니 거기서 core랑 똑같은 오류가 나서 위에 말한대로 생각한것 입니다. package hello.core; import hello.core.member.Member; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; @Configuration @ComponentScan( // basePackages = "hello.core.member", default는 1번째 줄에 있는 패키지 경로 excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { // @Bean(name ="memoryMemberRepository") // MemberRepository memberRepository(){ // return new MemoryMemberRepository(); // } }package hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository; import hello.core.order.OrderService; import hello.core.order.OrderServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public MemberRepository memberRepository() { System.out.println("call AppConfig.memberRepository"); return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy() { //return new FixDiscountPolicy(); return new RateDiscountPolicy(); } @Bean public MemberService memberService(){ System.out.println("call AppConfig.memberService"); return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService(){ System.out.println("call AppConfig.orderService"); return new OrderServiceImpl(memberRepository(), discountPolicy()); } }package hello.core.member; import lombok.Getter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Getter @Component public class MemberServiceImpl implements MemberService{ //Test용도 private final MemberRepository memberRepository; @Autowired public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } @Override public void join(Member member) { memberRepository.save(member); } @Override public Member findMember(Long memberId) { return memberRepository.findById(memberId); } }package hello.core.member; import java.util.HashMap; import java.util.Map; import org.springframework.stereotype.Component; @Component public class MemoryMemberRepository implements MemberRepository{ private static Map<Long, Member> store = new HashMap<>();//실무에선 컨커뤈트 해쉬맵? 사용함 동시성 이슈 @Override public void save(Member member) { store.put(member.getId(),member); } @Override public Member findById(Long memberId) { return store.get(memberId); } }
-
미해결김영한의 실전 자바 - 기본편
9.상속.pdf 26페이지에 주석 질문이요
저 주석은 잘못된거죠?
-
미해결스프링 핵심 원리 - 기본편
OrderServiceTest 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요. OrderServiceTest 클래스 질문이 있습니다.MemberServiceImpl 객체와 OrderServiceImpl 객체는 서로 의존성이 없어보이는데, 각각의 객체 내부에 존재하는 MemberRepository를 어떻게 공유하는지 궁금합니다. 정확히는 createOrder() 테스트 함수 내부에서 memberService.join(member)을 했을 때, 이후 orderService.createOrder() 메서드 내부에서 memberRepository.findByID()를 통해 멤버를 어떻게 찾아내는 것인가요?
-
미해결스프링 핵심 원리 - 기본편
build.gradle에 롬복 추가할 때 dependencies 관련 질문드립니다
롬복 기능 추가할 때 build.gradle의 dependencies에 implementation 'org.projectlombok:lombok' 이 한 줄만 넣어줘도 롬복이 기능하는데 문제가 없는데 강의에서는 아래와 같이 여러 줄의 코드를 추가해줬습니다. 단순히 implementation만 추가해주는것과 강의에서 제시한 아래의 코드가 서로 어떻게 다른 건지 알 수 있을까요?//lombok 라이브러리 추가 시작 compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' //lombok 라이브러리 추가 끝참고로 스프링부트 버전은 3.2.1 입니다.
-
해결됨스프링 핵심 원리 - 기본편
섹션7. 조회한 빈이 모두 필요할 때, List, Map
AllBeanTest에서@Autowired 어노테이션을 붙일 경우에, 빨간 밑줄이 생기면서, Autowired members must be defined in valid Spring bean (@Component|@Service|...) 이런 경고 문구가 뜹니다.실제로 해당 어노테이션을 붙이던 안붙이던 동일한 결과가 출력이 되는데 이유를 알 수 있을까요? public class AllBeanTest { @Test void findAllBean() { ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class); } static class DiscountService { private final Map<String, DiscountPolicy> policyMap; private final List<DiscountPolicy> policies; @Autowired 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); } } }
-
해결됨스프링 핵심 원리 - 기본편
@Autowired 필드명으로 빈 조회하기
섹션 7에서 "@Autowired 필드명" 강의를 듣고 있습니다.AutoAppConfigTest에서 아래와 같은 에러가 발생합니다.org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [/Users/a/Desktop/study/spring-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 single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy 질문 게시판에 있는 글들도 읽어봤는데 따로 해결방법을 못찾겠습니다.아래는 관련 코드들 캡쳐해서 첨부합니다.
-
해결됨김영한의 실전 자바 - 기본편
진짜 사소한 교재 오류 관련 질문입니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]정말 사소하긴 합니다만, 교재에도 강의 화면에도 출력 예시에 큰따옴표가 포함되어있는데, 강의 화면과 제공된 소스 코드에는 큰따옴표와 이스케이프 시퀀스가 포함되어있지 않아 아래 강의 화면처럼 큰따옴표가 출력되지 않을 것 같습니다. 별로 중요한 건 아니니 교재 파일을 수정하는 것이 어떨까요...? 사소해서 죄송합니다...
-
해결됨스프링 핵심 원리 - 기본편
조회빈이 2개 이상있을때 @Autowired를 사용시에 생성자에서 발생하는 오류
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]조회빈이 2개 이상일때 @Autowired 어노테이션이 붙은 생성자가 의존성을 주입할시에 처음에는 타입으로 주입시도하고 아닐경우에 필드명으로 주입을 시도한다고 하는데요. 필드명을 주입하려는 구현체랑 맞추더라도 같은 에러가 발생하는데요 혹시 해당 이슈에 대해서 업데이트 된 부분이 있을까요 ? 혹시나 필드명을 제가 잘못입력했을까봐 에러 로그에서 복사해서 실행해도 같은 증상이 나타압니다. 다음은 에러 코드입니다.org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'orderServiceImpl' defined in file [/Users/choehyeonseong/Desktop/project/spring/core/out/production/classes/hello/core/order/service/OrderServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: fixDiscountPolicy,rateDiscountPolicy 다음은 생성자 부분입니다. @Autowired public OrderServiceImpl(MemberRepositroy memberRepositroy, DiscountPolicy rateDiscountPolicy/*autowired등록시에 처음에 타입으로 조회 다음에 필드 변수명으로 매칭한다.*/) { System.out.println("1. OrderServiceImpl.OrderServiceImpl"); this.memberRepositroy = memberRepositroy; this.discountPolicy = rateDiscountPolicy; }
-
미해결스프링 핵심 원리 - 기본편
애플리케이션 실행 시점에 오류발생 부분 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의 마지막에 오류가 발생되는 이유를 myLogger 클래스의 @Scope("request")는 request가 존재해야 빈을 생성할 수 있는데 request가 존재하지 않기 때문에 빈을 생성할 수 없기 때문이다 라고 이해하는 것이 맞을까요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
변수 명명 규칙 강의 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]변수 명명 규칙강의 3:57에 첫 글자 소문자 시작인데 대문자 시작이라고 말씀 하셨네요!..
-
해결됨C개발자를 위한 최소한의 C++
문자열 필터 실습 코드 중 질문 드립니다.
안녕하세요. 강의 잘 보고 있습니다.실습 중 궁금한 것이 있어서 질문 남깁니다.CMyStringEx::onSetData 함수 내용입니다.void CMyStringEx::onSetData(const char*& param) { CMyString::onSetData(param); // 생략 if (param != nullptr) { if (strcmp(param, "멍멍이아들") == 0) { // delete [] param; param = "우리귀요미"; } } }param이 가리키고 있는 곳의 데이터가 "멍멍이아들" 문자열이면 "우리귀요미"라는 새 문자열이 담긴 주소로 바꿔주기 전에 기존 param이 가리키고 있는 곳을 delete 해줘야 메모리 누수가 발생하지 않을 것 같은데 맞나요? 만약 1번이 맞아서 delete를 한다면 CMyString::~CMyString() 소멸자가 호출될 때 문제가 발생할 것 같은데 이를 어떻게 해결하면 될까요?
-
해결됨김영한의 실전 자바 - 기본편
접근제어자
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]접근제어자를 공부하던 도중 Speaker 클래스 예제를 통해 변수에 privet를써러 외부 호출을 막는 경우를 보았습니다. 근데생성자에서 볼륨이 100보다 크게 만들어도사진과 같이 볼륨이 200이 되었습니다.이러한 경우 생성자 클래스안에이렇게 바꿔도 되는지? 아니면 다른 방법이 있는지 궁금합니다.
-
해결됨김영한의 실전 자바 - 기본편
코드위에 뜨는 글씨 없앨 수 있는 방법
강의에서 설명해주시는 영한쌤 화면에는 저기 보이는 '4 usages'글자가 안보이던데, 저는 코드를 작성할때 계속 뜨더라구요. 저걸 숨길려면 어떻게 설정해야할까요??
-
해결됨김영한의 실전 자바 - 기본편
this 코딩 스타일? 메서드 기능이 변경되는경우?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]void initMember(String nameParameter){ nameField = nameParameter;}이렇게 된 메서드가 기능의 오류가 있거나, 상급자의 명령으로 고치라고 해서 변경을 하였습니다. 근데 void initMember(String nameField){ this.nameField = nameField;}이런식으로 바꿔야 하는 상황이 생겼습니다.그럴 경우 어떻게 처리해야하는지 궁금합니다.this 라는 코딩스타일이 있다고 하였고 ide가 발달해서 안쓴다고 하였는데 메서드의 내에서 오류가 발생하거나 고치는 경우 흔하지는 않겠지만 이런식으로 바뀔수가 있을수도 있을것 같아서 질문을 드립니다.이런 경우로 바뀌는 경우가 있는지 만약에 이렇게 한다면 코드를 재수정해야는지 아니면 오래된 this.코딩 스타일이 나은지 궁금합니다.
-
미해결김영한의 실전 자바 - 기본편
인스턴스 생성에 대한 질문
User 클래스를 만들었고 ShoppingCart2에서 User클래스를 활용하기 위해서 user1이라는 인스턴스를 생성하였습니다. 그리고 User클래스에 있는 메서드를 활용하기 위해서 user1.을 하니 메서드가 나타나지 않았습니다.그 이유가 무엇때문인지 알 수 있을까요?(메인 메서드에서는 정상적으로 나타났습니다)
-
해결됨스프링 핵심 원리 - 기본편
@Configuration과 바이트코드 조작의 마법에 대해서 궁금한점이 있습니다.
현재 스프링 심화편을 다듣고나서 기본편 재복습을 하고있는데 @Test void configurationDeep() { ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); //AppConfig도 스프링 빈으로 등록된다. AppConfig bean = ac.getBean(AppConfig.class); System.out.println("bean = " + bean.getClass()); //출력: bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$bd479d70 }CGLIB객체로 호출이 된다고하셨는데 그러면 스프링 빈으로 등록되는 객체들은 무조곤 프록시 객체로 생성된다는 말씀이실까요?
-
미해결스프링 핵심 원리 - 기본편
BeanDefinition에 대해서 궁금한점이 있습니다.
AnnotationConfigApplicationContext의 경우 생성자로 들어온 파라미터의 값을AnnotatedBeanDefinitionReader로 읽은뒤 AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);AnnotationConfigApplicationContext은BeanDefinition에 대한 구현체를 주입받아서 사용한다라고 이해하면될까요?
-
미해결스프링 핵심 원리 - 기본편
결론적으로 DI를 관리하는 것은 AppConfig에서 하나요?
@Component 애노테이션을 사용하여 스프링 빈에 자동으로 클래스를 등록하고, 각 스프링 빈 간의 의존관계를 주입하는 방법에 대해 이해했습니다.의존관계 주입의 목적이, SOLID원칙에서 특히 DIP원칙을 위반하지 않기 위함이라고 생각됩니다. 추상화에 의존하고, 클라이언트 코드의 변경을 줄이기 위함입니다.그렇다면 실제 런타임에서 인스턴스(구현체)간의 의존 관계를 주입해주는 로직은 AppConfig에서 진행되는 건가요?@Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public DiscountPolicy discountPolicy() { return new FixDiscountPolicy(); } }위 코드는 기존에 사용하던 AppConfig클래스입니다. 여기서는 @Bean을 사용하여 수동으로 빈 등록을 해주므로 충돌이 존재할 것이라 무언가 수정이 필요하다고 생각되고 @Bean만 제거한 코드를 사용하면 되나요?생성자 주입을 통해 DI를 하는 것은 이해가 되었으나, AppConfig처럼 하나의 파일에서 런타임에 사용 될 의존관계를 정하는 코드가 궁금합니다
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
Scanner 파트에서 ScannerWhileEx3 변수 할당 관련
안녕하세요. 처음에int input = 0;여기서 변수를 선언하고 0으로 할당까지 했는데왜 input = scanner.nextInt(); 으로 다시 할당하는지 궁금합니다. 다시 할당하는 이유가 따로 있는 건가요?할당을 두 번씩 해도 괜찮은 건가요? 이미 비어있던 공간에 0이 들어가 있는데.. 코드가 잘 돌아가는거 보면 괜찮은거 같긴 한데 이해가 잘 안됩니다. int input = 0;을 지우고int input = scanner.nextInt(); 로 코드를 수정한 것도 잘 돌아가긴 하구요. java로 코딩 처음 배우는 왕왕초보입니다.왕초보 기준으로 설명해 주실 수 있을까요??ㅜㅜ
-
해결됨스프링 핵심 원리 - 기본편
@Autowired 필드명 매칭과 DIP
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]기존에 조회 빈이 두 개 이상일 때 구체 타입을 명시해서 주입받는 것으로 해결하는 것은 DIP를 위반해서 좋은 방법이 아니라고 설명해주셨는데 필드명 매칭도 결국 구체 타입에 의존(필드명=구체타입 이므로)하기 때문에 결국 DIP를 위반한 것으로 볼 수 있지 않을까요?