25%
66,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
컬렉션 조회
강의에서 order에 orderItemQuerydto를 컬렉션 하였는데 만약 예를들어 orderItemQuerydto에 itemDto라는 컬렉션까지 한번에 조회 하려고 할 때 강의에서 나온 동일한 방법을 반복하면 최적화가 될까요? import com.jpahop2.demo.domain.Address;import com.jpahop2.demo.domain.OrderStatus;import lombok.Data;import java.time.LocalDateTime;import java.util.List;@Datapublic class OrderQueryDto { private Long orderId; private String name; private LocalDateTime orderDate; //주문시간 private OrderStatus orderStatus; private Address address; private List<OrderItemQueryDto> orderItems; public OrderQueryDto(Long orderId, String name, LocalDateTime orderDate, OrderStatus orderStatus, Address address) { this.orderId = orderId; this.name = name; this.orderDate = orderDate; this.orderStatus = orderStatus; this.address = address; }} import lombok.Data;import java.time.LocalDateTime;@Datapublic class OrderItemQueryDto { private Long orderId; private int orderPirce; private int count; private String itemName; private List<ItemDto>items; public OrderItemQueryDto(Long orderId, int orderPirce, int count,String itemName) { this.orderId = orderId; this.orderPirce = orderPirce; this.count = count; this.itemName=itemName; }}
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Item 조회시 카테고리 별로 조회
안녕하세요 강사님 저는 jpa 1편을 듣지 않고 2편을 바로 듣고 쿼리디에스엘을 사용해서 코틀린으로 예제를 만들어보고 있습니다 예제 테이블의 여러 조회문을 만들어 보던 중 item 조회에 궁금한게 생겨 질문합니다. 아래 테이블은 category, category_item, item 순입니다. 제가 처음에 하고 싶던 것은 item 테이블의 DTYPE을 이용해서 타입별로 가져오는것입니다. 그래서 where절에 dtype을 넣고 싶었는데 넣을 수가 없더군요 그래서 찾은 방법이 조회를 할때 select문에 movie나 album의 q클래스를 사용하면 쿼리의 where절에 dtype이 찍혀서 해당값만 불러오더라구요 그런데 이렇게 했을때 문제가 album, book, movie에 대한 쿼리를 다 따로 짜야한다는 것입니다. 이또한 비효율적이라 생각하여 jpa2 강의에는 사용하지 않아서 정확한 용도가 뭔지는 모르겠지만 category 테이블을 사용해 봤습니다. 위의 테이블 값처럼 item과 다대다 매핑이 되어있는 상태에서 페치 조인을 하니 원하는데로 값이 출력되더라구요 이렇게 밤새 고민해서 원하는 바는 이뤘는데 현업은 어떨지 궁금하더라구요. 저처럼 카테고리로 조인해서 찾는 방법을 사용하는지 아니면 제가 처음 고민햇던 dtype별로 가져오는 방법이 또 존재해서 그방법을 쓰는지 궁금합니다. -------------------------------------------------------------------------------------------------------------------------- 두번째로 페이징된 결과값 출력인데요 api의 출력값으로 page를 넘기게 되면 pageing에 대한 정보값들이 같이 날라가는데 현업에서 이 데이터들을 다 넘겨주는지 아니면 리턴하기 전에 따로 response를 만들어 필요한 값만 넘겨주는지가 궁급합니다. -------------------------------------------------------------------------------------------------------------------------- 마지막으로 리턴값 출력시 엔티티 노출입니다. api를 구현할때 입력이나 출력값으로 엔티티를 사용하면 안된다고 배워서 출력값을 위한 dto를 따로 만들어 출력하려 합니다. 그런데 위의 예제의 경우 하나의 api에서 album, movie, book의 정보를 출력하기엔 각각 다른 변수값들이 있어서 고민이 되더라구요. 각각의 케이스별로 따로 dto를 만들어 줘야하는지 아니면 null값이나 빈값이 들어갈 순 있지만 각 케이스를 통합할 수 있는 dto를 만들어 줘야할지 궁금합니다. -------------------------------------------------------------------------------------------------------------------------- 이제 입사한지 3개월이 갓 넘은 초보 개발자인데 신규 프로젝트를 하면서 자바에서 코틀린, mybatis에서 jpa로 넘어가게 되어 강사는 강의를 들으며 공부하고 있습니다. jpa는 공부를 하면 할수록 추가로 공부해야 더 생기는거 같아요! 감사합니다
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
Jpa query 질문이 있어서 올립니다.
다름이 아니라 제가 실행하고 돌린 것은 fetch 조인을 해도 쿼리가 하나가 나가는게 아니라 2개가 나갑니다. select order0_.order_id as order_id1_6_0_, member1_.member_id as member_i1_4_1_, delivery2_.delivery_id as delivery1_2_2_, order0_.delivery_id as delivery4_6_0_, order0_.member_id as member_i5_6_0_, order0_.order_date as order_da2_6_0_, order0_.status as status3_6_0_, member1_.city as city2_4_1_, member1_.street as street3_4_1_, member1_.zipcode as zipcode4_4_1_, member1_.name as name5_4_1_, delivery2_.city as city2_2_2_, delivery2_.street as street3_2_2_, delivery2_.zipcode as zipcode4_2_2_, delivery2_.status as status5_2_2_ from orders order0_ inner join member member1_ on order0_.member_id=member1_.member_id inner join delivery delivery2_ on order0_.delivery_id=delivery2_.delivery_id Hibernate: select order0_.order_id as order_id1_6_0_, member1_.member_id as member_i1_4_1_, delivery2_.delivery_id as delivery1_2_2_, order0_.delivery_id as delivery4_6_0_, order0_.member_id as member_i5_6_0_, order0_.order_date as order_da2_6_0_, order0_.status as status3_6_0_, member1_.city as city2_4_1_, member1_.street as street3_4_1_, member1_.zipcode as zipcode4_4_1_, member1_.name as name5_4_1_, delivery2_.city as city2_2_2_, delivery2_.street as street3_2_2_, delivery2_.zipcode as zipcode4_2_2_, delivery2_.status as status5_2_2_ from orders order0_ inner join member member1_ on order0_.member_id=member1_.member_id inner join delivery delivery2_ on order0_.delivery_id=delivery2_.delivery_id 이런식으로 두개가 나가는데 이렇게 나가는 이유가 조회한 orderId 값이 달라서 이런건가요?? 그러기엔 영속성 안에 있는 값을 사용하면되는데 왜 다시 한번 호출이 되는지 궁금합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
복합키 관련해서 질문드립니다.
JpaRepository 상속받을때 키부분에 자료형을 아이디의 자료형을 사용하는데테이블이 복합키(복수의 pk)일 경우는 어떻게 해야하나요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
distinct 질문입니다.
안녕하세요 김영한 선생님~! distinct 관련해서 질문 있습니다. 강의에서 jpa의 distinct는 두가지 기능이 있다고 하셨는데 1. SQL에 distinct 넣어줘서 DB에서 실행 2. 애플리케이션에서 식별자로 distinct 수행. 여기서 애플리케이션에서 식별자로 distinct를 할때, 식별자가 기준이긴하지만 엄밀히 데이터는 다른 데이터인데 어떤 데이터를 버리고 어떤 데이터를 채택하는건가요? 예제에서는 주문(Order)데이터 1개에 OrderItem(주문상품) 데이터 (JPA1, JPA2) 이렇게 2개와 매칭되고 DB입장에서는 데이터가 다르기 때문에 모든 컬럼에 대해 distinct를 하면 2개가 나오는데요, JPA 입장에서는 식별자 기준으로 distinct를 한다면 저 2개의 데이터 중에 어떤 데이터를 무슨 기준으로 버리고 선택하는건가요?
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
@Valid 가 해결해주는 오류코드
안녕하세요 강사님! 항상 잘 듣고 있습니다:) @Valid 어노테이션을 통해서 구문오류를 spring 내에서 해결해 주어서 오류코드까지 반환해주는 것을 보고, 400대 에러 뿐만 아니라 500대 에러도 @Valid를 통해 검증해 줄 수 있는지 의문이 생겨 질문드립니다! 또 @valid가 500대 에러를 검증해 줄 수 없다면, 이에 대해 객체지향적으로 처리할 수 있는 다른 방법이 있는지도 궁금합니다! 감사합니다:)
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
could not initialize proxy [] - no Session
첫번째 이미지 잘 안보이시죠? https://cdn.inflearn.com/public/files/posts/8b857259-87d7-42a3-8b83-5a0c0481e361/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-02%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2011.08.57.png 여기로 부탁드립니다 ㅠ,ㅠ 크기를 키우는것이 힘드네요..ㅠ.ㅠ 강의 내용대로 open-in-view: false enable_lazy_load_no_trans: false 셋팅하고 ( 둘중에 true로 하면 당연 문제가 없습니다... ) Service단에 @Transactional(readOnly = true) 안에 getOne을 호출 하였습니다. 프록시 객체가 허용하도록 했는데요 왜 response가 could not initialize proxy []- no Session*/ 왜 이런 에러가 나오는건가요... 혹시 짐작가는게 있을까요? TransactionSynchronizationManager.getCurrentTransactionName() 혹시나 트렌젝션 안에 작동하지 않는걸까? 라고 생각했지만 트랜젝션 안에 포함 되었습니다. 선생님 감사합니다. 어쩔수없이 이렇게 질문 드립니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
인텔리제이 jpql 쿼리 인식 방법,,
안녕하세요 다름이 아니라 인텔리제이에서 jpql 쿼리가 인식이 안되고 그냥 문자열로만 인식하는데,,jpql 문법 오류시 찾기가 너무 힘드네요 ㅜ 혹시 이 기능을 활성화하고 싶으면 어떤 키워드로 검색하면 되나요? 찾기가 힘드네요 ㅜ
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
/api/v2/members에 대해 질문이 있습니다.
안녕하세요? 강사님. 항상 강의 잘 듣고 있습니다. 다름이 아니라, 제가 private Long price를 임의로 추가를 해봤습니다. 제가 이해한 내요은 @RequestBody를 통해서 CreateMemberRequest 에 해당되는 name 과 price를 postman 에서 가져와서 request에 담아서 실행하는 것으로 이해를 했습니다. 근데 실행 결과 에러가 났습니다. 애초에 제가 이해한 것이 잘못된것인지 궁금해서 질문드립니다. 감사합니다. @PostMapping("/api/v2/members")public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request){ Member member = new Member(); member.setName(request.getName()); Long id = memberService.join(member); return new CreateMemberResponse(id);}@Datastatic class CreateMemberRequest { private String name; private Long price;}
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강의자료 39페이지 오타(?) 제보드립니다.
안녕하세요 강사님, 간단한 오타 비스무리한게 있어서 제보드립니다. select m from member m where m.name = :name 위와 같은 JPQL을 아래처럼 바꿔야 할 것 같습니다! select m from Member m where m.name = :name
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
OSIV 를 끈 상태에서 개발하면 지연 로딩만 조심하면 되나여?
1.osiv를 끈 상태에서는 지연 로딩 관련 로직들을 서비스 계층 이후로 트랜잭셔날의 영향권 아래에 있는 로직으로 옮기면 되는건가여? 지연 로딩 관련만 옮기면 되는건가여? 아니면 다른것들도 옮겨야 되나여?2.성능 극대화가 필요한 앱이면 로직 구성이 조금더 복잡해지고 어려워지는건가여? 아니면 서비스 계층에서 로직이 좀더 길어지는거 말고는 별 차이가 없는건가여 이부분도 간단하지는 않아 보이는데 v1, v2, v3, v4, v5 를 OSIV 를 끄고도 개발할수 있어야 되나여? 3.근데 스프링 부트 jpa가 원래 이렇게 어려운건가여 끝이 없네여 ㅋ; 기본편 스프링 data jpa , quer dsl 다 들어야 되요 ㅠ; 알려주신 스펙 다 적용해서 실전 어플리케이션은 언제 만들죠 ㅠ; 4.리액트나 스벨트까지 연동해서 풀스택 프로젝트 강의도 언제인가 만들어 주실건가요? 5.훌륭한 강의 만들어 주셔서 감사합니다 좋은 주말 되세여!
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
v6의 OrderQueryDto 생성자 호출 부분에서 에러가 발생하는데 이유를 잘몰겠어여
안녕하세요 김영한 강사님v6 로직을 작성하던중 에러가 발생하는데여 v6 로직중에 아래의 코드중 OrderQueryDto 생성자 호출 부분에서 에러가 발생하는데 원인이 무엇일까여? 그리고 v6 최적화 로직은 전체적으로 쉽지 않은데 일단 v6 최적화 부분은 대충 의미를 파악한뒤 다음 강의로 넘어가도 될까여? controller/OrderApiController.java @GetMapping("/api/v6/orders")public List<OrderFlatDto> ordersV6() { List<OrderFlatDto> flats = orderQueryRepository.findAllByDto_flat(); return flats.stream() .collect(groupingBy(o -> new OrderQueryDto(o.getOrderId(), o.getName(), o.getOrderDate(), o.getOrderStatus(), o.getAddress()), mapping(o -> new OrderItemQueryDto(o.getOrderId(), o.getItemName(), o.getOrderPrice(), o.getCount()), toList()))) .entrySet() .stream().map(e -> new OrderQueryDto(e.getKey().getOrderId(), e.getKey().getName(), e.getKey().getOrderDate(), e.getKey().getOrderStatus(), e.getKey().getAddress(), e.getValue())) .collect(toList());} OrderQueryDto.java @Data@EqualsAndHashCode(of = "orderId")public class OrderQueryDto { private Long orderId; private String name; private LocalDateTime orderDate; //주문시간 private OrderStatus orderStatus; private Address address; private List<OrderItemQueryDto> orderItems; public OrderQueryDto(Long orderId, String name, LocalDateTime orderDate, OrderStatus orderStatus, Address address) { this.orderId = orderId; this.name = name; this.orderDate = orderDate; this.orderStatus = orderStatus; this.address = address; }}
- 해결됨실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
값 타입을 DTO에 넣는 방법?
안녕하세요 강사님! 강의 잘 듣고 있습니다. MemberDTO에 Address를 넣어주려고하는데, MemberDTO에 값 타입인 Address를 넣어주는 것보다 city, street, zipcode를 각각 따로 넣어주는게 나을까요? ( 코드로 작성해놓았습니다.) #1 코드 #2 코드 그리고 값 타입인 Address를 DTO에 명시하게 되면, 이것도 결국 엔티티를 직접 외부에 노출하는 것일까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
안녕하세요 영한님 static 관련
자정이 넘으신 시간까지 불철주야 강의 만들어주시고 질문 답변도 정말 상세하게 남겨주시는 노고에 감사드립니다. 강의 자료 3쪽부터 Response와 Dto 내부 클래스 선언에 static이 빠져있습니다. 3쪽 CreateMember Response, 5쪽 UpdateMemeberResponse 8쪽 Result와 MemberDto 입니다. 감사합니다.
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
회원 조회 로직의 응답 형식에 대해 질문이 있습니다.
아래처럼 회원 조회 로직이 있을때 멤버 엔티티 정보를 스트림화 한뒤 멤버 디티오 형식으로 다시 설정하고 그걸 리스트화하는것까지는 의미상으로 이해가 가는데여 응답 클래스 Result<T> 객체를 만들어서 응답하는 이유가 무엇인가여? @GetMapping("/api/v2/members")public Result memberV2() { List<Member> findMembers = memberService.findMembers(); List<MemberDto> collect = findMembers.stream() .map(m-> new MemberDto(m.getName())) .collect(Collectors.toList()); return new Result(collect);}@Data@AllArgsConstructorstatic class Result<T> { private T data;}@Data@AllArgsConstructorstatic class MemberDto { private String name;}
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
쿼리가 6번이 아니라 3번만 출력 되요
지금 코드가 아래 같은데 sql이 총 6번 찍혀야 되는데 3번만 찍혀서여 오더 두번 아이템 4번 이렇게 총 6개여야 하는데 오더 한번 아이템 두번 총3번만 찍히는데 뭐가 잘못된 것일까여? @GetMapping("/api/v3.1/orders") public List<OrderDto> ordersV3_page() { List<Order> orders = orderRepository.findAllWithMemberDelivery(); List<OrderDto> result = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return result; } @Data static class OrderDto { private Long orderId; private String name; private LocalDateTime orderDate; //주문시간 private OrderStatus orderStatus; private Address address; private List<OrderItemDto> orderItems; public OrderDto(Order order) { orderId = order.getId(); name = order.getMember().getName(); orderDate = order.getOrderDate(); orderStatus = order.getStatus(); address = order.getDelivery().getAddress(); // 주문 아이템 정보에 대한 프록시 초기화 구문 // order.getOrderItems().stream().forEach(o-> o.getItem().getName()); // orderItems = order.getOrderItems(); orderItems = order.getOrderItems().stream() .map(orderItem -> new OrderItemDto(orderItem)) .collect(toList()); } } @Getter 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(); } } ex2) 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(); } post 맨 요청 결과: url: http://127.0.0.1:8080/api/v3.1/orders/ result: [ { "orderId": 4, "name": "userA", "orderDate": "2021-01-27T03:46:24.680706", "orderStatus": "ORDER", "address": { "city": "서울", "street": "1", "zipcode": "1111" }, "orderItems": [ { "itemName": "JPA1 BOOK", "orderPrice": 10000, "count": 1 }, { "itemName": "JPA2 BOOK", "orderPrice": 20000, "count": 2 } ] }, { "orderId": 11, "name": "userB", "orderDate": "2021-01-27T03:46:24.767473", "orderStatus": "ORDER", "address": { "city": "진주", "street": "2", "zipcode": "2222" }, "orderItems": [ { "itemName": "SPRING1 BOOK", "orderPrice": 20000, "count": 3 }, { "itemName": "SPRING2 BOOK", "orderPrice": 40000, "count": 4 } ] } ]
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강사님 질문 드립니다!
강의 잘 듣고 있습니다! 실제 실무에서 JPA를 사용해서 조회할때, 조회하는 데이터 양이 많을때는 DTO 를 직접 조회해서 사용하고 조회하는 데이터 양이 많지 않을때는 페치조인을 사용하여 DTO를 반환하는 방식으로 사용하나요 ? ? 아니면 실무에서 따로 내부적으로 조회하는 쿼리는 이렇게 사용하자~ 라고 하는 내부규칙에 있을까요 ??
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강사님! 질문 드립니다.
강의 잘듣고 있습니다. 강의 듣고 강의 내용 복습하면서 정리를 하고 있는데, <일대다 상황에서의 조회일때> 1. 페이징이 없는 엑셀 다운로드와 같은 기능에서는모두 join fetch 사용하여 데이터를 조회한다. 2. 페이징이 필요한 기능에서는 x To One 관계만 join fetch 를 사용하여 한방에 갖고오며, x to Many 인 관계들은 default_batch_fetch_size 를 이용하여 조회한다. 강사님이 강조해주신 내용을 제가 정확하게 인지하고 있는게 맞을까요 ? _ ?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
강사님 질문 드립니다!
일하면서 틈틈히 강의 잘 듣고 있습니다. 다름이 아니라, 일대다 페치조인할 때, 기본적으로 별칭을 주지 않는다 로 알고 있는데, 예제와 같은 상황일때는 별칭을 주고 페치 조인을 해도 상관없는 걸까요?
- 미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
주문 조회 v1에서 반복문을 통해 json 응답할 내용 설정 되는 과정이 잘 이해가 안가여
주문 조회 v1의 컨트롤러 로직에서 주문 조회에 대해 lazy 패치 문제를 해결하고 필요한 데이터를 응답 객체에 세팅하기 위해 for문이 아래처럼 돌아가는데여 for(Order order:all) { // fetch.Lazy 로 인한 데이터 공백 에러를 피하기위해 주문에 대한 멤버 정보,배송 정보를 미리 조회 order.getMember().getName(); order.getDelivery().getAddress(); // 주문 상품의 이름들의 정보가 필요하므로 아래와 같이 재구성 List<OrderItem> orderItems = order.getOrderItems(); orderItems.stream().forEach(o -> o.getItem().getName()); } 이중에 item 정보 출력이 어떻게 설정되는건지 잘 이해가 안가여 all = 초기화할 내용 이렇게 뭔가를 가져와서 all에 저장한뒤 all을 리턴해야 json 응답에 반영되는게 아닌가여? 아래 코드에서 리스트를 재구성한건 알겠는데 그럼 item 정보 중에item.name 만 나와야 되는거 아닌가여? List<OrderItem> orderItems = order.getOrderItems(); orderItems.stream().forEach(o -> o.getItem().getName()); 실제 출력 결과는 아이템 이름 이외의 정보다 다 출력이 되서여 "item": { "id": 3, "name": "JPA2 BOOK", "price": 20000, "stockQuantity": 98, "categories": [], "author": null, "isbn": null }, 어떤식으로 all에 설정이 되서 json 응답 정보가 구성되는지에 대해 좀더 보충설명 해주실수 있나여? 좋은 하루 되세여 ~!