월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 핵심 원리 - 기본편
AllBeanTest 결과가 안나옵니다???
테스트 결과 map과 list가 다 비어서 나오네요?AutoAppConfig.class를 AppConfig.class로 바꾸어도 결과가 똑같습니다.
- 해결됨스프링 핵심 원리 - 기본편
static inner class 관련 과거 질문 글을 보고 추가적으로 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]https://www.inflearn.com/questions/257297/testconfig-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90%EC%84%9C-static%EC%9D%84-%EB%96%BC%EB%B2%84%EB%A6%AC%EB%A9%B4 이 질문 글의 답변을 보고 저도 궁금한 점이 있습니다. 아마 이 질문과 관련된 코드는 아래 코드인 것 같습니다. public class ApplicationContextExtendsFindTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); . . . (생략) . . . @Configuration static class TestConfig { @Bean public DiscountPolicy rateDiscountPolicy() { return new RateDiscountPolicy(); } @Bean public DiscountPolicy FixDiscountPolicy() { return new FixDiscountPolicy(); } } } 답변 내용 중에 다음과 같은 내용이 있습니다. "Test 클래스 내 TestConfig 클래스에 static 키워드를 뺀다면 Test 클래스가 생성되어야 TestConfig를 사용할 수 있습니다. 그러나 Test 클래스 내에서는 이미 TestConfig가 생성되기도 전에 스프링 컨테이너에서 TestConfig 빈이 있는지 찾아오려고 합니다. 당연히 스프링에서는 그런 빈이 없다고 합니다." 여기서 스프링 컨테이너에서 TestConfig 빈이 있는지 찾아오려고 한다는 부분이 잘 이해가 안 됩니다. AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); 이 코드는 TestConfig를 빈으로 등록하는 거로 알고 있습니다. 그러면 TestConfig 빈이 있는지 찾는 거랑은 다르지 않나요?
- 미해결스프링 핵심 원리 - 기본편
IoC 컨테이너와 DI 컨테이너의 차이점
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]IoC 컨테이너와 DI 컨테이너의 차이점이 궁금합니다.IoC 기능의 대표 동작원리가 DI이다.라는 것은 구글링을 통해 알게되었습니다. 그렇다면 DI 컨테이너는 IoC 컨테이너의 하위 개념인가요?
- 해결됨스프링 핵심 원리 - 기본편
ac.close()를 호출하지 않고 프로세스가 종료될 때의 스프링 컨테이너
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]public class SingletonTest { @Test public void singletonBeanFind() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class); SingletonBean singletonBean1 = ac.getBean(SingletonBean.class); SingletonBean singletonBean2 = ac.getBean(SingletonBean.class); System.out.println("singletonBean1 = " + singletonBean1); System.out.println("singletonBean2 = " + singletonBean2); assertThat(singletonBean1).isSameAs(singletonBean2); //ac.close(); } @Scope("singleton") static class SingletonBean { @PostConstruct public void init() { System.out.println("SingletonBean.init"); } @PreDestroy public void destroy() { System.out.println("SingletonBean.destroy"); } } } 이 코드에서 ac.close() 부분을 주석 처리하고 실행하면 다음과 같이 SingletonBean.destroy는 출력되지 않습니다. 왼쪽에 SingletonTest를 누르든, singletonBeanFind()를 누르든 SingletonBean.destroy는 출력되지 않습니다. ac.close()를 호출하는 게 스프링 컨테이너를 종료하는 거라고는 알고 있는데 ac.close()를 호출하지 않더라도 테스트가 끝나면 알아서 스프링 컨테이너가 종료되고, 종료되기 직전에 종료 메서드도 호출될 거라고 생각했는데 왜 SingletonBean.destroy가 보이지 않는지 궁금합니다. ac.close()를 호출하지 않으면 프로세스 실행이 끝나기 전에 알아서 컨테이너를 종료시켜 주진 않는 건가요? 질문 쓸 땐 궁금했는데 막상 다 적고 나니깐 ac.close() 하지 않으면 스프링 컨테이너가 알아서 종료되지 않는 건 당연한 건가? 싶기도 하네요..
- 미해결스프링 핵심 원리 - 기본편
@Configuration과 싱글톤 강의에 대한 질문
안녕하세요 현재 싱글톤 강좌를 시청하고 있습니다.AppConfig에서 호출관계의 관한 싱글톤 확인 부분에 중 예외가 발생하였고 MemberServiceImpl OrderServiceImpl 확인을 했는데 어떤 부분에서 오류가 발생한지 잘 모르겠습니다. 예외는 다음과 같이 나왔으며org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'memberRepository' available아래는 MemberServiceImpl OrderServiceImp 그리고 테스트 코드입니다.public class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } @Override public void join(Member member) { memberRepository.save(member); } @Override public Member findByMember(String userId) { return memberRepository.findById(userId); } public MemberRepository getMemberRepository(){ return memberRepository; } }public class OrderServiceImpl implements OrderService{ private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) { this.memberRepository = memberRepository; this.discountPolicy = discountPolicy; } @Override public Order createOrder(String userId, String itemName, int productPrice) { Member member = memberRepository.findById(userId); int discountPrice = discountPolicy.discount(member , productPrice); return new Order(userId , itemName , productPrice , discountPrice); } public MemberRepository getMemberRepository() { return memberRepository; }void configurationTest(){ ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); MemberServiceImpl memberService = ac.getBean("memberService", MemberServiceImpl.class); OrderServiceImpl orderService = ac.getBean("orderService", OrderServiceImpl.class); MemberRepository memberRepository = ac.getBean("memberRepository", MemberRepository.class); MemberRepository memberRepository1 = memberService.getMemberRepository(); MemberRepository memberRepository2 = orderService.getMemberRepository(); System.out.println("memberService -> memberRepository = " + memberRepository1); System.out.println("orderService -> memberRepository = " + memberRepository2); System.out.println("memberRepository = " + memberRepository); }
- 미해결스프링 핵심 원리 - 기본편
싱글톤인데 다른 인스턴스가 조회되는 이유는 뭘까요?
싱글톤 테스트를 했는데요findByName()에서 생성한 memberService1, memberService2는 같은 인스턴스가 조회가 됩니다.그런데 findByType에서 생성한 memberService는 memberService1, memberService2와 다른 인스턴스가 조회 됩니다.AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);는 한번 선언됬는데.....테스트라서 그런가요? @Test @DisplayName("빈 이름으로 조회") public void findByName(){ MemberService memberService1 = ac.getBean("memberService", MemberService.class); System.out.println("memberService1 = " + memberService1); System.out.println("memberService1.getClass() = " + memberService1.getClass()); assertThat(memberService1).isInstanceOf(MemberService.class); MemberService memberService2 = ac.getBean("memberService", MemberService.class); System.out.println("memberService2 = " + memberService2); System.out.println("memberService2.getClass() = " + memberService2.getClass()); assertThat(memberService2).isInstanceOf(MemberService.class); assertThat(memberService1).isSameAs(memberService2); } @Test @DisplayName("빈 타입으로 조회") public void fineByType(){ MemberService memberService = ac.getBean(MemberService.class); System.out.println("memberService = " + memberService); System.out.println("memberService.getClass() = " + memberService.getClass()); assertThat(memberService).isInstanceOf(MemberService.class); }
- 해결됨스프링 핵심 원리 - 기본편
실패테스트 할 때 콘솔에 메세지 안 뜨나요?
그냥 성공하면 예외가 떴다고 생각하면 되나요? 콘솔창엔 따로 표시 안되는건가요?
- 미해결스프링 핵심 원리 - 기본편
싱글톤 패턴 코드
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. private static final SingletonService instance = new SingletonService(); 강의에서 설명하실때 위와 같이 작성을 하셨는데 final이 꼭 붙어야하는 것인지 잘 모르겠습니다.외부에서부터의 접근을 막기 위한 private접근 제어자와 공유 개념을 적용해야하는 static만 사용하더라도 싱글톤 패턴이 구현되지않을까싶습니다. 하나의 클래스에 하나의 인스턴스만을 가지게 해서 보통 데이터베이스 연결 부분에서 이렇게들 사용하는 것으로 알고 있는데 final을 꼭 붙여야 할까요?
- 미해결스프링 핵심 원리 - 기본편
OrderService의 createOrder()의 매개변수 타입 질문
OrderService.java의 createOrder()에서 memberId의 타입은 wrapper이면서 itemPrice의 타입은 기본형으로 하신 이유가 궁금합니다.제가 생각한 이유는 다음과 같습니다. (이글과 비교해서 작성하였습니다)클라이언트가 '회원가입하기' 버튼을 눌렀을 때 Member 객체가 생성되는데, 이때 memberId는 클라이언트가 정하는 것이 아닌 서버 내부적으로 정해지는 값이다. 따라서 Member 객체가 생성되는 시점에서 memberId는 정해지지 않았기 때문에 null이 들어가는 것이 적절하다. 즉, Member의 memberId에는 null이 들어있을 가능성이 있기에 createOrder()의 매개변수 타입도 long이 아닌 Long으로 하였다.반면, 상품 등록을 할 때 상품 가격은 반드시 입력되어야 하는(required) 필드이다. 따라서 '상품 등록하기' 버튼을 눌렀을 때 Item 객체가 생성되는데, 이때 상품 가격(itemPrice) 필드에는 값이 반드시 들어갈 것이기에 itemPrice 필드에 null이 저장된 Item 객체는 존재하지 않을 것이다. 따라서 Integer가 아닌 int 타입인 것이다.
- 미해결스프링 핵심 원리 - 기본편
getBeanDefinition() 메서드가 존재하지 않네요?
getBeanDefintionNames()하고 getBeanDefintionCount()두개 만 존재하는데 다른 메서드를 써야 하나요?
- 해결됨스프링 핵심 원리 - 기본편
싱글톤 빈과 request scope 빈
컨트롤러 빈은 싱글톤이고, 여기에 Provider로 매 클라이언트의 요청시마다 새로운 request scope빈을 생성해 주입해준다는 것 까지는 이해했습니다. 그런데 강의 7:40처럼 메서드 logDemo를 호출하는 메인 쓰레드를 sleep()하고 그 사이 여러번 요청을 했을때, 쓰레드가 깨어나면서 각 요청마다 새로운 request scope빈이 생성되고 다시 여러번 종료되는 것이 이해가 되지 않습니다. 컨트롤러 빈은 싱글톤이라, 다음번 새로운 request빈이 들어올 때까지는 전의 request빈의 주소값을 갖고 있을텐데 어떤 과정으로 싱글톤빈의 log-Demo실행 중 내부 주입되는 request빈이 교체될 수 있을까요? 컨텍스트 스위칭처럼 logDemo의 실행간 내부 주입되는 빈이 교체되는 건가요?
- 미해결스프링 핵심 원리 - 기본편
스프링전환 실행시 로그내용이 나오지 않네요?
스프링 전환 실행 후 실행창에 나오는(4분50초) 로그 내용이제 실행화면에는 안나오고 결과 값만 나오네요???코딩은 똑 같이 했고, 결과도 잘 나옵니다.== appConfig에 어노테이션도 다 달았습니다.
- 미해결스프링 핵심 원리 - 기본편
실제로도 수동빈을 작성할 일이 많이 있나요 ??
프레임워크라는 것을 생각해보면 스프링이 의도한대로 로직을 짜는게 잘 설계하는거라고 생각이 되는데, 그럼 수동빈을 설정할 일이 많나요? 그리고 그것도 좋은 설계인가요 ??
- 해결됨스프링 핵심 원리 - 기본편
오류
주문과 할인 도메인 개발 강의에서 아래와 같이 작성하였는데요. package hello.core.order; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPlicy; import hello.core.member.Member; import hello.core.member.MemberRepository; import hello.core.member.MemoryMemberRepository; public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository = new MemoryMemberRepository(); private final DiscountPolicy discountPolicy = new FixDiscountPolicy(); @Override public Order createOrder(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPolicy = discountPolicy.discount(member, itemPrice); return new Order(memberId, itemName, itemPrice, discountPolicy); } public DiscountPolicy getDiscountPolicy() { return discountPolicy; } } int discountPolicy = discountPolicy.discount(member, itemPrice);이 부분에서 변수 discountPolicy가 초기화되지 않았을 수 있습니다. 라는 오류가 뜹니다. 실제 이 부분 때문에 실행이 안되는데요.인터페이스를 초기화할 수 없어서 그런거 아닌가요..?저만 안되나요..?
- 미해결스프링 핵심 원리 - 기본편
메서드 추출 시, @NotNull 이 자동으로 붙습니다
윈도우에서 ctrl + alt + M 을 입력했을 때, 강의처럼 Extract Method 창이 뜨지 않고이렇게 바로 추출할 수 있게 나오는데 이 방법으로 생성을 하면 @NotNull 이 붙은 채로 같이 생성이 됩니다.붙이고 사용해도 되는걸까요?(+ 그리고 사진과 같은 방식 말고 강의에서처럼 타입같은거 바로 바꿔서 추출할 수 있게 하는 창을 띄울 순 없을까요? 이렇게 하니 static도 자동적으로 붙어버리네요)
- 해결됨스프링 핵심 원리 - 기본편
싱글톤으로 여러 사람의 정보를 어떻게 저장하나요 ?
싱글톤을 활용해서 개인정보 등을 저장한다고 하면 MemberService 객체 하나가 여러 사람들에게 사용되잖아요? 근데 어떻게 각각의 사람들의 객체를 생성해주며 그런 개인정보를 db에 저장할 수가 있는걸까요? DB에 저장할 때는 결국 객체 자체를 저장하지 않습니까? 근데 싱글톤은 객체가 1개라는 점이 너무 상반되어서 이해가 안되는 것 같습니다
- 해결됨스프링 핵심 원리 - 기본편
@Autowired 의존성 주입 궁금한
@Autowired private final MemberRepository memberRepository;private final MemberRepository memberRepository; @Autowired public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; }차이점을 잘 몰라서 그런데...의존성 주입 할때 아래 코드로 하는 이유가 무엇입니까?
- 미해결스프링 핵심 원리 - 기본편
DiscountPolicy는 웹앱 계층구조에서
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]DiscountPolicy는 비즈니스로직(할인)을 구현하였으니, 웹앱 계층구조에서 서비스 계층에 해당하는건가요??
- 해결됨스프링 핵심 원리 - 기본편
역할과 구현을 분리함으로 얻는 이점의 궁금함
안녕하세요! 이제 막 공부하기 시작했습니다. 공부 중에 궁금한 점이 생겨서 질문을 올립니다.예제 만들기 1에서 회원 서비스로 회원가입과 회원조회를 인터페이스로 만든 후 구현객체를 만들었습니다.왜 회원 서비스를 인터페이스와 구현객체로 나눈 것인지 잘 이해가 가지 않습니다. 회원 저장소는 인터페이스로 만들어 구현 객체를 원하는 객체로 장착하기 위해 인터페이스로 만든 것은 이해했습니다. 회원 서비스를 역할과 구현을 나눔으로 얻는 이점이 있나요 ?
- 미해결스프링 핵심 원리 - 기본편
MemberServiceTest 실행시 오류가 납니다.
테스트 실행시 오류가 납니다.메서드 내용을 전부 막고 실행해도 오류가 납니다.-- build.gradle에 { exclude group : 'org.junit.vintage', module : 'junit-vintage-engine' } 이게 없길래 추가 해 줬는데도 오류 납니다. 2. Assertions.assertThat()는 구문 오류(빨간 글씨)가 계속 나옵니다. Assertions.assertEquals()는 정상처리 됩니다.