Spring

[Spring] AttributeConverter를 사용해 원하는 포맷으로 저장하기

F12:) 2024. 11. 20. 22:23

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