묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 기본편
테스트에서 @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 이 두개의 빈이 등록되는건가요???
-
해결됨스프링 핵심 원리 - 기본편
@Autowired 사용법 질문
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]<컴포넌트 스캔과 의존관계 자동 주입 시작하기>강의에 질문 드립니다. 강의를 보면 RateDiscountPolicy에 @Component를, OrderServiceImpl에서 @Autowired를 이용하여 의존성을 주입해주고 있는데요. "스프링이 DiscountPolicy에 대해 아는 정보가 RateDiscountPolicy밖에 없기 때문에(@Component) @Autowired를 사용하여 의존관계를 주입하지 않아도 알아서 의존관계를 설정해주지 않을까?라는 궁금증이 생겨 아래 테스트를 작성해보았습니다. >> 위 설정으로 테스트를 작성하고 수행했을 때, 테스트가 통과되는 것을 확인했습니다.예상대로 아래 로그와 같이 스프링이 OrderServiceImpl과 RateDiscountPloicy의 의존관계를 설정해주고 있었습니다.>> 질문 1. 위 케이스대로면 생성자만 만들고, @Autowired설정 없이 의존관계를 주입하고 싶은 구현체만 @Component로 등록하면 되지 않을까요? >> 질문 2. @Autowried를 꼭 사용해야 하는 이유가 있을까요? 예를 들어 구현체 여러개가 빈으로 등록되어야 한다든지..(이 경우는 컴파일 에러가 나는 것 같은데 다른 설정법이 있는건가요?)
-
해결됨그림으로 배우는 자바, 파트2: 객체지향!
클래스 실행 순서가 궁금합니다.
정답 코드 입니다.public class PlayerTest { public static void main(String[] args) { // 점수 배열 생성 int[] points0 = { 10, 9, 9, 8 }; int[] points1 = { 9, 10, 9, 9 }; int[] points2 = { 10, 9, 10, 10 }; // 선수 객체 생성 Player p0 = new Player("Kim", points0); Player p1 = new Player("Lee", points1); Player p2 = new Player("Park", points2); // 객체 배열 만들기 Player[] players = { p0, p1, p2 }; // 선수별 총점 출력 for (int i = 0; i < players.length; i++) { players[i].printTotalPoints(); } } } class Player { // 필드 String name; // 이름 int[] points; // 점수 // 생성자 Player(String str, int[] arr) { name = str; points = arr; } // 메소드 void printTotalPoints() { /* 2. 형식 문자열을 만드세요. */ System.out.printf("%s -> %d점\n", name, totalPoints()); } int totalPoints() { int sum = 0; for(int i = 0; i < points.length; i++){ sum += points[i]; } return sum; } } 위의 코드에서 'totalPoints()'메소드를 안에있는 for문 조건식 i<points.length;대신 점수 배열을 크키를 구하는데 저는 main메소드가 먼저 실행되는 것으로 알고 있어 points0 배열이 생성될 때 값도 대입했기 때문에 바로 크기를 알 수 있을 것으로 판단해 아래와 같이 points0.length 또는 points[i].length를 사용하려고 했으나 불가능하였습니다. for(int i = 0; i < points0.length; i++){ sum += points[i]; } 혹시나 main 메소드 부터 실행되는 것이 아니라면 points변수에 static을 부여해 프로그램이 시작하자마자 점수 배열을 생성을 하고 point[i].length를 사용해봤으나 'illegal start of expression' 라며 잘못된 표현이라는 에러가 나왔습니다. static int[] points0 = { 10, 9, 9, 8 }; static int[] points1 = { 9, 10, 9, 9 }; static int[] points2 = { 10, 9, 10, 10 }; 위와 같은 방법으로 풀면 왜 에러가 나는지 궁금합니다!
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
추상 클래스 / 익명 클래스
강사님, 안녕하세요. 우선 많은 강의 내용 중 생기는 질문에 대해서 항상 친절하게 답변해주시는 점 감사드립니다. 😊다름이 아니고 익명 클래스 (후반전) 에서 추상 클래스를 직접 상속받아서 객체 생성과 동시에 메서드를 오버라이드 하는 것과 객체 메서드로 반환받아 하는 것이 어떠한 기능적인 차이가 있는 것인지 궁금하여 여쭤봅니다!개인적으로는 별도의 메서드로 객체를 반환 받는 형태가 직관적으로 와닿지 않아서 어렵게 느껴지는 듯 합니다.단순히 코드의 유지보수나 가독성을 높이는 목적 때문에 추상 클래스의 메서드를 직접 상속받는 형태보다 익명클래스를 활용해 메서드로 객체를 반환받는 형식으로 하는걸까요?
-
미해결스프링 핵심 원리 - 기본편
on-demand시 * 모든패키지 설정이 안되네용? 버전차이인가요?
[질문 내용]이전 강의부터 궁금했던 부분인데Assertions라던지 static 메소드 호출 후 Add On-demend static Import를 하게되면 강의에서는 import 문의 끝이 Assertions.*로 되는데저는 Assertions.assertThat으로 적용됩니다.혹시 자바 버전차이일까요? 아니면 따로 설정을 해줘야하는건가요?이렇게되면 assertThat만 바로 호출이가능하고 나머지 다른 메소드들은 Assertions 클래스를 다시 선언하고 접근해야 하더라구요그래서 따로 *로 지정하면 자동으로 assertThat으로 변경됩니다...혹시 왜그런것인지 해결방안을 알 수 있나요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
run configuration 설정
쌤 안녕하세요 인텔리제이 실행할 때 run이 활성화 되어있지 않아서 해당 클래스로 설정을 해둬 실행이 되었는데 새로운 클래스 마다 설정을 해줘야하더라고요 혹시 자동으로 생성되는 클래스마다 설정되게 하는 방법 알 수 있을까요..? 구글링으로 찾아보는데 다 파일 하나하나씩 설정하는 것만 나오네요
-
미해결스프링 핵심 원리 - 기본편
PrototypeBean 두번 생성되는 이유가 궁금합니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.강의 자료와 강의에서 하신 말씀을 보면 둘 다 PrototypeBean이 두 번 생성된다고 되어있습니다.그런데 강의 중에 이런 말씀을 하셨습니다."ClientBean은 싱글톤 타입이고 PrototypeBean은 ClientBean이 관리하니까 생성이 한번만 된다"이 말씀을 들을때는 저도 이해가 되고 동의가 되었는데 두번 생성된다는 말은 무슨말인지 모르겠습니다.
-
미해결스프링 핵심 원리 - 기본편
스프링 핵심원리 기본편 request 빈 스코프 만들기 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요, 스프링 핵심원리 기본편 request 빈 스코프 만들기 예제 강의 11:52초 부분 강의 시청 중입니다.예제를 따라서 아래와 같이 코딩을 하였고, variable logDemoService not initialized in the default constructor 오류를 마주쳐서 해결 방법을 문의드립니다 ㅠㅠ소스 코드는 아래와 같습니다.package hello.core.web; import hello.core.common.MyLogger; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; @Controller @RequiredArgsConstructor public class LogDemoController { private final LogDemoService logDemoService; private final MyLogger myLogger; @ResponseBody @GetMapping("log-demo") public String logMemo(HttpServletRequest request) { String requestURL = request.getRequestURL().toString(); myLogger.setUuid(requestURL); myLogger.log("controller test"); logDemoService.logic("testId"); return "OK"; } }확인 부탁드리겠습니다 ㅠㅠ
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
도와주세요!
여기서 가로에 +1값을 안하고 싶은데 어떻게 해야할까요....
-
미해결스프링 핵심 원리 - 기본편
이해안되는 곳이 있습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.의존관계 주입 방법에서 오더서비스 의존관계 주입을 하였습니다.그러고 난 다음 확인 하기 위해 오더서비스임플 생성자에 sout문장을 넣은거 같습니다.근데 오토앱컨피트테스트는 빈에서 멤버서비스를 가지고 오는것으로 보이는데 실행을 하니 오더 서비스에 생성자에 추가한 sout문장들이 출력이 되었습니다 저는 오더서비스의 생성자에 추가한 문장들이 나오지 않습니다. 원래 멤버서비스 객체를 받아온거 아닌가요? 왜 오더서비스 sout문장이 나오는지 잘 모르겠습니다 ㅜ