개발환경
OS: Windows 11
IDE: Spring Tool Suite 4.14.1
JAVA: 17
@Convert
어노테이션을 사용한다.AttributeConverter
구현)를 생성하고 필드에 @Convert
와 함께 붙여주면 된다. 간편함. 예시) ‘YYYYMMDDHHmmssSSS’ 포맷의 varchar 타입으로 저장하고 있는데 이를 ‘YYYY/MM/DD HH:mm:ss’ 형식으로 포맷팅하여 조회하고 싶을 경우
1. 컬럼 설정
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.h2.util.json.JSONObject;
// 컨버팅 클래스
import com.armton.history.util.StringToFormatDateStringConverter;
import com.armton.history.util.StringToJson;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Entity
@Setter
@Getter
@Table(name = "service_history")
@ToString
@NoArgsConstructor
public class ServiceHistory {
@Id
@Column
private String id;
@Column(name = "log_dt")
@Convert(converter=StringToFormatDateStringConverter.class)
private String logDt;
}
@Convert(converter={컨버트 클래스})
어노테이션을 붙인다.import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
/**
* varchar 타입 데이터를 Date 포맷의 String으로 변환하는 클래스
*/
@Converter
public class StringToFormatDateStringConverter implements AttributeConverter<String, String>{ //AttributeConverter<엔티티 컬럼 타입, 데이터베이스 컬럼 타입>
private static final Logger logger = LoggerFactory.getLogger(StringToFormatDateStringConverter.class); // logger
@Override // 엔티티 -> DB 시
public String convertToDatabaseColumn(String attribute) {
// TODO Auto-generated method stub
return attribute;
}
@Override // DB값 -> 엔티티 시
public String convertToEntityAttribute(String dbData) { // dbData = "20221006102259045"
StringBuilder sb = new StringBuilder();
if(dbData!=null) {
SimpleDateFormat dbFormat = new SimpleDateFormat("yyyyMMddHHmmSSSS");
Date date = null;
try {
date = dbFormat.parse(dbData); // date = "Thu Oct 06 10:22:59 KST 2022"
SimpleDateFormat entityFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
sb.append(entityFormat.format(date)); // entityFormat.format(date) = "2022/10/06 10:22:59"
} catch (ParseException e) {
e.printStackTrace();
logger.error("Error Occured during convert \"log_dt\" value to entity attribute format.");
}
}
return sb.toString();
}
}
AttributeConverter
를 구현한 클래스를 생성한다.convertToDatabaseColumn(String attribute)
: 만약 insertable=true이거나 updatable=true일 경우 데이터를 DB 타입에 맞게 컨버팅하는 메소드@Override // 엔티티 -> DB 시
public String convertToDatabaseColumn(String attribute) {
// TODO Auto-generated method stub
return null; // 조회도 null이 될 수 있음
}
convertToEntityAttribute(String dbData)
: 조회 시 데이터를 엔티티 자료형에 맞게 컨버팅하는 메소드. 조회된 레코드가 파라미터로 들어옴SimpleDateFormat dbFormat = new SimpleDateFormat("yyyyMMddHHmmSSSS")
: 조회된 데이터의 포맷date = dbFormat.parse(dbData)
: 조회된 데이터의 포맷에 맞춰 date 자료형으로 변환SimpleDateFormat entityFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
: 원하는 데이터 포맷entityFormat.format(date)
: date 타입이 된 데이터를 원하는 포맷으로 변환예시) datetime 타입으로 저장되고 있는 데이터를 ‘YYYY/MM/DD HH:mm:ss’ 형식의 String으로 포맷팅하여 조회하고 싶을 경우
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
// 컨버팅 클래스
import com.armton.user.util.DateToStringConverter;
@Entity
@Setter
@Getter
@Table(name = "user")
@ToString
@NoArgsConstructor
public class User {
@Id
@Column
private String id;
@Column(name = "last_login_dt")
@Convert(converter=DateToStringConverter.class)
private String lastLoginDt;
}
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter
public class DateToStringConverter implements AttributeConverter<String, String>{
private static final Logger logger = LoggerFactory.getLogger(DateToStringConverter.class); // logger
@Override
public String convertToDatabaseColumn(String attribute) {
return attribute;
}
@Override
public String convertToEntityAttribute(String dbData) {
StringBuilder sb = new StringBuilder();
if(dbData!=null) {
SimpleDateFormat dbFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:SSSS");
Date date = null;
try {
date = dbFormat.parse(dbData);
SimpleDateFormat entityFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
sb.append(entityFormat.format(date));
} catch (ParseException e) {
e.printStackTrace();
logger.error("Error Occured during convert \"_dt\" value to entity attribute format.");
}
return sb.toString();
}
return dbData;
}
}
AttributeConverter
를 구현한 클래스를 생성한다.convertToDatabaseColumn(String attribute)
: 만약 insertable=true이거나 updatable=true일 경우 데이터를 DB 타입에 맞게 컨버팅하는 메소드@Override // 엔티티 -> DB 시
public String convertToDatabaseColumn(String attribute) {
// TODO Auto-generated method stub
return null; // 조회도 null이 될 수 있음
}
convertToEntityAttribute(String dbData)
: 조회 시 데이터를 엔티티 자료형에 맞게 컨버팅하는 메소드. 조회된 레코드가 파라미터로 들어옴예시) varchar, clob 등의 자료형을 JSON 형식으로 포맷팅하여 조회하고 싶을 경우
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import org.h2.util.json.JSONObject;
// 컨버팅 클래스
import com.armton.history.util.StringToFormatDateStringConverter;
import com.armton.history.util.StringToJson;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Entity
@Setter
@Getter
@Table(name = "service_history")
@ToString
@NoArgsConstructor
public class ServiceHistory {
@Id
@Column
private String id;
@Column(name = "res_data")
@Convert(converter=StringToJson.class)
private String resData;
}
@Convert(converter={컨버트 클래스})
어노테이션을 붙인다.import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
@Converter
public class StringToJson implements AttributeConverter<String, String>{
private static final Logger logger = LoggerFactory.getLogger(StringToJson.class);
@Override
public String convertToDatabaseColumn(String attribute) {
return attribute;
}
@Override
public String convertToEntityAttribute(String dbData) { // dbData = “{\"name\" : \“armton\”,\"age\" : 55,\"address\" : \“\”,\"tel\" : \"010-8888-9999\”}”
if(dbData!=null) {
ObjectMapper om = new ObjectMapper();
JsonNode requestResult = null;
try {
requestResult = om.readTree(dbData);
} catch (JsonProcessingException e) {
logger.error("Error Occured during convert \"res_data\" value to entity attribute format(JSON).");
e.printStackTrace();
}
return requestResult.toPrettyString();
}else {
return null;
}
}
}
AttributeConverter
를 구현한 클래스를 생성한다.convertToDatabaseColumn(String attribute)
: 만약 insertable=true이거나 updatable=true일 경우 데이터를 DB 타입에 맞게 컨버팅하는 메소드@Override // 엔티티 -> DB 시
public String convertToDatabaseColumn(String attribute) {
// TODO Auto-generated method stub
return null; // 단순 조회도 null이 될 수 있음
}
convertToEntityAttribute(String dbData)
: 조회 시 데이터를 엔티티 자료형에 맞게 컨버팅하는 메소드. 조회된 레코드가 파라미터로 들어옴