묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
enum, sealed과 when
안녕하세요! 강의 잘 보고 있습니다!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에 접근하지 못하는지 궁금합니다. 혹은 어떤 키워드로 검색해보면 좀 도움이 될까요?감사합니다.
-
미해결스프링 핵심 원리 - 기본편
강의 5분에 맵에 키값이 어떻게 할당되는건지 이해가 되지 않습니다.
강의 5:00~ 보시면 맵에 키값에 fixDiscountPolicy가 들어가는데 어떻게 할당되는건지 이해가 되지 않습니다. ㅠㅠ
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
질문입니다.
안녕하세요. 영상 마지막에 open 키워드에 대해서 추상 멤버가 아니면 기본적으로 오버라이드가 불가능하다. open 키워드를 사용해주어야 한다. 라고 말씀해주셨는데요! 추상 멤버는 open 키워드 사용 없이 오버라이드가 가능하다는 말씀인 것 같은데요. 추상 멤버라고 한다면, 구체적으로 어디까지가 추상 멤버일까요? 예를 들어 인터페이스 Swimable의 val swimAblity는 추상 멤버이기 때문에 open 키워드를 사용하지 않았고, 인터페이스를 구현하는 Penguin 클래스에서 override 할 수 있게 된건가요? 그런데 추상 클래스 Animal에서는 legCount에 open을 붙여주었는데 추상 클래스의 프로퍼티니까 추상 멤버인 줄 알았는데 아닌건가요? 감사합니다.
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
리턴 값 생략에 대하여
안녕하세요 자바에서 코틀린으로 넘어가고 싶어 강의를 들으며 차근차근 공부중입니다.인텔리제이에서 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 실행
회원 도메인 실행과 테스트 부분에서 MemberApp 클래스에 public static void main(String args[]) 를 만들고 여기서 실행하는 것은 이해했습니다.그런데 기존의 CoreApplication 에도 메인 메서드가 있어서 프로젝트에 메인 메서드가 2개이고 이렇게 프로젝트가 구성이 되어도 실행하는데 문제가 없는건가요??
-
미해결객체 지향 프로그래밍 입문
캡슐화 연습 2번
강의 수강 중 캡슐화 2번을 리팩토링 하는 과정에서 궁금한 점이 있습니다!getFrequentRenterPoints()를 Movie에서 구현을 해주셨는데 daysRented를 파라미터로 넘겨서 RenterPoints를 계산하는 과정에서 대여기간 조건을 2일, 3일 이런식으로 변경점이 생겼을 때 Movie 클래스에서 변경하면 된다고 하셨는데 대여기간 조건 변경이 생겼는데 Movie에서 로직을 변경하는게 맞는가? 라는 의문점이 들었습니다. 저의 생각은 renterpoint를 계산할 때 Rental 클래스에서 기존의 방식처럼 구현하는게 나중에 변경점이 생겼을 때 더 쉽게 찾을 수 있지 않을까 생각합니다.혹시 제가 놓치고 있는 부분이 있을까요??
-
미해결스프링 핵심 원리 - 기본편
프로토타입 빈 질문
싱글톤의 경우, 요청이 올 때 마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 공유해서 사용할 수 있다라고 이해했습니다. 그러면 프로토타입의 경우, 스프링 컨테이너에 빈의 이름과 빈이 등록이 되고 나서 빈 객체는 생성이 되지 않고 그냥 빈 자체만 등록이 되는 것인가요? 그리고 요청이 들어오면 그때서야 빈 객체를 새로 만들어주는 것이 맞나요?
-
미해결스프링 핵심 원리 - 기본편
memoryRepository 3개가 다릅니다
-
미해결스프링 핵심 원리 - 기본편
6:10초에 객체를 생성할 떄 앞에 private final 해주는 이유가 무엇인가요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.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을 안 해주던데 하는 것과 안하는 것이 무슨 차이인지, 왜 필요한지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
여러 빈들이 @PostConstruct 사용시 질문입니다.
여러 빈들이 초기화할때, 서로 각각 초기화할때 생성된 데이터를 이용하는 경우 null에러같은 것이 일어날 수 도 있지 않나요?? 스프링은 이런걸 초기화할때 알아서 방지해줄지 궁금합니다 (아니면 클래스에 @order, @primary 등과 같은 기능을 붙여야하는지 싶습니다)
-
미해결스프링 핵심 원리 - 기본편
policyMap과 polices에 아무것도 안 나옴
System.out.println("policyMap = " + policyMap);System.out.println("policies = " + policies);했을 때, 영상과 다르게 아무것도 나오지 않습니다.분명 영상 코드와 똑같이 쳤는데, 무엇을 확인하면 좋을지 알 수 있을까요?아래는 제가 작성한 AllBeanTest class 코드 입니다ㅡㅡㅡㅡㅡㅡpackage hello.core.autowored;import hello.core.AutoAppConfig;import hello.core.discount.DiscountPolicy;import hello.core.member.Grade;import hello.core.member.Member;import org.assertj.core.api.Assertions;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.List;import java.util.Map;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"); Assertions.assertThat(discountService).isInstanceOf(DiscountService.class); Assertions.assertThat(discountPrice).isEqualTo(1000); int rateDiscountPrice = discountService.discount(member, 20000, "rateDiscountPolicy"); Assertions.assertThat(rateDiscountPrice).isEqualTo(2000); } 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); } public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); return discountPolicy.discount(member, price); } }}
-
미해결스프링 핵심 원리 - 기본편
isinstanceof 관련
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.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을 사용한 싱글톤
안녕하세요! 김영한님과 서포터즈님들 항상 좋은 강의와 질문답변 감사합니다! :) 강의를 듣고 관련된 질문들을 찾아보면서 궁금한게 있는데요, @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 주입 등에서 활용되는데 알아야 하나? (물론 중요하겠지만) 싶은 생각이 들어 질문드려 봅니다..! 예제에서의 예시처럼 데이터베이스 커넥션 풀 같은 과정은 생성자 주입으로는 할 수 없어서인 것일까요?
-
미해결스프링 핵심 원리 - 기본편
AppConfig.class에서 빈을 등록하는 메서드가 static 메서드일 때.
AppConfig.class 파일에서 @Bean이 붙는 메서드들을 static메서드로 설정했을 때도 싱글톤을 보장해주지 않는 것 같은데 왜 그런것일까요? 스프링 프레임워크 내부적으로 일반 메서드를 호출하는 것만 구현이 되서 그런것일까요?
-
미해결스프링 핵심 원리 - 기본편
이너 static class
package hello.core.beanfind;import hello.core.AppConfig;import hello.core.repository.MemberRepository;import hello.core.repository.MemoryMemberRepository;import hello.core.service.MemberService;import org.junit.jupiter.api.Assertions;import org.junit.jupiter.api.DisplayName;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.NoUniqueBeanDefinitionException;import org.springframework.beans.factory.UnsatisfiedDependencyException;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import static org.junit.jupiter.api.Assertions.*;public class ApplicationContextSameBeanFindTest { AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(SameBeanConfig.class); @Test @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다") void findBeanByTypeDuplicate() { //DiscountPolicy bean = ac.getBean(MemberRepository.class); assertThrows(NoUniqueBeanDefinitionException.class, () -> ac.getBean(MemberRepository.class)); } @Configuration static class SameBeanConfig{ @Bean public MemberRepository memberRepository(){ return new MemoryMemberRepository(); } @Bean public MemberRepository memberRepository2(){ return new MemoryMemberRepository(); } }이 코드에서 static이너클래스면 실행이 되고 그냥 이너클래스이면 안되는 이유가 뭔지궁금합니다.}
-
미해결스프링 핵심 원리 - 기본편
혹시 스프링 완전정복 로드맵의 마지막 강의인 스프링부트는 기존 스프링부트 로드맵의 강의와 무슨차이인가요?
관련글이 안보여서 질문남깁니다!
-
미해결스프링 핵심 원리 - 기본편
빈 등록 안 된 상태에서 @Autowired사용
강의 4:13초에 실행된 결과 값이 이해가 가지 않습니다. 저는 오류가 발생해야 된다고 생각합니다. 그 이유는 @Autowired가 생략된 것으로 @Autowired로 인해 의존 관계가 주입이 되어야 하는데 new AnnotationConfigApplicationContext(); 인자 속에 DiscountService.class만 존재합니다. 그러면 DiscountService생성자의 매개변수 타입이 빈 등록이 안 되어 있어 주입해 줄 타입의 빈이 존재하지 않아 오류가 발생해야 한다고 생각하는데 오류가 왜 안 나는 것인가요? 감사합니다.