묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 기본편
NetworkClient에서 setUrl 질문합니다!
[질문 내용]안녕하세요 강의 듣다 헷갈려서 질문 드립니다..! NetworkClient() 객체가 생성되면서 생성자를 호출하고 그 뒤에 setUrl로 url를 지정해도 출력에 포함이 안되고 null이 출력된 게 의존 관계 주입이 안돼서 그렇게 나오는 건가요?? 강의노트 보면 객체 생성 후 외부에서 수정자 주입을 통해 setUrl()을 호출해야지 url이 존재한다는데 이 말이 잘 이해가 안되는데 NetworkClient 클래스에서 public void setUrl(String url) {this.url = url;} 이 코드를 통한 수정자 주입을 통해 호출해야 한다는 말씀인지 궁금합니다..!
-
해결됨스프링 핵심 원리 - 기본편
12분경 memberRepository예측 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]선생님께서 12분쯤에 memberRepository가 3번 호출될 것이라 예상하셨었는데 저는 memberService에서 왜 memberRepository가 2번 호출되는지 잘 이해가 안갑니다. memberService에서 MemberServiceImpl의 매개변수를 통해 memberRepository로 건너가기 때문에 memberRepository가 한번만 호출된 뒤 orderService가 호출되어야하는 것 아닌가요?쉽게 얘기해서 선생님은 memberServicememberRepositorymemberRepositoryorderServicememberRepository위의 순서를 예상하셨는데저는memberServicememberRepositoryorderServicememberRepositorymemberRepository이런 순서가 될 것으로 예측했습니다. 제가 착각한 부분이 있다면 알려주시길 바랍니다.감사합니다.
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
static 메소드와 instance 메소드의 접근?
안녕하세요 ㅎㅎ 다름이 아니라 나도코딩 자바편에서 메소드를 공부하면서 궁금증이 생겨, 이렇게 또 다시 질문을 남깁니다...ㅎ 나도코딩 자바편을 보는 것과 동시에, 제 스스로 나름 예제들도 풀면서 개념을 익히고 있는데요...ㅎ 방금 전에 제가 문자열(String)배열과 charAt()을 이용하여, 전치행렬을 만드는데 성공했습니다...ㅎ 결과도 잘 출력했구요 ㅎㅎ 이 예제를 푸는 데는 String, String[], length(), charAt()에 대한 선생님의 도움과 답변이 없었으면 풀지 못했을 건데, 선생님의 자세한 답변 덕분에 문제를 빠르게 잘 풀 수 있었습니다. 감사합니다 ㅎㅎ아래가 제가 쓴 코드고, 출력한 결과입니다:여기서부터가 제 질문인데요...ㅎ static 메소드(public static void main(String[] args) {...})에서 일반 메소드를 접근하려면, 에러 메시지로 'non-static variable/method cannot be referenced fromstatic context.'라고 나오는데, 이럴 경우에 에러를 없애고, 결과를 잘 출력하려면:pubilc static void main 메소드 앞에 첫 번째 방법으로 void transpose 메소드를 static void tranpose라고 바꾸거나, 아니면 2번째 방법으로 static 메소드 안에서 이렇게 Question_03 making = new Question_03(); 즉, (클래스 이름) (객체 이름) = new (클래스 이름)(); 이런 식으로 객체화를 해서 메소드를 접근해야 하나요?
-
미해결스프링 핵심 원리 - 기본편
스프링부트와 레거시를 사용할때 View부분의 확장자가 바뀌는이유가 뭔가요?
수업의 내용과는 무관하지만 궁금한점이 있어 질문드립니다스프링 레거시의 경우에는 .jsp 파일로 view부분을 처리하고 부트의 경우에는 .jsp로 처리할수있지만 html로 처리하기를 권장하는데 그이유(속도,편의성)?가 궁금합니다.
-
미해결스프링 핵심 원리 - 기본편
setter주입
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]간단하게 질문드리겠습니다. Component scan을 사용하며 setter주입 시 @autowired 애너테이션을 붙여주면 자동 주입이 되는 걸로 알고 있습니다. 그런데 만약 Configuration으로 수동 빈 등록을 하면, 의존관계는 Configuration애너테이션이 붙은 설정 앱에서 setXX메서드로 직접 의존관계를 등록해주면 되는건가요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
getVideoFileCount 변수 선언하는 이유
안녕하세요 선생님🙇♀️클래스_메소드 강의를 보다 궁금한 점이 생겨 질문 남깁니다.BlockBox 클래스에 두 메소드를 넣었고, 04_Method클래스에 두 메소드를 활용한 문장이 있었는데요.insertMemoryCard()는 그대로 사용했지만, getVideoFileCount()는 다시 변수로 선언한 이유가 무엇인가요?감사합니다.void inserMemoryCard(int capacity) { System.out.println("메모리 카드가 삽입되었습니다."); System.out.println("용량은 " + capacity + "GB 입니다."); }void getVideoFileCount(int type) { if ( type == 1) { return 9; } else if ( type == 2) { return 1; } return 10; } b1.insertMemoryCard(256);int fileCount = b1.getVideoFileCount(1);
-
해결됨스프링 핵심 원리 - 기본편
@Configuration과 싱글톤강의를 따라하는데 값이 다르게 나옵니다.
@Configuration 어노테이션 안의 AppConfig 클래스에서 memberService와 orderService에 들어가는 memberRepository 설정이 각각 new로 MemoryMemberRepository를 생성한다 하더라도 그 MemberRepository들은 같은 싱글톤으로 있다는 강의 내용은 전부 이해했습니다.그런데 강의 내용 그대로 따라 코딩을 하였는데 결과값은 각각 다른 MemberRepository를 갖게 되더라구요... 그래서 제가 잘못한 것이 있는지 알 수 있을까 해서 질문드립니다.AppConfig@Configuration public class AppConfig { @Bean public static MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public static DiscountPolicy discountPolicy() { // return new FixDiscountPolicy(); return new RateDiscountPolicy(); } @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } }MemberServiceImplpublic 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 findMember(Long memberId) { return memberRepository.findById(memberId); } // 스프링의 @Configuration 싱글톤 테스트를 위한 Getter public MemberRepository getMemberRepository() { return memberRepository; } }OrderServiceImplpublic 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(Long memberId, String itemName, int itemPrice) { Member member = memberRepository.findById(memberId); int discountPrice = discountPolicy.discount(member, itemPrice); return new Order(memberId, itemName, itemPrice, discountPrice); } // 스프링의 @Configuration 싱글톤 테스트를 위한 Getter public MemberRepository getMemberRepository() { return memberRepository; } }ConfigurationSingletonTestpublic class ConfigurationSingletonTest { @Test 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); System.out.println("memberService -> memberRepository = " + memberService.getMemberRepository()); System.out.println("orderService -> memberRepository = " + orderService.getMemberRepository()); System.out.println("memberRepository = " + memberRepository); assertThat(memberService.getMemberRepository()).isSameAs(memberRepository); assertThat(orderService.getMemberRepository()).isSameAs(memberRepository); } }결과제가 강의 내용을 이해한대로라면 저렇게 3개가 같은 MemoryMemberRepository를 가져야 할것같은데 제가 뭔가 잘못 작성한것이 있을까요...?
-
해결됨스프링 핵심 원리 - 기본편
xml 방식의 설정은 어떻게 싱글톤을 보장하나요?
[질문 내용]xml 방식의 설정으로 MemberRepository 객체를 출력해보면 MemberServiceImpl 과 OrderServiceImpl, MemberRepository 모두 같은 인스턴스를 공유하고 있는데 xml 의 BeanDefinition을 확인하려고 해도 GenericXmlApplicationContext 구현체는 getBeanDefinition() 함수를 제공하지도 않네요... 궁금합니다.
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
학습 커리큘럼
자바를 학습 하고 있는 학생입니다. 혹시 섹션 9,10,11건너 뛰고 섹션 12 공부해도 될까요?학교 커리큘럼 따라가면서 배우고 싶은데 학교에서는 9,10,11에 해당하는 내용을 배우는 것 같지 않아서요..
-
해결됨스프링 핵심 원리 - 기본편
테스트에서 @BeforeEach 안에 AppConfig를 생성하고 사용하는 이유
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요 단위 테스트 도중에 @BeforeEach 사용시 어떤 이점이 있는지 궁금해서 질문 드립니다.public class orderServiceTest { AppConfig appConfig = new AppConfig(); MemberService memberService = appConfig.memberService(); OrderService orderService = appConfig.orderService(); }이렇게 사용하는 것보다 @BeforEach 어노테이션을 사용해서public class orderServiceTest { MemberService memberService; OrderService orderService; @BeforeEach public void beforeEach(){ AppConfig appConfig = new AppConfig(); memberService = appConfig.memberService(); orderService = appConfig.orderService(); }이렇게 작성하는게 좋다고 말씀하셨는데제 생각에는 그 이유가 1번 처럼 작성하면 다른 테스트 진행시 기존의 선언되어 있는 meberService 객체에 남아있는 데이터?가 있어서 오류가 날 수 있어 초기화와 같은 목적으로 @BeforeEach를 사용하여 매번 테스트를 실행시킬때마다 새롭게 의존관계 주입을 하는 것 같은데정확한 의미를 알고 싶어서 질문 드립니다.
-
미해결그림으로 배우는 자바, 파트2: 객체지향!
객체 배열과 반복문 강의 중
안녕하세요:) 강의 예제중 양궁 국가대표 선발전 부분에서 질문드립니다. 다름이 아니라 토탈포인트 계산 부분에서 sum= sum + points[i]가 실행되는데 왜 누적값이 되는게 아닌지 궁금합니다!
-
미해결스프링 핵심 원리 - 기본편
@Bean 파라미터 있을 경우 빈 생성/등록 순서
@Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public OrderService orderService() { return new OrderServiceImpl( memberRepository(), discountPolicy()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } ... }CGLIB이 AppConfig를 상속한 클래스를 만들어 참조할 빈이 등록되어 있으면 반환, 없으면 생성/등록하도록 조작한다고 이해했습니다. 위 방식과 다르게 @Configuration 클래스를 분리하겠습니다.@Configuration public class AppConfig { @Bean public MemberService memberService (MemoryMemberRepository memoryMemberRepository) { System.out.println("@@ AppConfig.memberService"); return new MemberServiceImpl(memoryMemberRepository); // return new MemberServiceImpl(getMemoryMemberRepository()); } } @Configuration public class TestConfig { @Bean public MemoryMemberRepository memoryMemberRepository() { System.out.println("@@ Testconfig.memoryMemberRepository"); return new MemoryMemberRepository(); } }테스트를 몇 번 해보니 memberService 빈 등록 시 memoryMemberRepository()가 알아서 먼저 호출된다는 걸 확인했습니다. 질문입니다.파라미터가 있을 경우 memoryMemberRepository 빈(파라미터)이 memberService 빈보다 먼저 생성/등록된다는 게 항상 보장되는 건가요?이런 방식에 위험이 있나요?
-
미해결자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)
12강 Movable 인터페이스
안녕하세요 ㅎㅎ코틀린 강의 잘 듣고 있습니다. 12강에 자바에서 Movable 인터페이스를 new Movable로 인스턴스화 시켰는데.. 인터페이스는 인스턴스 객체로 만들수 없는거 아닌가요?? 헷갈려서 질문드립니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
AppConfig에 질문이 있습니다.
@Configuration에 @Component가 있으면 메서드들은 자동으로 빈으로 등록되는 것으로 강의를 보면서 이해했습니다. 그러면 AppConfig에서 @Bean을 메서드마다 붙이지 않아도 @SpringbootApplication에 있는 @ComponentScan이 자동으로 component들을 빈으로 등록해줘서 의존관계 주입이 되는 거 아닌가요? 내가 잘못 이해하고 있는 거면 답변 부탁드립니다.
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
문자열 병합(String concatenation)에 관한 간단한 질문
안녕하세요 선생님, 다름이 아니라 제가 지난 String[], String, charAt, length와 관련된 질문 이후로 문자열(String)을 계속 공부하면서 막히는 것이 조금 있어 이렇게 질문을 남깁니다.아래 코드에서 제가 간단하게 System.out.println(); 명령문으로 아래 문장들을 출력해봤습니다:결과 (1)에서는 "Hello, "와 "World!" 2개의 단어가 합쳐져서 문장 Hello, World!가 출력이 되고, 결과 (2)에서는 Route 12가 아닌, Route 66으로, 결과 (3)에서는 25 years old 이라고 출력이 되는데, 이렇게 되는 이유가 System.out.println(); 명령문의 괄호 안에 쓰여진 문장들이 기본적으로 String으로 간주하여 결과를 출력하고, 만일 숫자가 먼저 온다면 int로 인지해서 결과를 먼저 받은 다음, + 기호를 통해 문자열을 출력해서 그런 건가요? 혹여나 시간이 되신다면, 선생님으로부터 답변을 받았으면 좋겠습니다! 지난 번 QNA가 너무 좋아서 아직도 기억에 남네요..ㅎ 미리 감사합니다 :)
-
미해결스프링 핵심 원리 - 기본편
getBeanDefinitionNames()관련해서 질문이요
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.컨테이너에 등록된 모든 빈을 조회할때Object bean=ac.getBean(beanDefinitionName);으로 bean을 찾았습니다.근데 밑 내용에서 스프링 컨테이너 에서 스프링 빈을 찾는 가장 기본적인 조회방법은 ac.getBean(빈이름,타입), ac.getBean(타입)으로 찾습니다.즉 매개변수를 하나로 찾으려면 ac.getBean(타입)으로 찾아야한다는 말과 같습니다.ac.getBean(beanDefinitionName)은 beanDefinitionName을 출력했을때 타입이 아니라 빈 이름인것 같은데 이게 어떻게 된걸까요?
-
미해결스프링 핵심 원리 - 기본편
제가 이해한게 맞을까요?
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]여기에 질문 내용을 남겨주세요.제가 이해한게 맞는지 확인 좀 해주세요!스프링 빈의 이벤트 라이프 사이클은스프링 컨테이너 생성-> 스프링 빈 생성-> 의존관계 주입-> 초기화 콜백 ->사용 ...이렇게 되는데NetworkClient 예제에서는 초기화라는게 networkClient.setUrl("http ...") 이 아닌 connect() 와 call("초기화 연결 메세지") 이다즉 의존 관계 주입이후 connect와 call을 호출 하는 것이 목적이다.그렇기 때문에 @Beanpublic NetworkClient networkClient(){에서 return networkClient를 하기 전, networkCludent.setUrl(...)을 한 후에 networkClient.connect(), networkClient.call()을 한다면출력창에 찍히는 것은 같을지 몰라도 그 의미가 다르다. 왜냐하면 빈이 등록(return networkClient)이전에 호출한 함수이기 때문이다. 우리가 원하는 것은 의존관계 주입이후에 connect와 call을 하는 것이기 때문에 NetworkClient tmp=ac.getBean(NetworkClient.class);tmp.connect(); tmp.call();을 하는 것과 이론적으로 같다. 하지만 이렇게 하는게 귀찮으므로(?)1)인터페이스(InitializingBean)2)설정 정보에 초기화 메서드, 종료 메서드 지정, 3) @PostConstruct,@PreDestroy 애노테이션을 지원한다. 이게 맞나요??아 이거 뭔가 아닌것같은데 ㅠㅠ
-
미해결스프링 핵심 원리 - 기본편
NoUniqueBeanException 에러
https://www.inflearn.com/questions/776767/nouniquebeandefinitionexception-%EC%97%90%EB%9F%AC해당 글이랑 똑같은 에러, 상황인데 혹시 해결되셨나요? 답변이 없어서요 Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'hello.core.discount.DiscountPolicy' available: expected single matching bean but found 2: rateDiscountPolicy,getDiscountPolicy
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
protected 접근 제어자 간단한 질문 및 코드 작성 방식?
안녕하세요, 다름이 아니라 제가 퀴즈 #7, 퀴즈 #8, 섹션 8. 접근 제어자 (전반전 및 후반전) 강의를 듣고, 궁금한 것이 생겨서 이렇게 글을 남깁니다.(1) 접근 제어자랑 관련된 간단한 질문입니다. 제가 올바르게 이해하고 있는지 한 번 확인해보고 싶습니다. 제가 강의를 들었을 땐, protected 예약어는 같은 패키지에서도 사용 가능하고, 다른 패키지에서 사용하고 싶을 땐, 자식 클래스에서 써야하는 걸로 이해했는데, 이 '같은 패키지'라는 말은 패키지 뿐만 아니라 (아마 당연하겠지만) '같은 클래스 안에서도 사용 가능하다'는 것도 내포하는 건가요?(2) 코드 작성 방식에 관한 질문입니다. 퀴즈 #7 강의를 듣기 이전에 제 스스로 코드를 아래와 같이 적고 결과도 강의에서 제시한 바와 같이 똑같이 만들었습니다:그런데 선생님의 코드를 보니 한 클래스 내에서 여러 개의 생성자를 만들 수 있다는 것을 이용해서 아래 사진처럼 생성자 2개를 하나는 this()로, 하나는 String name 전달 값을 포함하는 public 생성자를 만들어서 이름을 지으셨는데, 혹시 이렇게 코드를 적는 방식의 차이가 있을까요? 또한 이름을 지을 때 그대로 this,name = "햄버거"; 또는 super,name = "치즈버거"; 이렇게 작성해도 상관없는 건가요? (중간에 반점은 점(.)을 넣게되면 글 안에서 하이퍼링크가 자동 생성되어 불가피하게 반점을 넣었습니다. 양해 부탁바랍니다.)3. 마찬가지로 코드 작성 방식에 관한 질문입니다. 퀴즈 #8 강의를 듣기 이전에 제 스스로 코드를 적고, 결과도 강의에서 제시한 바와 같이 똑같이 만들었습니다:다만 한 가지 다른 것은 저는 사진처럼 this.AccidentDetector = AccidentDetector;로 직접적으로 접근하는 방향으로 해서 코드를 썼고, 이 이후에는 this.detector.detect();나 this.reporter.report();를 이용한 것이 아닌 AccidentDetector.detect();와 VideoReporter.report();로 작성하여 코드를 완성했습니다. (비록 사진에는 나와있지 않지만...ㅎ) 이러한 경우에도 상관 없는 건가요?지난 번에 제 글에 달린 답변은 정말로 자세해서 많이 도움이 되었습니다. 항상 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
ObjectProvider<MyLogger> myLoggerProvider 질문
안녕하세요 계속 고민하고 구글링하고 하다가 정리가 확실히 안되서 질문드립니다 ㅠ우선 https://www.inflearn.com/questions/743070/provider 여기에 나와있는 답변을 바탕으로 어느정도 정리가 되었습니다.하지만 여기서 드는 고민이 있습니다. 1. 그럼 LogDemoController,LogDemoService 는 @RequiredArgsConstructor 때문에 생성자에서 (두개의 클래스 안에 공통으로 있는) 필드ObjectProvider<MyLogger> myLoggerProvider를 주입받아야 되는데 ObjectProvider<MyLogger> myLoggerProvider는 .getObject()나오기 전까지 스프링컨테이너에 아무일도 안일어나는건가요?? 1번이 맞다면 대기하였다가 이 .getObject()이 실행될때 해당 빈(Mylogger)을 찾아서 반환을 해주고 그때서야 스프링컨테이너에 LogDemoController,LogDemoService 이 두개의 빈이 등록되는건가요???