섹션 3 - 새로운 할인정책 개발 강의에서 test 코드에서 RateDiscountPolicy discountPolicy = new RateDiscountPolicy(); 관련하여 질문 있습니다. Q1. 다른 test 코드에서는 자료형에 인터페이스 명을 적어서 선언했는데 이번엔 구현체 명을 적어서 선언한 이유가 있나요 ? Q2. 그렇지 않다면, 인터페이스 명으로 자료형을 선언할 때와 구현체 명을 선언할 때 차이점과 어떠한 상황에서 선언이 되어야 하는지 궁금합니다 !
안녕하세요! effectively final 관련 궁금증이 있어 질문드립니다! Java에서 람다 사용시 effectively final 여야지만 되는 이유가 람다 외부 지역변수를 제어하는 스레드와 람다식을 수행하는 스레드가 서로 다를 수 있고, 지역 변수는 스택에 저장되는데 각 스레드가 다르면 서로의 스택을 공유하지 못하기 때문에 값을 복사하여 사용하는데 이 경우 값이 최신값임을 보장하지 못하기 때문이라고 알고 있습니다. Kotlin에서는 effectively final 하지 않아도 되는 이유가 잘 이해가 안가서 질문드립니다! 람다 시작 지점에 참조하고 있는 변수들을 모두 포획한다는 것 이 Java에서와 마찬가지로 복사하여 값을 사용하는 것과는 다른 개념인걸까요?
주문과 할인 도메인 설계 강의 8:00 부터입니다. 회원을 메모리가 아닌 실제 DB에서 조회하고, 정률 할인 정책을 지원해도 주문 서비스를 변경하지 않아도 된다고 하시는데 이전 강의 중 회원 도메인 설계에서 문제점으로 OCP, DIP 전부 다 위반한다고 하셨습니다. 이렇게 위반을 하니까 스프링을 사용해야 하는 것 같고요. 이 강의도 마찬가지로, OrderServiceImpl에서 private final MemberRepository memberRepository = new MemoryMemberRepository(); 를 사용함으로써 '회원을 메모리가 아닌 실제 DB에서 조회'하면 OrderServiceImpl 파일의 내용도 변경되어야 한다고 생각합니다. '회원을 메모리가 아닌 실제 DB에서 조회하고, 정률 할인 정책을 지원해도 주문 서비스를 변경하지 않아도 된다' 틀린 말 아닌가요?
안녕하세요! 강의 잘 보고 있습니다! enum과 sealed를 when과 함께 쓰는 부분을 보고 궁금증이 생겨 질문드립니다! 제가 느끼기에 when 문은 자바의 switch문과 유사하다고 생각이 들어요. switch문이나 if-else 같은 경우 많이 사용하면 유지보수 측면에서도 힘들고 안 좋다는 의견을 많이 들었어요. 그래서 enum 각 내부 필드가 로직을 가지게 하여 if-else를 없애거나, 팩토리를 만들어 switch문을 최소화하거나 하는식으로 구현한다고 알고 있습니다. 이런 측면에서 if-else나 switch는 많이 쓰지 않는게 좋은 것 같은데 when은 조금 다르게 봐야하는건지 궁금합니다. 실제로도 when을 많이 사용하나요?
MemberServiceTest 코드를 작성할 때 영한님 코드를 보면 join 메소드를 default로 선언하시고 실행하고 정상적으로 테스트에 성공하셨습니다. 하지만 제 환경에서는 에러가 발생하네요 해당 에러코드를 확인 후 join 메소드를 public으로 선언하니 정상적으로 테스트에 성공했습니다. 제가 아직 JUnit에 대한 이해가 충분하지 않지만 혹시 어떤 원인 때문에 package-private 메소드인 join에 접근하지 못하는지 궁금합니다. 혹은 어떤 키워드로 검색해보면 좀 도움이 될까요? 감사합니다.
안녕하세요. 영상 마지막에 open 키워드에 대해서 추상 멤버가 아니면 기본적으로 오버라이드가 불가능하다. open 키워드를 사용해주어야 한다. 라고 말씀해주셨는데요! 추상 멤버는 open 키워드 사용 없이 오버라이드가 가능하다는 말씀인 것 같은데요. 추상 멤버라고 한다면, 구체적으로 어디까지가 추상 멤버일까요? 예를 들어 인터페이스 Swimable의 val swimAblity는 추상 멤버이기 때문에 open 키워드를 사용하지 않았고, 인터페이스를 구현하는 Penguin 클래스에서 override 할 수 있게 된건가요? 그런데 추상 클래스 Animal에서는 legCount에 open을 붙여주었는데 추상 클래스의 프로퍼티니까 추상 멤버인 줄 알았는데 아닌건가요? 감사합니다.
안녕하세요 자바에서 코틀린으로 넘어가고 싶어 강의를 들으며 차근차근 공부중입니다. 인텔리제이에서 option + command + v 단축키를 사용하면 바로 리턴 타입을 알 수 있어서 자바 개발을 할 때 자주 사용 했습니다. 하지만 코틀린은 기본적으로 타입의 명시가 생략되어 있어서 그런지 같은 단축키로 리턴타입이 나오지 않더라구요 기존 자바의 경우 "ABC".startsWith("A"); 에 option + command + v 를 사용하면 boolean a = "ABC".startsWith("A"); 이렇게 startsWith()의 리턴 값이 boolean이라는 것을 알 수 있는데 코틀린의 경우 val startsWith = "ABC".startsWith("A") 이렇게 나옵니다. 제 생각에는 val startsWith: Boolean = "ABC".startsWith("A") 이런식으로 나와야 할 것 같은데 말이죠 물론 메서드에 마우스를 올리면 리턴 타입을 알 수 있지만 자바 개발하면서 익숙해진 단축키라 코틀린에서도 유용하게 활용할 수 있는지 궁금합니다. 그리고 실무에서 개발 할 때에도 리턴타입이 없다면 많이 불편할 것 같은데 아직 자바에서 벗어나지 못해하는 걱정인걸까요...?
회원 도메인 실행과 테스트 부분에서 MemberApp 클래스에 public static void main(String args[]) 를 만들고 여기서 실행하는 것은 이해했습니다. 그런데 기존의 CoreApplication 에도 메인 메서드가 있어서 프로젝트에 메인 메서드가 2개이고 이렇게 프로젝트가 구성이 되어도 실행하는데 문제가 없는건가요??
강의 수강 중 캡슐화 2번을 리팩토링 하는 과정에서 궁금한 점이 있습니다! getFrequentRenterPoints()를 Movie에서 구현을 해주셨는데 daysRented를 파라미터로 넘겨서 RenterPoints를 계산하는 과정에서 대여기간 조건을 2일, 3일 이런식으로 변경점이 생겼을 때 Movie 클래스에서 변경하면 된다고 하셨는데 대여기간 조건 변경이 생겼는데 Movie에서 로직을 변경하는게 맞는가? 라는 의문점이 들었습니다. 저의 생각은 renterpoint를 계산할 때 Rental 클래스에서 기존의 방식처럼 구현하는게 나중에 변경점이 생겼을 때 더 쉽게 찾을 수 있지 않을까 생각합니다. 혹시 제가 놓치고 있는 부분이 있을까요??
싱글톤의 경우, 요청이 올 때 마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 공유해서 사용할 수 있다라고 이해했습니다. 그러면 프로토타입의 경우, 스프링 컨테이너에 빈의 이름과 빈이 등록이 되고 나서 빈 객체는 생성이 되지 않고 그냥 빈 자체만 등록이 되는 것인가요? 그리고 요청이 들어오면 그때서야 빈 객체를 새로 만들어주는 것이 맞나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 6:10초에 MemberRepository memberRepository = new MemoryMemberRepository(); 객체와 할인 객체를 생성할 떄 앞에 private final 해주는 이유가 무엇인가요? private final 안 쳐도 잘 되는데 저걸 쳐 주는 이유가 있나요? 앞 강의에서 MemberServiceImpl에서는 해 주고 뒷 강의에서 MemberApp과 OrderApp에서는 private final을 안 해주던데 하는 것과 안하는 것이 무슨 차이인지, 왜 필요한지 궁금합니다.
여러 빈들이 초기화할때, 서로 각각 초기화할때 생성된 데이터를 이용하는 경우 null에러같은 것이 일어날 수 도 있지 않나요?? 스프링은 이런걸 초기화할때 알아서 방지해줄지 궁금합니다 (아니면 클래스에 @order, @primary 등과 같은 기능을 붙여야하는지 싶습니다)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 강의내용 2분33초에서 findBeanByName() 메서드의 assertThat ~ isInstanceof 문장이 이해가 잘 안됩니다. 저는 AppConfig.class 에서 memberService가 MemberServiceImpl을 포함하므로 memberService와 MemberServiceImpl.class의 위치가 서로 반대라고 생각했는데 예상과 다르네요.
안녕하세요! 김영한님과 서포터즈님들 항상 좋은 강의와 질문답변 감사합니다! :) 강의를 듣고 관련된 질문들을 찾아보면서 궁금한게 있는데요, @Configuration을 사용하면 스프링 컨테이너에서 해당 인스턴스가 존재하는지를 확인하고 있으면 인스턴스 반환, 없으면 생성하는 기능으로 싱글톤이 보장된다는것을 알겠습니다. @Congfiguration 없이는 싱글톤 보장이 안된다고하셨는데 https://www.inflearn.com/questions/288987 의 질문답변을 보면 @Congfiguration의 유무에 관계 없이 싱글톤으로 유지된다는 답변을 봐서 뭐가 맞는건지 궁금해서 질문드립니다. 그리고 @Configuration 없이 생성된 memberRepository 세개의 인스턴스들에 대해서 @Bean이 붙은 memberRepository객체는 스프링이 관리해주는 스프링 빈이고 나머지 MemberServiceImpl, OrderServiceImpl 의 memberRepository는 스프링 빈이 아닌거죠? 감사합니다~
10:55초 에서 MyLogger가 요청마다 각각 따로 생성 된다고 하셨는데 프록시 객체가 HTTP요청 마다 각각 따로 생성된다는 말씀이신가요? 그리고 실제 MyLogger는 실제 메서드가 사용 될 때 호출된다고 하셨는데 이게 MyLogger의 실제 기능(메서드)를 사용할 때 프록시객체와의 상속관계를 끊어버리는건가요? ( 가짜를 쓸 때도 진짜 MyLogger를 가리키고 있으나 그 땐 상속관계에 있는 프록시 객체로 오버라이딩 )
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 영한 님이 그동안 설명해주신 것으로는 가급적이면 생성자 주입을 선택하라고 하셨는데, 빈 생명주기 콜백은 생성자 주입을 제외한 setter 주입 등에서 활용되는데 알아야 하나? (물론 중요하겠지만) 싶은 생각이 들어 질문드려 봅니다..! 예제에서의 예시처럼 데이터베이스 커넥션 풀 같은 과정은 생성자 주입으로는 할 수 없어서인 것일까요?