본문 바로가기

JPA54

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.
JPA - 다양한 연관관계 - M : N 식별관계 - 참조: 자바 ORM 표준 JPA 프로그래밍 - M : N 연결 엔티티 이제 1 : 1, 1 : N, M : N 의 단방향과 양방향을 모두 알아보았으니 도메인 설계만 잘하면 JPA 로 모든 맵핑을 할 수 있을까? 세상 문제가 그렇게 간단하면 좋겠지만 M : N 관계에서 더 살펴볼 사항이 있다. 앞의 글 다양한 연관관계 M : N 의 ER Diagram 과 UML 을 다시 한번 생각해보자. ER Diagram 에 USER 와 PRODUCT 테이블이 있었고, 두 테이블이 서로에 대해 M : N 의 관계라면 외래키를 이용해서 표현할 방법이 없으므로 USER_PRODUCT 조인 테이블도 추가했었다. 반면 객체(UML Digram)에서는 User 와 Product 엔티티를 선언하고 서로 Collection 으로.. 2021. 7. 10.
JPA - 다양한 연관관계 - M : N - 참조: 자바 ORM 표준 JPA 프로그래밍 - M : N 관계 회원과 상품이 있다고 가정해보자. 회원은 여러 상품을 주문할 수 있고, 하나의 상품도 여러 회원들에 의해 주문될 수 있다. 이때 다중성의 관계는 M : N 이다. 이를 ER Diagram 으로 나타내면 위와 같다. 그러나 RDB(관계형 DB)는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없다. 그래서 조인 테이블을 사용한다. 1 번째 다이어그램에서 USER 와 PRODUCT 의 PK인 USER_ID 와 PRODUCT_ID 로 이루어진 조인테이블 USER_PRODUCT 가 추가되었다. 하지만 객체의 경우에는 서로에 대해 M : N 을 나타낼 때 조인객체를 두지 않는다. 위 다이어그램처럼 다대다 관계에서 회원은 상품을, 상품은 회원을 컬.. 2021. 7. 8.