HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🍗
[New] 조규현팀
/
🐾
DailyLog
/
🏛️
Enum Converter 사용기
🏛️

Enum Converter 사용기

태그
JPA
날짜
May 13, 2022 11:35 AM
해결 상태
완료
Thrower

🚀 이 글은 아래의 우아한 형제들의 기술 블로그의 글을 구현해본 후기 입니다.

Legacy DB의 JPA Entity Mapping (Enum Converter 편) | 우아한형제들 기술블로그
안녕하세요. 저는 우아한형제들 비즈상품개발팀의 이은경입니다. Legacy DB의 JPA Entity Mapping (복합키 매핑 편)에 이어 저는 DB의 코드값과 Java Enum을 연결해주는 과정에서 유용하게 사용한@Convert 에 대해서 설명하려고 합니다. 그동안 광고 시스템에서는 모든 상태값에 대해서 아래와 같이 DB 코드 테이블에 정의된 코드값을 사용하고 있었습니다.
Legacy DB의 JPA Entity Mapping (Enum Converter 편) | 우아한형제들 기술블로그
https://techblog.woowahan.com/2600/
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 를 할 수 있는 방법입니다.
 
 
✨ 실제 구현한 코드들은 란에서 확인 가능합니다.
 
...코드를 작성 했다면? 👀 🏃 설정대로 되는지 테스트를 한번 해봅시다.
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()); }
설정을 하고나서 위의 테스트 코드를 실행 시켜보면 아래와 같은 로그를 볼 수 있습니다.
notion image
실제로 DB에서 등록 될 때는, Converter가 동작해서 1이 들어간걸 볼 수 있고, 조회를 해서 객체의 값을 보면 OrderStatus 값이 설정된 모습을 볼 수 있습니다.