ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] Enum 사용
    프로그래밍/JPA 2022. 1. 14. 18:44
    반응형

    이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.

    틀리거나 잘못된 정보가 있을 수 있습니다.

    댓글로 알려주시면 수정하도록 하겠습니다.


    1. Enum이란

    일정한 종류를 가지는 정보의 집합을 의미합니다.

     

    예를 들어 상품의 종류로 책, CD, 연필 등 다양한 상품이 존재할 수 있습니다. 이때 책, CD, 연필 등은 일정한 종류 상품이라는 정보로 볼 수 있습니다.

     

    그럼 이 상품 Enum에 책, CD, 연필 등 다양한 상품들을 상수 형태의 집합으로 만들어 관리할 수 있도록 합니다.

     

    2. JPA에서 Enum 사용

    먼저 Entity의 특정 속성으로 Enum을 사용하기 위해서는 @Enumerated라는 어노테이션을 사용해야 합니다.

     

    이 어노테이션은 EnumType.String, EnumType.ORDINAL 2개의 속성이 존재합니다.

    • EnumType.String : Enum의 상수명 그대로 사용하여 관리합니다.
      즉 Product.BOOK을 가지는 Entity를 저장한다면 DB에는 "BOOK" 문자열을 DB에 저장합니다.
      반대로 DB에 "BOOK" 문자열을 조회하면 Entity의 Enum 타입의 속성에는 Product.BOOK 값이 입력될 것입니다.
    • EnumType.ORDINAL : Enum의 순서를 사용하여 관리합니다.
      즉 Product Enum에 BOOK, CD, PEN이 순서대로 정의되어 있다면 BOOK을 저장하면 0을 CD를 저장하면 1을 DB에 저장합니다.
      반대로 DB에서 1을 조회하면 Entity의 Enum 타입의 속성에는 Product.CD 값이 입력될 것입니다.

    Enumerated 어노테이션의 기본값은 EnumType.ORDINAL입니다.

     

    EnumType.ORDINAL는 사용을 지양하여야 합니다.

     

    ORDINAL은 Enum에 선언된 순서를 이용하여 관리되므로 이미 선언된 Enum 중간에 신규 상수를 추가하거나, 삭제 시 이미 DB에 저장된 값들이 변경 되게 됩니다.

     

    즉 기존 Product의 1번은 CD였습니다. 그러나 CD가 제거가 된다면 1번은 PEN이 될 것입니다.

     

    Enum의 경우 추가나 삭제가 발생할 가능성이 있기 때문에 String 사용을 권장합니다.

     

    3. JPA Enum 구현

    위 처럼 Product의 Enum을 정의 하였습니다.

     

    Enumerated 속성만 다른 2개의 Product Entity입니다.

     

    먼저 EnumType이 ORDINAL인 Test를 진행하도록 하겠습니다.

     

    Product Type이 BOOK인 Entity와 CD인 Entity 2개를 생성하여 DB에 저장 한 뒤 BOOK Product Entity를 조회하여 해당 Entity의 EnumType이 ProductType인지와 그 값이 BOOK인지 비교하는 Test를 진행하였습니다.

     

    DB에 실제 Entity가 저장된 결과를 보도록 하겠습니다.

     

    ProductType의 BOOK은 0번째 CD는 1번째 PC는 2번째 순서로 정의되어 있습니다. 그러므로 DB의 EnumType이 저장되는 PRODUCT_TYPE 컬럼에 Enum 순서로 0과 1이 저장된 것을 확인할 수 있습니다.

     

    Test 결과 또한 정상적으로 통과하였으므로 Enum Type의 저장과 조회가 정상적으로 진행되는 것을 확인할 수 있습니다.

     

    이번엔 EnumType이 ORDINAL인 Test를 진행하도록 하겠습니다.

     

    Ordinal과 동일하게 Product Type이 BOOK인 Entity와 CD인 Entity 2개를 생성하여 DB에 저장 한 뒤 BOOK Product Entity를 조회하여 해당 Entity의 EnumType이 ProductType인지와 그 값이 BOOK인지 비교하는 Test를 진행하였습니다.

     

    DB에 실제 Entity가 저장된 결과를 보도록 하겠습니다.

     

    DB의 EnumType이 저장되는 PRODUCT_TYPE 컬럼에 Enum에 정의된 상수 이름이 저장된 것을 확인할 수 있습니다.

     

    Test 결과 또한 정상적으로 통과하였으므로 Enum Type의 저장과 조회가 정상적으로 진행되는 것을 확인할 수 있습니다.

     

    4. Enumerated 속성 외 저장 방법

    만약 Enumerated 속성인 순서, 문자열이 아닌 다른 방법으로 저장이 필요한 경우 AttributeConverter를 사용하여 순서나 문자열이 아닌 다른 값으로 변경하여 저장 할 수 있습니다.

     

    AttributeConverter에 대한 사용법은 포스팅으로 작성되어 있으므로 이번 포스팅에서는 결과만 확인하도록 하겠습니다.

     

    Entity Class는 이전 Entity와 다르게 Enumerated 어노테이션 대신 Convert 어노테이션을 사용하여 Converter를 설정 합니다.

     

    Converter는 단순하게 Enum의 Code값을 저장하고 조회 시 Code값을 통해 Enum을 결정하여 반환 하도록 하였습니다.

     

    Test는 앞전의 Ordinal, String과 동일하게 Book, CD Product를 저장한 뒤 조회하여 해당 Enum의 값이 무엇인지 확인하는 Test를 진행 하였습니다.

     

    DB에 저장된 값을 보면 Ordinal, String과 다른게 순서나 Enum 상수의 이름이 아닌 Enum이 가지고 있는 Code값이 저장되어 있는 것을 확인할 수 있습니다.

     

    Test 결과 또한 정상적으로 통과하였으므로 Enum Type의 저장과 조회가 정상적으로 진행되는 것을 확인할 수 있습니다.

     

    사용된 예제 코드는 Git에 있습니다.

    반응형

    '프로그래밍 > JPA' 카테고리의 다른 글

    [JPA] N+1 문제  (0) 2022.03.02
    [JPA] 즉시로딩과 지연로딩 Eager And Lazy  (0) 2022.01.13
    [JPA] Attribute Converter  (0) 2022.01.12
    [JPA] Dirty Checking(변경 감지)  (0) 2021.12.24
    [JPA] 예외 처리  (0) 2021.11.05

    댓글

Designed by Tistory.