중고 게시글 상태가 (판매중
, 예약중
, 판매완료
, 숨김
) 4가지로 나타낼 수 있는데
Database에서는 integer형태로 저장하여 효율을 높이고, Spring에서는 숫자에 따른 Enum type으로 관리한다면 얼마나 좋을까?
Database에서는 Enum type으로 저장한다면, 효율측면과 유지보수 측면에서 알 수 없는 오류가 나기 쉽상이다. (Enum.value vs Enum Ordinary)
그래서 JPA에서는 중간에 추상화 객체를 두어 변환이 매우 쉽게 될 수 있도록 기능을 제공한다.
Entity & Enum
// entity
@NoArgsConstructor
@Getter
@Entity(name = "posts")
@DynamicUpdate
@Builder
public class Post extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "title", nullable = false, length = 100)
private String title;
@Column(name = "content", columnDefinition = "TEXT")
private String contents;
@Convert(converter = PostStatusAttributeConverter.class)
@Column(name = "status", nullable = false)
private PostStatus status; // <- 이 부분이 point.
@Column(name = "views", nullable = false)
private Long views;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "seller_id", referencedColumnName = "id")
@Column(nullable = false)
private User seller;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "buyer_id", referencedColumnName = "id")
private User buyer;
}
// enum
import java.util.Arrays;
public enum PostStatus {
RESERVED(1, "예약 중"),
SOLD(2, "판매 완료"),
SELLING(3, "판매 중"),
HIDE(4, "숨김");
private final String status;
private final int val;
PostStatus(int val, String status) {
this.val = val;
this.status = status;
}
public String getStatus() {
return status;
}
public Integer getValue() {
return val;
}
public static PostStatus of(String status) {
return Arrays.stream(values())
.filter(element -> element.status.equals(status))
.findFirst()
.orElseThrow(() -> new RuntimeException(ErrorMessage.INTERNAL_SERVER_ERROR.message()));
}
public static PostStatus of(Integer value) {
return Arrays.stream(values())
.filter(element -> element.val == value)
.findFirst()
.orElseThrow(() -> new RuntimeException(ErrorMessage.INTERNAL_SERVER_ERROR.message()));
}
}
Converter
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter
public class PostStatusAttributeConverter implements AttributeConverter<PostStatus, Integer> {
@Override
public Integer convertToDatabaseColumn(PostStatus postStatus) {
return postStatus.getValue();
}
@Override
public PostStatus convertToEntityAttribute(Integer integer) {
return PostStatus.of(integer);
}
}
'👨🏻💻 Development > 🍃 Spring Boot' 카테고리의 다른 글
Raw SQL vs Query Builder vs ORM (0) | 2021.11.14 |
---|