슬기로운 개발생활

Spring Boot JPA 게시판 LocalDateTime format 변경하기

by coco3o
반응형
2021-12-02T16:23:47.960583

LocalDateTime에서 기본으로 적용되는 날짜 포맷이다.

T는 날짜 뒤에 시간이 있다는 것을 알려주는 ISO 날짜 형식이라고 한다.

저 T를 포함해 밀리세컨드 단위까지 보여지는 것이 눈에 거슬려 LocalDateTime format을 바꾸려 한다.

어떻게 할까 알아보던 중 예전에 썼던 글이 생각났고 이를 참고해 date format을 변경했다.


TimeEntity 변경 전

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class TimeEntity {
    
    @Column(name = "created_date")
    @CreatedDate
    private LocalDateTime createdDate;

    @Column(name = "modified_date")
    @LastModifiedDate
    private LocalDateTime modifiedDate;
}

1. LocalDate로 변경

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class TimeEntity {

    @Column(name = "created_date")
    @CreatedDate
    private LocalDate createdDate;

    @Column(name = "modified_date")
    @LastModifiedDate
    private LocalDate modifiedDate;
}

필자는 시간을 제외한 날짜만 보여주고 싶었기에 LocalDateTime가 아닌 LocalDate로 변경 해줬다.

이제 T를 포함한 밀리세컨드 단위가 보이지 않는다. 하지만 yyyy-MM-dd 가 아닌 yyyy.MM.dd로 보여주고 싶었다.

뭔 차이가 있나 싶지만 아무튼 그렇게 바꾸고 싶었다.

LocalDateTime format을 지정하는 형식은 아래와 같다.

String dateFormat = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"));

그래서 다음과 같이 TimeEntity를 수정했다.

2. String 타입 변경

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class TimeEntity {

    @Column(name = "created_date")
    @CreatedDate
    private String createdDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy.MM.dd"));

    @Column(name = "modified_date")
    @LastModifiedDate
    private String modifiedDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy.MM.dd"));
}

format을 지정하는 형식을 String 타입 변수에 바로 대입했다.

이렇게 하면 DB 컬럼의 데이터 타입은 DATETIME(LocalDateTime) > DATE(LocalDate) > VARCHAR(String) 으로 변경된다.

잘 바꼈나 확인해보니 내가 만든 포맷으로 적용이 안됐고 아래와 같은 형식으로 바뀌었다.

다행히 몇번의 구글링을 통해 해답을 찾았다.
이는 EntityListeners를 통해 해결할 수 있었다.

3. EntityListeners의 @PrePersist 와 @PreUpdate 추가

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class TimeEntity {
    
    @Column(name = "created_date")
    @CreatedDate
    private String createdDate;

    @Column(name = "modified_date")
    @LastModifiedDate
    private String modifiedDate;

    @PrePersist
    public void onPrePersist(){
        this.createdDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy.MM.dd"));
        this.modifiedDate = this.createdDate;
    }

    @PreUpdate
    public void onPreUpdate(){
        this.modifiedDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy.MM.dd"));
    }
}

@PrePersist : 해당 엔티티를 저장하기 이전에 실행된다.
@PreUpdate : 해당 엔티티를 업데이트 하기 이전에 실행된다.

날짜 값이 원하는 형식대로 적용되었다.

반응형

블로그의 정보

슬기로운 개발생활

coco3o

활동하기