월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
항상 좋은 강의와 답변 감사합니다.
강사님께서 알려주신 컬렉션 최적화 강의 덕분에 querydsl 가지고 각종 조회 쿼리들을 편안하게 짜고 있습니다. 감사합니다. 사용 중에 궁금한 점이 생겨 질문을 하게 되었습니다. 만약에 테이블이 두 개의 toMany 관계로 있을 때, one에 해당하는 테이블을 먼저 조회하고 알려주신 방식대로 컬렉션 조회를 할 때, toMany에 있는 테이블을 orderby를 사용해서 정렬을 하게 될 경우toMany를 디비에서 끄집어 내고 정렬을 하고, 먼저 조회를 한 테이블도 정렬을 한 테이블의 정렬 순서대로 되는 것인지 궁금하여 질문을 하게 되었습니다.좋은 강의를 찍어주셔서 정말 감사합니다.!!!!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
해당 강의에서의 내용의 대부분은 queryDsl로 적용된다고 하시는데
해당 강의에서의 내용의 대부분은 queryDsl로 적용된다고 하시는데... 그렇다고 하면 해당 내용은 진지하게 듣고 복습할 필요없이 그냥 이런것도 있구나~ , 불편한 점이 ~~게 있고. 이떄문에 queyDsl에 나왔구나 정도의 마인드로 해당 강의를 들으면 될까요?결국은 해당 내용 들어도 queryDsl로 다 가능하니까...김영한 강사님도 실무에선 queryDsl을 많이 사용한다고 하셔서 질문드려용..
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요. Entity 필드 구성과 응답 DTO에 대해 질문 드립니다.
안녕하세요 김영한 강사님. 항상 좋은 강의와 친절한 답변 너무 감사드립니다.강의를 듣고 게시판 구현 프로젝트 진행 중 두 가지 고민이 생겨 질문 드립니다.첫 번째 질문은전체 게시글 리스트를 반환할 때, 게시글 리스트에 댓글 개수와 태그 이름 등을 함께 API 응답으로 반환해야 하는 상황입니다. 이때,엔티티의 필드에 comment_count, tag_name 형식으로 적어줘야 할 지, 아니면comment와 tag 테이블에 쿼리를 날려 가져와서 응답 DTO 필드에 적어줘야 할 지 고민하고 있는 상황입니다.1번 방식으로 하면 무언가 불필요한 필드가 테이블에 포함되는 것 같고, 2번 방식은 추가 쿼리가 많이 나갈 것 같아 망설여집니다.보통 이런 경우 어떤 방식으로 처리는 게 좋은 지 궁금합니다!두 번째 질문은응답 DTO에 클라이언트가 필요로 하지 않는 데이터가 포함되어 있어도 되는지 궁금합니다.예를 들어, title과 content를 필드로 가지는 DTO를, title만을 필요로 하는 요청에 반환해도 괜찮은 지, 아니면 응답 마다 DTO 각각 따로 생성해야 하는지 궁금합니다
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요, 강제초기화에 대해서 궁금한점이 있습니다.
안녕하세요 김영한 강사님,강의에서는 단순 조회이기때문에 강제초기화를 선택적으로 할수있으니 쿼리가 나가는 수를 줄일수있는거로 이해했습니다.그렇다면 만약 조회가아닌 Order가 다른엔티티 생성메서드에 집어넣으려면 proxy상태로 들어가면 안되니까 모두다 초기화를 해야할텐데..궁금한점은지금은 간단한 예제로 Member엔티티에는 생성메서드가 없지만 추후에 생긴다고하면, 연관관계 메서드에서 member.getOrders().add(this) 할때 Order에 proxy를 모두 강제초기화를 해서 집어넣어야하는건가요?Order엔티티가 추후에 @OneToMany가 점점 늘어나는방향으로 설계가 되었고, Member 생성메서드에 Order가 들어가야해서 proxy를 강제초기화하는 과정에서 쿼리가 @OneToMany의 수만큼 나가야한다면 이것은 엔티티 설계를 비효율적으로 하는건가요? 아니면 다른방법이 있는건가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
스프링 데이터 JPA 사용에 대해 궁금한점 있습니다.
안녕하세요 강사님, 기존의 repository에서 스프링데이터JPA를 적용하고, order를 조회할때findById로 조회한다면 딸려오는 member 는 초기화가 안되어있으니..?초기화를 하기위해 getName을 사용하면 member select 쿼리가 나갈텐데 그러면 쿼리가 총 2개가 나갈거로 예상합니다.그걸 방지하기 위해 JPQL fetch join을 사용했었는데,예를들어 findByIdFetchJoinMember 같이 처음에 조회할때 member도 긁어오는건 스프링 jpa에서는 지원을 안하는지 궁금합니다.없다면.. 결국엔 @XXToOne가 작성되어있는 엔티티는 조회할때 JPQL로 명시적으로 fetch join을 사용하는 방법밖엔 없나요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
fetch join에 관련하여 문의드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요 fetch join 과 join에 관련하여 문의드립니다. fetch join 시 fetch join 뒤에 붙은 엔티티객체에 별칭을 사용 할 수 없는 걸로 알고 있습니다. ex) select o from Order o join fetch o.member m 에서 o.member 뒤에 m 사용 불가로 알고 있습니다. 그럼 만약 Member Entity에서 name이 userA라는 사람이라는 조건을 주고 싶은 경우 select o from Order o join fetch o.member m where m.member_id = 'userA' 와 같이 사용 하면 안되고 join 쿼리로 SELECT o from Order o join o.member where m.member_id = 'userA' 와 같이 사용 해야 되는지 문의드립니다. select o from Order o join o.member where m.meber_id = 'userA' 와 같이 사용 하는 경우 order 엔티티에 있는 member 단일 연관 관계에서 name 을 가져오는 경우 초기화가 되어 쿼리문이 다시 나가는 걸로 알고 있습니다. 그래서 한번쿼리문과 조건을 같이 사용하기위해서 DTO로 직접 받아오는게 맞는지도 궁금합니다. 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 해당 오류 질문드립니다 ㅠㅠ
안녕하세요 강의보면서 하다가 500에러를 마주하게 되서 ... 해결해보려고 했는데 잘 모르겠어서 질문드립니다.. (찾아보니 .. Order 엔티티와 Member 엔티티의 문제가 있는거 같아서 @JsonIgnore로 해결해보려고 했는데 잘 안되네욤...ㅠㅠ , ) 미리 답변 감사드립니다..(__) package jpabook.jpashop.api; import jpabook.jpashop.domain.Order; import jpabook.jpashop.domain.OrderItem; import jpabook.jpashop.repository.OrderRepository; import jpabook.jpashop.repository.OrderSearch; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequiredArgsConstructor public class OrderApiController { private final OrderRepository orderRepository; @GetMapping("/api/v1/orders") private List<Order> ordersV1() { List<Order> all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); order.getDelivery().getAddress(); List<OrderItem> orderItems = order.getOrderItems(); orderItems.stream().forEach(o -> o.getItem().getName()); } return all; } } package jpabook.jpashop.domain; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String name; @Embedded private Address address; @JsonIgnore @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); } package jpabook.jpashop.domain; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.Getter; import lombok.Setter; import javax.persistence.*; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Entity @Table(name = "orders") @Getter@Setter public class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id") private Member member; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> orderItems = new ArrayList<>(); @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) @JoinColumn(name = "delivery_id") private Delivery delivery; private LocalDateTime orderDate; @Enumerated(EnumType.STRING) private OrderStatus status; public void setMember(Member member) { this.member = member; member.getOrders().add(this); } public void addOrderItem(OrderItem orderItem) { orderItems.add(orderItem); orderItem.setOrder(this); } public void setDelivery(Delivery delivery) { this.delivery = delivery; delivery.setOrder(this); } // 생성 메서드 public static Order createOrder(Member member, Delivery delivery, OrderItem... orderItems) { Order order = new Order(); order.setMember(member); order.setDelivery(delivery); for (OrderItem orderItem : orderItems) { order.addOrderItem(orderItem); } order.setStatus(OrderStatus.ORDER); order.setOrderDate(LocalDateTime.now()); return order; } //비즈니스 로직 /*주문취소*/ public void cancel(){ if (delivery.getStatus() == DeliveryStatus.COMP) { throw new IllegalStateException("이미 배송완료된 상품은 취소가 불가능 합니다."); } this.setStatus(OrderStatus.CANCEL); for (OrderItem orderItem : orderItems) { orderItem.cancel(); } } public int getTotalPrice() { int totalPrice = 0; for (OrderItem orderItem : orderItems) { totalPrice += orderItem.getTotalPrice(); } return totalPrice; } } 2022-08-21 16:54:05.638 ERROR 60781 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->jpabook.jpashop.domain.Order["member"]->jpabook.jpashop.domain.Member$HibernateProxy$PoOpCCHU["hibernateLazyInitializer"])] with root cause com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.hibernate.proxy.pojo.bytebuddy.ByteBuddyInterceptor and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: java.util.ArrayList[0]->jpabook.jpashop.domain.Order["member"]->jpabook.jpashop.domain.Member$HibernateProxy$PoOpCCHU["hibernateLazyInitializer"]) at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1277) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:71) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:33) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:145) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:400) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1512) ~[jackson-databind-2.11.3.jar:2.11.3] at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1006) ~[jackson-databind-2.11.3.jar:2.11.3] at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:345) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:104) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:277) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:181) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:78) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:124) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.2.jar:5.3.2] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.3.2.jar:5.3.2] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.41.jar:9.0.41] at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
페치조인 select 필드에 의문이 있습니다.
이번 강의에 나온 예시처럼 fetch join을 여러 관계에 적용한다면 한번의 select 쿼리에 모든 필드값을 가져오게 됩니다. 여기서 의문이 생긴게 만약 필요한 필드의 개수가 소수라면, 해당하는 필드만 select 하여 가져오는게 성능상 좋을지 아니면 페치 조인을 통해 한방 쿼리로 가져 오는게 성능상 좋을지 입니다. 전자의 경우 다수의 select 문이 실행되겠지만 가져오는 조회하는 필드는 적고, 후자의 경우 한번의 select 문이 실행되지만 모든 필드를 조회합니다. 이러한 경우엔 어떤 방식이 유리한가요? 페치조인으로 한방에 가져오는 메서드로 여러 방면에서 재사용하는 것이 좋은지, 각 상황에 맞는 쿼리로 다수의 메서드를 만드는게 좋은지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Dto 관련해서 질문드립니다!
안녕하세요! 로드맵 따라서 좋은 강의 잘 듣고 있습니다. 실제 프로젝트를 진행하면서도 들었던 의문인데 생성, 수정과 같은 역할이 다른 Dto이지만 동일한 값을 가져가는 Dto가 많이 생성되는 것을 느끼게 되었습니다. 실제 실무에서는 이런 경우 Dto를 어떻게 처리하시는지 궁금합니다! 동일하게 쓰이는 값들을 한 곳으로 모아 상속을 통해 하위 Dto를 만드는 방법도 생각해보았는데 이런 방법은 어떤지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV 질문드립니다.
OSIV가 false일때, createOrder의 param으로 맴버넣을경우에 맴버를 member.findBy로 조회하고 넣잖아요? 이때 Member엔티티에서 @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); 이렇게 오더가 프록시로 들어가있으니 선생님은 어떤식으로 초기화를 하시나요? orders could not initialize proxy - no Session 요렇게 나오는데.. 다른 Member는 겟네임으로 초기화한다고하는데 orders는 리스트니까.. 궁금해서요 ㅠㅠ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV false 일때 영속성 관련해서 질문드립니다.
안녕하세요 김영한 강사님, OSIV를 false로 하면 트랜잭션 라이프사이클이랑 영속성 라이프 사이클이이 같이 끝맺음을 가지는거로 이해했습니다. 그렇다면 트랜잭션 안에서 엔티티를 save메소드로 저장 한다면 트랜잭션이 끝나고난뒤에 DB에 저장하기위해 인서트문이 날라가는게 아닌가요? 트랜잭션 메소드를 끝낸뒤 로그로 엔티티는 찍히는데 디비에는 저장이안되어있어서 findBy등으로 찾아오지못해 제가 정확히 이해를 못하는것인지, 아니면 잘못 사용하고있는것인지 궁금합니다. 트랜잭션안에서 save를 한뒤 정상적으로 끝난뒤에도 디비에는 존재하지 않는 이유는 무엇인가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
orderitem proxy 초기화 시점 질문있습니다
현재 orderItem 프록시 초기화 시점이 order.getOrderItems()에서 일어나는 건가요? 아님 orderItem.getItem() 시점에서 일어나는 건가요??
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@PostConstruct 지정 함수 @Transactional 지정 시 컨텍스트 관리가 안되는 경우
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 역시 백문이 불여일타!! 강의 보고 혼자 샘플작성하다 막 터집니다. 강의 볼때는 '음~ 그렇지~' 하고 보던게 안보고 혼자 작성해보니 강사님이 말씀하시는 "이거 분명이 개발할 때 문제 발생합니다." 하는거 다 터지네요. [질문 내용] InitDB.java 샘플 따라하다가 궁금한점이 생겨 질문 드립니다. 애플리케이션 구동 시 초기 데이터를 넣기 위해 @PostConstruct 로 코드를 작성하는 부분에서 문제가 발생했습니다. "Caused by: javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call" 결론은 영속성 관리가 안되는 문제인거 같습니다. 근데 @Transactional을 붙였고 내부 함수 호출도 아닌데 왜 관리가 안되냐해서 디버깅을 해봤습니다. PostConstruct 하는 부분을 따라가 보니 해당 함수를 invoke하는 클래스가 프록시가 아니더군요. InitDB의 내부 맴버는 프록시인데. 질문: PostConstruct를 호출되는 대상 클래스도 spring container에 있는 bean같은데 왜 저넘은 프록시가 아닌거죠? 다른 bean의 맴버로 주입되는 bean만 프록시인 건가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
querydsl 사용에 질문있습니다.
안녕하세요 김영한 강사님, querydsl 사용할때, 오라클처럼 FROM DUAL이나 MySQL처럼 FROM절을 생략하려면 어떻게해야하나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의들으면서 @ToMany에 질문이있습니다.
안녕하세요 김영한 강사님, @XXToMany 같은 어노테이션을 사용해서 발생되 N+1의 문제를 해결하기위해 fetch를 사용하는데, 그럼 여기서,JPQL로 fetch 조인을 사용하기위해 직접 String에 사용하는 방법이면 @ToMany어노테이션을 사용하지않은 엔티티들로 JPQL에 String에 직접 FK들을 적어서 조인을 사용한 쿼리랑 차이점이 뭐가있나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
API 개발 협업 관련 질문드립니다.
안녕하세요 영한님 스프링 기본편부터 querydsl까지 들으면서 혼자 프로젝트를 진행했었고 이제 사이드 프로젝트를 하면서 다른 프론트엔드 개발자와 협업해보고 싶습니다. 구글링을 해도 원하는 정보를 얻을 수 없어서... 질문을 남겨보려고 합니다. 보통 사이드 프로젝트를 진행하면 백엔드(저)는 제 pc로, 프론트엔드 개발자분은 그 분의 pc로 개발하게 될텐데, 제가 api 개발을 마치고 깃허브에 코드를 올려놓으면 프론트분이 제 코드를 clone해서 프론트분의 로컬 환경에서 api를 테스트하는 메커니즘인가요? 또한 만약 이렇게 테스트하게 된다면, 프론트분은 db이 어떻게 접근하는지, 보통 백엔드는 api만 개발하고 테스트는 하지 않는지도 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
[문의] 비동기 처리
안녕하세요? 강의 잘 듣고 있습니다. 강사님 톤과 실무를 염두에 두고 강의하시는 점이 특히 좋네요 지금 강의를 기반으로 실무에서 답답함이 하나씩 해소가 되고 있습니다. 하지만 API 를 순차적으로 하나씩만 호출하는 것이 아니기에 비동기에 대한 부분도 추가가 되면 좋을거 같은데요 해당 강의에는 언급이 안되는거 같아 문의드립니다. 현재의 예제코드를 동기방식으로는 정상 동작하지만 비동기로 동시 호출을 할때는 안되는데 이에 대한 가이드는 어떤 강의를 참고하면 될까요? casacade 에 대한 detach 처리가 필요한거 같은데, 그걸 수정하니 여러가지 오류가 발생해서 이렇게 로직을 만든 서비스에 대한 비동기 처리가 너무 궁금하네요 ㅠ 답변 부탁드립니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV 질문드려요~
질문을 찾아봤는데 없는것 같아서 질문 드립니다! 혹시 특정 Service만 OSIV를 끄고 커넥션을 유지하는 방법은 없을까요? 이전 강의에서 hibernate.default_batch_fetch_size는 전체 사이즈를 정하고 @BatchSize처럼 개별적으로 사이즈를 정하듯이 OSIV는 개별적으로 on/off는 불가능한지 궁금합니다.
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Json 반환 시 질문 좀 드릴게요!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 안녕하세요. 실전 JPA 활용 2를 복습하다가 궁금한 점이 생겨서 질문드립니다! JSON을 반환할 때 바로 배열로 반환하면 JSON 자체의 확장성이 좋지 못해 Result라는 껍데기 역할을 하는 클래스를 만들어서 반환하는 방법을 배웠는데요. 이 때, 이 Result라는 클래스를 개별적인 클래스로 생성한 후, 모든 Controller에 공통적이게 사용해도 별 문제가 없는 건가요? 제가 아직 JSON을 통한 API 통신은 많이 미숙하여 Result 클래스 이 친구를 항상 사용해주는 것인지 그렇다면 프로젝트 구조 상 어떤 위치에 선언하여 사용하는 것이 좋은지 궁금하여 질문드립니다!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
협업할 때
협업할 때 백엔드에서 만든 API를 어떤식으로 전달해주나요? 그리고 resources에 만든 html 같은건 넘겨주지 않나요? 어떤 것들만 넘겨주나요?