반응형
이번 프로젝트에서 DDD 개념을 일부 도입해 보면서 값객체를 시도해 볼 수 있는 부분에 적용을 해보았다.
인터넷에 유명한 Money나 Address는 당연히 구현해봤고, 아래는 그 외에 잘 구현했다고 생각되는 것을 적어봤다.
@Getter
@Embeddable
@EqualsAndHashCode
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Rating {
private static final int MIN_SCORE = 1;
private static final int MAX_SCORE = 5;
private Integer score;
public Rating(int score) {
if (!isScoreInRange(score)) {
throw new GlobalException(ResultCase.INVALID_INPUT);
}
this.score = score;
}
private boolean isScoreInRange(int score) {
return MIN_SCORE <= score && score <= MAX_SCORE;
}
}
final이나 Record 타입으로 하고 싶었는데, JPA는 기본 생성자를 필요로 해서 할 수 없었다.
프로젝트 요구사항 중, 리뷰에 평점을 1~5점 남길 수 있다는 요구사항이 있었다.
단순히 int 타입으로 score를 표현할 수도 있겠지만, 단순히 int 필드보고 얘가 평점이라고 가스라이팅 하기보다, 보다 명확하게 평점임을 표시하고 싶었다.
그래서 Rating 이라는 객체를 만들었고, 일단 생성하면 더 이상 값을 변경하지 못하게 하여 불변을 보장했다.
그리고 생성 시 정책이었던 1~5 사이 값인지를 검증하는 로직을 넣어서 일단 생성만 하면 이후 추가 검증을 할 필요 없이 안심하며 값을 사용할 수 있도록 했다.
그리고 상태와 행위를 한 곳에서 관리하여 응집도를 높일 수도 있다!!
반응형
'TIL ✍️' 카테고리의 다른 글
24/09/30(월) 109번째 TIL : 카프카 직렬화 및 역직렬화 (0) | 2024.10.01 |
---|---|
24/08/28(수) 108번째 TIL : EmbeddedId 식별자 값객체 (0) | 2024.09.09 |
24/08/26(월) 106번째 TIL : mapStruct와 @Getter 사용 시 boolean 필드 매핑 (1) | 2024.09.01 |
24/08/23(금) 105번째 TIL : Gradle로 WAR 파일 빌드하기 (2) | 2024.08.30 |
24/08/22(목) 104번째 TIL : Redis maxmemory 소숫점 설정 (0) | 2024.08.30 |