Legacy DB의 JPA Entity Mapping (Enum Converter 편) | 우아한형제들 기술블로그
저희는 JPA에서 Enum 값을 저장하기 위해 아래와 같이 사용합니다.
// 주문의 상태
public enum OrderStatus {
ACCEPTED, SHIPPED, CANCELED
}
// 주문 엔티티
@Entity
public class Order {
...
@Enumerated(EnumType.STRING)
private OrderStatus orderStatus;
...
}
ACCEPTED
를 그대로 저장하기 위해서 @Enumerated(EnumType.STRING)
를 사용하게 됩니다.
하지만 아래와 같이 사용하고 싶다면 어떻게 해야 될까요?
@Getter
public enum OrderStatus {
ACCEPTED("승인완료", "1"),
SHIPPED("배달완료", "2"),
CANCELED("취소", "3");
...
}
위의 블로그 글은 DB에는 1
로 저장하고, 실제 사용은 ACCEPTED
를 할 수 있는 방법입니다.
✨ 실제 구현한 코드들은 [Git-Commit]
란에서 확인 가능합니다.
...코드를 작성 했다면? 👀
🏃 설정대로 되는지 테스트를 한번 해봅시다.
Order newOrder = new Order(randomUUID().toString(), now(), ACCEPTED, "둘리가 시킴");
@Test
void testOrderStatusConverter() {
EntityManager entityManager = emf.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.persist(newOrder);
transaction.commit();
Order order = entityManager.find(Order.class, newOrder.getUuid());
log.info("Order: {}", order);
log.info("Order status: {}", order.getOrderStatus());
}
설정을 하고나서 위의 테스트 코드를 실행 시켜보면 아래와 같은 로그를 볼 수 있습니다.
실제로 DB에서 등록 될 때는, Converter가 동작해서 1
이 들어간걸 볼 수 있고,
조회를 해서 객체의 값을 보면 OrderStatus 값이 설정된 모습을 볼 수 있습니다.