월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
이번 강의에 대한 질문이 있습니다.
아직 개인적으로 개발 공부 중인 저에게 너무 앞서가는 내용이 아닌가 싶기도 하고 실제로 Map 등 java에 관한 이해가 아직 부족해서 이 부분을 패스하고 나중에 필요할 때 다시 들어도 공부하는 틀에 큰 지장이 없는지 여쭤보고 싶습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
join에 대해 질문있습니다.
public List<Order> findAllWithMemberDelivery() { return em.createQuery("select o from Order o ", Order.class).getResultList(); }이렇게 order만 select해줘도@GetMapping("api/v3.1/orders") private List<OrderDto>ordersV3_page(){ List<Order>orders=orderRepository.findAllWithMemberDelivery(); List<OrderDto>result=new ArrayList<>(); for(Order order:orders){ result.add(new OrderDto(order)); } return result; }강의자료와 동일하게 설계해서 뿌려주면//postman의 결과 [ { "orderId": 4, "name": "userA", "orderDate": "2023-01-19T14:02:41.723635", "address": { "city": "서울", "street": "1", "zipcode": "1111" }, "orderStatus": "ORDER", "orderItems": [ { "itemName": "JPA1 BOOK", "orderPrice": 10000, "count": 1 }, { "itemName": "JPA2 BOOK", "orderPrice": 20000, "count": 1 } ] }, { "orderId": 11, "name": "userB", "orderDate": "2023-01-19T14:02:41.79964", "address": { "city": "진주", "street": "2", "zipcode": "2222" }, "orderStatus": "ORDER", "orderItems": [ { "itemName": "SPRING1 BOOK", "orderPrice": 20000, "count": 3 }, { "itemName": "SPRING2 BOOK", "orderPrice": 40000, "count": 4 } ] } ]이렇게 원하는 결과가 나옵니다.(물론 item id가 없습니다.)즉 Order만 select해도 Dto에 설계한대로 정보가 잘 나오는데 o.member 등을 join하는 이유는 item id 등이 필요할 때가 있어서 그런건가요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
공식 서포터즈님들은 영한님 답변들을 따로 분류해서 모으시나요?
어떤 주제에 대해서 관련된 영한님 답변을 잘 찾아서 답변 남겨 주시는게 신기해서 질문 드립니다. 학습하시는 분들과 공유된다면 비슷한 질문이 덜 올라오지 않을까 생각되네요. 이미 공유되고 있다면 링크를 알려주실 수 있을까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OrderDto stream -> for문으로 작성
stream 사용이 익숙하지 않아서 for문으로 대체해서 작성했는데요Dto의 생성자에는 엔티티를 노출시켜도 괜찮은거죠?@Data static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; private Address address; private OrderStatus orderStatus; private List<OrderItemDto> orderItems; public OrderDto(Order order) { orderId = order.getId(); name = order.getMember().getName(); orderDate = order.getOrderDate(); address = order.getMember().getAddress(); orderStatus = order.getStatus(); //질문구간 List<OrderItem> items = order.getOrderItems(); orderItems = new ArrayList<>(); for (OrderItem orderItem : items) { orderItems.add(new OrderItemDto(orderItem)); } } @Data static class OrderItemDto { private String itemName; private int orderPrice; private int count; public OrderItemDto(OrderItem orderItem) { itemName = orderItem.getItem().getName(); orderPrice = orderItem.getOrderPrice(); count = orderItem.getCount(); } }
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
postman 문제
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. postman 작동이 안돼요.뭐가 문제일까요? 인텔리제이 코드는 2편 코드 파일 다운받아서 그대로 사용했어요.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
로그 출력 방법
(insert into member부터 끝까지) 쿼리문 로그가 계속해서길게 한 줄로 출력되는데짧게짧게 여러줄로 출력되도록 하려면 어떻게 해야되나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Entity 에 setter 가 없을경우 update method
안녕하세요~항상 좋은 강의를 위해 노력해주셔서 감사합니다!Service 에서 update method 를 만들때 entity 의 name 을 setter 를 통해 수정하셨는데만약 Setter 를 사용하지 않을경우엔 어떤방법으로 수정하는게 좋을까요??Entity 에 수정을 원하는 필드만 따로 setter 를 만들어야 하는건가요??
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
처음에 무한 Loop 을 돌게 되는 이유
안녕하세요~ 강의 중 처음에 order 들을 조회하는 api 가 무한 루프를 도는 이유가 궁금해서 질문을 올리게 되었습니다 (6분 30초 ~ 7분 부분)우선, Order > Member > Order 조회 의 순으로 일어나기 때문에 무한 루프가 발생한다고 설명해주셨습니다.이 때, Order 는 member 가 Lazy 설정이 되어 있고, Member 에도 List<Order> 를 가져오는 것이 Lazy 로 설정이 되어 있습니다 (@OneToMany 이기 때문) .[모든 order 를 조회하라] 라는 로직에 member 를 join 해서 가져오기 대문에, Order 가 Member 를 조회해서 가져오는 부분은 이해를 하였습니다. 쿼리도 다음과 같이 나가더라구요! 2023-01-15 18:08:52.603 DEBUG 74756 --- [nio-8080-exec-1] org.hibernate.SQL : select order0_.order_id as order_id1_6_, order0_.delivery_id as delivery4_6_, order0_.member_id as member_i5_6_, order0_.order_date as order_da2_6_, order0_.status as status3_6_ from orders order0_ inner join member member1_ on ( order0_.member_id=member1_.member_id ) 2023-01-15 18:08:52.713 DEBUG 74756 --- [nio-8080-exec-1] org.hibernate.SQL : select member0_.member_id as member_i1_4_0_, member0_.city as city2_4_0_, member0_.street as street3_4_0_, member0_.name as name4_4_0_ from member member0_ where member0_.member_id=? 2023-01-15 18:08:52.722 DEBUG 74756 --- [nio-8080-exec-1] org.hibernate.SQL : select orders0_.member_id as member_i5_6_0_, orders0_.order_id as order_id1_6_0_, orders0_.order_id as order_id1_6_1_, orders0_.delivery_id as delivery4_6_1_, orders0_.member_id as member_i5_6_1_, orders0_.order_date as order_da2_6_1_, orders0_.status as status3_6_1_ from orders orders0_ where orders0_.member_id=?첫번째 쿼리로 join 을 하는데, <이후 호출>에 의하여 두, 세번째 쿼리가 나가는 것 같습니다.이 때, 각각의 멤버의 정보를 불러오기 위하여 member 쿼리가 나가는 것은 이해가 되는데, orderItem 이 LAZY 임에도 쿼리가 또 나가는 이유가 궁금합니다. response 가 나가는 과정에서 Json 형성을 위해 ObjectMapper 가 getMember, getOrderItem 등을 수행하는 것으로 알고 있는데, 이 때 불러오기 때문일까요?? 2.ObjectMapper 가 무시할 수 있도록 다음과 같이 변경후 실행시켜 보았습니다. @JsonIgnore @OneToMany(mappedBy = "member") private List<Order> orders = new ArrayList<>(); 이렇게 될 시엔 다음과 같이 Serializable 관련 에러가 발생하는 것 같았습니다. 그랬더니 두번재 쿼리까지만 나가긴 하는데, 다음과 같은 에러가 발생합니다.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]->com.example.actualjpa.domain.Order["member"]->com.example.actualjpa.domain.Member$HibernateProxy$jMkxupIu["hibernateLazyInitializer"])검색을 해보니 프록시 객체를 Serialize 하려고 했다는 에러가 발생하는 것 같은데, orders 에 프록시 값들이 들어있는게 맞을까요? 반대인 경우에는 DB 에 FK값이 있기 때문에 id 값만을 가지고 Proxy 객체를 형성한다는 점을 완전히 이해를 했었는데, 이와 같은 경우에는 각 ID 값이 DB에 없기 때문에, Member만 조회시 orders 내의 Order 들에 대한 프록시도 없고 아예 아무 정보도 없겠구나 라고 이해를 했었습니다.즉, 레이지일 경우 Member만 조회시 orders 에 대한 정보는 Member 객체에 없다 라고 이해를 했었습니다. @JsonIgnore를 해서 조회같은걸 할 수 없도록 했음에도, 위와 같은 에러가 발생하는 이유가 어떤건지 알 수 있을까요?? =========================위 질문에 대한 수정사항:제가 질문한 바로 뒷내용이 JsonIgnore 설정해주시고 같은 에러에 대해서 설명해주시는 부분 확인했습니다 ㅠㅠ 프록시 객체 때문에 발생하는 에러가 맞네요.그래도 같은 질문을 드리고 싶은데, 1:N 관계에서 Proxy 객체에 대해서 조금 이해가 안되었습니다(JPA 강의 완강했습니다). Apple 과 Tree 라는 N:1 관계에서 살펴보면 (양방향 모두LAZY 설정시) , Apple Entity 내의 private Tree tree가 있을 것이고, APPLE DB에는 외래키값으로 tree_id 가 들어가있을 것이기 때문에 그 값을 토대로 프록시 객체를 형성해 놓는다는 사실은 잘 이해하였습니다.하지만 그 반대일 경우 에 대해서 이해를 못한 것 같습니다 (JPA 강의에서도 반대에 대한 프록시 구성 설명은 없었던 것 같습니다 ㅠ). 반대의 경우 Tree DB 안에는 Apple 을 외래키값으로 가지고 있지 않은데, 어떻게 프록시 객체를 형성해 놓는 걸까요?? (프록시 객체를 형성해 놓기 때문에 위 2번과 같은 상황이 발생한 것으로 보입니다). 다음과 같은 예제를 설정해보았습니다.@Test @DisplayName("1:N에서 1이 N List를 조회시 :: LAZY LOADING 의 타입은 Proxy") void test2() { Tree findTree = em.find(Tree.class, tree.getId()); System.out.println("findTree.getApples().get(0).getClass() = " + findTree.getApples().get(0).getClass()); }이 때, em.find 만 해서 tree 를 조회하였을 경우 쿼리가 Tree 만을 조회하도록 나가는 것은 확인했습니다. 하지만, 그 아래 get(0) 를 수행하는 순간 "Apple 테이블에서 Tree_ID={tree_id} 인 값을 찾아와라" 라고 쿼리 문이 나가는 것을 확인했습니다. (getClass 를 통해 프록시가 맞는지 확인하려 했으나, get() 을 하는 순간 select 가 나가서 확인하지 못했습니다)즉,Apple 에서 Tree 프록시를 형성할 때는 Apple DB에 있는 외래키를 통해 Tree Proxy 에 PK 값을 넣어준 상태로 프록시를 형성하였는데, Tree 에서 Apple 들의 프록시를 형성할 때는 외래키가 없으므로, 그냥 자신의 PK 값을 통해 Apple 의 외래키 값을 넣어준 상태로 프록시를 형성해 둔다(??).이렇게 정리되는게 맞는 걸까요?질문이 너무 기네요.... 계속 붙이다 보니 .... 죄송합니다. 2번 질문은 그냥 아래 수정사항 이후 질문이라고 봐주시면 될 것 같습니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컨트롤러에서 반환하려는 DTO 에 임베디드 타입
컨트롤러에서 반환하려는 DTO에 임베디드 타입으로 사용한 클래스를 넣어도 괜찮은가요? 강의에서 OrderDto에 Address 를 넣으셨는데 생각해보면 Address 자체는 엔티티가 아니라서 괜찮을것 같지만 궁금해서 질문 남깁니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
DTO, 그리고 Result Generic Class 에 대해서
안녕하세요~ 질문 드리는 부분이 사실 알아서 하면 되는? 부분인 것 같긴 한데.. 보통 어떻게 하는지 궁금해서 질문을 올립니다. 다음과 같은 generic class 를 예시로 들어주셨습니다 static class Result<T>{ private T data; }이 때, count 같은 spec 을 추가적으로 요청한다면, 그 것에 대응하기 쉽기 때문이라고 설명해주셨는데요, 그러면 이런 Generic class 들도 API SPEC 에 맞춰서 하나씩 만들어 줘야 하나요? 아니면 보통 응답용? 모델을 만들고 (다음과 같이) DTO 에 세팅을 해주나요?예시를 들면, 다음과 같습니다. class ResponseModel<T>{ private int statusCode; private String responseType; private String responseDesc; private T data; } class MemberLookUpDto{ private int count; private List<MemberDto> memberDtos; }이렇게 하나 저렇게 하나 사실 개발자 마음이긴 할텐데, 제가 경험이 부족하다보니 보통 어떻게 하는지 궁금해서 문의 드리게 되었습니다.그리고 만들다 보니 위처럼 ResponseModel 이라는게 필요할까? 라는 생각도 드네요. 통신에 대한 정보는 이미 기본으로 다 담겨져 있지 않나 싶고 .. 그렇게 생각하다보면 강의에서 보여주신 것처럼 Result 같은 Generic class 도 메인 데이터만을 Generic 화 하고 요청하는 데이터들을 따로 더 담아줄 수 있도록 모델링 하는게 맞는 것 같기도 합니다. 근데 또 그러면 위에서 말씀드린 것처럼, 모든 요청마다 Generic class 가 있어야 하는 것일텐데... 보통 어떤 방식으로 실무에서 진행되는지 문의드려도 될까요?
- 미해결실전! 스프링 부트와 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 개발과 성능 최적화
강의가 반복됩니다
편집이 조금 잘못됐는지 네트워크 문제라고 생각하고 넘겼었는데 이상해서 문의합니다!페이징과 한계 돌파 강의부터 끝날때까지 꾸준히 발생하는 것 같습니다