Projects/Personal project - 게시판 만들기

@Embedd를 활용한 관계 매핑

마손리 2023. 8. 14. 22:15

문제 발단

개인 프로젝트로 만든 게시판의 처음 계획했던 모든 기능들을 성공적으로 완성한 뒤 회고 차원에서 테이블 설계를 좀더 간략화 시킬 수 있는 방법이 없을까 고민하던중 Embedded Type을 알게 되어 알아보게 되었다.

 

 

Embedded Type이란?

Embedded Type은 JPA에서 사용되는 개념으로 엔티티의 일부 속성을 별도의 테이블로 분리하지 않고 하나의 테이블에 내장하는 방식이다. 

 

장점

  1. 코드의 재사용: 여러 엔티티에서 공통된 속성을 임베디드 타입으로 묶어 재사용할 수 있다.
  2. 객체지향적 설계: 여러 속성을 하나의 객체로 분리하여 더욱 객체지향적으로 설계할 수 있다.
  3. 데이터베이스 스키마 최적화: 중복 데이터 저장을 최소화하여 데이터베이스 스키마를 깔끔하게 유지할 수 있다.
  4. 복잡성 감소: 일부 속성을 별도의 엔티티로 분리하는 대신 임베디드 타입을 사용하여 관련된 속성을 하나의 객체로 그룹화하여 복잡성을 감소 시킬 수 있다.

 

 

Embedded Type 사용

일반적인 OneToOne 매핑

 

 

위와 같이 Member와 Email이라는 두 테이블의 관계를 설정해 줄 때 기본적인 방법인 OneToOne 단방향 매핑을 사용할 경우 아래와 같이 나타낼 수 있다.

 

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @OneToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "email", referencedColumnName = "id", nullable = false)
    private Email email;
}

@Entity
public class Email {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String email;
    private String verificationCode;
    private Boolean verified;
}

 

이후 Member와 Email의 분리된 테이블을 확인할 수 있다.

 

 

 

만약 Embedded Type을 사용하면 데이터베이스에서는 동일한 테이블로, JPA에서는 분리된 객체로 접근이 가능하다. 

 

 

@Embedded 사용

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Embedded
    private Email email;
}

@Embeddable
public class Email {
    private String email;
    private String verificationCode;
    private Boolean verified;
}

 

위와 같이 Embedded Type을 이용하면 아래와 같이 DB에서는 하나의 테이블로 데이터를 관리 하며 JPA에서는 OneToOne과 같이 분리된 객체로 데이터에 접근이 가능하다.

 

 

또한 OneToOne을 사용했을때는 Member와 Email 테이블에 두번의 INSERT문을 실행했던 것과 달리 @Embedded를 사용하면 하나의 테이블만을 사용하므로 한번의 INSERT문만 실행한다.

 

 

 

 

마무리

직접 사용을 해보니 확실히 장점이 크게 느껴젔다. 첫번째로 불필요한 테이블이 간소화 되었고 두번째로 다른 엔티티에서도 동일한 Embedded Type을 사용할 수 있어 코드 또한 간소화 시켜줄 수 있었다. 세번째로 데이터베이스에서는 통일된 테이블로 관리하다 보니 한번의 INSERT문으로 데이터가 생성이 되었다. 

 

유의할 점은 Embedded Type을 수정할 시, 해당 Embedded Type이 사용된 모든 테이블이 변경될 수 있다는 점과 단방향 매핑처럼 Embedded Type 객체에서 기존의 엔티티 객체로 접근할 수 없다는 점을 충분히 고려하여 데이터베이스 설계를 해야될 것 같다.