JPA 15

QueryDSL 중급 문법

프로젝션과 결과 반환 - 기본프로젝션 : select 대상 지정 프로젝션 대상이 하나List result = queryFactory .select(member.username) .from(member) .fetch();프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있음프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회튜플 조회프로젝션 대상이 둘 이상일 때 사용com.querydsl.core.TupleList result = queryFactory .select(member.username, member.age) .from(member) .fetch(); for (Tuple tuple : result) { String username =..

JPA 2024.09.11

JPQL 중급 문법과 기능

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

JPA 2024.09.04

JPQL 기본 문법과 기능

JPQL 문법select m from Member as m where m.age > 18엔티티와 속성은 대소문자 구분O (Member, age)JPQL 키워드는 대소문자 구분 X (SELECT, FROM, where)엔티티 이름 사용, 테이블 이름이 아님 (Member)별칭은 필수 (m) (as는 생략 가능) 집합과 정렬COUNT, SUM, AVG, MAX, MIN 등 가능GROUP BY, HAVING, ORDER BY 등 가능 TypeQuery, QueryTypeQuery: 반환 타입이 명확할 때 사용Query : 반환 타입이 명확하지 않을 때 사용TypeQuery(Member> query = em.createQuery("SELECT m FROM Member m", Member.class); ..

JPA 2024.09.03

JPA 쿼리 지원 방법

JPA는 다양한 쿼리 방법을 지원JPQLJPA CriteriaQueryDSLNative SQLJDBC API 직접 사용, MyBatis, SpringJdbcTemplate 함께 사용 JPQL (Java Persistence Query Language)JPA를 사용하면 엔티티 객체를 중심으로 개발검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색JPQL은 엔티티 객체를 대상으로 쿼리SQL은 데이터베이스 테이블을 대상으로 쿼리모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어 제공SQL을 추상화해서 특정 데이터베이스 SQL에 의존 XSQL과 문법 유..

JPA 2024.09.03

값 타입

JPA의 데이터 타입 분류엔티티 타입@Entity로 정의하는 객체데이터가 변해도 식별자로 지속해서 추적 가능예) 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인지 가능값 타입int, Integer, String처럼 단순한 값으로 사용하는 자바 기본 타입이나 객체식별자가 없고, 값만 있으므로 변경시 추적 불가예) 숫자 100을 200으로 변경하면 완전히 다른 값으로 대체 값 타입 분류기본값 타입자바 기본 타입(int, double)래퍼 클래스(Integer, Long)String임베디드 타입(embedded type, 복합 값 타입)컬렉션 값 타입(collection value type) 기본값 타입예): String name, int age생명 주기를 엔티티에 의존예) 회원을 삭제하면 이름, 나이 필..

JPA 2024.09.01

프록시와 연관관계 관리

프록시 기초em.find() vs em.getReference()em.find() : 데이터베이스를 통해서 실제 엔티티 객체 조회em.getReference() : 데이터베이스 조회를 미루는 가짜 (프록시) 엔티티 객체 조회 프록시 객체의 초기화 프록시의 특징프록시 객체는 처음 사용할 때 한 번만 초기화프록시 객체를 초기화할 때, 프록시 객체가 실제 엔티티로 바뀌는 것은 아님, 초기화되면 프록시 객체를 통해서 실제 엔티티에 접근 가능프록시 객체는 원본 엔티티를 상속 받음, 따라서 타입 체크 시 주의해야 함 (== 비교 실패, 대신 instance of 사용)영속성 컨텍스트에 찾는 엔티티가 이미 있으면 em.getReference()를 호출해도 실제 엔티티 반환영속성 컨텍스트의 도움을 받을 수 없는 준영속..

JPA 2024.09.01

상속관계 매핑

상속 관계 매핑관계형 데이터베이스는 상속 관계 X슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사상속 관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 각각 테이블로 변환 -> 조인 전략통합 테이블로 변환 -> 단일 테이블 전략서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 주요 어노테이션@Inheritance(strategy=InheritanceType.XXX)JOINED : 조인 전략SINGLE_TABLE : 단일 테이블 전략TABLE_PER_CLASS : 구현 클래스마다 테이블 전략@DiscriminatorColumn(name=“DTYPE”)@DiscriminatorValue("XXX") 조인 전략..

JPA 2024.08.27

다양한 연관관계 매핑

연관 관계 매핑 시 고려사항 3가지다중성단방향, 양방향연관 관계의 주인 다중성다대일 : @ManyToOne일대다 : @OneToMany일대일 : @OneToOne다대다 : @ManyToMany 단방향, 양방향테이블외래 키 하나로 양쪽 조인 가능사실 방향이라는 개념이 없음객체참조용 필드가 있는 쪽으로만 참조 가능한쪽만 참조하면 단방향양쪽이 서로 참조하면 양방향 연관 관계의 주인테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음객체 양방향 관계는 참조가 2군데 있음, 둘 중 테이블의 외래 키를 관리할 곳을 지정해야 함 다대일 단방향 정리더보기가장 많이 사용하는 연관관계다대일의 반대는 일대다다대일 양방향 정리더보기외래 키가 있는 쪽이 연관 관계의 주인양쪽을 서로 참조하도록 개발 일대다 단방향 정리더보기일대다..

JPA 2024.08.26