DB에 LocalDate나 LocalTime 혹은 LocalDateTime을 원하는 형식으로 넣을 수는 없을까?
LocalTime은 HH:mm:ss 형식으로 저장된다.
하지만, 이를 ms 단위까지 저장하고 싶다면?
이를 위해 필요한 AttributeConverter를 소개한다.
AttributeConverter
AttributeConverter는 DB에 저장될 때의 형식을 지정할 수 있게 해준다.
해당 인터페이스는 2개의 메서드 구현을 요구한다.
1. convertToDatabaseColumn
말그대로, DB에 저장할 때를 의미한다.
우리가 LocalTime을 HH:mm:ss.SSS방식으로 저장하고자 한다면 아래와 같이 작성할 수 있다.
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm.SSS");
@Override
public String convertToDatabaseColumn(LocalTime localTime) {
// localTime이 null이 아니면 형식에 맞게 변경
return localTime != null ? localTime.format(formatter) : null;
}
2. convertToEntityAttribute
DB에서 데이터를 가져올 때를 의미한다.
우리가 저장한 방식은 HH:mm:ss.SSS이고, 이를 LocalTime으로 변환하기 위해서는 아래의 코드처럼 작성한다.
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm.SSS");
@Override
public LocalTime convertToEntityAttribute(String data) {
return data != null ? LocalTime.parse(data, formatter) : null;
}
AttributeConverter를 구현한 클래스인 LocalTimeAttributeConverter의 전체적인 코드는 아래와 같다.
@Converter(autoApply = true)
public class LocalTimeAttributeConverter implements AttributeConverter<LocalTime, String> {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm.SSS");
@Override
public String convertToDatabaseColumn(LocalTime localTime) {
// localTime이 null이 아니면 형식에 맞게 변경
return localTime != null ? localTime.format(formatter) : null;
}
@Override
public LocalTime convertToEntityAttribute(String data) {
return data != null ? LocalTime.parse(data, formatter) : null;
}
}
이렇게 한다면 준비는 다 끝났다.
우리가 커스텀하고 싶은 컬럼에 아래처럼 어노테이션을 붙여주자.
@Convert(converter = LocalTimeAttributeConverter.class)
// 시간 형식을 HH:mm:ss.SSS 로 저장
private LocalTime visitTime;
이렇게 되면 기존 HH:mm:ss 로 저장되던 형식을 HH:mm:ss.SSSS로 변경할 수 있게 된다.
'Spring' 카테고리의 다른 글
[Spring] Jasypt를 이용하여 코드 암호화하기 (1) | 2024.11.20 |
---|---|
[Spring] @RequestBody와 @RequestParam (0) | 2024.01.22 |