ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] Attribute Converter
    프로그래밍/JPA 2022. 1. 12. 00:32
    반응형

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

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

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


    1. Attribute Converter이란

    명칭을 그래도 번역하면 속성 변환기 정도가 될 것 같습니다.

     

    번역 그대로 Converter는 Entity와 DB사이에서 속성의 변환을 담당합니다.

     

    Converter가 지정되지 않은 속성의 경우 조회 시 DB의 데이터를 특정 속성의 값으로 읽어오며, 저장 또는 수정 시 Entity의 속성 값을 DB의 컬럼에 저장합니다.

     

    반면 Converter가 지정된 속성의 경우는 조회 시 DB의 데이터를 읽어와 Converter의 특정 동작을 수행 후 결과를 Entity속성에 값을 입력하며, 저장 또는 수정 시 Entity의 속성 값을 Converter의 특정 동작을 수행 후 결과를 DB의 컬럼에 저장합니다.

     

    2. Attribute Converter Interface

    AttributeConverter 인터페이스에 대해 알아보겠습니다.

     

    AttributeConverter 인터페이스의 경우 2개의 메소드만 정의되어 있는 아주 간단한 인터페이스입니다.

     

    먼저 정의되어 있는 2개의 메소드 convertToDatabaseColumn와 convertToEntityAttribute를 구현함으로써 Converter를 만들 수 있습니다.

     

    AttributeConverter Generic Type의 값들은 Entity에 저장되는 속성 Type과, DB에 저장될 컬럼의 Type을 전달합니다.

     

    AttributeConverter의 주석에 작성된 것처럼 첫 번째 Generic Type은 Entity의 속성 Type을 전달하고, 두 번째 Generic Type은 DB에 저장될 컬럼 Type을 전달합니다.

     

    convertToDatabaseColumn는 Entity의 속성 값을 DB에 저장하기 전 변경 동작을 구현하는 메소드입니다.

     

    반대로 convertToEntityAttribute는 DB에서 읽어온 데이터를 Entity의 속성에 입력하기 전 변경 동작을 구현하는 메소드 입니다.

     

    3. AttributeConverter 구현

     

    NameEntity는 id, name, convertName 속성 3개를 가지고 있는 Entity로 구성되어 있으며 convertName은 @Convert어노테이션을 사용하여 해당 속성이 사용할 AttributeConverter Class를 지정하였습니다.

     

    이제 convertName 속성은 DB -> Entity, Entity -> DB로 ReverseConverter의 메소드의 동작을 수행 후 저장하거나 조회될 것입니다.

     

     

    ReverseConverter Class를 생성하고 AttributeConverter를 구현하였습니다.

     

    convertToDatabaseColumn과 convertToEntityAttribute 2개 메소드를 오버 라이딩하였습니다.

     

    convertToDatabaseColumn는 DB에 저장하기 전 속성에 입력된 문자열을 반대로 뒤집어 저장하도록 구현하였으며

     

    convertToEntityAttribute는 DB에 저장된 문자열을 그대로 Entity의 속성으로 읽어오도록 하였습니다.

     

    먼저 name속성과 convertName속성에 'hello' 값을 입력한 NameEntity를 하나 생성하고 DB에 해당 Entity를 저장합니다.

     

    이후 DB로부터 위에서 저장한 Entity를 조회하여 Entity의 convertName의 값을 확인합니다.

     

    예상되는 결과는 생성된 Entity의 convertName의 속성 값을 hello로 입력한 뒤 저장 시 ReverseConverter의 convertToDatabaseColumn메소드에 의해 'hello'가 'olleh'로 변환되어 DB에 저장될 것입니다.

     

    다시 Entity를 조회 시 DB에 저장되어 있는 'olleh'를 조회 한 뒤 ReverseConverter의 convertToEntityAttribute메소드를 수행하게 될 것입니다.

     

    convertToEntityAttribute는 조회한 문자열을 그대로 반환하므로 'olleh' 문자열이 그대로 반환되어 Entity의 convertName 속성에 입력될 것입니다.

     

     

    디버깅을 통해 조회한 Entity getNameEntity의 상태 값을 확인한 결과 convertName의 값이 'olleh'로 입력된 것을 확인할 수 있습니다.

     

    Test 결과 또한 성공이므로 조회된 Entity의 convertName 속성의 값이 'hello'가 아닌 'olleh'이 조회된 것을 확인할 수 있습니다.

     

    이번에는 convertToEntityAttribute 메소드를 수정하여 DB에서 조회한 문자열 뒤에 '_converter' 문자열을 추가하도록 변경하도록 하겠습니다.

     

    예상되는 결과는 'olleh'로 저장된 문자열을 조회한 뒤 문자열 마지막에 '_converter'를 추가하여 'olleh_converter'가 Entity의 convertName 속성 값으로 입력될 것이라고 예상할 수 있습니다.

     

    디버깅을 통해 조회한 Entity getNameEntity의 상태 값을 확인한 결과 convertName의 값이 'olleh_converter'로 입력된 것을 확인할 수 있습니다.

     

    Test 결과 또한 성공하는 것을 확인할 수 있습니다.

     

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

    반응형

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

    [JPA] Enum 사용  (0) 2022.01.14
    [JPA] 즉시로딩과 지연로딩 Eager And Lazy  (0) 2022.01.13
    [JPA] Dirty Checking(변경 감지)  (0) 2021.12.24
    [JPA] 예외 처리  (0) 2021.11.05
    [JPA] 연관관계의 주인  (0) 2021.10.21

    댓글

Designed by Tistory.