묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결스프링 핵심 원리 - 기본편
순수한 DI 컨테이너 AppConfig에 @Configuration
안녕하세요.강의 후반부 스프링 없는 순수한 DI 컨테이너로 메서도 호출을 한다면, 계속해서 객체를 새로 생성하는 예시를 보여주는 부분이 있습니다.여기서 궁금한 것은 AppConfig에 @Configuration 과 해당 클래스 메서드들에 @Bean 설정이 되어있는데, 이것들은 순수한 DI 컨테이너에서 의미없는 어노테이션들이 맞을까요?원래는 빼야하는데 그냥 안빼시고 설명하신 것 인지 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
만약 스프링으로 전환하지 않는다면....
[질문 내용]안녕하세요 항상 강의 잘 듣고있습니다! 제가 복습을 하던 중 궁금한게 생겼는데 제가 이해한 것이 맞는 지 확인하고 싶어요!질문 1. MemberServiceImpl의 경우 AppConfig를 사용했을 때 위와 같은 구조를 갖게 되는데 만약에 이때 스프링으로 전환하지 않고 사용한다고 가정한다면, 클라이언트의 요청이 100번 들어오면 마찬가지로 AppConfig객체도 100번 생성해야 하는 문제점이 발생하게 되는 것이 맞나요? 질문 2.만약에 스프링 컨테이너를 사용하게 된다면 스프링 컨테이너에 AppConfig를 등록하고 필요할 때 마다 쓰게 되니까 싱글톤으로 공유해서 사용하게 되는 것이 맞나요??
-
미해결스프링 핵심 원리 - 기본편
너무 기본적인 질문인 것 같은데...
인스턴스라는 게 정확히 뭐죠..?기본적인 java지식이 있으나 너무 기본적이라 그런지..답변주시면 감사드리겠습니다 ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
이름에 궁금한 게 있어요
Appconfig.class라고 해줄 때,.class의 의미는 무엇인가요?class를 호출하겠다는 의미일까요? :)
-
미해결스프링 핵심 원리 - 기본편
쇼 다이어그램은
어디서 볼 수 있나요? 윈도우는 오른쪽 마우스 클릭해도 안 나와용
-
미해결스프링 핵심 원리 - 기본편
ApplicationContext(), AnnotationConfigApplicationContext() 차이
둘의 차이는 ApplicationContext가 상위 인터페이스라 기능이 적어서 AnnotationConfigApplicationContext()를 쓴다고 알고있는데 어차피이거나ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);이거나AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);결국 둘 다 new로 AnnotationConfigApplicationContext()를 구현해 줬으니 똑같은 기능을 사용할 수 있는 것 아닌가요?왜 ApplicationContext를 사용하면 getBeanDefinition()메소드를 이용할 수 없는 것이죠?
-
미해결스프링 핵심 원리 - 기본편
스프링 빈과 기본생성자
MemberServiceImpl과 MemberRepository 이렇게 2개가 의존관계에 있을 때 로그를 확인해보니1. MemberServiceImpl 빈 등록2. MemberRepository 빈 등록3. MemberServiceImpl에 MemberRepository 의존성 주입 (Autowired)이렇게 로그가 찍혔습니다.여기서 궁금한 점은 MemberServiceImpl 빈 등록이 가장 처음이라는 점이었습니다.구글링을 해보니 빈 등록시 Reflection API를 사용한다고 나와있었습니다. 그런데 MemberServiceImpl에는 기본생성자가 없습니다. 그래서 Reflection API를 사용하여 인스턴스를 어떻게 생성하는거지??? 의문이 생겼습니다.분명히 로그를 보면 MemberRepository가 주입되지 않은 빈객체가 생성된 것을 알 수 있습니다.그렇다면 Reflection API를 사용하여 기본생성자로 MemberServiceImpl 인스턴스를 생성했다는 것인데 MemberServiceImpl에는 기본생성자가 없습니다.실제로 테스트를 해봤습니다.생성자가 하나인 경우 @Autowired 붙이나 안붙이나 같은 효력을 가지므로 다음과 같이 테스트 하였습니다.@Component public class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } public MemberServiceImpl(MemberRepository memberRepository, String message) { this.memberRepository = memberRepository; }테스트를 해보니 기본생성자가 없어서 빈으로 등록을 못한다는 예외가 발생하였습니다.그런데 다음의 경우에는 기본생성자가 없어서 빈으로 등록을 못한다는 예외가 발생하지 않았습니다.@Component public class MemberServiceImpl implements MemberService{ private final MemberRepository memberRepository; @Autowired public MemberServiceImpl(MemberRepository memberRepository) { this.memberRepository = memberRepository; } public MemberServiceImpl(MemberRepository memberRepository, String message) { this.memberRepository = memberRepository; }단서는 @Autowired라는 것은 발견했습니다.그런데 구글링을 해도 @Autowired 가 기본생성자를 만들어주나? 이에대한 글을 찾기가 힘들었습니다.혹시 이와관련한 자료가 있다면 답변 주시면 감사하겠습니다~
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
array,plus(...) 에 대한 질문입니다 ㅎ
안녕하세요 좋은강의 감사합니다.제가 잘못한건지, array.plus(300)후 foreach 를 활용해 프린트를하여도 300이라는 값은 안나오더라구요..plus 확장함수를 살펴보니 새로운 객체를 copy 하여 return 해주던데,새로운 객체로 return 받아서 활용해야하지 않나요?예를 들어 val newArray = array.plus(300) 이런식으로요제가 잘못 생각한 것인지..ㅜㅜ별거아닌거 같긴한데 확인가능하실까요 ㅎ
-
미해결스프링 핵심 원리 - 기본편
의존관계 주입 타이밍과 setUrl() 불러오는 타이밍
안녕하세요. NetworkConfig에서 객체를 생성한 후 setUrl()이 불리는데 의존관계 주입과 setUrl()을 부르는 타이밍? 순서를 알수 있을까요? 무조건 setUrl()을 부른뒤에 의존관계가 주입되나요?
-
미해결스프링 핵심 원리 - 기본편
섹션3 - 새로운 할인정책 개발에서 테스트 코드 작성 중.
섹션 3 - 새로운 할인정책 개발 강의에서 test 코드에서RateDiscountPolicy discountPolicy = new RateDiscountPolicy();관련하여 질문 있습니다. Q1.다른 test 코드에서는 자료형에 인터페이스 명을 적어서 선언했는데이번엔 구현체 명을 적어서 선언한 이유가 있나요 ? Q2.그렇지 않다면, 인터페이스 명으로 자료형을 선언할 때와 구현체 명을 선언할 때차이점과 어떠한 상황에서 선언이 되어야 하는지 궁금합니다 !
-
미해결스프링 핵심 원리 - 기본편
주문 서비스를 변경하지 않아도 된다라고 하는데요
주문과 할인 도메인 설계 강의 8:00 부터입니다.회원을 메모리가 아닌 실제 DB에서 조회하고, 정률 할인 정책을 지원해도 주문 서비스를 변경하지 않아도 된다고 하시는데 이전 강의 중 회원 도메인 설계에서 문제점으로 OCP, DIP 전부 다 위반한다고 하셨습니다. 이렇게 위반을 하니까 스프링을 사용해야 하는 것 같고요. 이 강의도 마찬가지로, OrderServiceImpl에서 private final MemberRepository memberRepository = new MemoryMemberRepository(); 를 사용함으로써 '회원을 메모리가 아닌 실제 DB에서 조회'하면 OrderServiceImpl 파일의 내용도 변경되어야 한다고 생각합니다. '회원을 메모리가 아닌 실제 DB에서 조회하고, 정률 할인 정책을 지원해도 주문 서비스를 변경하지 않아도 된다' 틀린 말 아닌가요?
-
미해결자바 개발자를 위한 코틀린 입문(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개가 다릅니다