문제 발단
개인 프로젝트로 만든 게시판의 처음 계획했던 모든 기능들을 성공적으로 완성한 뒤 회고 차원에서 테이블 설계를 좀더 간략화 시킬 수 있는 방법이 없을까 고민하던중 Embedded Type을 알게 되어 알아보게 되었다.
Embedded Type이란?
Embedded Type은 JPA에서 사용되는 개념으로 엔티티의 일부 속성을 별도의 테이블로 분리하지 않고 하나의 테이블에 내장하는 방식이다.
장점
- 코드의 재사용: 여러 엔티티에서 공통된 속성을 임베디드 타입으로 묶어 재사용할 수 있다.
- 객체지향적 설계: 여러 속성을 하나의 객체로 분리하여 더욱 객체지향적으로 설계할 수 있다.
- 데이터베이스 스키마 최적화: 중복 데이터 저장을 최소화하여 데이터베이스 스키마를 깔끔하게 유지할 수 있다.
- 복잡성 감소: 일부 속성을 별도의 엔티티로 분리하는 대신 임베디드 타입을 사용하여 관련된 속성을 하나의 객체로 그룹화하여 복잡성을 감소 시킬 수 있다.
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 객체에서 기존의 엔티티 객체로 접근할 수 없다는 점을 충분히 고려하여 데이터베이스 설계를 해야될 것 같다.
'Projects > Personal project - 게시판 만들기' 카테고리의 다른 글
[게시판 프로젝트] 테이블 설계 및 엔티티 관계매핑에 대한 회고 (0) | 2023.08.15 |
---|---|
@ElementCollection 그리고 @Embedded와 비교 (0) | 2023.08.15 |
MockMVC - Multipart form data요청 테스트 (0) | 2023.06.10 |
Mock test 단계에서 발생한 MockHttpServletResponse: body is empty (0) | 2023.06.08 |
파일 업로드를 위한 AWS S3 연결 도중 발생한 문제들과 해결방안 (0) | 2023.06.07 |