Programming/JPA & Spring Data JPA 기초

07. @Embeddable2 - 다른 테이블에 매핑하기

JKROH 2023. 2. 28. 15:31
반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.

* 다른 테이블에 값을 저장할 때

  • DB 설계 중에는 여러 테이블에 관련된 값을 저장할 때가 있다.
  • writer와 관련된 데이터를 writer_intro와 writer_address에 나눠 저장할 수 있다.
  • 이 세개의 테이블을 자바 코드로 모델링 하면 오른쪽과 같이 세 개의 클래스를 이용해 구현할 수 있다.
  • Intro와 Address는 데이터를 지닌 값의 형태로 존재할 수 있다.
  • @Embeddable로 엔티티인 Writer에 Intro와 Address를 매핑할 수 있다.

 

* 방법1 - @SecondaryTable + 테이블명

  • Intro클래스는 @Embeddable을 사용하지만 @Column에 table = "writer_intro" 태그가 추가됐다.
  • 이는 Intro는 Embeddable이긴 하지만 writer_intro라는 이름의 테이블로 사용할 것이다. 라는 의도를 명시해주는 것이다.
  • 이후 Intro를 Embedded할 Writer 클래스에 @SecondaryTable 애노테이션을 추가하고 name = "writer_intro"를 추가해준다. 
  • 또한 pkJoinColumns를 지정해주어야 한다. 이는 writer_intro 테이블에서 writer 테이블을 참조할 때 참조할 칼럼의 이름을 지정한다.
  • 해당 예시에서는 writer_intro의 "writer_id" 컬럼은 writer의 "id" 칼럼을 참조함을 명시하고 있다.

 

* 방법2 - @SecondaryTable + @AttributeOverride

  • Address 클래스는 여러 곳에서 사용될 수 있다. 따라서 @Column 에 테이블 이름을 지정하기는 어렵다.
  • @SecondaryTable은 동일하게 사용한다.
  • @AttributeOverride를 사용할 때, @Column에 table = "writer_address"와 같이 테이블도 함께 지정해준다.

 

* 저장

  • Writer 객체를 만들 때 Address, Intro를 argument로 넣어준다.
  • 그러면 각각의 테이블에 insert를 한다.

 

* 조회

  • 관련된 테이블은 모두 left join으로 join해서 읽어온다.
  • inner join을 사용하면 null 일 때 조회가 불가능하다.

 

* 변경

  • Address를 setAddress(@param)를 통해 변경한다고 하자.
  • 기존 address가 null이 아니면 바로 update를 한다.
  • 기존 address가 null이면 insert 문을 실행한다.
  • parameter로 null 을 넘겼는데 기존 address가 null 이 아니면 delete를 이용해서 삭제한다.

 

* 삭제

  • 삭제를 할 때는 본체인 writer뿐만 아니라 Embeddable 로 매핑된 다른 테이블도 delete처리한다.

 

* 정리

- SecondartTable

  • 다른 테이블에 저장된 데이터를 @Embeddable로 매핑 가능하다.
  • 다른 테이블에 저장된 데이터가 개념적으로 밸류(값)일 때 사용한다.
    • 1-1 관계인 두 테이블을 매핑할 때 종종 출현한다.

 

반응형