분류 전체보기 1341

Ch03. API 개발 고급(지연 로딩과 조회 성능 최적화) - 간단한 주문 조회 V4(JPA에서 DTO로 바로 조회)

Select 절에서 내가 원하는 것만 뽑을 수 있다. public List findOrderDtos() { return em.createQuery("select new jpabook.jpashop.dto.OrderSimpleQueryDto(o.id,m.name,o.orderDate,o.status,d.address) from Order o" +" join o.member m" +" join o.delivery d" ,OrderSimpleQueryDto.class ).getResultList(); } Repository @Repository @RequiredArgsConstructor public class OrderSimpleQueryRepository { private final EntityManage..

Ch03. API 개발 고급(지연 로딩과 조회 성능 최적화) - 간단한 주문 조회 V3(Entity -> DTO로 변환(페치 조인 최적화))

SQL을 실행할 때, Fetch join을 하여, 필요한 것만 가지고 와서 조인할 수 있다(성능 이슈 해결) 엔티티를 페치 조인(fetch join)을 사용해서 쿼리 1번에 조회 페치 조인으로 order -> member , order -> delivery는 이미 조회된 상태 이므로 지연 로딩

Ch03. API 개발 고급(지연 로딩과 조회 성능 최적화) - 간단한 주문 조회 V2(Entity -> DTO로 변환)

DTO로 반환하지만, 쿼리가 너무 많이 실행된다. order 조회 1번(order 조회 결과 수가 N이 된다.) order -> member 지연 로딩 조회 N 번 order -> delivery 지연 로딩 조회 N 번 예) order의 결과가 4개면 최악의 경우 1 + 4 + 4번 실행된다.(최악의 경우) 지연 로딩은 기본적으로 영속성 컨택스트를 먼저 탐색하기 때문에 만약 해당 데이터가 영속성 컨택스에 있다면 쿼리를 생략한다. Eager로 변경해도 성능 향상을 기대할 수 없다(성능이 너무 안 좋아진다) 엔티티를 DTO로 변환하는 일반적인 방법이다

Ch03. API 개발 고급(지연 로딩과 조회 성능 최적화) - 간단한 주문 조회 V1(엔티티를 직접 노출)

주문 + 배송정보 + 회원을 조회하는 API를 만들자 참고: 지금부터 설명하는 내용은 정말 중요합니다. 실무에서 JPA를 사용하려면 100% 이해해야 합니다. 안그러면 엄청난 시간을 날리고 강사를 원망하면서 인생을 허비하게 됩니다. 지연 로딩 때문에 발생하는 성능 문제를 단계적으로 해결해보자 무한루프 발생 Why? -> order - Member를 순환참조한다. 해결하기 위해 양방향 연관관계가 있는 앤티티를 JsonIgnore 해준다. Member,delivery,orderItem 에러 발생 500 ->org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org...

Ch02. API 개발 고급(준비) - API 개발 고급 소개, 조회용 샘플 데이터 입력

API 개발 고급 - 조회용 샘플 데이터 입력 등록과 수정은 성능 이슈가 거의 발생하지 않기 때문에 조회용 데이터를 입력한다. API 개발 고급 - 지연 로딩과 조회 성능 최적화 N + 1 문제를 실전에서 많이 발생한다. -> 이를 해결하는 방법을 공부한다. API 개발 고급 - 컬렉션 조회 최적화 일대일, 일대다 조회를 하게 되면 데이터가 뻥튀기되는데 이때 어떻게 해결하고, 최적화하는지 API 개발 고급 - 페이징 한계 돌파 API 개발 고급 - OSIV와 성능 최적화 OpenSesionInView 이걸 사용하지 않는다면 Lasy로딩 Exception을 자주 만난다 샘플 데이터 입력 userA JPA1 BOOK JPA2 BOOK userB SPRING1 BOOK SPRING2 BOOKInitDb 컴포넌..

Ch01. API 개발 기본 - 회원 조회 API

문제점 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다. 기본적으로 엔티티의 모든 값이 노출된다. 응답 스펙을 맞추기 위해 로직이 추가된다. (@JsonIgnore, 별도의 뷰 로직 등등) 실무에서는 같은 엔티티에 대해 API가 용도에 따라 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 프레젠테이션 응답 로직을 담기는 어렵다. 엔티티가 변경되면 API 스펙이 변한다. 추가로 컬렉션을 직접 반환하면 항후 API 스펙을 변경하기 어렵다.(별도의 Result 클래스 생성으로 해결) 반환 객체가 배열 형태이기 때문에, 만약 Count라는 변수를 추가할 경우 확장이 어렵다. WHY? 배열에는 같은 스펙을 데이터가 들어가야 되므로 count가 들어가면서 깨지게 된다. 따라서 확장이 유연하게 툴을 만들어..

Ch01. API 개발 기본 - 회원 수정 API

멱등성 = 같은 동작을 하면 동일함을 보장한다. JPA의 변경감지를 활용하여 해당 데이터를 수정을 진행해준다. 오류정정 회원 수정 API updateMemberV2 은 회원 정보를 부분 업데이트 한다. 여기서 PUT 방식을 사용했는데, PUT은 전체 업데이트를 할 때 사용하는 것이 맞다. 부분 업데이트를 하려면 PATCH를 사용하거나 POST를 사용하는 것이 REST 스타일에 맞다.

Ch01. API 개발 기본 - 회원 등록 API

postman 설치 (https://www.getpostman.com) Api랑 화면을 로딩해 주는 화면과는 분리를 해주는 것이 좋다. RestController @RestController //2개의 어노테이션을 합친것이다. @RequiredArgsConstructor public class MemberApiController { private final MemberService memberService; @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){ //@RequestBody -> json객체를 member에 넣어준다 //Controller 에서 Vali..

Ch11. 객체지향 쿼리 언어2(중급 문법) - 벌크 연산

재고가 10개 미만인 모든 상품의 가격을 10% 상승하려면? JPA 변경 감지 기능으로 실행하려면 너무 많은 SQL 실행 1. 재고가 10개 미만인 상품을 리스트로 조회한다. 2. 상품 엔티티의 가격을 10% 증가한다. 3. 트랜잭션 커밋 시점에 변경 감지가 동작한다. 변경된 데이터가 100건이라면 100번의 UPDATE SQL 실행 벌크 연산 쿼리 한 번으로 여러 테이블 로우 변경(엔티티) executeUpdate()의 결과는 영향받은 엔티티 수 반환 UPDATE, DELETE 지원 INSERT(insert into.. select, 하이버네이트 지원) 벌크 연산 - 주의 벌크 연산은 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리 EX) 벌크 연산은 DB에 직접 쿼리를 바로 실행해주기 때문에 애플..

Ch11. 객체지향 쿼리 언어2(중급 문법) - Named 쿼리

미리 정의해서 이름을 부여해두고 사용하는 JPQL 정적 쿼리 어노테이션, XML에 정의 애플리케이션 로딩 시점에 초기화 후 재사용 애플리케이션 로딩 시점에 쿼리를 검증 @NamedQuery를 통해 NamedQuery를 작성할 수 있다. 애플리케이션 로딩 시점에 미리 파싱 하여 오류 여부를 파악한다. 가장 좋은 에러 1) 컴파일 2) 어플리케이션 실행시점 3) 실제 이벤트 동작 시점 createNamedQuery를 통해 NamedQuery을 이름을 지정하여 사용하면 된다. Named 쿼리 - XML에 정의 XML이 항상 우선권을 가진다. 애플리케이션 운영 환경에 따라 다른 XML을 배포할 수 있다 SpringDataJPA에서의 @Query로 사용하는 jpql 같은 경우 Spring에서 해당 쿼리를 다 Na..