묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 기본편
예외처리
학교 수업에서 예외처리를 먼저 진도 나가서 그러는데, 예외 처리의 경우에만 중급편 앞쪽 강의를 건너뛰고 예외처리 먼저 들어도 괜찮을까요? 그리고 고급편 강의에서는 어떤 것을 다뤄주실 예정이신지 대략적으로라도 여쭤볼 수 있을까요 ?!!!!
-
해결됨스프링 핵심 원리 - 기본편
공부법에 대해서 궁금해요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)예[질문 내용]여기에 질문 내용을 남겨주세요.현재 스프링을 공부중에 있습니다.김영한님의 커리큘럼 순서대로 가려고 하는데 궁금한 점은 1. 스프링 입문부터 스프링 부트 - 핵심 원리와 활용까지 그냥 쭉 한번 보면서 코드 따라 치고 다시 처음부터 복습하는 게 좋을까요? 2. 아니면 입문을 보고 다음으로 넘어가면서 새로운 거 학습 + 입문 복습 이렇게 하는 게 좋을까요?어떤 공부법이 더 좋을지 궁금합니다.제 상태는 거의 스프링 초보라고 생각하시면 됩니다.현재는 이해가 안되더라도 1번 형태로 쭉 한번 따라하고 2번째부터 2번 방식으로 할 예정입니다.
-
미해결스프링 핵심 원리 - 기본편
다형성
다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 함께 변경된다 라고 하셨는데 이해가 안갑니다 ㅠㅠㅠㅠㅠㅠ
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
버전 21에서 Oracle OpenJDK21은 없습니다
[질문 내용]버전 21에서 Oracle OpenJDK21은 없습니다. 어떻게 해야하나요?
-
미해결김영한의 실전 자바 - 기본편
import관련 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.패키지 import를 할때 import는 하나만 할 수 있다고 하셨는데 a패키지와 b패키지에 클래스명이 User로 같아서 하나만 할 수 있다는건가요? 직접해보니까 c라는 패키지를 만들어서 클래스명을 User로 안하니까 import가 되더라고요 만약 그렇다면 강의에서 보통 자주쓰는 패키지를 임포트하고 다른 패키지는 풀네임으로 쓴다고 하셨는데 그냥 클래스명만 조금 바꾸고 둘다 임포트해서 쓰는게 더 낫지 않나요?
-
미해결김영한의 실전 자바 - 기본편
블로그 포스팅 관련 질문입니다.
안녕하세요 김영한 선생님.Node 계열로만 개발 하다가 Spring을 시작하게된 학생입니다.블로그에 정리를 하면서 수강을 할까 싶은데 강의 화면을 캡처해서 부연설명을 다는 식으로 포스팅을 하면 문제가 될까 싶어 먼저 여쭤봅니다..!
-
미해결김영한의 실전 자바 - 기본편
섹션2 문제와풀이 ProductOrderMain3 문제 이렇게 풀어보았습니다.
package ref.ex; import java.util.Scanner; public class ProductOrderMain3 { static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { System.out.print("입력할 주문의 개수를 입력하세요: "); int arrayLength = scanner.nextInt(); ProductOrder[] orders = createOrder(arrayLength); printOrders(orders); System.out.println("총 결제 금액: " + getTotalAmount(orders)); } static ProductOrder[] createOrder(int arrayLength) { ProductOrder[] orders = new ProductOrder[arrayLength]; for (int i = 0; i < arrayLength; i++) { orders[i] = new ProductOrder(); scanner.nextLine(); System.out.println((i + 1) + "번째 주문 정보를 입력하세요."); System.out.print("상품명: "); orders[i].productName = scanner.nextLine(); System.out.print("가격: "); orders[i].price = scanner.nextInt(); System.out.print("수량: "); orders[i].quantity = scanner.nextInt(); } return orders; } static void printOrders(ProductOrder[] orders) { for (ProductOrder order : orders) { System.out.println("상품명: " + order.productName + ", 가격: " + order.price + ", 수량: " + order.quantity); } } static int getTotalAmount(ProductOrder[] orders) { int totalAmount = 0; for (ProductOrder order : orders) { totalAmount += order.price * order.quantity; } return totalAmount; } }다 풀고 선생님 풀이 보니까 훨씬 간결하게 느껴지네요 ㅠㅠ 메인 메소드를 줄이려고 배열을 생성하고 사용자가 값을 넣는 부분을 메인 메소드 밖에 만드려고 시도하였습니다. 그러다보니 스캐너를 클래스범위에서 생성해야했었고 createOrder메소드의 타입과 매개변수도 바꾸는 등 대대적으로 다 바꾸는 고생을 해야 했습니다 하면서 사용자가 값을 입력하는 부분과 그걸 받아서 배열에 집어넣는 부분을 구분하여 메소드를 하나 더 만드는게 좋다고 생각했으나 하다보니 산으로 가버려서 createOrder메소드가 지나치게 많은 역할을 하고 커져버린 것 같습니다. 피드백 부탁드립니다!
-
미해결스프링 핵심 원리 - 기본편
설정 관련
강의 노트에서 build and run using과 run tests using 설정에서 spring3.2 이상부터는 Gradle을 설정하라고 하셨는데검색했더니 run tests using를 IntelliJ로 설정해야 테스트 코드를 실행했을 때 성공테스트 목록이 보인다고 하는데run tests using만 intelliJ로 설정해도 코드가 돌아가는데 이상이 없을까요?
-
미해결김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음
섹션2 변수 선언과 초기화
[질문 내용]여기에 질문 내용을 남겨주세요.안녕하세요. 선생님께서 컴파일 완료된 것들은 out 폴더에 보인다고 하셨는데 hellojava랑 main만 보이고 나머지도 모두 컴파일 완료 했는데 out 폴더에서 보이지 않습니다.왜 그런건가요?? 그리고 out 폴더에서 보이지 않는다면 문제가 있을까요?
-
미해결스프링 핵심 원리 - 기본편
request 스코프] CoreApplication 오류 납니다.
build.gradle에 웹 라이브러리 추가하고 dependencies { implementation 'org.springframework.boot:spring-boot-starter' implementation 'jakarta.inject:jakarta.inject-api:2.0.1' //web 라이브러리 추가 implementation 'org.springframework.boot:spring-boot-starter-web'CoreApplicaton을 돌렸더니, 아래와 같은 오류 메세지가 뜹니다. 대충 어떤 오류인지는 알겠는데.....어떻게 찾아서 고쳐야 할지는 모르겠네요? Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.Parameter 0 of constructor in hello.core.member.MemberServiceImpl required a single bean, but 2 were found: - memoryMemberRepository: defined in file [C:\SpringBoot\core\out\production\classes\hello\core\member\MemoryMemberRepository.class] - memberRepository: defined by method 'memberRepository' in class path resource [hello/core/AppConfig.class]This may be due to missing parameter name informationAction:Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumedEnsure that your compiler is configured to use the '-parameters' flag.You may need to update both your build tool settings as well as your IDE.
-
해결됨스프링 핵심 원리 - 기본편
빈 생명 주기 콜백에서 생성자 주입 -> setter 주입으로 코드 변경 시 이벤트 라이프 사이클 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]해당 강의에서 섹션 8 부분 ( 빈 생명 주기 콜백 시작 ~ 애노테이션 @PostConstruct, @PreDestroy)를 수강하던 중에 궁금한 점이 생겼습니다. Q. 생성자 주입 방식에서 Setter 메소드 주입 방식으로 코드를 변경 했을 때강사님께서 말씀하셨던 스프링 빈의 이벤트 라이프 사이클 과실제 프로그램 실행 과정이 일치하는지 확인해보았는데일치하지 않는 것 같아서 관련 내용 문의 드립니다. ( 실제 강의에서는 setter 방식으로 변경하는 내용은 나오지 않았습니다.setter 메소드 주입으로 바꿨을 때 실제 라이프 사이클이 어떻게 돌아가는지 궁금해서제가 임의로 코드 변경하였습니다..혹시 이런 질문이 안된다면 글 삭제하겠습니다 ㅠㅠ참고로 setter 로 변경한 코드는 댓글에 남겨두었습니다.) [강사님께서 말씀하셨던 스프링 빈의 이벤트 라이프 사이클]스프링 컨테이너 생성 → 스프링 빈 생성 → 의존 관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료 [생성자 -> setter 로 변경 후 실행했을 때 결과값] 의존 관계 주입 되기 전에 초기화 콜백이 먼저 호출되는데 그러면 이벤트 라이프 사이클을 벗어나는 내용 아닌가요? 혹시 제가 setter 로 주입하는 코드를 제대로 구현하지 못해서 이런 일이 발생한 것일까요?ㅠㅠ ( + 사실 setter 방식일 때 의존 관계가 주입되는 시점이 정확히 어떤 부분인지에 대해서도 제대로 이해를 못한 것 같습니다. )
-
해결됨스프링 핵심 원리 - 기본편
스프링이 제공하는 인터페이스에 의존하면 안되는 이유 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] "스프링 핵심 원리 - 기본편" 강의에서커리큘럼 = 인터페이스 InitializingBean, DisposableBean에서3:45 부터 김영한 강사님께서 하신 말씀에 대해 궁금증이 생겨 질문 남깁니다. 강사님께서 스프링이 제공하는 어노테이션까진 괜찮지만 인터페이스까지 의존하게 되면 너무 부담스럽다고 말씀하셨는데 혹시 이유가 뭔지 알 수 있을까요? 이미 어노테이션에 의존했다면스프링에 의존적인 것은 피할 수 없는 일인데왜 어노테이션은 되고 인터페이스는 안되는 건가요?
-
미해결김영한의 실전 자바 - 기본편
jdk 버전 21
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]강의에서는 21버전 Oracle OpenJDK를 사용하라고 하셨는데 제 화면에는 (21버전) OracleGraalVM 만 뜨는데 이걸로 사용해도 무방한가요? 상관없어보이지만 혹시나 해서 궁금한 마음에 여쭤봅니다!
-
미해결스프링 핵심 원리 - 기본편
실습관련 에러
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요. 강의를 보며 실습을 진행하던 중 Test폴더에서 진행하는 코드에 에러가 발생해서 해결방법을 알고싶어 질문합니다두 파일에서 메소드를 확인할 수 없다는 에러가 발생해서 해결방법을 찾다가 해결하지 못했습니다
-
해결됨김영한의 실전 자바 - 기본편
부모(Item) 클래스의 생성자 및 메서드의 접근 제어자가 public인 이유
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]안녕하세요. 강의 잘 듣고 있습니다.해당 강의에서 부모 클래스인 Item의 생성자 및 print(), getPrice()메서드에 대한 접근제어자를 public으로 설정하셨습니다.제 생각에는 ShopMain 클래스에서 부모 클래스에 접근할 때에는 모두 Item의 자식(book, album, movie)을 통해서만 접근하는 상황이고 이러한 접근 방식이 옳다고 판단되어서 부모 클래스의 생성자 및 메서드의 접근 제어자를 protected로 설정하였습니다(당연하게도 해당 예제에서 실행 결과는 public으로 했을 때와 동일합니다).이 경우에 언젠가는 자식 클래스를 통해 접근하지 않을 경우가 발생할 수 있기 때문에 public으로 설정을 하신 걸까요? 아니면 protected로 설정하는 것이 조금 더 논리에 맞는 걸까요?package extends1.ex; public class Item { private String name; private int price; protected Item(String name, int price) { this.name = name; this.price = price; } protected void print() { //이름과 가격은 모든 자식에서 동일하게 수행하는 기능이므로 부모에 구현 System.out.println("이름:" + name + ", 가격:" + price); } protected int getPrice() { return price; } }
-
미해결김영한의 실전 자바 - 기본편
오버라이딩의 조건
왜 오버라이딩하는 메서드의 접근 제어자는 부모 클래스의 메서드보다 더 제한적이면 안되는 건가요??
-
미해결스프링 핵심 원리 - 기본편
PrototypeBean 클래스는 Static 영역과 Heap 영역 모두에 존재하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]너무 기초 질문인가 싶지만 제가 맞게 이해하고 있는지 확신이 안 돼서 질문드립니다. 제가 이해하고 있는 내용들을 적었습니다. 아래 코드에서 static class PrototypeBean으로 되어 있는 PrototypeBean 클래스는 클래스 로더가 클래스들을 로딩할 때 Method Area(Static Area)에 적재되며, 이 Method 영역에선 인스턴스 객체들처럼 여러 개로 존재하는 것이 아니다. getBean(PrototypeBean.class)을 통해 조회할 때마다 생성되는 프로토타입 빈들은 Heap 영역에 생성되는 객체들이다.(마치 PrototypeBean이 static 클래스가 아닌 것처럼)결론적으로 PrototypeBean은 static임에도 불구하고 Heap 영역에 객체 형태로도 여러 개 존재한다.(조회되는 만큼) 혹시 위 내용들 중에 제가 잘못 이해하고 있는 부분이 있을까요? 자바 기본 문법을 배웠을 땐 static으로 지정하는 것들은 Method Area에만 있고, 객체별로 관리되는 게 아니기 때문에 Heap 영역엔 없는 거로 이해하고 있었는데, PrototypeBean의 경우엔 static임에도 Heap 영역에도 있어서 좀 생소하긴 합니다. 그래도 이 강의를 들으면서 프로토타입 스코프에 대해 이해한 대로면 위에 정리한 1, 2, 3처럼 생각되기는 하는데 제가 혹시 이해를 잘못한 부분이 있나 해서 확인받고 싶습니다. public class PrototypeTest { @Test public void prototypeBeanFind() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class); System.out.println("find prototypeBean1"); PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class); System.out.println("find prototypeBean2"); PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class); System.out.println("prototypeBean1 = " + prototypeBean1); System.out.println("prototypeBean2 = " + prototypeBean2); assertThat(prototypeBean1).isNotSameAs(prototypeBean2); prototypeBean1.destroy(); prototypeBean2.destroy(); ac.close(); } @Scope("prototype") static class PrototypeBean { @PostConstruct public void init() { System.out.println("PrototypeBean.init"); } @PreDestroy public void destroy() { System.out.println("PrototypeBean.destroy"); } } }
-
미해결스프링 핵심 원리 - 기본편
@ComponentScan 강의 중 테스트 코드 에러에 관하여
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'hello.core.member.MemberService' available다음과 같이 에러가 나타났으며 강의 내용 그대로 따라서 @Component @Autowired 작성했는데 해당 오류가 왜 나타난지 모르겠습니다. MemberServiceImpl에 @Component와 생성자에 @Autowired 다 확인했습니다. [이전 강의 중 Singleton에 대한 내용은 입력하지 않았는데 해당 클래스가 있어야 정상적으로 작동하는 것인가요..?]
-
미해결스프링 핵심 원리 - 기본편
노란 바탕 글씨는 왜 나오나요?
노란 바탕 글씨가 나오네요 ???
-
미해결스프링 핵심 원리 - 기본편
AutoAppConfig 필터링 문제
안녕하세요! 컴포넌트 스캔의 필터와 관련하여 질문이 있어 올립니다!기존에 있던 AppConfig.java로 등록한 Bean을 제외하려고 excludeFilters를 사용했는데, CoreApplication을 실행하면 Parameter 0 of constructor in hello.core.member.MemberServiceImpl required a single bean, but 2 were found: - memoryMemberRepository: defined in file [파일경로/core/out/production/classes/hello/core/member/MemoryMemberRepository.class] - memberRepository: defined by method 'memberRepository' in class path resource [hello/core/AppConfig.class]이런 오류가 뜹니다. 코드는 다음과 같습니다.AppConfig.javapackage hello.core; import hello.core.discount.DiscountPolicy; import hello.core.discount.FixDiscountPolicy; import hello.core.discount.RateDiscountPolicy; import hello.core.member.MemberRepository; import hello.core.member.MemberService; import hello.core.member.MemberServiceImpl; import hello.core.member.MemoryMemberRepository; import hello.core.order.OrderService; import hello.core.order.OrderServiceImpl; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class AppConfig { @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public DiscountPolicy discountPolicy() { //return new FixDiscountPolicy(); return new RateDiscountPolicy(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountPolicy()); } } AutoAppConfig.javapackage hello.core; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; import static org.springframework.context.annotation.ComponentScan.*; @Configuration @ComponentScan( excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public class AutoAppConfig { }위의 오류는 memberRepository뿐만 아니라 rateDiscountPolicy에서도 나옵니다. @Component와 @Autowired 어노테이션은 잘 설정한것 같은데 뭐가 문제일까요?