728x90

Programming/JPA 23

JPA - API (지연 로딩과 조회 성능 최적화) 컬렉션 조회 최적화

- 컬렉션 조회는 OneToMany의 경우에 발생한다. * V1. 엔티티 직접 노출 * - 엔티티가 변하면 API 스펙이 변한다. * - 트랜잭션 안에서 지연 로딩 필요 * - 양방향 연관관계 문제 * * V2. 엔티티를 조회해서 DTO로 변환(fetch join 사용X) * - 트랜잭션 안에서 지연 로딩 필요 * V3. 엔티티를 조회해서 DTO로 변환(fetch join 사용O) * - 페이징 시에는 N 부분을 포기해야함(대신에 batch fetch size? 옵션 주면 N -> 1 쿼리로 변경 가능) * * V4. JPA에서 DTO로 바로 조회, 컬렉션 N 조회 (1 + N Query) * - 페이징 가능 * V5. JPA에서 DTO로 바로 조회, 컬렉션 1 조회 최적화 버전 (1 + 1 Query)..

Programming/JPA 2023.07.22

JPA - API (지연 로딩과 조회 성능 최적화) 기본

- xToOne (ManyToOne, OneToOne) 관계 최적화 1. 엔티티 직접 노출 (권장하지 않음) @RestController @RequiredArgsConstructor public class OrderSimpleApiController { @GetMapping("/api/v1/simple-orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); // LAZY 강제 초기화 order.getDelivery().getAddress(); // LAZY 강제 초기화 } return all..

Programming/JPA 2023.07.21

JPA - API 개발 기본

- 회원 등록 API @RestController //Controller + ResponseBody를 합친 것으로 Body에 json을 통해 데이터를 전달한다. @RequiredArgsConstructor public class MemberApiController { private final MemberService memberService; //기존에 작성되어 있는 Service @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { Long id = memberService.join(member); return new CreateMemberResponse(id)..

Programming/JPA 2023.07.19

JPA - 벌크 연산

- 쿼리 한 번으로 여러 테이블 로우 변경(엔티티) - executeUpdate()의 결과는 영향받은 엔티티 수를 반환한다. - UPDATE, DELETE를 지원한다. - INSERT(insert into ... select, 하이버네이트 지원) Team team1 = new Team(); team1.setName("팀A"); em.persist(team1); Team team2 = new Team(); team2.setName("팀B"); em.persist(team2); Member member1 = new Member(); member1.setUsername("회원1"); member1.setTeam(team1); em.persist(member1); Member member2 = new Membe..

Programming/JPA 2023.07.19

JPA - 페치 조인 (1)

- 페치 조인(fetch join) 1. SQL 조인 종류가 아니다. 2. JPQL에서 성능 최적화를 위해 제공하는 기능이다. 3. 연관된 엔티티나 컬렉션을 SQL 한 번에 함께 조회하는 기능이다. - 엔티티 페치 조인 1. Member 엔티티를 조회하면서 연관된 팀 Team 엔티티도 함께 조회가 가능하다. (SQL 한 번에) //JPQL select m from Member m join fetch m.team //SQL SELECT M.*, T.* FROM MEMBER M INNER JOIN TEAM T ON M.TEAM_ID = T.ID - 현재 위와 같이 회원 2명이 팀 하나에 같이 소속되어 있는 상황이다. - 회원 1,2,3과 팀 A,B를 조인하면 위와 같이 3개의 튜플이 생성된다. - 기존의 조..

Programming/JPA 2023.07.19

JPA - 경로 표현식

- 경로 표현식 1. .(점)을 찍어 객체 그래프를 탐색하는 것이다. select m.username -> 상태 필드 from Member m join m.team t -> 단일 값 연관 필드 join m.orders o -> 컬렉션 값 연관 필드 where t.name = '팀A - 경로 표현식 용어 정리 1. 상태 필드(state field): 단순히 값을 저장하기 위한 필드 - ex) m.username 2. 연관 필드(association field): 연관관계를 위한 필드 2.1. 단일 값 연관 필드: @ManyToOne, @OneToOne, 대상이 엔티티 (ex: m.team) 2.2. 컬렉션 값 연관 필드: @OneToMany, @ManyToMany, 대상이 컬렉션 (ex: m.orders)..

Programming/JPA 2023.07.18

JPA - 기본 문법 (조건식(CASE 등등), JPQL 함수)

- 조건식 - CASE 식 - 기본 CASE 식 // 기본 case문 String query = "select " + "case when m.age = 60 then '경로요금' " + " else '일반요금' " + "end " + "from Member m"; List result = em.createQuery(query, String.class) .getResultList(); for (String s : result) { System.out.println("s = " + s); } - COALESCE : 하나씩 조회해서 null이 아니면 반환 //coalesce String query = "select coalesce(m.username, '이름 없는 회원') from Member m"; List..

Programming/JPA 2023.07.18

JPA - 기본 문법 (조인, 서브쿼리, 타입 표현과 기타식)

- 조인 1. 내부 조인 : SELECT m FROM Member m [INNER] JOIN m.team t 2. 외부 조인 : SELECT m FROM Member m LEFT [OUTER] JOIN m.team t 3. 세타 조인 : select count(m) from Member m, Team t where m.username = t.name - 조인 - ON 절 1. 조인 대상 필터링 2. 연관관계 없는 엔티티 외부 조인 1. 조인 대상 필터링 - ex) 회원과 팀을 조인하면서, 팀 이름이 A인 팀만 조인 - JPQL SELECT m, t FROM Member m LEFT JOIN m.team t on t.name = 'A' - SQL SELECT m.*, t.* FROM Member m LEF..

Programming/JPA 2023.07.18
728x90