JPA with Springboot, @convert date type to string or reverse
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에 삽입할 경우
원하는 포멧에 맞게 변경 할 수 있습니다.