본 내용은 유튜브 최범균님의 강의 내용을 정리한 내용입니다.
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 (?, ?, ?)

@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 |