본문 바로가기

Spring/Spring Data Jpa7

7. Projections 1. Projections 장점 : jpql select 최적화 + dto 조회 그러나 실무의 복잡한 쿼리를 해결하기에는 한계가 있다. 단순한 쿼리일 때만 사용하고, 중첩 구조와 같이 복잡해지면 QueryDSL을 사용하는 것이 좋다. 1) 인터페이스 기반 interface의 구현체를 spring data jpa가 제공한다. public interface UsernameOnly { // open projection : entity 전체를 가지고 와서, 원하는 데이터를 넘긴다. (jpql select 최적화 X) // close projection : 원하는 데이터 값만 fit 하게 가지고 온다. @Value("#{target.username + ' ' + target.age}") String getUser.. 2024. 4. 13.
6. 스프링 데이터 JPA 분석 1. persist 와 merge save : 엔티티를 새로 저장하거나 변경 사항을 업데이트 한다. persist : 새로운 엔티티 객체를 영속성 컨텍스트에 추가한다. merge : 준영속 상태(detached)의 엔티티 객체를 받아 영속 상태로 전환한다. 여기서 준영속 상태는 엔티티가 현재 세션의 영속성 컨텍스트에 속하지 않는 상태를 의미한다. 즉, 데이터베이스에는 존재하지만 현재 세션에서는 관리되지 않는 상태이다. 2. Spring Data JPA에서의 동작 방식 Entity ID(식별자) 생성 전략 1) @GenerateValue : 호출 시점에 식별자가 없으므로 새로운 엔티티로 인식해서 persist가 정상 동작한다. 2) 직접할당 : 이미 식별자 값이 있는 상태로, merge가 호출된다. DB에.. 2024. 4. 12.
5. 확장 기능 1. 사용자 정의 Repository 구현 [사용자 정의 인터페이스] public interface MemberRepositoryCustom { List findMemberCustom(); } [구현 클래스] - 규칙 : 사용자 정의 인터페이스 이름 + "Impl" @RequiredArgsConstructor public class MemberRepositoryCustomImpl implements MemberRepositoryCustom { private final EntityManager em; @Override public List findMemberCustom() { return em.createQuery("select m from Member m").getResultList(); } } [사용자.. 2024. 4. 11.
4. 쿼리 메소드 기능 Spring Data Jpa의 특징을 차례로 알아보자. 1. 메소드 이름으로 쿼리 생성 *메소드 이름 조회 : find...By + where 문에 들어갈 조건 개수 : count...By 존재 : exist...By 삭제 : delete...By DISTINCT : findDistinct LIMIT : findFirst, findFirst3, findTop, findTop3 cf. Entity 필드명이 변경되면, Spring Data Jpa 인터페이스에 정의한 메서드 이름도 변경해야 한다. 애플리케이션 로딩 시점에, 메서드를 parsing 해서 sql 쿼리문을 생성하기 때문에 필드명이 변경되면 parsing 시점에서 문법 오류를 던진다. [순수 JPA] public List findByUserNameA.. 2024. 3. 25.
3. 공통 인터페이스 기능 순수 JPA 기반으로 CRUD가 가능한 repository를 만들면 다음과 같다. save / delete / findAll / findById / count 와 같은 기능들은 어떠한 Entity가 생성되더라도 공통적으로 요구될 수 있는 기능들이다. 이러한 기능들을 Spring에서는 Spring Data JPA 라이브러리로 공통 인터페이스를 설정한다. 이 때 T는 Entity 타입이 되고, ID은 해당 Entity의 PK 타입이 된다. public interface MemberRepository extends JpaRepository { } @Repository public class MemberJpaRepository { @PersistenceContext private EntityManager em;.. 2024. 3. 24.
2. 예제 도메인 모델 [Member - Team 모델] [多:1 연관관계 매핑] 多 는 주테이블. 즉 연관관계의 주인으로서, 대상테이블의 키(외래키)를 가진다. @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "team_id") //FK 이름, many 쪽에서 FK를 갖는다. private Team team; 1 은 mappedBy로 연관관계의 주인을 지정하는데, 여기에서는 Member의 team 필드가 된다. @OneToMany(mappedBy = "team") //FK가 없는 쪽에 mappedBy를 거는 것이 좋다. private List members = new ArrayList(); https://wch-0625.tistory.com/24 https://wch-0625... 2024. 3. 23.