Programing/JPA

JPA with Springboot, @convert date type to string or reverse

리커니 2021. 5. 11. 18:09
반응형

JPA with Springboot, @convert date type to string or reverse

 

DB에 Date type인 컬럼을 원하는 포멧에 맞게 변경하는 방법을 알아보겠습니다.

 

[Spec]

DB : MariaDB 10.1.13

Framework : Springboot 2.3.2

 

데이터를 원한는 포멧으로 변경하기 위해서는 Entity column에 Convert Annotaion을 활용합니다. 

Convert는 AttributeConverter를 implements한 클래스를 구현하면 됩니다.

 

우선 Entity를 작성해보도록 하겠습니다.

 

[Member.class]

@Entity
@Table(name="M_OP_MEMBER")
@Data
public class Member {
	@Id
	@Column(name="MEMBER_ID", length=20, nullable=false)
	private String id;
	
	@Column(name="MEMBER_NAME", length=50)
	private String name;
	
	@Column(name="PASSWORD")
	private String password;
	
	@Column(name="ROLES", length=10)
	private String roles;
	
	@Column(name="USE_YN", length=1)
	private String useYn;
	
	@Column(name="REG_DTM", length=20)
	@Convert(converter=DateToStringConverter.class)
	private String regDtm;
	
	@Column(name="UDT_DTM", length=20)
	@Convert(converter=StringToFormatDateStringConverter.class)
	private String udtDtm;
}

@Convert annotation이 선언된 2개의 Column이 있습니다. (regDtm, udtDtm)

두 컬럼 다 String 변수이지만, Database에는 REG_DTM은 datetime, UDT_DTM varchar 타입니다.

 

@Convert(converter=클래스명.class)

 

datetime 타입인 REG_DTM 컬럼의 컨버터인 DateToStringConverter를 보도록 하겠습니다. 

 

@Converter
public class DateToStringConverter implements AttributeConverter<String, Date>{
	
    private static final Logger LOGGER = LoggerFactory.getLogger(DateToStringConverter.class);
    private SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
    /*String to Date (Client -> DB */
    @Override
    public Date convertToDatabaseColumn(String attribute) {
        Date date = null;
        try {
            date = sf.parse(attribute);
        } catch (ParseException e) {
            LOGGER.error("[ERROR] 문자열을 Date 타입으로 변환하는데 실패하였습니다.", e);
        }
        return date;
    }
    /*Date to String (DB -> Client*/
    @Override
    public String convertToEntityAttribute(Date dbData) {
        if(dbData != null) {
            return sf.format(dbData);
        }else {
            return null;
        }
    }
}

위의 예시 코드에서 보시는 것과 같이 AttributeConverter를 implements 받게 되면 2개의 메소드가 자동으로 생성됩니다. (convertToDatabaseColumn, convertToEntityAttribute)

 

convertToDatabaseColumn 의 경우 Entity에 데이터를 set 할 때 인터셉트되어 사용되며

주석을 쓴것과 같이 client에서 입력받은 데이터를 DB에 저장/수정 할 경우 호출됩니다.

 

convertToEntityAttribute의 경우는 convertToDatabaseColumn와 반대로 데이터베이스의 데이터를 조회 할 경우 호출됩니다. 

 

내부 로직은 단순히 원하는 포멧에 맞게 변경을 해주는 코드 입니다.

 

위처럼 converter를 사용하게 되면 DB데이터를 가져올 경우와 DB에 삽입할 경우

원하는 포멧에 맞게 변경 할 수 있습니다.

 

 

반응형