[JPA] @Converter

윤재열·2022년 9월 30일
0

JPA

목록 보기
19/21
post-custom-banner

@Converter 란?

  • 컨버터를 사용하면 엔티티이 데이터를 변환하여 데이터베이스에 저장할 수있습니다.

  • 주로 개인정보에 암호화/복호화 해야 하는 정보나, 날짜에 원하는 방식으로 저장하기 위하여 오노테이션이 붙어있습니다.

    interface AttributeConverter<X,Y> 설명

public interface AttributeConverter<X,Y>{
	public Y convertToDatabaseColumn(X attributes);
    public X convertToEntityAttribute(Y dbData);
  • X : 엔티티의 속성에 대응하는 타입

  • Y : DB에 대응하는 타입

  • convertToDatabaseColumn : 엔티티의 X 타입 속성을 Y타입의 DB 데이터로 변환합니다.

    • 엔티티 속성을 DB에 반영할 때 사용합니다.
  • convertToEntityAttribute : Y 타입으로 읽은 DB 데이터를 엔티티의 X 타입의 속성으로 변환합니다.

    • 엔티티 조회시 DB에서 읽어온 데이터를 엔티티의 속성에 반영할 때 사용합니다.

    Example

  • JPA 를 사용하면 자바의 boolean 타입은 방언에 따라 다르지만 데이터베이스에 저장될 때 0 또는 1인 숫자로 저장됩니다. 그런데 DB에 숫자 대신 문자 Y or N 으로 저장하고 싶다면 컨버터를 사용하면 됩니다.

  • 방언 : 서로 다른 데이터베이스 간의 SQL 문법 차이를 의미합니다.

  • 아래의 코드는 @Converter를 적용하여 데이터베이스에 저장되기 직전에 BooleanToYNConverter 컨버터가 동작합니다. Meber 엔티티의 vip 필드는 boolean 타입입니다.

  • Converter 가 사용 될 Member 클래스

@Enttity
@Data
public class Member{
	
    @Id
    private String id;
    
    private String name;
    
    @Convert(converter = BooleanToYNConverter.class)
    private boolean vip;
    
   } 
  • Converter 를 선언할 클래스
    • 컨버터는 @Converter 어노테이션을 사용하여 AttributeConverter 인터페이스를 구현해야 합니다.
@Converter
public class BooleanToYNConverter implements AttributeConverter<Boolean,String>{

	public String convertToDatabaseColumn(Boolean attribute){
    	return ( attribute != null && attribute) ? "Y" : "N";
        }
	
    public Boolean convertToEntityAttribute(String s){
    	return "Y".equals(s);
		}
    }    

Example 2

  • 날짜타입을 변환시키고 싶을 때도 사용가능합니다.
  • 예를들어 DB에는 "20220930" 으로 넣고 싶고,
    entity 에는 " 2022-09-30" 으로 받고 싶다고 한다면 아래와 같이 사용 할 수도 있습니다.
package com.pluspark.operational.report.lab;

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import javax.print.attribute.Attribute;

@Converter
public class StringDateHyphenConverter implements AttributeConverter<String,String> {


    @Override
    public String convertToDatabaseColumn(String attribute) {
        return attribute.replace("-","");
    }

    @Override
    public String convertToEntityAttribute(String dbData) {
        StringBuilder sb = new StringBuilder();
        sb = sb.append(dbData.substring(0,4));
        sb = sb.append("-");
        sb = sb.append(dbData.substring(4,6));
        sb = sb.append("-");
        sb = sb.append(dbData.substring(6,8));

        return sb.toString();
    }
}

Example 3

두 개 이상의 속성을 갖는 벨류 타입을 한개 칼럼에 매핑

@Data
@AllArgsConstructor
public class Monkey{
	private Double value;
    private String currency;
   
  } 
  • Monkey 타입을 DB에 보관할때 "1000KRW" or "100USD"와 같은 문자열로 저장됩니다.
  • Monkey를 한개의 칼럼에 매핑하므로 @Embeddable를 사용할 수는 없습니다.
  • Monkey를 한 개의 칼럼에 매핑하기 위한 AttributeConverter 구현체를 만들어 보겠습니다.
@Converter(autoApply =true)
public class MonkeyConverter implements AttributeConverter<Monkey,String>{

	@Override
    public String convertToDatabaseColumn(Monkey attribute){
    	if(attribute == null){
        	return null;
        }
    return attribute.toString();
    }
    
    @Override
    public Monkey convertToEntityAttribute(String dbData){
    if(dbData == null){
    	returen == null;
    }else{
    	String value = dbData.subString(0, dbData.length() -3);
        String currency = dbData.subString(dbData.length()-3);
        return enw Monkey(Double.valueOf(value),currency);
    }
   }
 }
    
    
  • autoApply 설정을 true 로 함으로써 JPA 프로바이더는 MonkeyConverter를 자동으로 적용합니다.
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/
post-custom-banner

0개의 댓글