jpa(29)
-
[JPA] Join
※ Join Query를 위한 테스트 데이터 내부조인 JPQL에서 기본적으로 내부 조인은 "INNER JOIN"으로 사용하고 여기서 INNER은 생략할 수 있다 회원 조회 : 팀이 Team-A인 회원 (팀에 대한 내부 조인) // INNER 명시 List result = em.createQuery( "SELECT m FROM Member m INNER JOIN m.team WHERE m.team.name = :name", Member.class ).setParameter("name", "Team-A") .getResultList(); // INNER 명시 X List result = em.createQuery( "SELECT m FROM Member m JOIN m.team WHERE m.team.nam..
2022.07.29 -
[JPA] 프로젝션 & 페이징
프로젝션 (Projection) 프로젝션이란 SELECT 절에서 조회할 대상을 지정하는 것을 의미한다 SELECT 절에서 조회할 수 있는 대상은 크게 3가지 분류로 나눌 수 있다 1. 엔티티 타입 프로젝션 엔티티 프로젝션은 말그대로 원하는 엔티티(객체) 자체를 통째로 조회하는 것이다 // Member(Entity) List members = em.createQuery( "SELECT m FROM Member m", Member.class ).getResultList(); // Team(Entity : Member -> Team) List team = em.createQuery( "SELECT m.team FROM Member m", Team.class ).getResultList(); Member와 Te..
2022.07.28 -
[JPA] JPQL 기본 문법
[JPA] 객체지향 쿼리 소개 (JPQL, Criteria, QueryDSL, ...) 일반적으로 SQL에 query를 날리는 방식은 다음과 같다 -- Member 테이블의 모든 정보 가져오기 SELECT * FROM Member; 하지만 JPA에서 생성하는 query는 이와 다르다 물론 JPA에서도 native query를 생성해서 DB로.. cs-ssupport.tistory.com 이전에 엔티티를 쿼리하는 다양한 방법을 짧게 소개했었다. 여기서 가장 중요한 사실은 어떤 방법을 사용하든 JPQL에서부터 시작한다는 사실이다 JPQL의 특징은 다음과 같다 - 테이블을 대상으로 쿼리하는게 아닌 엔티티를 대상으로 쿼리하는 객체지향 쿼리 언어이다 - SQL을 추상화한 쿼리 언어이므로 특정 DB에 종속적이지 않..
2022.07.28 -
[JPA] 객체지향 쿼리 소개 (JPQL, Criteria, QueryDSL, ...)
일반적으로 SQL에 query를 날리는 방식은 다음과 같다 -- Member 테이블의 모든 정보 가져오기 SELECT * FROM Member; 하지만 JPA에서 생성하는 query는 이와 다르다 물론 JPA에서도 native query를 생성해서 DB로 날릴 수 있다 (nativeQuery) -- Member 테이블의 모든 정보 가져오기 SELECT m FROM Member m 여기서 native Query와 JPA에서 생성하는 query의 차이는 다음과 같다 native query : DB의 테이블을 대상으로 쿼리 생성 JPQL : 엔티티(객체)를 대상으로 쿼리 생성 일반적인 SQL이 DB Table을 대상으로 하는 "데이터 중심의 쿼리"라면 JPQL이란 엔티티 객체를 대상으로 하는 "객체지향 쿼리"..
2022.07.27 -
[JPA] 값 타입
JPA의 데이터 타입을 큰 카테고리로 나누면 총 2개의 카테고리로 나눌 수 있다 엔티티 타입 값 타입 엔티티 타입은 말그대로 @Entity로 정의되는 객체를 의미하고, 값 타입은 단순히 값으로 사용되는 자바의 기본 타입이나 객체를 의미한다 여기서 이 두 타입의 가장 큰 차이점은 "추적의 가능성"이다 → 엔티티 타입은 "식별자"를 통해서 엔티티를 추적할 수 있지만, 값 타입은 별도의 식별자 개념이 없기 때문에 값이 바뀌어버리면 추적 자체가 불가능하다 @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "member") public class Member { @Id @GeneratedValue(strategy = G..
2022.07.22 -
[JPA] 영속성 전이 & 고아 객체
영속성 전이 : CASCADE 특정 엔티티를 "영속 상태"로 만들 때 → 연관된 엔티티도 함께 영속 상태로 만들고 싶다면 어떻게 해야할까 >> 영속성 전이 기능 (Transitive Persistence) JPA에서는 영속성 전이를 CASCADE 옵션을 통해서 제공한다 @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "member") public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "member_id") private Long id; private String name; @ManyToOne(f..
2022.07.06 -
[JPA] 즉시로딩 & 지연로딩
> "즉시 로딩 전략"을 활용하면 연관된 Entity도 DB에서 조회해서 실제 Entity가 반환된다 대부분의 JPA 구현체는 "즉시 로딩을 최적화"하기 위해서 가능하면 조인 쿼리를 사용한다 >> 위의 예제에서도 Member와 Team간의 left outer join을 통해서 쿼리 1번으로 연관된 두 엔티티를 모두 조회하였다 ※ 즉시로딩 & NULL 제약 조건 위의 조인을 잘 보면 "left outer join" : 외부조인을 통해서 Member과 Team이 조인을 하고 있다 현재 Member Table에서는 Team 컬럼에 대한 nullable을 허용하고 있는 상태이다 >> 따라서 Player중에 team이 없는 Player도 존재한다는 의미이다 그렇기 때문에 이 Member에 대한 instance도 ..
2022.07.06 -
[JPA] 프록시
선수 Entity와 팀 Entity가 존재하고 서로 다대일 관계이다. Player (N) @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity @Table(name = "player") public class Player { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "player_id") private Long id; private String name; @ManyToOne @JoinColumn(name = "team_id") private Team team; } Team (1) @Getter @NoArgsConstructor(access = Access..
2022.07.06 -
[JPA] 식별 관계 & 복합 키
DB에서 두 테이블간에 관계를 나타낼때는 총 2가지로 분류할 수 있다 1. 상대방의 PK를 자신의 PK이자 FK로 사용 = 식별관계 2. 상대방의 PK를 자신의 FK로 사용 = 비식별관계 필수적 비식별 관계(Mandatory) : FK에 NULL 허용 X 선택적 비식별 관계(Optional) : FK에 NULL을 허용 O 비식별 관계 (복합키) 현재 PARENT Table은 PK가 "복합키"로 구성되어있는 상태이고 CHILD와 1:N 관계이다 따라서 CHILD는 PARENT의 PK : 복합키를 자신의 FK로 활용함으로써 둘의 관계는 비식별 관계이다 @Entity @Table(name = "parent") public class Parent { @Id @Column(name = "parent_id1") p..
2022.07.05 -
[JPA] @MappedSuperClass
[JPA] 상속 관계 일반적으로 관계형 DB에서는 객체지향 언어에서 다루는 "상속"이라는 개념이 존재하지 않는다 그대신 "슈퍼타입 - 서브타입"같은 모델링 기법을 통해서 우회적으로 상속을 구현할 수 있다 슈퍼 cs-ssupport.tistory.com 상속 관계의 기본적으로 JOINED 전략을 사용하면 Super Type & Sub Type 모두 DB Table과 매핑되었다 하지만 여기서 부모 클래스는 DB Table과 매핑하지 않고 자식 클래스에게 속성만 물려주고 싶다면 @MappedSuperClass를 사용하면 된다 @MappedSuperClass는 단순히 "필드 정보"를 상속할 목적으로만 사용하는 것이다 예를 들어서 거의 모든 테이블에 필요한 {생성 날짜 / 생성한 사람 / 수정 날짜 / 수정한 사..
2022.07.05 -
[JPA] 상속 관계
일반적으로 관계형 DB에서는 객체지향 언어에서 다루는 "상속"이라는 개념이 존재하지 않는다 그대신 "슈퍼타입 - 서브타입"같은 모델링 기법을 통해서 우회적으로 상속을 구현할 수 있다 슈퍼타입 - 서브타입 논리적 모델을 실제 DB에 들어가는 물리적 모델로 구현하는 방법은 총 3가지가 존재한다 "각각 테이블"로 변환 "통합 테이블"로 변환 "서브타입 테이블"로 변환 1. 각각 테이블로 변환 - "조인 전략 (Super Type + Sub Type)" 조인 전략이란 엔티티 각각을 일단 모두 테이블로 만들어준다 그리고 "자식 테이블"은 부모 테이블의 PK를 자신의 PK이자 FK로 사용한다 조회할때는 당연히 Join을 많이 사용하게 된다 >> @Inheritance(strategy = InheritanceType..
2022.07.05 -
[JPA] 3. 일대일 연관관계 (@OneToOne)
일대일 관계는 양쪽이 서로 하나의 관계만 가지는 관계이다 따라서 일대일 관계에서는 "어느 쪽이든 FK를 가질 권리"를 보유하고 있다 참고로 일대일 연관관계에서 FK에는 반드시 UNIQUE도 추가해줘야 한다 왜냐하면 UNIQUE 제약조건을 추가해주지 않으면 일대일이 아니라 일대다가 되기 때문이다 1. 주 테이블 FK 일반적으로 "개발자" 입장에서는 주 테이블에 FK가 있는 것을 선호한다 왜냐하면 주 테이블에 FK가 있어야 더 편리하게 매핑할 수 있기 때문이다 대상 테이블에 FK가 존재한다면 본인이 아닌 상대방의 column을 관리해야 하기 때문 (1) 주 테이블 FK - 단방향 일반적으로 생각해보면 "User는 Ticket 하나를 소유할 수 있다"이므로 User를 "주테이블"로 생각해서 매핑해보자 User..
2022.07.03