728x90

개발 304

Spring Data JPA - 페이징과 정렬

- JPA 페이징 - Repository 코드 // 페이징 설정 public List findByPage(int age, int offset, int limit) { return em.createQuery("select m from Member m where m.age = :age order by m.username desc") .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); } // 카운트 설정 public long totalCount(int age) { return em.createQuery("select count(m) from Member m where m.age = :age", Lon..

Spring Data JPA - 쿼리 메소드 (메소드 이름으로 쿼리 생성, @Query)

- 쿼리 메소드 기능 3가지 1. 메소드 이름으로 쿼리 생성 2. 메소드 이름으로 JPA NamedQuery 호출 3. @Query 어노테이션을 사용해서 Repository 인터페이스에 쿼리 직접 정의 - 메소드 이름으로 쿼리 생성 - 순수 JPA Repository public List findByUsernameAndAgeGreaterThan(String username, int age) { return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) .getResultList(); } ..

Spring Data JPA - 공통 인터페이스 기능

- Member (Entity) @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) //매개변수가 없는 생성자 생성과 동시에 접근 지정자를 PROTECTED로 설정한다. @ToString(of = {"id", "username", "age"}) //ToString에 범위를 지정해주지 않으면 양방향 연관관계에 의해 //무한 루프가 발생할 수 있기 때문에 필요한 정보만 입력한다. public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String username; private int age; @ManyToOne(..

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)..

개발/JPA(KYH) 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..

개발/JPA(KYH) 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)..

개발/JPA(KYH) 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..

개발/JPA(KYH) 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개의 튜플이 생성된다. - 기존의 조..

개발/JPA(KYH) 2023.07.19
728x90