목록Spring/인프런_JPA (16)
빙응의 공부 블로그

📝 사용자 정의 리포지토리 JPA에서 기본적인 기능은 JpaRepository 인터페이스를 상속받아 사용한다.그러나 복잡한 쿼리나 특정 기능 구현을 위해 사용자 정의 인터페이스를 사용할 수 있다.스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동으로 생성한다스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많다.다양한 이유로 인터페이스 메서드를 직접 구현하고 싶다면 사용하면 된다.!!사용자 정의 인터페이스 public interface MemberRepositoryCustom { List findMemberCustom(); }사용자 정의 인터페이스 구현 클래스@RequiredArgsConstructor public class Member..

JPA의 쿼리 기능을 알아보자!📝 메소드 이름으로 쿼리 생성만약 특정 속성으로 엔티티를 검색한다고 해보자... 이름과 나이로 회원 조회 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(); }순수하게 JPA를 사용한다는 기준으로 다음과 같이 ..

📝 개요 저번 시간에는 1대1, 다대1에 대해 페치 조인을 통해 최적화를 해보았다.그렇다면 일대다 관계 조회는 어떻게 최적화해야할까?📝 컬렉션 조회 최적화🚩 V1. 엔티티 직접 노출 /** * V1. 엔티티 직접 노출 * - Hibernate5Module 모듈 등록, LAZY=null 처리 * - 양방향 관계 문제 발생 -> @JsonIgnore */ @GetMapping("/api/v1/orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember(..

📝 지연 로딩과 조회 성능 최적화🚩 V1 그냥 조회해보기 /** * V1. 엔티티 직접 노출 * 객체에서 바로 참조하기 - 무한 루프에 빠짐 */ @GetMapping("/api/v1/simple-orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); return all; }Order를 바로 조회해서 반환해보자 결과오류가 무한 로딩된다.... (각각의 엔티티의 관계는 지연로딩이기에 jackson 라이브러리가 예외를 발생시킨다)설령 문제를 해결해도 모든 핵심 엔티티가 지연로딩으로 인해 다 출력된다. 핵심 엔티티를 직접 ..

📝변경 감지와 병합(merge) JPA에서 값을 업데이트는 어떻게 하는걸까? 변경 감지!! 🚩변경감지 JPA에서 엔티티를 조회한 후, 해당 엔티티의 상태를 추적하여 변경 여부를 감지하는 매커니즘을 말한다. 엔티티의 상태가 변경되는 JPA는 트랜잭션 커밋 시점에서 변경을 감지해 업데이트 쿼리를 날려준다. 이는 영속성 컨텍스트에서 관리되기에 적용되는 범위이다.!! @Transactional void update(Item itemParam) { //itemParam: 파리미터로 넘어온 준영속 상태의 엔티티 Item findItem = em.find(Item.class, itemParam.getId()); //같은 엔티티를 조회한다. findItem.setPrice(itemParam.getPrice()); //..

📝경로 표현식 경로 표현식이란 .(점)을 찍어 객체 그래프를 탐색하는 것을 말한다. 경로 표현식은 여러개 존재한다. SELECT m.username -> 상태 필드 FROM Member m JOIN m.team t -> 단일 값 연관 필드 JOIN m.orders o -> 컬렉션 값 연관 필드 where t.name = "팀A"; 상태 필드 단순히 값을 저장하기 위한 필드이다. EX) m.username 보통 경로 탐색의 끝이며, 탐색이 마무리되어 탐색을 하지 않는다. 연관 필드 연관관계를 위한 필드이다. 단일 값 연관 필드 @ManyToOne, @OneToOne, 대상이 엔티티 EX) m.team 묵시적 내부 조인(inner join)이 발생하며, 탐색을 진행한다. 쿼리 튜닝에 조심히 생각해서 사용해야..