월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
스프링 부트 3.0 findAll() 쿼리
안녕하세요!!강의 너무 잘 보고 있는 수강생입니다! 스프링 부트 3.0.1 버전으로 프로젝트를 생성해 강의를 듣다가 단순 전체 조회 쿼리(/api/v2/orders)인 findAll()에서 쿼리가 강의와 다르게 나와 궁금증이 생겨 질문 드립니다.제가 이해하기로는 /api/v2/orders를 호출하면 다음과 같은 순서로 데이터를 가져온다고 생각했습니다.orders 조회하는 쿼리 호출OrderDto 를 만드는 과정에서 getMember()와 getDelivery() 를 호출할 때 Member와 Delivery를 가져오는 쿼리 호출getOrderItems() 를 통해 orderItems 조회하는 쿼리 호출OrderItemDto 를 만드는 과정에서 getItem()을 호출할 때 각각의 Item을 가져오는 쿼리 호출그래서 강의처럼 데이터를 초기화 한다면 총 11번의 쿼리가 발생해야 한다고 생각했고 강의에서도 11번의 쿼리가 생겼습니다.하지만 제 코드에서는 getDelivery() 를 호출하는 과정에서 이상하게 Delivery를 호출한 후, deliveryId 를 조건절로 Order를 조회하는 쿼리가 한 번 더 생겨 아래 로그처럼 총 13번의 쿼리가 발생했습니다. 2023-01-14T18:10:31.860+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 2023-01-14T18:10:31.890+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name from member m1_0 where m1_0.member_id=? 2023-01-14T18:10:31.890+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [1] 2023-01-14T18:10:31.895+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status from delivery d1_0 where d1_0.delivery_id=? 2023-01-14T18:10:31.895+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [1] 2023-01-14T18:10:31.899+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.delivery_id=? 2023-01-14T18:10:31.900+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [1] 2023-01-14T18:10:31.910+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select o1_0.order_id, o1_0.order_item_id, o1_0.count, o1_0.item_id, o1_0.order_price from order_item o1_0 where o1_0.order_id=? 2023-01-14T18:10:31.910+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [1] 2023-01-14T18:10:31.914+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select i1_0.item_id, i1_0.dtype, i1_0.name, i1_0.price, i1_0.stock_quantity, i1_0.author, i1_0.isbn from item i1_0 where i1_0.item_id=? 2023-01-14T18:10:31.915+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [1] 2023-01-14T18:10:31.916+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select i1_0.item_id, i1_0.dtype, i1_0.name, i1_0.price, i1_0.stock_quantity, i1_0.author, i1_0.isbn from item i1_0 where i1_0.item_id=? 2023-01-14T18:10:31.917+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [2] ============================================== 2023-01-14T18:10:31.919+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name from member m1_0 where m1_0.member_id=? 2023-01-14T18:10:31.919+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [2] 2023-01-14T18:10:31.921+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status from delivery d1_0 where d1_0.delivery_id=? 2023-01-14T18:10:31.921+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [2] 2023-01-14T18:10:31.922+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select o1_0.order_id, o1_0.delivery_id, o1_0.member_id, o1_0.order_date, o1_0.status from orders o1_0 where o1_0.delivery_id=? 2023-01-14T18:10:31.923+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [2] 2023-01-14T18:10:31.925+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select o1_0.order_id, o1_0.order_item_id, o1_0.count, o1_0.item_id, o1_0.order_price from order_item o1_0 where o1_0.order_id=? 2023-01-14T18:10:31.926+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [2] 2023-01-14T18:10:31.927+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select i1_0.item_id, i1_0.dtype, i1_0.name, i1_0.price, i1_0.stock_quantity, i1_0.author, i1_0.isbn from item i1_0 where i1_0.item_id=? 2023-01-14T18:10:31.927+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [3] 2023-01-14T18:10:31.928+09:00 DEBUG 6590 --- [nio-8070-exec-2] org.hibernate.SQL : select i1_0.item_id, i1_0.dtype, i1_0.name, i1_0.price, i1_0.stock_quantity, i1_0.author, i1_0.isbn from item i1_0 where i1_0.item_id=? 2023-01-14T18:10:31.928+09:00 TRACE 6590 --- [nio-8070-exec-2] org.hibernate.orm.jdbc.bind : binding parameter [1] as [BIGINT] - [4] ============================================== 혹시나 제가 코드를 잘못 작성했을까봐 강의 자료로 올라온 소스코드에서 default_batch_fetch_size 만 주석 처리하고 스프링 부트 3.0 환경에서 돌려봤는데 같은 결과가 나왔고, JpaRepository 를 통한 findAll 로 두 버전에서 모두 테스트를 해봤는데 같은 결과가 발생했습니다. 그래서 Delivery에 @OneToOne으로 걸려있는 order가 문제라 생각해 이 부분을 지우고 실행했더니 해당 쿼리가 사라졌습니다. 하지만 @OneToOne의 패치 전략을 Lazy로 하고 따로 Order를 조회하지 않았고, 맨 처음 orders를 조회하는 쿼리를 실행하는 과정에서 영속성 컨텍스트에 orders가 저장 되기도 했기 때문에 해당 쿼리가 생기면 안된다고 생각을 했는데 혹시 제가 잘못 이해하고 있는걸까요..? 스프링 부트 3.0으로 올라가는 과정에서 hibernate의 버전도 6으로 올라가 뭔가 변경이 생긴것인지, 아니면 제가 어떤 실수를 하고 있는건지 궁금해서 질문 드립니다..!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
속성 목록보는 단축키가 뭔가요...?
강의에서 어노테이션 속성 고를 때 단축키로 목록을 여시던데... 이거 단축키가 맥기준으로 Basic via⌃Space 라고 쓰여있는데 이거 어떻게 쳐야하는건가요...?일단 ctrl + space 눌러도 반응이 없습니다 ㅠㅠ인텔리제이 얼티메이트 에디션 사용중입니다...속성목록 보는 기능을 뭐라고 구글링 해야 하는지 모르겠어서 하는수없이 여기에 적었습니다 ㅠㅠ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OrderRepository를 사용하는 이유
안녕하세요~좋은 강의를 위해서 항상 노력해주셔서 감사합니다 :)수업을 듣다가 갑자기 궁금한것이 있어서 질문드립니다!지금 강의에서는 OrderSimpleApiController 에서 OrderRepository 를 Service 를 거치지 않고 의존하고 있는데 Service 를 거칠 만큼 로직이 복잡하지 않아서 repository 에서 바로 가져다 사용한 것이 맞을까요??
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원조회 api DOT 클래스 생성 질문드립니다
// 2. DTO를 사용할 경우 @GetMapping("/api/v2/members") public MemberListResponse<List<Member>> membersV2(){ List<Member> member = memberService.findMembers(); return new MemberListResponse<List<Member>>(member); } @Data @AllArgsConstructor static class MemberListResponse<T>{ private T member; }저는 김영한 강사님과 다르게 위에 코드처럼 구현했는데 이렇게 구현해도 문제 없는 걸까요? 성능상 안 좋거나 단점이 있는지 알고 싶습니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
in 쿼리에 대한 자세한 내용
19:24 로그에서in 쿼리에 대한 자세한 내용이 저는 확인이 안되는데어떤 옵션이나 설정을 주신건지 알 수 있을까요?!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
간접 참조에 대한 조회 쿼리
안녕하세요 영한님!memberId 를 간접 참고 하도록 설정한 후 조회 기능을 구현하다가 궁금증이 생겼습니다.글 (Article) 과 댓글 (Comment) 은 양방향 연관관계로 설정되어 있는 상태이고, Member 는 Article 과 Comment 에 각각 Long createdBy 에 memberId 가 들어가도록 간접 참조로 설정 되어있는 상황인데요.영한님께 배운 방식을 적용해보자면,Article 과 Comment 를 엔티티로 조회하고, Member 도 createdBy 의 id 값을 in 으로 조회해서 값을 Article 과 Comment 에 넣어주는 방식join 을 이용하여 dto 로 조회하는 방식이렇게 두 가지 경우가 있을 것 같은데요.영한님께서는 간접 참고의 값을 조회해야 하는 경우에 두 가지 방식 중 어떤 방식을 더 선호하시는지 궁금합니다!밑은 코드 첨부입니다.아래와 같이 response 를 보내주고 싶습니다.{ "article_id": 1, "title": "JPA 질문", "content": "조회 쿼리 질문입니다", "creatorEmail": "jpa", "creatorName": "noob", "comments": [ { "content": "첫 번째 댓글", "creatorEmail": "q1", "creatorName": "questioner1" }, { "content": "두 번째 댓글", "creatorEmail": "q2", "creatorName": "questioner2" } ] }
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
이너 클래스 질문 입니다.
안녕하세요,강의를 보면 Dto들을 모두 이너 클래스로 작성하셨는데실무에서도 이런 경우 이너 클래스로 작성해주나요?아니면 하나하나 다 클래스를 생성해 주어야 하나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
페이징 한계돌파 강의 중 문의
안녕하세요?우선 새해 복 많이 받으세요.spring boot version: 3.0java version: 17order table에는 2건(강의에 나오는 주문내역과 같습니다.)의 주문 있고 offset을 적용 했을 때 조회된 데이터가 1건 이상이 조회 될 때는 order_item table조회가 in query로 데이터를 잘 가지고 오고 있습니다. 문제는 offset을 적용 해서 조회된 order 데이터가 1건일때default_batch_fetch_size: 100하나의 orderId를 위에 설정한 batch_fetch_size만큼 in query에 파라미터로 사용하고 있습니다.OperationTime : 0ms| HeFormatSql(P6Spy sql,Hibernate format):selecto1_0.order_id,o1_0.order_item_id,o1_0.count,o1_0.item_id,o1_0.order_pricefromorder_item o1_0whereo1_0.order_id in(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2)혹시 이와 관련한 해결법이 있을까요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
api 작성중에 enum type 문의 드립니다.
이전 jpa활용 1편에서 작성했던 부분들을 api로 변경을 진행중입니다. 다른 부분들은 잘 진행되고있지만java 기초가 부족해서 enum으로 만든 OrderStatus부분을 어떻게 처리해야될지 감이 잡히질 않아 문의드립니다.처음 주문 내역페이지를 호출 할 때 주문상태(OrderStatus) 부분을 api로 받아 select 구성을 해야합니다. 이 때 enum을 배열로 변환(?)해서 넘기는게 맞는 방법일까요? 조회시 주문상태(OrderStatus)와 회원이름을 form으로 넘길때 Controller에서는 @RequestBody OrderSearch로 받으며 주문상태는 OrderStatus로 선언되어있습니다. 자동 맵핑이 안되는거같은데 enum type을 request로 어떻게 받아야하는지 궁금합니다. 질문이 잘 전달되었을지 모르겠지만 답변부탁드리겠습니다.감사합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의가 반복됩니다
편집이 조금 잘못됐는지 네트워크 문제라고 생각하고 넘겼었는데 이상해서 문의합니다!페이징과 한계 돌파 강의부터 끝날때까지 꾸준히 발생하는 것 같습니다
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
순환 참조 문제 질문입니다.
Member 클래스의 orders 속성에 @JsonIgnore를 선언하지 않으면 Member와 Order는 양방향 관계이기 때문에 순환 참조 문제가 발생할 것 같은데 안 하더라구요. 이유가 orders에 값이 저장되어 있지 않기 때문이 맞을까요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
페이징 관련 질문입니다
offset, limit 이제 어플리케이션 쪽에서 받아서 페이징 조회를 하는데음수 값이 나올 때는 어떻게 처리를 하나요?영한님 강의에서는 음수는 안 넘어온다고 가정을 하신 것 같습니다그러면 페이징 관련 값 검증은 프론트 또는 백 쪽 어디가 더 맞는 걸까요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
여러 테이블 fetch join 질문 드립니다!
안녕하세요!Event와 Member의 N : N 관계를 중간 테이블(EventMEmber)을 만들어서 풀어낼때Event <-> EventMember <-> Member에서Event를 리스트로 조회하려고 하는데 이때 EventDto에 Member의 String name 필드를 리스트로 가져오려고 합니다. 1. @Query("select distinct e from Event e " + "join fetch e.eventMember a " + "join fetch a.member")Event에 중간 엔티티인 EventMember를 fetch join하고 별칭을 사용해서 EventMember의 member를 fetch join 했습니다.fetch join에서 별칭 사용을 권장하지 않고, 컬렉션을 fetch join을 하면 추후 페이징에 문제가 생길 것 같습니다. 2.@Query(value = "select e from EventMember e " + "join fetch e.member " + "join fetch e.event")List<EventMember> eventMembers = eventMemberRepository.findAllEventArtist(); Map<Event, List<String>> events = new HashMap<>(); for (EventMember eventMember : eventMembers) { if (!events.containsKey(eventMember.getEvent())) { events.put(eventMember.getEvent(), new ArrayList<>()); } events.get(eventMember.getEvent()) .add(eventMember.getMember().getName()); } 중간 엔티티인 EventMember로 Event와 Member를 fetch join으로 가져오고 자바 코드로 원하는 응답을 만들었습니다. 혹시 둘중 더 나은 방법이나 더 좋은 방법, 제가 잘못 알고 있는 부분이 있으면 말씀 부탁드리겠습니다 ㅠㅠ
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원 수정 API 강의 질문입니다.
회원 수정 시 MemberService 의update 메소드 파라미터를 Long id, String name 으로 받으셨는데파라미터를 따로 dto로 생성해주신 UpdateMemberRequest로 받아도 될 것 같다고 생각이 드는데 사용하면 안되는 이유가 따로 있는건가요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
ddl-auto : none 옵션
조회용 샘플 데이터를 입력하면서 application.yml 파일의 ddl-auto : none 옵션으로 바꾸어주면, 실행 시에 데이터가 더이상 쌓이지 않아야 하는 것이 맞는지 궁금합니다. 저는, 실행할 때 마다 InitDb의 데이터가 쌓여서 저장이 되는데, 이게 맞는 건지 잘 모르겠습니다. 제가 생각한 바로는, 최초에 create 옵션일 때 데이터를 넣어두고, 이후에 none으로 바꾸게 되면 더 이상 데이터가 입력되지 않는 것이라고 생각했는데 혹시 제 생각이 맞다면, none 옵션 시에 insert 쿼리가 안나가게 하는 방법이 있을까요?참고로 제 스프링부트 버전은 2.7.1입니다.h2 데이터베이스는 2.1.214가 설치되어있음을 확인했습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
조회용 필드 설정하는 방법?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. JPA 에서 Entity에 정의되지 않은 (테이블과 매핑되지 않은) 필드를 조회할 때, 어떻게 처리해야할 지 잘 모르겠습니다.@Transient 설정과는 좀 다른게, 해당 어노테이션은 메모리상에서 값을 보관하고, 비즈니스 로직에서 주로 사용한다고는 하지만저 같은 경우는 일단 DB 에서 조회를 해야하기 때문에요.. 해당 쿼리는 복잡해서 nativeQuery를 사용을 했고, 다른 테이블과 조인해서 가공한 필드입니다 (예를들어 postgresql의 array_agg, oracle의 list_agg 와 같은..) 가공한 필드 alias를 test 로 설정해서 조회했을 때, 이 조회한 Entity에 필드를 어떻게 설정해야 가져올 수 있는 지를 잘 모르겠습니다..ㅠ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
lazy -> 즉시로딩으로 바꿨을때 쿼리 이상하게 나가는 것
이부분에 대해 자세한 설명은 없으셨거든요근데 이부분도 쿼리가왜저렇게 나가는지 이해해볼 필요가 있는걸까요? 아니면 실무에선 저렇게 쓰지않을거기때문에 이해할필요가없을까요?간단한주문조회v2:엔티티를 dto로 변환 << 강의에서 나왔습니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@PostMapping으로 등록 시 파라미터 안에 List 질문입니다.
안녕하세요강의 완강 후 따로 프로젝트를 만들어 보던 중 궁금한 게 생겨서 질문 드립니다. PostMapping으로 등록할 때 CreateRequest라는 별도의 클래스를 만들어 주어서 파라미터로 받았는데 이 CreateRequest안에 List를 받아야 할 경우가 있다면 어떻게 해줘야 하는지 잘 모르겠습니다. Product 클래스 입니다.Module 클래스 입니다.하나의 Product에 여러 개의 Module이 들어갈 수 있기 때문에ProductModule 클래스를 만들어줬습니다.이러한 경우에서Product를 등록할 때아래와 같이 넘겨주고 싶으면CreateProductRequest 에서 List를 어떤식으로 받아줘야 하나요? 아래와 같이 해봤는데 잘 안되는 것 같아서요...
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
entity로 의존관계가 들어와야하는데 반대로 의존관계가 나가버린다
회원조회api 영상의 5:40초쯤 하신 말씀입니다.근데 이 말이 무슨말인지 잘 모르겠어요왜 의존관계가 나간다고 표현하시는 거죠?json으로 출력할때만 출력하지 않는것이 왜 의존관계가 나가는일인건가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
CQS
관련 질문에 대한 답변을 읽어봤는데도 이해가 가지 않아서 질문드립니다.커맨드와 쿼리를 분리해야한다는 CQS를 설명하신 말이었어요. 내부변경이 일어나는것은 커맨드, 명령어라고 부른다커맨드는 결과값을 그대로 반환하면안된다내부변경이 일어나지않는 것은 쿼리라고 부른다.쿼리는 결과값을 반환한다-> 1. 커맨드에서 결과값을 반환하면 안되는 이유가 뭘까요?update 메서드 안에서도 결국은 update하는것(커맨드)과 findOne(쿼리)하는 코드가 모두 들어가있는거잖아요? 근데 이게 왜 cqs를 지킨 사례인거죠?@Transactinalpublic vodi update(Long id, String name){ memberService.update(id,name); Member member = memberService.findOne(id); rreturn ~~~;}