[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 회원가입 테스트 진행하는데 테스트 자체는 강의와 똑같이 잘 진행됩니다. 오류메세지가 계속 뜨는데 해결을 어떻게 해야되는지는 모르겠네요. --------------오류메세지------------ Mockito is currently self-attaching to enable the inline-mock-maker. This will no longer work in future releases of the JDK. Please add Mockito as an agent to your build what is described in Mockito's documentation: https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3 WARNING: A Java agent has been loaded dynamically (C:\Users\hyozz\.gradle\caches\modules-2\files-2.1\net.bytebuddy\byte-buddy-agent\1.15.11\a38b16385e867f59a641330f0362ebe742788ed8\byte-buddy-agent-1.15.11.jar) WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information WARNING: Dynamic loading of agents will be disallowed by default in a future release OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended --------------오류메세지------------
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 안녕하세요 상속 생성자의 super 사용에 대해 궁금한 점이 생겨 질문을 남깁니다. 생성자를 사용 시 this를 사용해도 상위의 생성자를 만들기 위해 super();을 한 번은 호출해야 한다고 이해했는데, 하위 클래스에서 하나의 생성자 안에 this와 super();을 함께 사용하지는 못할까요 ? 만약 하나의 생성자 안에 this와 super을 함께 사용이 가능하다면 super을 먼저 쓰는지 this를 먼저 쓰는지에 따라 상위와 하위 생성자 할당 순서가 달라질텐데 무엇을 먼저 써주어야하는지가 궁금합니다. 좋은 강의 항상 감사드립니다 !
import java.util.*; public class Main { public void solution(String str) { String upper = str.toUpperCase(); for (int i = 0; i<str.length(); i++) { if (str.charAt(i) != upper.charAt(i)) { System.out.print(upper.charAt(i)); } else { System.out.print(Character.toLowerCase(str.charAt(i))); } } } public static void main(String[] args) { Main main = new Main(); Scanner sc = new Scanner(System.in); String str = sc.next(); main.solution(str); } } 정답 처리는 됐습니다. 저는 solution() 메서드의 리턴 타입을 void로 두고, 이 메서드 내부에서 한 글자씩 print()로 출력했습니다. 이런 접근은 안 좋으려나요?
1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 아니오 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 먼저 강의 설명과 일맥상통한 부분일 것 같지만, Spring Data JPA를 바탕으로 토이프로젝트를 개발하고있고 Pageable 인터페이스를 활용하고 있습니다. 프로젝트에서 Item(품목)의 하위 개념으로 Product(제품)을 가지고 있습니다.(1:N - 품목 하나에 대해 여러개의 제품을 등록 할 수 있음) 처음에는 특정 item을 클릭했을 때, 해당 item의 정보와 item에 등록된 하위 Product 리스트(목록을 보여주기 위한 일부 정보들만)를 보여주기 위해 item에 접급하는 Repository에 다음 메소드를 만들었습니다. @Query(value = "SELECT DISTINCT i FROM Item i LEFT JOIN FETCH i.productList WHERE i.id = :itemId", countQuery = "SELECT COUNT(p) FROM Product p WHERE p.item.id = :itemId") Page<Item> findWithProductsByItemId(@Param("itemId") long itemId, Pageable pageable); 그런데 이렇게 하다보니 product가 아닌 item으로 페이징이 되는 것을 알았습니다. 이에 두 가지로 대책을 세웠는데 어떻게 해야할지 모르겠습니다. 1) 응용계층에서 item에 대한 정보를 불러오는 item서비스 호출 + 위 item에 해당되는 product 리스트 정보들을 paging 하여 불러오는 페이징하여 불러오는 product서비스 호출 2) product를 메인으로 item과 n:1 패치조인하는 메소드를 productRepository에서 생성. 1번 방법이 맞는 것 같지만,, paging으로 데이터를 불러올 때마다 item쿼리를 한번씩 날려야하는게 비효율적인거 같기도하고,, 2번으로 하자니... 제가 구현하고자 하는 기능과는 뭔가 다르게 개발하는거 같아 꺼림직 합니다.(item 중심의 조회 기능이 아닌 product기준의 조회) 긴글 읽어주셔서 감사합니다... 어떤식으로 구현하는게 맞는 방법일까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 입문이나 기본편에서는 인터페이스를 만들어서 확장을 염두에 두었는데 JPA는 인터페이스 기반 설계를 못하는 건가요?? 아니면 일부로 안 하신건가여
학습중 궁금한 것은 언제든 문의 하세요. 질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다. 추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다. 선생님 좋은 강의 감사합니다. 강의 재밌게 듣고 있습니다. 브로드캐스트활용해서 채팅(실시간 알림)기능 구현 강의 듣던 중 궁금한게 생겼는데요 그 전 강의에서 8080 8081 두개 서버 띄어놓고 라운드로빈으로 분배되는 것 설명하셨을 때 처럼 두개 띄어놓고 8080 8081 각각의 웹소켓으로 메세지 전송했는데 각각의 서버 별로 별도로 브로드캐스팅이 되는 것 같더라고요. 전체로 브로드캐스팅 하려면 보통 어떤 식으로 구현하나요?
학습중 궁금한 것은 언제든 문의 하세요. 질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다. 추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다. 첫 pdf 에서 docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 이부분 뒤에 짤렸고 짤린 부분 다른 파일도 더 있는 것 같아요
안녕하세요, 먼저 소중한 강의 만들어주셔서 너무 감사드립니다! 🙏🏻 댓글 목록 조회 쿼리에서 궁금한 점이 있어 질문드립니다. ( 댓글 최대 2 depth - 목록 API 설계 7:19 부분 ) 질문 "튜플 비교 (a, b) > (x, y) 를 사용하면 인덱스 풀 스캔이 발생하여 성능이 매우 떨어지는데, 명시적 조건 a > x OR (a = x AND b > y) 으로 분리하면 인덱스 레인지 스캔이 발생하여 쿼리 성능이 매우 빨라지는데 왜 그런 것일지 모르겠습니다.." 질문 상세 테스트 환경: comment 에 약 8백만건의 테스트 데이터 삽입 mysql base image: mysql:8.0.38 comment table ddl -- auto-generated definition create table comment ( comment_id bigint not null primary key, content varchar(3000) not null, article_id bigint not null, parent_comment_id bigint not null, writer_id bigint not null, is_deleted tinyint(1) not null, created_at datetime not null ); create index idx_article_id_parent_comment_id_comment_id on comment (article_id, parent_comment_id, comment_id); 문제가 되는 테스트 케이스 (1: slow, 2: fast) case 1. tuple comparision (slow) explain analyze select comment.comment_id, comment.parent_comment_id, comment.content, comment.article_id, comment.writer_id, comment.content, comment.is_deleted, comment.created_at from comment where article_id = 1 and (parent_comment_id, comment_id) > (142539921307124354, 142539921307124350) order by parent_comment_id, comment_id limit 30; -- -> Limit: 30 row(s) (cost=542979 rows=30) (actual time=8620..8620 rows=30 loops=1) -> Filter: ((`comment`.comment_id,`comment`.parent_comment_id) > (142539921307124354,142539921307124350)) (cost=542979 rows=4.01e+6) (actual time=8620..8620 rows=30 loops=1) -> Index lookup on comment using idx_article_id_parent_comment_id_comment_id (article_id=1) (cost=542979 rows=4.01e+6) (actual time=1.83..8251 rows=8e+6 loops=1) case 2. fast explain analyze select comment.comment_id, comment.parent_comment_id, comment.content, comment.article_id, comment.writer_id, comment.content, comment.is_deleted, comment.created_at from comment where article_id = 1 and ( parent_comment_id > 142539921307124354 or (parent_comment_id = 142539921307124354 and comment_id > 142539921307124350) ) order by parent_comment_id, comment_id limit 30; -- -> Limit: 30 row(s) (cost=416 rows=30) (actual time=0.252..0.727 rows=30 loops=1) -> Index range scan on comment using idx_article_id_parent_comment_id_comment_id over (article_id = 1 AND parent_comment_id = 142539921307124354 AND 142539921307124350 < comment_id) OR (article_id = 1 AND 142539921307124354 < parent_comment_id), with index condition: ((`comment`.article_id = 1) and ((`comment`.parent_comment_id > 142539921307124354) or ((`comment`.parent_comment_id = 142539921307124354) and (`comment`.comment_id > 142539921307124350)))) (cost=416 rows=358) (actual time=0.232..0.705 rows=30 loops=1) 튜플 비교를 사용한 1번 쿼리에서는 index full scan 이 발생하여 ( 8백만개의 row 를 모두 스캔 ) 8초의 안좋은 쿼리 성능이 나타난 것으로 판단했습니다. 반면 튜플 비교를 명시적 조건으로 분리한 2번 쿼리에서는, ( a > X OR (a = X AND b > Y) )) index range scan 을 통해 0.7초 이하의 빠른 쿼리 성능이 나타난 것 같아요. 요약 튜플 비교 (a, b) > (x, y) 를 사용한 1번 쿼리에서 MySQL 옵티마이저는 왜 풀 인덱스 스캔을 선택하는 것인지, 튜플 비교가 인덱스 레인지 스캔으로 최적화되지 않는 이유가 무엇인지 원인을 찾고 있는데 잘 모르겠네요.. 힌트를 받을 수 있을까요? 새해복 많이 받으세요!
package enumeration.ex2; public class ClassGrade { public static final ClassGrade BASIC = new ClassGrade(); public static final ClassGrade GOLD = new ClassGrade(); public static final ClassGrade DIAMOND = new ClassGrade(); } => public static final ClassGrade BASIC; public static final ClassGrade GOLD ; public static final ClassGrade DIAMOND ; 이로면 안되나여?new를 왜햇는지 모르겟어요
package enumeration.ex1; public class DiscountService { public int discount(StringGrade grade,int price){ int discountPercent=0; if(grade.equals(StringGrade.BASIC)) { discountPercent=10; }else if(grade.equals(StringGrade.GOLD)){ discountPercent=20; }else if(grade.equals(StringGrade.DIAMOND)){ discountPercent=30; }else{ System.out.println(grade+":할인 x"); } return price*discountPercent/100; } } discount 메서드에서 타입을 String 타입이 아닌 StringGrade타입으로 받으면 아래 예제가 다 에러 표시가 나면서 개발자들이 실수 하지않게 되는데? 왜 굳이 enum을 쓰나여? StringGrade타입으로 하면되자나여 package enumeration.ex1; import enumeration.ex1.DiscountService; public class StringGradeEx1_2 { public static void main(String[] args) { int price=100000; DiscountService discountService=new DiscountService(); //존재하지 않는 등급 int VIP =discountService.discount("VIP",price); System.out.println("VIP = " + VIP); //오타 int diamoddd= discountService.discount("diamoddd",price); System.out.println("diamoddd = " + diamoddd); //소문자 입력 int gold= discountService.discount("gold",price); System.out.println("gold = " + gold); } }
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] public static void printV2(Shuttle<? extends BioUnit> shuttle) { shuttle.showInfo(); } 이 부분에 와일드카드가 BioUnit 을 extends 해야 한다고 명시적으로 작성해 주고 있는데 Shuttle 클래스에서 이미 <T extends BioUnit> 을 하고 있기 때문에 와일드카드는 단순하게 ? 만 사용해도 괜찮은 걸까요? 다른 개발자가 사용할 경우에 좀 더 명시적으로 확인시켜주기 위해 적은거라고 이해해도 되는 건지 궁금합니다. public static void printV2(Shuttle<?> shuttle) { shuttle.showInfo(); } 이렇게 코드를 작성한 이후에 여러 테스트를 해봤는데 Shuttle 클래스를 만들때 <T extends BioUnit> 에 걸려서 Integer나 Object 등 다른 타입은 사용할 수 없더라구요.
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] build.gradle에 Hibernate5JakartaModule을 잘 등록하여 라이브러리 목록도 확인했습니다. 그런데 이렇게 오류가 뜹니다ㅠㅠ 빨간 줄에는 "Cannot return a value from a method with void result type" 라고 뜨는데 이유가 뭘까요..ㅠㅠ
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 여기에 질문 내용을 남겨주세요. 연관관계 양방향에 값을 입력해주는 부분에 대해서 이해한 것 같습니다. 아직 1차 캐시에만 존재하고 영속성 엔티티에 반영이 되지 않았기 때문에 객체로는 조회가 되지 않는 것으로 이해했습니다. 다만 궁금한 점이 기본키 전략을 auto_increment 같은 방식으로 한 경우에는 미리 한번 쿼리가 나간다고 이전 강의에서 배운 것이 생각났습니다. 강의에서도 기본키 전략은 동일한 것 같습니다. 기본키 전략 때문에 나간 쿼리가 반영이 안되는 이유가 따로 있을가요?
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
강의따라서 H2접속하면 자동으로 BOOK, FRUIT, PERSON, USER, USER_LOAN_HISTORY 테이블이 있는데 어떻게 자동으로 만들어져 있는 건가요.?? mysql에서 테이블 만들었는데 h2는 mysql과 다른거 아닌가요..? 기존의 자바 entity 코드를 다 읽어서 얘네가 알고있는건가요??? ps. 강의 너무 잘듣고 있습니다! 이때까지 완강해본 강의가 손에꼽는데 완강을 앞두고 있어서 너무 설레는 맘입니다..! 좋은 강의 만들어주셔서 감사합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오)네 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)아니오 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)네 [질문 내용] 여기에 질문 내용을 남겨주세요. spring.datasource.username=sa를 추가하였고, javax를 jakarta로 변경하였는데도 오류가 납니다. external libraries에 hibernate를 검색해도 나오지 않습니다. 틀린부분 알려주시면 감사하겠습니다.
게시글 CRUD API 구현 테스트 하는 부분에서 13:34쯤에 작성하고 테스트 실행하는 부분에서 아래 오류가 발생하는데 원인이 도대체 뭐일까여..ㅠㅠ 포트 9000에 서버 시작도 해놨었습니다 500 Internal Server Error: "{"timestamp":"2025-01-27T06:39:44.186+00:00","status":500,"error":"Internal Server Error","path":"/v1/articles"}" org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Internal Server Error: "{"timestamp":"2025-01-27T06:39:44.186+00:00","status":500,"error":"Internal Server Error","path":"/v1/articles"}" at org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:102)
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예) [질문 내용] 대상 강의록: 4. 컬렉션 프레임워크 - LinkedList.pdf 의 p.12 대상 소스 파일: NodeMain3 add(Node node, String param) 메서드 건의 내용: 해당 부분은 아직 LinkedList 에 대한 제네릭 도입 전이므로 Node 클래스에서도 item 의 타입을 Object 로 사용하고 있습니다. public class Node { Object item; Node next; public Node(Object item) { this.item = item; } ... } 따라서 add 메서드 또한 추가할 데이터인 param을 String이 아닌, Object 타입으로 설정해야 수강생들의 이해가 쉬울 것이라고 생각합니다. // 기존 강의록 코드 private static void add(Node node, String param) { Node lastNode = getLastNode(node); lastNode.next = new Node(param); } // 수정 제안 코드 <<수정부분: String -> Object>> private static void add(Node node, Object param) { Node lastNode = getLastNode(node); lastNode.next = new Node(param); }
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 윈도우로 h2 console을 진행해서 h2를 켜는 것과, cmd를 이용해서 h2.bat으로 h2를 켜는 것의 차이가 있을까요?