티스토리 뷰
Entity 모델링에 VO(value object)를 활용하기
최근 진행하고 있는 Entry3.0 프로젝트에서 ged_grade(검정고시 졸업자 점수)테이블의 grade 컬럼을 unsigned double로 만들었다.
점수를 음수로 저장하는 몽총이는 없으니까 난 스마트하니까~
~

이 테이블을 엔티티로 매핑하려는데 unsigned에 대한 처리는 자바에서 기본적으로 제공하는 기능(문법?)으론 불가능했다. 자바에는 unsigned가 없기 때문이다. 무언가 다른 방법이 필요했다.
그래서 VO를 활용하기로 했다.
먼저 UnsignedDouble이라는 Double을 래핑한 VO를 만들고 @Embeddable
을 붙여 Entity에 임베딩할 수 있도록 했다.
import lombok.Getter; | |
import javax.persistence.Embeddable; | |
@Getter | |
@Embeddable | |
public class UnsignedDouble { | |
private Double value; | |
public UnsignedDouble() { | |
value = 0.0; | |
} | |
public UnsignedDouble(Double value) { | |
if (value != null && value < 0) throw new IllegalArgumentException(); | |
this.value = value; | |
} | |
} |
이제 GedGrade Entity 클래스에서 UnsignedDouble을 가져다 써보자. (편의를 위해 @Column
을 통한 설정은 따로 하지 않았다.)
import lombok.Getter; | |
import javax.persistence.Column; | |
import javax.persistence.Embedded; | |
import javax.persistence.Entity; | |
import javax.persistence.Id; | |
@Entity | |
@Getter | |
public class GedGrade { | |
@Id | |
@Column(length = 32) | |
private String userId; | |
@Embedded | |
private UnsignedDouble grade; | |
@Embedded | |
private UnsignedDouble conversionScore; | |
private Integer attendanceScore; | |
@Embedded | |
private UnsignedDouble volunteerScore; | |
@Embedded | |
private UnsignedDouble finalScore; | |
} |
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.entry.entrydsm.ged.grade.GedGrade column: value ....(중략)
@Embedded
는 컬럼 명으로 @Embeddable
클래스 내에서 설정한 이름을 사용하기 때문에 4개의 컬럼을 "value"라는 이름으로 매핑을 시도하게되고, 결국 Repeated column 오류가 발생하게 된다.
이 문제는 @AttributeOverride
를 이용해 컬럼명을 덮어 씌움(Override)으로써 해결할 수 있다.
import lombok.Getter; | |
import javax.persistence.*; | |
@Entity | |
@Getter | |
public class GedGrade { | |
@Id | |
@Column(length = 32) | |
private String userId; | |
@Embedded | |
@AttributeOverride(name = "value", column = @Column(name = "grade", nullable = false)) | |
private UnsignedDouble grade; | |
@Embedded | |
@AttributeOverride(name = "value", column = @Column(name = "conversion_score", nullable = false)) | |
private UnsignedDouble conversionScore; | |
private Integer attendanceScore; | |
@Embedded | |
@AttributeOverride(name = "value", column = @Column(name = "volunteer_score", nullable = false)) | |
private UnsignedDouble volunteerScore; | |
@Embedded | |
@AttributeOverride(name = "value", column = @Column(name = "final_score", nullable = false)) | |
private UnsignedDouble finalScore; | |
} |
적용후 오류없이 잘 동작함을 확인할 수 있다.
하지만 Response로서 GedGrade Entity를 던져주면 JSON Serializing 과정에서 UnsignedDouble이 객체로 판정되어 기대했던 JSON 형태와 다른 JSON으로 Serializing되는 이슈가 발생한다.
{ "userId": "user_id", "grade": { "value": 1.0 }, "conversionScore": { "value": 2.0 }, "attendanceScore": 100, "volunteerScore": { "value": 100.0 }, "finalScore": { "value": 100.0 } }
우리가 원한 건 이게 아닌데...
해결하는 방법은 JPA의 범주를 벗어나기 때문에 다른 게시글로 다뤄야겠다.
- Total
- Today
- Yesterday
- 백준
- 양방향 연결
- 알고리즘
- JPA 관계
- 우테캠
- 스택 계산기
- bi direction
- 소프트웨어개발과
- @Embdded
- 정렬 알고리즘
- Java 스택 계산기
- Sign Me
- 정렬
- 붕어빵틀과 붕어빵
- 우아한테크캠프
- 클래스와 객체
- Entity에 VO
- 전공프로젝트
- 백준 온라인 저지
- 자바 힙 구현
- 자료구조 Heap
- Java Heap
- 자료구조
- uni direction
- 단방향 연결
- 자료구조 힙
- signme
- 스택
- @Embeddable
- 붕어빵틀과붕어빵
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |