JPA 기초 - 값 컬렉션 Map 매핑

2024. 1. 18. 18:17·JPA
본 내용은 유튜브 최범균님의 강의 내용을 정리한 내용입니다.
JPA 기초 10 값 콜렉션 Map 매핑
JPA 기초 11 값 콜렉션 주의사항

컬랙션 Map 매핑 설정

package com.example.jpa.entity;

...

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "doc")
public class Document {
    @Id
    private String id;
    private String title;
    private String content;

    @ElementCollection
    @CollectionTable(
            name = "doc_prop",
            joinColumns = @JoinColumn(name = "doc_id")
    )
    @MapKeyColumn(name = "name") // 키가 될 컬럼 지정
    @Column(name = "value")
    private Map<String, String> props = new HashMap<>();
}
  • @MapKeyColumn 어노테이션은 Map 컬렉션의 키 값이 될 컬럼을 지정할 때 사용합니다.

엔티티 객체 저장

Map<String, String> props = new HashMap<>();
props.put("p1", "v1");
props.put("p2", "v2");
Document document = new Document("M1", "제목", "내용", props);
entityManager.persist(document);
  • JPA 실행 쿼리
Hibernate: 
    insert into doc (content, title, id) values (?, ?, ?)
Hibernate: 
    insert into doc_prop (doc_id, name, value) values (?, ?, ?)

 

Map 컬렉션의 값 추가 / 수정 / 삭제

Document foundDocument = entityManager.find(Document.class, document.getId());
foundDocument.setProp("p1", "newV1"); // 수정
foundDocument.setProp("p10", "v10"); // 추가
foundDocument.removeProp("p2"); // 삭제
  • Document 객체의 props 필드의 값 변경을 위한 메서드를 생성해줍니다.
// Document 엔티티 객체 메서드 추가
public void setProp(String name, String value) { // 추가 및 수정
    props.put(name, value);
}
public void removeProp(String name) { // 삭제
    props.remove(name);
}
  • JPA 실행 쿼리
Hibernate: 
    delete from doc_prop where doc_id=? and name=?
Hibernate: 
    update doc_prop set "value"=? where doc_id=? and name=?
Hibernate: 
    insert into doc_prop (doc_id, name, "value") values (?, ?, ?)

h2database 결과

@Embeddable 타입 Map 컬렉션 매핑 설정

package com.example.jpa.entity;

...

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "doc")
public class Document {
    @Id
    private String id;
    private String title;
    private String content;

    @ElementCollection
    @CollectionTable(
            name = "doc_prop",
            joinColumns = @JoinColumn(name = "doc_id")
    )
    @MapKeyColumn(name = "name") // 키가 될 컬럼 지정
    private Map<String, PropValue> props = new HashMap<>(); // value 타입 PropValue로 변경
}
package com.example.jpa.entity;

...

@Data
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class PropValue {
    private String value;
    private boolean enabled;
}

 

컬렉션 타입 매핑 시 성능문제 - CQRS

CQRS(Command Query Responsibility Segregation)는 데이터의 변경 기능(Command)과 조회 기능(Query)을 분리하여 처리하는 아키텍처 패턴입니다. 이 패턴은 특히 컬렉션 타입을 매핑하는 경우 발생할 수 있는 성능 문제를 해결하는 데 도움이 됩니다.

  • 변경 기능 - JPA 활용
  • 조회 기능 - MyBatis/JdbcTemplate/JPA 중 알맞은 기술 사용
  • 모든 기능을 JPA로 구현할 필요 없음
    • 특히 목록, 상세와 같은 조회 기능

'JPA' 카테고리의 다른 글

JPA 기초 - 엔티티 1 - N 단방향 연관관계  (0) 2024.01.22
JPA 기초 1 - 1 단방향 연관 관계  (0) 2024.01.19
JPA 기초 - 값 컬렉션 List 매핑  (0) 2024.01.18
JPA 기초 - 값 컬렉션 Set 매핑  (0) 2024.01.18
JPA 기초 - @Embeddable을 사용하여 다른 테이블 매핑하기  (0) 2024.01.17
'JPA' 카테고리의 다른 글
  • JPA 기초 - 엔티티 1 - N 단방향 연관관계
  • JPA 기초 1 - 1 단방향 연관 관계
  • JPA 기초 - 값 컬렉션 List 매핑
  • JPA 기초 - 값 컬렉션 Set 매핑
PortLee
PortLee
  • PortLee
    프로그래밍 공부
    PortLee
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C++
      • JAVA
      • JPA
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    allocationSize
    list
    @Access
    컬렉션 매핑
    MemberService
    MemberEntity
    @Basic
    Entity
    map
    기본키 매핑
    @AttributeOverride
    컬랙션 매핑
    @Embeddable
    1-1연관관계
    식별자공유
    persistence.xml
    entity mapping
    @CollectionTable
    JoinColumn
    Translent
    SQL Mapping
    Table 기본키 생성 전략
    1-N
    Entity 연관관계
    @Table
    다른 테이블 매핑
    set
    MemberRepository
    필드와 컬럼 매핑
    JPA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
PortLee
JPA 기초 - 값 컬렉션 Map 매핑
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.