본문 바로가기

Framework and Tool/JPA56

JPA - 즉시 로딩과 지연 로딩 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 즉시 로딩과 지연 로딩 이전에 살펴본 프록시 객체는 주로 연관된 엔티티를 지연 로딩할 때 사용한다. Member member = em.find(Member.class, 2L); Team team = member.getTeam(); System.out.println(team.getName()); 위와 같이 회원이 팀에 소속되어 있다고 가정해보자. 이때 회원 엔티티 조회시 팀까지 한꺼번에 하는게 좋을까? 아니면 팀 엔티티를 실제 사용시할때까지 조회를 미루는것이 좋을까? JPA 는 이 두 가지 방식을 모두 지원한다. 즉시 로딩: 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다. @ManyToOne(fetch = FetchType.EAGER) 로 설정할 수 있.. 2021. 7. 15.
JPA - 프록시 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 프록시와 즉시로딩, 지연로딩 객체가 데이터베이스에 저장되어있으면 연관된 객체를 탐색하기 난해하다. JPA 구현체들은 이런 문제 해결을 위해 프록시를 이용한다. 프록시를 이용하면 실제 이용하는 시점에 데이터베이스에서 조회할 수 있다. JPA 에서는 즉시로딩 혹은 지연로딩으로 시점을 정할 수 있다. - 프록시 엔티티를 사용할 때 연관된 엔티티의 사용 유무는 비즈니스 로직에 따라 다르다. @Entity public class Member { @Id @GeneratedValue @Column(name = "USER_ID") private Long id; private String userName; @ManyToOne @JoinColumn(name = "TEAM_.. 2021. 7. 14.
JPA - 고급맵핑 - 요구사항 분석과 맵핑3 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 실전 예제 아래와 같은 요구사항이 추가되었다고 가정하자. 상품의 종류는 음반, 도서, 영화가 있고 이후 확장가능하다. 모든 데이터는 등록일과 수정일이 있다. 상품의 종류에 음반, 도서, 영화가 있다는것에 대한 요구사항을 UML 로 표현하면 아래와 같다. Album, Book, Movie 객체는 Item 객체를 상속받는다. JPA 로 이러한 상속관계를 맵핑할 떄에는 @Inheritance 어노테이션을 사용한다. 실전이라면 맵핑 전략을 신중하게 고르겠지만 예제이기 때문에 간단하게 SINGLE_TABLE 전략을 이용해보자. 2 번째 요구사항인 모든 엔티티에 등록일과 수정일 컬럼을 추가할 때에는 컬럼을 모두 추가해주지 말고 맵핑 관계만 상속받는 @MappedSu.. 2021. 7. 13.
JPA - 고급맵핑 - Multi 테이블 맵핑 - 참조: 자바 ORM 표준 JPA 프로그래밍 - Multi 테이블 맵핑 잘 사용하진 않지만 @SecondaryTable 을 이용하면 하나의 엔티티에 여러 테이블을 맵핑할 수 있다. @Entity @Table(name = "BOARD") @SecondaryTable(name = "BOARD_DETAIL", pkJoinColumns = { @PrimaryKeyJoinColumn(name = "BOARD_DETAIL_ID")}) public class Board { @Id @GeneratedValue @Column(name = "BOARD_ID") private Long id; private String title; @Column(table = "BOARD_DETAIL") private String cont.. 2021. 7. 12.
JPA - 고급맵핑 - 조인 테이블 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 조인 테이블 DB 의 테이블 연관관계를 설계하는 방법에는 컬럼을 이용한 조인과 조인 테이블을 사용하는법 2 가지가 존재한다. 위 다이어그램에서 MEMBER 테이블에서 LOCKER 와 연관관계를 맺을 때 LOCKER_ID 조인 컬럼을 이용한다. 만약 회원이 5 명 있을 때 2 명에게만 사물함이 할당되었고 나머지 회원에게는 사물함이 아직 할당되지 않았다면 해당 회원의 LOCKER_ID 컬럼에는 NULL 이 할당되어 있을것이다. FK 에 NULL 이 있다면 INNER JOIN 사용 시 MEMBER 를 인식할 수 없으므로 MEMBER 를 기준으로 사물함 존재유무를 나타내야 한다면 OUTER JOIN 을 이용해야 한다. 위 다이어그램은 MEMBER_LOCKER 조.. 2021. 7. 12.
JPA - 고급맵핑 - 복합키와 식별 관계 맵핑 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 참조: https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/JoinColumns.html - 식별 vs 비식별 관계 이전에도 언급했듯이 DB 에서는 외래키(FK)를 기본키(PK)에 포함하는지 여부에 따라 식별과 비식별 관계로 구분한다. 위의 ER Diagram 에서 CHILD 테이블을 보면 PARENT 테이블의 PK 인 PARENT_ID 를 PK 이자 FK 로 사용하고 있다. 외래키를 기본키에 포함하고 있으므로 식별관계이다. 위 다이어그램은 CHILD 테이블에서 PARENT_ID 를 FK 로만 참조하고 있고, CHILD_ID 를 PK 로 사용하고 있다. FK 가 PK 에 포함되지 않으므로 비식별.. 2021. 7. 11.
JPA - 고급맵핑 - MappedSuperclass - 참조: 자바 ORM 표준 JPA 프로그래밍 - @MappedSuperclass 앞에서 살펴본 슈퍼타입과 서브타입에서는 부모 클래스와 자식 클래스를 모두 테이블과 맵핑했다. @MappedSuperclass 를 이용하면 부모 클래스는 테이블과 맵핑하지 않고, 상속 받는 자식 클래스에게 맵핑 정보만 제공할 수 있다. 즉 @Entity 는 실제 테이블과 맵핑되지만 @MappedSuperclass 는 실제 테이블과 맵핑되지 않는다. 위와 같이 MEMBER 와 SELLER 테이블이 있지만, MEMBER 와 SELLER 는 비즈니스적인 관계가 없다고 가정하자. 관계는 없지만 ID 와 NAME 을 공통된 속성으로 사용하고 싶을 때가 있다. 이를 UML 로 표현해보면 위와 같이 된다. BaseEntity 에 id, .. 2021. 7. 10.
JPA - 고급맵핑 - 슈퍼타입과 서브타입 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 상속 관계 맵핑 관계형 DB(RDB) 는 상속이라는 개념이 없다. 대신 슈퍼타입과 서브타입이라는 유사한 기법이 존재한다. 그래서 ORM 의 상속관계맵핑이라고 하면 객체의 상속과 슈퍼타입 서브타입의 관계를 맵핑하는것을 말한다. 맵핑방법은 아래와 같이 3 가지 방법이 있다. 각각의 테이블 변환: 공통된 속성을 부모 테이블로 두고 달라지는속성을 모두 하위 테이블로 만들어서 조회시 조인을 사용한다. JPA 에서는 조인전략(JOINED)이라고 한다. 통합 테이블로 변환: 테이블을 하나만 사용하여 통합한다. JPA 에서는 단일 테이블 전략(SINGLE_TABLE)이라고 한다. 서브타입 테이블로 변환: 모든 속성을 서브타입마다 하나의 테이블에 둔다. JPA 에서는 구.. 2021. 7. 10.
JPA - 다양한 연관관계 - 요구사항 분석과 맵핑 2 - 참조: 자바 ORM 표준 JPA 프로그래밍 - 실전 예제 이전 글 JPA - 엔티티 맵핑 - 요구사항 분석과 맵핑 에 이어서 요구사항 분석을 통해 1 : 1 및 M : N 연관관계 맵핑을 적용해보자. 추가된 요구사항은 아래와 같다. 상품을 주문할 때 배송정보를 입력할 수 있다. 하나의 주문에서는 하나의 배송지로만 배송할 수 있다. 상품을 카테고리로 구분할 수 있다. 아래 다이어그램은 위의 요구사항을 반영하여 UML 을 다시 그린것이다. 이전 UML 과 비교해서 Delivery 와 Category 클래스가 추가되었다. 먼저 Order 와 Delivery 를 살펴보자. 하나의 주문시 하나의 배송지에만 배송할 수 있으므로 둘은 1 대 1 관계이다. 또 주문에서만 배송지 정보를 참조하는게 아니라 배송지 정보.. 2021. 7. 10.
JPA - 다양한 연관관계 - M : N 비식별관계 - 참조: 자바 ORM 표준 JPA 프로그래밍 - M : N 연결 엔티티, 비식별 앞에서 M : N 연결 엔티티를 알아보았다. 복합 키를 사용하기 위해 @IdClass 를 추가하고, 식별자 클래스를 지정하였다. 식별자 클래스는 Serializable 을 구현해야하고, equals 와 hashCode 재정의 및 그 외에도 지켜야하는 규약이 있었다. USER_PRODUCT 테이블에서 복합키를 사용했었는데 DB 설계를 해본사람이라면 이를 그대로 사용하지는 않을 것이다. 위의 다이어그램에서 USER_PRODUCT 테이블의 명이 ORDERS 로 변경되었다. 회원이 상품을 몇개 그리고 언제 주문했는지 정보를 추가하면서 비즈니스에서 주문이라는 업무의 성격이 되었기 때문이다. 또 ORDER_ID 를 추가하여 PK 로 .. 2021. 7. 10.