묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨스프링 핵심 원리 - 기본편
@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문장이 나오는지 잘 모르겠습니다 ㅜ
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
퀴즈 11 질문입니다 관련
Throw 로 생성을 해주니 클래스 부분에 스태틱을 포함하든가 메인 영역에 스태틱을 지우라고 오류가 뜹니다.선생님 코드에는 이상이 없는 것 같은데 궁금합니다!이렇게 클래스에 스태틱을 추가하면 오류가 사라집니다.
-
해결됨스프링 핵심 원리 - 기본편
@Configutation 질문
ApplicationContext로 class를 등록하고 등록된 빈들을 조회해보니 싱글톤이 보장되는 것을 확인했습니다.근데 @Configuration을 사용하지 않고 @Bean만 사용하면 주입받는 객체들이 싱글톤을 유지하지 않게되는데@Configuration이 주입관계있는 빈들까지 싱글톤을 보장해주는 것 맞나요..?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
wrapper 클래스
제네릭 클래스에서는 wrapper가 이러한 형식으로 쓰이는 가보다라고 문법처럼 이해를 했습니다. 근데 본질적으로 wrapper 클래스 강의를 보다 보니까 왜 원시자료형을 쓸 때는 intvValue(), doubleValue() 등등이 안되는지 이해가 안됩니다. 대충 알아보니 박싱 언박싱 개념이 나오는데... 그냥 메소드를 사용하려면 참조형이 되야 한다라고 생각하고, wrapper를 쓰면 원시-> 참조로 바뀐다고 생각하면 되나요? 그리고 parseInt()와 intValue()의 차이도 알고싶습니다. 혹시 이것도 parseInt()는 원시자료형이 필요하고 intValue()는 참조형이 필요하다고 생각하면 되나요?
-
미해결스프링 핵심 원리 - 기본편
안녕하세요.
안녕하세요 강의 너무 잘듣고 있습니다 항상감사합니다. build.gradle로 프로젝트를 open하는거랑 그냥 프로젝트 폴더로 open하는거 차이를 알고싶습니다.강의를 계속반복하고있는데 최근 스프링부트 버전이 3.xx되면서 3.xx부터는 자바17만지원되는데 17을사용해도 문제없는지 궁금합니다...
-
미해결스프링 핵심 원리 - 기본편
조회대상 빈이 2개 이상 일 때 빈지정에 방법들의 DIP 위반 여부
관련 강의 : 의존관계 자동 주입 - 6번째 강의(@Autowired, @Qualifer, @Primary)질문타입이 같은 빈이 여러 개 조회 될 때, 특정 빈을 선택하는 방법을 3가지 소개해 주셨는데..이 3가지 방법이 결국 특정 빈을 지정해 주는 방법인 것 같습니다. 이 방법을 사용하면, 특정 빈을 지정해 DI 할 수 있을 것 같습니다. 그러나 DIP 위반을 피하기 위해서 이전 강의에서 AppConfig에서만 특정 빈을 선택하도록 하였습니다. 예를들어 AppConfig에서 DiscountPolicy 중 Rate..와 Fix... 를 선택하게 하고 , 또한 AppConfig에서 MemberRepository 중 Memory..., DB...,External... 등을 선택하도록 하여 DIP 위반 문제를 해결했습니다. 그런데 @Qualifer,@Primary 등을 사용하면 OrderServiceImpl 이나 MemberServiceImpl 이 RateDiscountPolicy, FixDiscountPolicy 또는 Repository 관련 하위 클래스 등을 선택하게 되어 결국은 DIP에 위반되는 것은 아닌지 여쭈어 봅니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
생성자 주입으로 변경했을 때 Provider 생성할때 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.단위 테스트로 할 때 필드 주입이 좋지 않다고 하셔서 생성자 주입으로 변경 후 돌려봤을 때 Provider를 적용하기 전에 ObjectProvider<PrototypeBean> 으로 했을 때는 테스트가 성공했지만 Provider로 할때는 다음과 같은 에러가 나서 왜 발생했는지 질문드립니다org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'singletonWithPrototype.ClientBean': Unsatisfied dependency expressed through constructor parameter 1: No qualifying bean of type 'javax.inject.Provider<hello.core.scope.SingletonWithPrototype$PrototypeBean>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}아래는 전체 코드 입니다.package hello.core.scope; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Scope; import javax.inject.Provider; import static org.assertj.core.api.Assertions.assertThat; public class SingletonWithPrototype { @Test void prototypeFind() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class); prototypeBean1.addCount(); assertThat(prototypeBean1.getCount()).isEqualTo(1); PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class); prototypeBean2.addCount(); assertThat(prototypeBean2.getCount()).isEqualTo(1); } @Test void singletonClientUsePrototype() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ClientBean.class, PrototypeBean.class); ClientBean clientBean1 = ac.getBean(ClientBean.class); int count1 = clientBean1.logic(); assertThat(count1).isEqualTo(1); ClientBean clientBean2 = ac.getBean(ClientBean.class); int count2 = clientBean2.logic(); assertThat(count2).isEqualTo(1); } @Scope("singleton") static class ClientBean { private final PrototypeBean prototypeBean; //생성시점에 주입되어서 계속 같은 거 사용. private final Provider<PrototypeBean> prototypeBeanProvider; @Autowired //생성자 하나니까 @Autowired 생략해도 되긴 함 public ClientBean(PrototypeBean prototypeBean, Provider<PrototypeBean> prototypeBeanProvider) { this.prototypeBean = prototypeBean; this.prototypeBeanProvider = prototypeBeanProvider; } public int logic() { PrototypeBean prototypeBean = prototypeBeanProvider.get(); prototypeBean.addCount(); return prototypeBean.getCount(); } } @Scope("prototype") static class PrototypeBean { private int count = 0; public void addCount() { count++; } public int getCount() { return count; } @PostConstruct public void init() { System.out.println("PrototypeBean.init " + this); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } } }
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
String 문자열, String[] 배열에서의 .length, .length(), .charAt() 쓰임의 차이점을 알고 싶습니다 :)
안녕하세요, 다름이 아니라 제가 나도코딩 자바(Java) 기본편을 공부하면서, 배열(Array)에 관해 모르는 것이 생겨서 이렇게 질문을 남깁니다.일반적으로 배열이 String[] array = {...}; 이렇게 선언 되었을 때, array.length를 이용해서 배열의 길이를 파악하고, array[0] 처럼 이렇게 인덱스로 값의 위치를 파악하면서 데이터를 읽는다고 알고 있습니다. 반면에 String sentence = "sentence"; 이런 경우에는 같은 length를 쓰지만 String 클래스의 메소드라서 괄호를 나타낸 sentence.length()로 길이를 파악하고, "..."; 안 문장의 각 글자 별 위치를 파악할 때는 sentence.charAt()을 쓴다고 알고 있습니다. 제가 이해한 부분이 혹시 맞을까요?또한 아래처럼 선언된 String[] 배열에서:String[] Java = { "나는 자바가 좋아요" };Java 배열의 전체 길이를 파악하고 싶다면, Java.length 으로 적는데, 만약 배열 안 문장 "나는 자바가 좋아요" 의 전체 길이를 알고 싶다면 Java[].length()으로 적고, 배열 안에 들어있는 문장 "나는 자바가 좋아요" 에서 각 낱말의 위치를 파악하고 싶다면, Java[].charAt()를 적으면 되는 건가요? 여기서 Java[].부분에는 배열 index를 적고 (예를 들면 Java[0]), charAt()은 "..." 문장의 각 글자 별 인덱스를 적는 방식으로요.질문이 조금 많이 길었습니다. 하지만 동시에 그 만큼 제가 또한 열심히 배우고 싶다는 열정으로 봐주셨으면 합니다! 게다가 앞으로 다가올 기말시험에서도 배열의 비중이 꽤 크기도 해서, 정말로 잘 배우고 싶습니다! (해외에서 대학을 다니는 지라 지금 이맘때 쯤이 시험기간입니다 ㅠㅠ)참 얼마 전에, 자바로 소켓 프로그래밍으로 과제를 해야 했었던 일이 있었는데, 그 때 나도코딩님이 업로드 해주신 섹션 12. (Section 12.) 예외 처리 부분이 상당히 많이 도움 되었습니다.덕분에 과제에서 나쁘지 않은 점수를 받았습니다. 앞으로도 좋은 강의 잘 부탁하고, 진심으로 감사합니다 :-)
-
해결됨[코드팩토리] [입문] Dart 언어 4시간만에 완전정복
[질문] cascading operator 설명하실 때
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. ...는 Spread Operator 이고..이 Cascading Operator 아닌가해서 질문드립니다. dart 강의 3강, 32분 쯤에 나오는 내용입니다.
-
미해결스프링 핵심 원리 - 기본편
생성자에서 @Autowired 생략
setter에 @Autowired를 붙이고, 생성자에 @Autowired를 붙이지 않은 경우에도생성자에는 @Autowired가 붙은 것과 같이 동작하나요?
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
강사님, 질문 하나 드립니다!
구문 1구문 2 (강사님이 보여주신 예제)단순 위 아래의 순서 차이 같아 보이는데, 구문 1 에서는 오류가 나고, 구문 2에서는 오류가 나지 않는 이유를 혹시 알 수 있을까요? 왠지 인스턴스 변수 때문에 그런건가 대충 짐작만 하고 있는데.. 혹시 설명을 들을 수 있을지요 하하;
-
미해결나도코딩의 자바 기본편 - 풀코스 (20시간)
제네릭 클래스 (전반전) 마지막 부분 int와 String으로 변환
안녕하세요.강의 정말 잘 듣고 있습니다.제네릭 클래스 (전반전) 마지막 부분int 와 String으로 변환 후 출력을 하는 부분에서Object c3Name = c3.name; System.out.println("주문 고객 번호 : " + c3Name); Object c4Name = c4.name; System.out.println("주문 고객 이름 : " + c4Name);이대로 작성하면 오류없이 정상 출력 됩니다.int와 String으로 변환하지 않고 Object로 코드 작성하면 안되는 건가요?왜 굳이 int와 String으로 변환해서 출력하는지 궁금합니다.