월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
fetch join 에 대해서 질문드립니다.
엔티티 A, B, C 가 있습니다.A 와 B 일대다 관계, B 와 C 일대다 관계를 가지고 있습니다.fetch join 은 XtoOne 관계에서는 얼마든지 해도 괜찮고 컬렉션과의 fetch join 은 1개만 해야한다고 들었습니다.만약 B 를 기준으로 본다면 A 와 XtoOne 관계이고, C 와 XtoMany 관계이니 A, C 모두 fetch join 으로 묶어와도 괜찮나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
1대 다 fetch join 에 대해서 질문이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]요새 너무 질문을 많이 하는 것 같네욤 ㅠㅠ1대다 fetch join 에서 @OneToMany 밑에다가 @BatchSize를 설정해서 성능을 최적화하는 강의 를 이해했습니다. 그런데 궁금한게 생겼습니다. 예를 들어 A, B , C 가 1대 다 , 다대 1 이라고 치면 (C는 중간 테이블 ) A에서 C의 데이터를 가지고 오는데 이 경우에는 @BatchSize를 이용해서 성능을 최적화하는게 좋은 방식인가요?예를 들면 A 에서 A.getBList().getC.Name() 이렇게 할 때 A에서 B에 대한 쿼리는 Batch Size 를 통해서 줄일 수 있어도 getC 를 통해서 또 쿼리가 나가는데 ....어떻게 보면 걍 B 의 리포지토리에서 @Query("select b from B join fetch C where b.a,id=:id) 이런 식으로 하는게 더 나아보이기도 하고요.. 어떤 식으로 하는 것이 더 효율적이라고 생각하시는게 궁금합니다!!!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO내에 정적 팩토리 메서드를 생성해도 되는걸까요?
말그대로 컨트롤러 층에서 인스턴스 생성 코드를 작성하는 게 아니라Member 인스턴스 생성 메서드를 DTO내부에 만들어서 반환해도 될까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
제가 강의 내용을 제대로 이해하지 못한 것 같습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]@Query("select r from Review r join fetch r.user u join fetch r.reviewReviewTags rt join fetch rt.reviewTag where r.program.id=:programId order by r.likeCounts desc") List<Review> findTop4ByProgramOrderByLikeCountsDescWithFetch(@Param("programId") Long programId, Pageable pageable);안녕하세요!영한님의 강의에서 이해했던 내용과 결괏값이 달라서 질문 올립니다.(물론 제가 이해를 잘 못했을 것 같긴합니다!)현재 User, Review, Program 을 1대 다 다대1로 나누었고 중간테이블은 Review 입니다.또한 Review , RevieReviewTag, ReviewTag 또한 1대다 다대1. 중간테이블은 ReviewReviewTag 입니다.현재 강의 내용에서 제가 이해한 것은@OneToMany 에서 성능 최적화 할 때1)페이징 처리시 : Batch 를 활용2) 페이징 처리 안할 시: distinct+ fetch JOIN 사용입니다.위 경우에서 join fetch r.reviewReviewTags 에 주목해 주세요!이는 review 와 reviewreviewTag 즉 1대다입니다.이를 fetch Join 으로 한번 발라보았습니다. 저는 위 과정에서 일단 핵심적으로 distinct 를 안붙였기 때문에 같은 리뷰에 대한 리뷰 태그가 여러 개 생겨서 중복된 결과가 나올줄 알았습니다. 실제로 위 과정에서 나온 쿼리를 복사해서 집어 넣어보니 이렇게 추가된 같은 review에 대해서 reviewTag 개수(review에 대한 1대다,2개로 고정해서 저장하였음. 따라서 두번씩 중복) 만큼 중복해서 나왔습니다. 그래서 위 과정을 DTO로 만들어서 반환하면 2개씩 중복된 결과가 나올 것이라 예상했습니다. 근데 JSON 데이터를 확인한 결과 { "reviewId": 21, "like": 0, "contents": "너무 좋았습니다0", "userPosterPath": null, "userNickName": null, "localDateTime": "2024-02-04T03:40:18.924606", "ratings": "2.5", "reviewTagNames": [ "극장에서 또 보고 싶어요", "돈이 아까워요" ] }, { "reviewId": 22, "like": 0, "contents": "너무 좋았습니다1", "userPosterPath": null, "userNickName": null, "localDateTime": "2024-02-04T03:40:18.934169", "ratings": "1.5", "reviewTagNames": [ "극장에서 또 보고 싶어요", "돈이 아까워요" ] }, { "reviewId": 23, "like": 0, "contents": "너무 좋았습니다2", "userPosterPath": null, "userNickName": null, "localDateTime": "2024-02-04T03:40:18.939567", "ratings": "2.5", "reviewTagNames": [ "극장에서 또 보고 싶어요", "돈이 아까워요" ] }, { "reviewId": 24, "like": 0, "contents": "너무 좋았습니다3", "userPosterPath": null, "userNickName": null, "localDateTime": "2024-02-04T03:40:18.948736", "ratings": "0.5", "reviewTagNames": [ "극장에서 또 보고 싶어요", "돈이 아까워요" ] } ], 얼레레 근데 왠걸정상적으로 나오는 것입니다.저는 위에 쿼리를 DTO로 만들어서 반환한 것 밖에 없는데 (pageable 안에는 PageRequest.of(0, 4)) 제가 이해한 강의 내용 대로라면 일단 핵심적으로 distinct 를 안붙였기 때문에 1대다의 다의 개수만큼 중복된(위에서는 2개) 결과가 나와야 할 것 같았는데어디서 틀린 것일까요 ㅠ 스프링 부트 버젼은 2.7.X 이며 하이버 네이트 버젼도 6이 안되는 것을 참고해주세요 ㅜ
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의 내용은 아니지만 진도와 체득에서 질문이 있습니다..
영한 선생님 강의를.. Http부터 시작해서 지금 실전 2편까지 쭉 로드맵대로 왔는데요.. 실전 2편부터는 지금까지 MVC와는 다르게 API개념이 익숙지 않다보니 머리가 많이 뒤죽박죽이고 과열(?) 된 상태입니다..영한쌤이야 워낙 쉽게 설명해주시고 이해도 잘 되서 강의 들을 땐 좋지만 막상 누가 강의 후에 강의 내용을 기반으로 하되 강의 소스코드 보지말고 복붙하지 말고 새로운 코드를 짜봐! 하면 사실 자신 없다라는게 제 솔직한 심정인데.. 여기서 어떻게 방향을 잡아야 할지 모르겠네요.. 시간이 걸리더라도 완강한 강의 중 부족한 부분을 다시 듣고 토이프로젝트 반복 후에 실전 2편과 나머지 querydsl이나 data jpa를 들어가는게 나을지 아니면 일단 쭉 로드맵 끝낸 후에 복습으로 들어가는게 나을지 고민이 됩니다.물론 시간 충분한 학부생이면 모르겠지만 취준생 입장이라 고민이 더더욱 크네요..
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@JsonIgnore 관련 ClassNotFoundException 발생
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.@JsonIgnore을 어느 클래스에 어디어디 붙여야 할까요?"http://localhost:8080/api/v1/simple-orders"api 테스트를 해보니 아래와 같은 에러가 나서 질문드립니다 2024-01-25T22:37:28.102+09:00 DEBUG 32028 --- [nio-8080-exec-1] 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 join member m1_0 on m1_0.member_id=o1_0.member_id fetch first ? rows only2024-01-25T22:37:28.226+09:00 ERROR 32028 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed: java.lang.NoClassDefFoundError: javax/persistence/Transient] with root causejava.lang.ClassNotFoundException: javax.persistence.Transient at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[na:na]2024-01-25T22:37:28.277+09:00 ERROR 32028 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost] : Exception Processing ErrorPage[errorCode=0, location=/error]jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoClassDefFoundError: javax/persistence/Transient
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OrderQueryRepository 에러
OrderItemQueryDto와 OrderQueryDto를 생성한 후, OrderQueryRepository를 생성하여 학습하고 있는데 강의 내용과는 다르게 진행중입니다. (밑에 질문 글에 한번 올렸었습니다.) 스프링데이터JPA로 진행하다보니 @Query를 작성하여 연습하는 중 java.lang.IllegalStateException: Cannot instantiate class 'jaein.crudpractice.repository.order.query.OrderItemQueryDto' (it has no constructor with signature [java.lang.Long, java.lang.String, java.time.LocalDateTime, java.time.LocalDateTime], and not every argument has an alias) 자꾸 생성자쪽에서 문제가 발생합니다. OrderItemQueryDtopackage jaein.crudpractice.repository.order.query; import com.fasterxml.jackson.annotation.JsonIgnore; import jaein.crudpractice.domain.OrderItem; import lombok.Data; @Data public class OrderItemQueryDto { @JsonIgnore private Long orderId; private String itemName; private int count; public OrderItemQueryDto(Long orderId, String itemName, int count) { this.orderId = orderId; this.itemName = itemName; this.count = count; } } OrderQueryDtopackage jaein.crudpractice.repository.order.query; import jaein.crudpractice.domain.Order; import jaein.crudpractice.domain.OrderItem; import jaein.crudpractice.domain.OrderStatus; import lombok.Data; import lombok.EqualsAndHashCode; import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @Data @EqualsAndHashCode(of = "orderId") public class OrderQueryDto { private Long orderId; private String name; private LocalDateTime loanDate; private LocalDateTime returnDate; private List<OrderItemQueryDto> orderItems; public OrderQueryDto(Long orderId, String name, LocalDateTime loanDate, LocalDateTime returnDate, List<OrderItemQueryDto> orderItems) { this.orderId = orderId; this.name = name; this.loanDate = loanDate; this.returnDate = returnDate; this.orderItems = orderItems; } } OrderQueryRepositorypackage jaein.crudpractice.repository.order.query; import jaein.crudpractice.domain.Order; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface OrderQueryRepository extends JpaRepository<Order, Long> { @Query("select distinct new jaein.crudpractice.repository.order.query.OrderQueryDto(" + "o.id, s.name, o.loanDate, o.returnDate, oi) " + "from Order o " + "join o.student s " + "join o.orderItems oi") List<OrderQueryDto> findOrderQueryDtos(Pageable pageable); @Query("select distinct new jaein.crudpractice.repository.order.query.OrderItemQueryDto(" + "oi.order.id, i.name, oi.count)" + " from OrderItem oi " + " join oi.item i " + " where oi.order.id = :orderId") List<OrderItemQueryDto> findOrderItems(@Param("orderId") Long orderId); } 생성자도 다 맞게 작성했는데 어느부분이 잘못됐는지 모르겠습니다.강의대로 EntityManager를 사용하여 해보아도 같은 에러가 발생합니다.도메인에서 연관관계 매핑에서 문제가 있는걸까요??
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
gradle build 실패, intelij 빌드 성공 왜그런걸까요?
안녕하세요 스프링부트 3.0 이상 버전을 사용하고 있는 사람입니다.원래는 gradle로 잘 빌드하다가 오늘 갑자기 gradle빌드가 실패하네요그래서 혹시나 해서 build를 intelij로 바꿔보니깐 실행이 잘됩니다. 3.0이상버전부터는 gradle빌드로 해야한다고 하시는데 이렇게 하면 문제가 생길까요?왜그런걸까요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 왜 저는 v3쿼리가 다르게 나오는 걸까요?
public List<Order> findAllWithMemberDelivery() { return em.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d", Order.class) .getResultList(); }이렇게 똑같이 했는데도 select o1_0.order_id, d1_0.delivery_id, d1_0.city, d1_0.street, d1_0.zipcode, d1_0.status, m1_0.member_id, m1_0.city, m1_0.street, m1_0.zipcode, m1_0.name, o1_0.order_date, o1_0.status from orders o1_0 join member m1_0 on m1_0.member_id=o1_0.member_id join delivery d1_0 on d1_0.delivery_id=o1_0.delivery_id조인이 이상하게 되고 있습니다@Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; //주문시간 @Enumerated(EnumType.STRING) private OrderStatus status; //주문상태 [ORDER, CANCEL] @Id @GeneratedValue @Column(name = "member_id") private Long id; @NotEmpty private String name; @Embedded private Address address; @JsonIgnore @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>();@Id @GeneratedValue @Column(name = "delivery_id") private Long id; @JsonIgnore @OneToOne(mappedBy = "delivery") private Order order; @Embedded private Address address; @Enumerated(EnumType.STRING) private DeliveryStatus status; //READY, COMP잘못 연관 관계를 잘못 설정한걸까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
QueryDSL 도입후 개발 방향을 궁금해서 질문드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.보통 QueryDSL과 Spring Data JPA를 같이 도입하게 되는데 여기서 궁금한점이 있습니다.QueryDSL을 도입하게 되면, 모든 DB관련 쿼리는 querydsl만 사용하나요?? 아니면 Spring data jpa도 혼용하시나요? 아니면 querydsl은 동적쿼리만 위한것인지? 혼용한다면 어떤 시기에 querydsl과 spring data jpa을 쓰는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
querydsl 수업 중 질문드립니다
spring 버전이 달라 구글링 해서 버전에 맞는 gradle 설정을 끝내고 측면의 gradle 탭에서 build를 눌러 q클래스를 생성시켰더니 test 클래스에서 다음과 같은 오류가 났고 해당 오류부분을 주석처리하여 실행시켰더니 새로 만든 querydsl 메서드를 사용하는 주문내역 페이지(/orders)가 오류가 났는데 구글링을 아무리 해도 해결하는 방법을 모르겠습니다 ㅠㅠ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
주문 조회 V4: JPA에서 DTO 직접 조회
주문 조회 V4: JPA에서 DTO 직접 조회 강의에서 OrderQueryRepository를 스프링데이터JPA를 이용해 변경하려하는데 잘 되지않아서 질문하게 되었습니다.(변수명이 바뀐 것은 제가 강의를 보면서 좀 수정해가며 작성하였습니다.)package jaein.crudpractice.repository.order.query; import jaein.crudpractice.domain.Order; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.List; @Repository public interface OrderQueryRepository extends JpaRepository<Order, Long> { // @Query("select o from Order o" + // " join fetch o.student s" + // " join fetch o.loan l") // List<OrderQueryDto> findOrderQueryDtos(); // @Query("select o.id as orderId, s.name as name, o.loanDate, o.returnDate, o.status, " + // "oi.id as itemId, i.name as itemName " + // "from Order o " + // "join o.student s " + // "join o.loan l " + // "join OrderItem oi on oi.order.id = o.id " + // "join oi.item i") // List<OrderQueryDto> findOrderQueryDtos(Pageable pageable); @Query("select o.id, s.name, o.loanDate, o.returnDate, o.status " + "from Order o " + "join fetch o.student s " + "join fetch o.loan l " + "join fetch OrderItem oi on oi.order.id = o.id") List<OrderQueryDto> findOrderQueryDtos(Pageable pageable); // @Query("select oi.order.id, i.name, oi.orderPrice, oi.count " + // "from OrderItem oi join oi.item i where oi.order.id = :orderId") // List<OrderItemQueryDto> findOrderItems(Long orderId); @Query("select oi from OrderItem oi" + " join oi.item i where oi.order.id = :orderId") List<OrderItemQueryDto> findOrderItems(@Param("orderId") Long orderId); }package jaein.crudpractice.repository.order.query; import jaein.crudpractice.domain.OrderStatus; import lombok.Data; import java.util.Date; import java.util.List; @Data public class OrderQueryDto { private Long orderId; private String name; private Date loanDate; private Date returnDate; private OrderStatus status; private List<OrderItemQueryDto> orderItems; public OrderQueryDto(Long orderId, String name, Date loanDate, Date returnDate, OrderStatus status, List<OrderItemQueryDto> orderItems) { this.orderId = orderId; this.name = name; this.loanDate = loanDate; this.returnDate = returnDate; this.status = status; this.orderItems = orderItems; } }package jaein.crudpractice.repository.order.query; import lombok.Data; @Data public class OrderItemQueryDto { private Long orderId; private String itemName; private int count; public OrderItemQueryDto(Long orderId, String itemName, int count) { this.orderId = orderId; this.itemName = itemName; this.count = count; } }
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@EqualsAndHashCode
주문 조회 V4: JPA에서 DTO 직접 조회 제공해주신 피피티에서는 @EqualsAndHashCode 를 사용하는데 강의에서는 제가 못 본것 같습니다.. @EqualsAndHashCode 를 사용하신 이유가 있을까요? 강의 중 9분 34초 에서 본 OrderQueryDto는 @Data만을 사용했습니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션 fetch join
안녕하세요 강사님프로젝트 중 궁금한 점이 있어 질문드립니다..!6개의 엔티티를 조인해야 하는 상황인데 현업에서도 이렇게 조인을 하기도 하나요? 물론 성능에 따라 다르겠지만 몇개 정도의 테이블을 조인하는 것이 적당할까요?컬렉션 패치 조인은 1개까지만 하라고 하셨는데 현재 상황은 3개나 컬렉션이 존재합니다. 이런경우는 어떤식으로 해결하는게 좋을까요?? 강사님께서는 어떤식으로 해결하시는지 궁금합니다 ㅎㅎ감사합니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV off인 아키텍쳐에서 궁금해서 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.영한쌤이 말씀해주신Controller -> Application Service -> Domain Service -> Repository에서Application Service: 트랜잭션의 시작, Domian Service에 있는 순수 도메인 로직들을 활용하여, 복잡한 애플리케이션 비즈니스 로직을 구성Domain Service : 도메인에 대한 순수한 로직으로 구성. Application Service의 도구로서 활용됨. OSIV를 off 상태이기 때문에 Controller에 반환시 Application Service에서는 응답 Dto로 넘겨줘야 하는데 여기서 한가지 고민이 있습니다. 아키텍쳐는 위에서 아래로 순방향으로 흘러야 하는데 (역행, 순환 참초 X). Application Service에서 Controller단에 종속적인 응답 Dto를 넘기게 된다면, Application Service와 Controller간에 순환 참조와 역류 참조가 일어나지 않아 문제이지 않나 싶습니다... 상관이 없는지 아니면 어떻게 해결해야 좋을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
섹션 4. API 개발 고급 - 컬렉션 조회 최적화 - 주문조회 V3
섹션 4. API 개발 고급 - 컬렉션 조회 최적화 - 주문조회 V3 수강 중에 질문 있어 글 남깁니다. 현재 스프링 부트 3.0.11 자바 17버전인데 강의에서는 findAllWithitem()에서 select에 distinct를 붙이지 않을 경우 총 네개의 Order가 생겼습니다. 패치 조인으로 인해 두개씩 생성되었기 때문에.하지만 저의 경우에는 distinct를 붙이지 않아도 두개의 Order가 생겼습니다. 혹시 스프링 버전 업에 따른 변경사항 일까요? 아니면 제가 코드를 잘못 친걸까요? 사진 첨부 하겠습니다.@GetMapping("/api/v3/orders") public List<OrderDto> ordersV3() { List<Order> orders = orderRepository.findAllWithItem(); for (Order order : orders) { System.out.println("order ref=" + order + " id="+order.getId()); } List<OrderDto> result = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return result; }public List<Order> findAllWithItem() { return em.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d" + " join fetch o.orderItems oi" + " join fetch oi.item i", Order.class ).getResultList(); }[ { "orderId": 1, "name": "userA", "orderDate": "2024-01-07T04:02:33.369413", "orderStatus": "ORDER", "address": { "city": "서울", "street": "1", "zipcode": "1111" }, "orderItems": [ { "itemName": "JPA1 BOOK", "orderPrice": 10000, "count": 1 }, { "itemName": "JPA2 BOOK", "orderPrice": 20000, "count": 2 } ] }, { "orderId": 2, "name": "userB", "orderDate": "2024-01-07T04:02:33.427993", "orderStatus": "ORDER", "address": { "city": "대구", "street": "2", "zipcode": "2222" }, "orderItems": [ { "itemName": "SPRING1 BOOK", "orderPrice": 30000, "count": 3 }, { "itemName": "SPRING2 BOOK", "orderPrice": 40000, "count": 4 } ] } ]
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
레이어드 아키텍쳐에 대해 질문 드립니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]보통 spring mvc 구조에서View -> Controller -> Service -> Repository로 구성되어있는데, 여기서 Dto 변환하는 곳에서 고민이 있었습니다. Dto를 Service까지 끌고 가서, Service에서 엔티티로 변환 과정을 거칠것인지. 아니면 Controller단에서 dto - Entity 변환 과정을 거칠것인지 고민이 있었습니다Service 단에서 변환 과정을 거치게 된다면, 즉 파라미터로 해당 컨트롤러 한곳만 종속적이게 되는 고민이 있게 되었습니다. Service는 여러곳에서도 쓸 수 있다는건데, Dto를 Service 까지 끌고 오게 되면, 매번 서비스 메소드를 만들어야 하는 문제가 있습니다.그래서 Controller와 Service 사이에Controller -> Business(Service) -> Service 라는 비즈니스를 추가하여 설계를 하였습니다 Business : dto - entity 변환 로직 처리. 컨트롤러와 상호작용하여 , dto를 받아 entity로 변환 다시 dto를 반환하도록 만들었고, 여기서는 여러 Service의 메소드를 가져와서 복잡한 비즈니스 로직을 처리하도록 하였습니다.Service : Entity를 받고 Entity를 반환하면, 순전히 해당 도메인의 비즈니스 로직으로만 구성하도록 하였습니다.이런 식으로 했더니, 좀 더 유연하게 비즈니스 로직을 처리할 수 있더라구요. 제가 설계한 레이어 아키텍쳐 (dto 변환)이 맞는 설계인지, 이렇게도 실무에서 구성하는지 궁금합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OrderApiController
웹 개발 구조에서backend - repository - service - controller - frontend이런 식으로 이해를 하고 있었습니다. 강의를 수강 중 MemberApiController는 MemberService를 의존관계 주입을 받아 Api테스트를 진행하는데 OrderApiController는 왜 Service를 주입받지 않고 Repository를 주입받아 사용하는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
주문조회 V3.1 실행 후 Query 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]여기에 질문 내용을 남겨주세요.V3.1 실행 후 콘솔창에 뜨는 쿼리문이 다음과 같이 뜹니다.springboot version 3.2.1 이고 Hibernate5JakartaModule로 설정했습니다.application.properties도 아래와 같이 설정했습니다.그외 부분도 강사님 코드를 그대로 복붙해도 다음과 같이 물음표가 너무 많이 뜨는데 버전 문제인건가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
default_batch_fetch_size 설정 질문입니다.
지금 서비스엔티티에서 작업자와 상품이 2개 전부 1:N 상태입니다@Query("select s from Services s join fetch s.workers w " + "join fetch s.serviceTime st " + "where s.id = :id") Services findByIdWithWorkers(@Param("id") Long id);OneToMany인 경우 2개가 동시에 fetch join이 안되는걸 알고 application.yml에jpa: hibernate: ddl-auto: update properties: hibernate: default_batch_fetch_size: 100 format_sql: true show-sql: true위에 spring: 있습니다 이렇게 default_batch_fetch_sizes을 추가했는데 sql에Hibernate: select rg1_0.service_id, rg1_0.id, rg1_0.base_category, rg1_0.created_at, rg1_0.price, rg1_0.service_item_name, rg1_0.service_time, rg1_0.sub_category, rg1_0.super_category, rg1_0.updated_at from reservation_goods rg1_0 where rg1_0.service_id=?in이 나오지 않는데 데이터가 지금 10개 정도 있는데 데이터 작아서 in절이 나오지 않는걸까요?