묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 기본편
[버그 가능성] "새로운 할인 정책 개발" 강의에서 int보다 floating point나 decimal을 사용해야 하지 않나요?
[질문 내용]안녕하세요. "새로운 할인 정책 개발" 부분을 보고 있다가 이부분이 그냥 마음에 걸려서 질문을 올립니다.사진을 보면 discountPercent를 int로 쓰셨는데 만약 price가 10 미만이면 discount가 항상 0이 나와서요. 아마 튜토리얼이라서 간단히 int를 쓰지 않았을까 하지만 질문을 올립니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
싱글톤 관련 질문 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.아래 코드에서 보면 SingletonService 클래스를 정의하고 그 안에 스태틱 변수로 SingletonService 타입인 instance를 정의하고 있습니다. 클래스 안에 같은 클래스를 또 정의하는 것이 이해가 안가는데, static이라서 가능한 걸까요?public class SingletonService { private static final SingletonService instance=new SingletonService(); public static SingletonService getInstance(){ return instance; } private SingletonService(){ } public void logic(){ System.out.println("싱글톤 객체 로직 호출"); } }
-
미해결김영한의 실전 자바 - 기본편
static에 대해서 궁금합니다!!
안녕하세요. static에 대해 궁금한 것이 있어서 질문을 남깁니다!! static의 생존주기가 메모리에 생성이 되면 Java를 새로 실행이 될 때까지 유지되는 것으로 알고 있어요. 그럼 Heap 영역의 GC처럼 static을 정리해주는 역할을 하는 것이 있을까요? 아니면 개발자가 메모리 누수가 없도록 따로 관리를 해줘야 하나요? 이 부분이 궁금합니다~
-
미해결김영한의 실전 자바 - 기본편
여러 생성자가 있을 때, this()의 역할
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요! 영한님 강의 너무 잘 보고 있습니다!생성자 강의를 듣고 있다가 this()에 관한 걸 배웠을 때, 이런 질문이 떠 올랐습니다. this()는 어떤 클래스의 생성자를 사용하고 싶을 때 사용하는 것이라고 했는데, 만약 오버로딩으로 만든 생성자가 3개 이상일 때, this()는 그 생성자들 중에서 어떤 것을 가리키는 걸까? 에 대한 의문이 생겼습니다. 제가 직접 IDE에서 실험을 했을 땐, this()에 어떤 파라미터를 사용하느냐에 따라, 해당 파라미터와 같은 생성자가 사용되는 것 같은 결과가 나왔습니다.그렇다면 this()에 대해, this() 안에 파라미터와 같은 생성자가 호출된다고 생각해도 되는 걸까요?
-
해결됨김영한의 실전 자바 - 기본편
매서드 캡슐화와 테스트 코드
선생님, 안녕하세요.내부에서만 사용하는 매서드는 private으로 캡슐화 해두는 것이 좋은 구현이라고 알고 있고, 이번 수업에서도 그런 내용을 확인할 수 있었는데요, private 매서드들도 테스트 코드를 작성해서 테스트 해보고싶은 경우가 자주 발생합니다... 이런 경우 고민을 하다가 몇 가지 방법이 있겠으나 ... 그냥 public 으로 열어버리고 테스트 코드를 두곤 했는데요, 이런 경우에 선생님은 실무에서 어떻게 하셨는지, 가장 좋은 practice가 무엇인지 알고 싶습니다. 항상 감사합니다..^^
-
해결됨스프링 핵심 원리 - 기본편
의존관계 자동주입 - 조회 빈이 2개 이상일 경우에 궁금증이 있습니다.
@Autowired 필드 명, @Qualifier, @Primary 강의 부분에서 궁금한 점이 생겼습니다.결국에 조회 빈이 2개 이상인 경우엔 위의 어노테이션을 활용해서 우선순위를 지정해준다고 되어있는데,필드명을 수정해주거나, Qualifier의 이름을 변경해야하는 상황이 생긴다면( ex) OrderServiceImpl의 discountPolicy를 fixDiscountPolicy 에서 rateDiscountPolicy 로 할인 정책을 변경하고 싶다면)직접 구현체들(클라이언트 코드)을 수정해줘야하는데( ex) Autowired 된 DiscountPolicy의 변수명을 수정하거나, @Qualifier의 이름을 수정해서)이는 OCP 원칙에서 위배되는 것은 아닌지 궁금합니다. 나아가 이런식으로 실제 구현체를 수정해줘야하는 것이라면 discountPolicy 의 타입명만 DiscountPolicy일 뿐이지, 타입명 자체를 FixDiscountPolicy 로 지정하거나 RateDiscountPolicy로 지정해서 사용하는 DIP 위반하는 코드들과 무슨 차이인지 잘 모르겠습니다. 순수 자바 코드 자체는 해당 원칙들을 지키고 있는 것이니까 상관없는것인가요?
-
미해결스프링 핵심 원리 - 기본편
질문있습니다
package hello.core.beanfind; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoUniqueBeanDefinitionException; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; public class ApplicationContextExtendsFindTest { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class); @Test @DisplayName("부모 타입으로 조회 시, 자식이 둘 이상 있으면, 중복 오류가 발생한다.") void findBeanByParentTypeDuplicate(){ assertThrows(NoUniqueBeanDefinitionException.class,()->ac.getBean(DiscountPolicy.class)); } @Test @DisplayName("부모 타입으로 조회 시, 자식이 둘 이상 있으면, 빈 이름 지정하면 된다.") void findBeanByParentTypeBeanName(){ DiscountPolicy rateDiscountPolicy=ac.getBean("rateDiscountPolicy",DiscountPolicy.class); assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class); } @Test @DisplayName("특정 하위 타입으로 조회") void findBeanBySubType(){ RateDiscountPolicy bean=ac.getBean(RateDiscountPolicy.class); assertThat(bean).isInstanceOf(RateDiscountPolicy.class); } @Test @DisplayName("부모 타입으로 모두 조회하기") void findAllBeanByParentType(){ Map<String,DiscountPolicy> beansOfType=ac.getBeansOfType(DiscountPolicy.class); assertThat(beansOfType).isEqualTo(2); for (String key : beansOfType.keySet()) { System.out.println("key= "+key+"value="+beansOfType.get(key)); } } @Test @DisplayName("부모 타입으로 모두 조회하기-Object") void findAllBeanByObjectType(){ Map<String,Object> beansOfType=ac.getBeansOfType(Object.class); for(String key:beansOfType.keySet()){ System.out.println("key = "+key +"value="+beansOfType.get(key)); } } @Configuration static class TestConfig{ @Bean public DiscountPolicy rateDiscountPolicy(){ return new RateDiscountPolicy(); } @Bean public DiscountPolicy fixDiscountPolicy(){ return new FixDiscountPolicy(); } } }여기서assertThrows(NoUniqueBeanDefinitionException.class,()->ac.getBean(DiscountPolicy.class)); 이 부분이 왜 부모 타입으로 조회하는 건지 이해가 안갑니다. 상속을 한 적도 없고 그냥 타입을 넣어줬을 뿐인데 말이죠..ㅠ
-
해결됨김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
인텔리제이 초기 실행화면
안녕하세요.섹션1 - 다운로드 소스 코드 실행 방법 강의에서 인텔리제이 첫 실행화면에서 화면과 같이 프로젝트 선택하는 창이 뜨는 것으로 보입니다.(강의 내용)그러나, 인텔리제이를 처음 다운로드해서 수업과 같은 방식으로 따라했으나,, 저런 화면은 뜨지 않고 이전 작업에서 창을 닫기 전의 모습이 그대로 뜹니다.강사님처럼 프로젝트를 선택하려면 별도의 설정이 필요한 내용인가요?
-
해결됨김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
초기화 선언 관련 질문
안녕하세요!!지금 배열 문제풀이 하고 있는데요,보통 int sum = 0;이런식으로 0값으로 초기화 시켜주잖아요근데 어떤때는 double avg;이런식으로 그냥 하는데 두개의 차이가 뭐지궁금해요 코드 만들다보면 계산식이 어디있냐에 따라어떤때는double avg; 쓰고 어떤때는 0으로 초기화시켜야 돌아가더라구요..! 혹시 정확하게 구분지을 수 있을까요?
-
해결됨스프링 핵심 원리 - 기본편
xmlAppContext 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 계속 오류가 떠서 도움을 요청드리고자 글 남깁니다...해결 부탁드립니다..
-
미해결스프링 핵심 원리 - 기본편
질문있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 스프링 컨테이너에 등록하는 코드를 똑같이 작성했는데 기존과 실행결과가 같고, 디버그 실행문이 안뜹니다. 어디가 문제인가요?
-
해결됨김영한의 실전 자바 - 기본편
private static method를 사용하는 이유를 알고 싶습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]private static method 를 사용하는 이유를 알고 싶습니다. [질문 배경]영한님의 다른 강의(스프링 강의로 기억합니다.) 중에 아주 단순한 기능을 private static method를 사용하셔서 만드신 걸 본적이 있었습니다. 왜 private 접근제어자를 사용하셨는데, 인스턴스 메서드가 아닌 static 메서드를 사용하셨을까? 궁금하여 여러 검색과 이리 저리 혼자서 생각도 많이 해보고 나름대로 정리했습니다만 뇌내 망상 수준이라.. 영한님의 답변만큼 확실한건 없을 것 같아 질문드립니다. [검색 등을 통해 제가 정리한 내용]속도 : 인스턴스 메서드의 경우에는 메서드 영역의 virtual table을 거쳐서 이 인스턴스에 매핑되는 메서드를 조회 후 메서드에 접근해야 하지만, static 메서드의 경우에는 그럴 필요가 없어 인스턴스 메서드에 비해 빠르다. -> 이 부분은 제가 여러 정보를 조합한 내용이라 신빙성이 떨어지고, 과연 속도 측면에서 유의미한 차이가 있을까 의문입니다.객체지향기반의 커뮤니케이션 : private 접근제어자를 명시하여 캡슐화를 하였으나 static 까지 붙여 이 메서드는 내부에서만 쓸 뿐더러 객체지향적으로 대화할 의도가 없으니 거들떠도 보지 말아라 라는 의미를 담고 있는 것이 아니었을까 추측해봅니다.
-
해결됨스프링 핵심 원리 - 기본편
스프링 3.2 버전 이상에서 Run tests using 부분은 intelliJ IDEA 를 사용해도 되는지 궁금합니다.
제가 강의를 오랜만에 들어서 혹시 수정사항이 있을까 PDF를 다시 다운받아서 확인했는데,주의! 스프링 부트 3.2 부터 Gradle 옵션을 선택하자.스프링 부트 3.2 부터 앞서 Build and run using에 앞서 설명한 IntelliJ IDEA를 선택하면 몇가지 오류가 발생한다.따라서 스프링 부트 3.2를 사용한다면 다음과 같이 IntelliJ IDEA가 아니라 Gradle을 선택해야 한다.라고 PDF가 12월4일 경에 수정되었더라구요. Run tests using 부분은 intelliJ IDEA 를 사용해도 되는지 궁금합니다.제가 굳이 Run tests using 을 바꾸고 싶은 이유는, test 실행시에,@DisplayName 어노테이션, 메서드로 구분해둔 개별 테스트들의 테스트 결과가 나누어지지 않고 한번에 보여서 그럽니다.구글링 결과 해결법이 Run tests using 부분을 intelliJ IDEA 로 바꾸라는 것 뿐인데 바꾸면 어떤 치명적인 오류가 있는건가요? Run tests using 을 Gradle로 설정했을 때 테스트 실행 결과 화면Run tests using 을 intelliJ IDEA로 설정했을 때 테스트 실행 결과 화면
-
해결됨김영한의 실전 자바 - 기본편
2. 기본형과 참조형 - 메서드편에서, pdf 14페이지 수정해야하는 것이 아닌가요?
해당 pdf에는 int dataX = dataA라고 되어있는데, Data dataX = dataA라고 수정을 해야하지 않을 까 싶어서 올리게 되었습니다.파라미터로 dataA의 참조값을 dataX에 복사하는 것이고, 실제로 System.out.println(dataA)와 System.out.println(dataX)를 찍어보면, ref 패키지의 Data클래스로부터 만들어진 인스턴스의 참조값이 찍혀서 나오니, 이건 int형이 아닌 것 같아서요.dataX = x001 참조값, dataA = x001 참조값을 가진다고 하고, 해당 참조값을 통해, Data인스턴스의 멤버변수인 value에 접근해서 dataX.value = 20이라 변경했으니, dataA.value = 20으로 변경이 되는 것이고 만약 이를 의도하고 작성한 것이라면 int dataA.value = dataX.value 라고 적어야 하지 않을까요?
-
미해결김영한의 실전 자바 - 기본편
수업 자료 변경 요청
안녕하세요, 수업 자료를 다운받았는데 자바 기본편이 아닌 입문(기초) 관련 수업자료 입니다 확인 후 변경 부탁드릴게요! 감사합니다
-
미해결스프링 핵심 원리 - 기본편
DiscountPolicy 상속
안녕하세요public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); return discountPolicy.discount(member, price); }코드에서 참조변수 discountPolicy 에 FixDiscountPolicy 혹은 RateDiscountPolicy의 객체가 오게 될텐데요참조변수 선언을 DiscountPolicy 로 했는데 discount 메소드를 어떻게 사용할 수 있는것이죠?런타임 시점에 자식 타입으로 뿅 하고 변하는건가요? 바보같은 질문 죄송합니다 ^^,,;;
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
섹션7, 문제와 풀이2 번째 강의에서 질문있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 강사님 항상 좋은 강의 들려주셔서 감사합니다.다름이아니라 섹션7 문제와 풀이2번 풀이과정중 궁금한점이 있어서 질문드립니다.문제를 혼자풀다보니 이런 풀이와 해답 결과를 도출하였는데이부분에서 작은숫자가 항상 같이 출력되어 이부분을 해결할수있는 좋은 방법이 있는지 여쭤보려고 글 남겨드렸습니다.감사합니다.
-
미해결스프링 핵심 원리 - 기본편
MyLogger 스코프
[질문 내용]requeste 스코프 예제 만들기 20:17초에 나오는 LogDemoService의 MyLogger에 관한 질문입니다. 해당 스코프가 request니까 각 http요청당 하나씩 생성되고 종료되는 거로 알고 있습니다. 처음 컨트롤러에서 생성된 MyLogger를 사용하고 그 다음 서비스에도 MyLogger를 사용하는데 이 때 컨트롤러에서 세팅한 값 MyLogger객체가 그대로 서비스에도 쓰이는 거 같은데 이게 어떻게 가능한거죠?? 컨트롤러와 서비스 코드 간에 같은 MyLogger 객체를 공유하는 어떤 기능이 있는 건가요? 동시에 100개의 http 요청이 들어왔을 때 구분을 어떻게 하는지 궁금합니다.
-
해결됨스프링 핵심 원리 - 기본편
의존 관계 주입이 끝나는 시점
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]초기화 메서드는 의존 관계 주입이 끝난 후에 실행된다고 이해했습니다. 그런데 의존 관계 주입 단계라는 구간은 정확히 언제까지인가요? 이 코드의 경우엔 setUrl()에서 의존 관계 주입이 일어나지만스프링이 초기화 메서드를 실행하려면 의존 관계 주입이 끝났다는 것을 정확히 파악해야 할 것 같은데 스프링은 다음 중 어떤 식으로 의존 관계 주입이 끝났다는 것을 판단하나요? 1) setUrl()이 호출된 이후, 즉시 의존 관계 주입이 끝났다는 것을 판단할 수 있다.2) networkClient() 메서드 호출이 완전히 끝날 때(return문의 실행이 끝나고 나서)까지가 의존 관계 주입이라고 판단한다.3) 기타.. 혹시 강의 때 말씀하셨었나요? pdf로 복습하는 중인데 이 부분이 궁금하네요..
-
미해결스프링 핵심 원리 - 기본편
스프링 컨테이너가 아닌 순수한 자바로 테스트
안녕하세요강의 20:33 에서 스프링 컨테이너가 아닌 순수한 자바로 테스트할 수 있는 방법이 없다라고 해주셨는데요 AutoAppConfigTest.java 에서 메소드만 실행 시키면 순수한 자바 테스트이고 클래스 레벨에서 실행시키면 스프링 컨테이너의 도움을 받는건가요?@SpringBootTest 어노테이션이 붙어야 스프링 컨테이너 도움을 받는건가요 ..? 헷갈리네요