728x90

Programming 275

Spring Data JPA - (벌크성 수정 쿼리)

- JPA에서 벌크 연산은 executeUpdate()를 통해 JPQL에 update, delete를 지원하였다. - 또한 벌크 연산은 DB에 직접 쿼리를 날리기 때문에 영속성 컨텍스트에 영향을 주지 않았다. - JPA를 이용한 벌크 수정 쿼리 public int bulkAgePlus(int age) { int resultCount = em.createQuery( "update Member m set m.age = m.age +1" + " where m.age >= :age") .setParameter("age", age) .executeUpdate(); return resultCount; } - 벌크 연산과, 파라미터 바인딩을 통해 JPQL에 update 쿼리를 작성하였다. - Test 코드 @Test..

Programming/Spring 2023.07.26

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(); } ..

Programming/Spring 2023.07.24

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

Programming/Spring 2023.07.24

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
728x90