본문 바로가기
Programming/JPA & Spring Data JPA 기초

10. 값 콜렉션 Map 매핑

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

 

* 단순 값을 Map으로 보관하는 모델

  • doc_prop 테이블은 map에 해당하는 테이블이다.
  • name이 key, value가 value로 저장된다.
  • Document의 props에 매핑된다.

 

* 단순 값 Map 매핑

  • Document 클래스에서 확인할 수 있다.
  • 기본적인 방법은 Set, List와 동일한다.
  • @MapKeyColumn 애너테이션을 사용한다는 차이가 있다. 해당 애너테이션은 key값으로 쓰일 칼럼을 지정한다.

 

* 저장

  • 여러 값을 보유한 Map을 이용해 props 맵을 만들고 해당 props를 인자로 넘겨준 Document 객체를 생성하고 persist()를 해보자.
  • 기본적으로 doc 테이블에는 map을 제외한 content, title, id값을 저장한다.
  • doc_prop 테이블에는 해당 맵이 어느 객체의 것인지를 나타내기 위한 doc_id와 name, value가 저장된다.
    • 예를 들어, props에 <"p1" : "v1">, <"p2" : "v2"> 를 넣고 Document 객체를 만들어서 저장한다고 하자.
    • doc_prop테이블에는 두 개의 row가 저장된다.
      • 두 row의 doc_id는 모두 DOC1이다.
      • name과 value가 각각 저장된다.

 

* Map에 값 추가/수정/삭제

  • Map의 값을 추가하면 insert 쿼리를 실행해 doc_prop 테이블에 새롭게 저장한다.
  • 수정하면 update쿼리를 실행한다.
  • 삭제하면 delete 쿼리를 실행한다.
    • 이때 Map을 담은 객체 인스턴스를 통해 doc_id를 구한다.
    • update의 경우, Map의 key인 name은 변하지 않기 때문에 value만 테이블에서 update set해준다.
    • delete의 경우, doc_id와 함께 Map의 key인 name을 사용한다.
  • 새로운 Map을 할당하면, delete쿼리로 기존 테이블을 전부 지우고 새롭게 테이블을 할당한다.

 

* Embeddable 타입 Map

  • 앞의 경우들과 마찬가지로 @Column 애너테이션을 사용하지 않는다.
  • 클래스에서 Map의 key던 value던 Embeddable 타입을 넣어준다.

 

* 정리

  • 컬렉션 테이블을 이용한 값 Map 매핑
    • @ElementCollection과 @CollectionTable, @MapKeyColumn이면 된다.

 

 

반응형

댓글