@CreatedDate를 통해 컬럼의 생성일을 받게 되면, 보통 LocalDateTime으로 받아서
아래와 같은 형식으로 DB에 저장되게 된다.
@CreatedDate // Entity가 생성되어 저장될 때 시간 자동 저장
@Column(updatable = false) // updatable = false : column 수정 시 값 변경을 막는다.
private LocalDateTime createdDate;
LocalDateTime.now()의 반환 형식
2022-11-01T16:23:47.960583
👉 이렇게 DB에 저장되니 나노초와 ‘T’가 가독성이 너무 안 좋아서 삭제하기 위해
Format을 변경하는 방법을 찾게 되었다.
기본적으로는, LocalDateTime의 포맷을 변경하고 싶다면
LocalDateTime의 format() 메소드를 다음과 같이 사용하면 된다.
ex) LocalDateTime 포맷 연월일+시분으로 변경(yyyy-MM-dd HH:mm)
String customLocalDateTimeFormat =LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
👉 이렇게 LocalDateTIme.format(DateTimeFormatter.ofPattern(”지정할 포맷”)) 을 사용하면 된다.
하지만, 이렇게 format() 메소드를 사용하게 되면 반환 타입이 String이므로
LocalDateTime이 아니라 String으로 DB에 저장되게 된다.
이는 @CreatedDate 필드의 타입을 String으로 수정해서 DB에 저장할 수 있다.
※ @CreatedDate 를 사용한다면, 해당 엔티티가 저장되기 전에 실행시켜주는 @PrePersist() 를 통해
LocalDateTime의 포맷을 생성일 엔티티가 저장되기 전에 바꿔 String으로 받아야한다.
@CreatedDate + @PrePersist + LocalDateTime.format() 사용하여 포맷 변경
@CreatedDate // Entity가 생성되어 저장될 때 시간 자동 저장
@Column(updatable = false) // updatable = false : column 수정 시 값 변경을 막는다.
private String createdDate;
@PrePersist
public void onPrePersist() {
String customLocalDateTimeFormat = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
this.createdDate = parsedCreateDate;
}
👉 이렇게 @CreatedDate 생성일 필드의 타입을 String으로 바꾸고,
@PrePersist 를 통해 해당 엔티티를 저장하기 전에 LocalDateTime의 포맷을 바꿔주면,
@CreatedDate 로 엔티티가 생성되어 저장될 때 사용자가 지정한 포맷으로 바꿔서 DB에 저장된다.
이렇게 끝난 것 같지만, 생성일 필드가 LocalDateTime → String으로 바뀌어서 불편한 점이 있다.
바로 모든 테이블의 생성일 필드를 가공할 때, LocalDateTime의 메소드를 사용할 수 없다는 점이다.
형식 변환 전 : 2022-11-01T16:23:47.960583 (LocalDateTime)
형식 변환 후 : 2022-11-01 23:47 (String)
이렇게 DB에 변환이 되었지만, 만약 생성일의 월만 가져오는 로직을 구현한다고 해보자.
형식 변환 전에는 LocalDateTime.getMonthValue() 를 통해 쉽게 월을 받을 수 있다.
하지만, 형식 변환 후는 String이기 때문에 직접 String을 가공하는 작업을 거쳐 월을 뽑아내야한다.
이러한 불편함이 있기 때문에, 변환한 String을 다시 LocalDateTime으로 변환하는 작업을 거치는 것이 좋다.
이는 LocalDateTime.parse() 를 이용하면 String → LocalDateTime 변환이 가능하다.
LocalDateTime 변환 & 가공 로직
1. LocalDateTime.now().format("지정 형식")으로 LocalDateTime -> String 변환
※ 이때, format의 역할은 현재 시간을 String으로 변환하는 역할이므로 원하는 형식으로 하지 않아도 된다.
결국 DB에 저장되는 형식은 parse에서 사용하는 형식이기 때문에 format의 지정 형식으로는 저장되지 않는다.
하지만, format으로 변환된 String을 parse하는 것이기 때문에 필요한 정보는 있어야한다.
예를 들면, "yyyy-MM-dd" 형식으로 DB에 저장하고 싶을 때
format 형식으로 "yyyy-MM"을 지정하면 String으로 년월만 담겨서 parse에 오기 때문에
형식은 "yyyy-MM-dd"가 되겠지만, dd에 대한 정보가 없어서 00이 담길 것이다.
따라서, 그냥 format의 지정 형식도 parse할 형식과 똑같이 하는 것이 복잡하지 않고 직관적일 것 같다.
2. LocalDateTime.parse("변환할 String", "지정 형식")으로 String -> LocalDateTime 변환
※ 이때, format의 역할은 현재 시간을 String으로 변환하는 역할이므로 원하는 형식으로 하지 않아도 된다.
결국 DB에 저장되는 형식은 parse에서 사용하는 형식이기 때문에 format의 지정 형식으로는 저장되지 않는다.
하지만, format으로 변환된 String을 parse하는 것이기 때문에 필요한 정보는 있어야한다.
예를 들면, "yyyy-MM-dd" 형식으로 DB에 저장하고 싶을 때
format 형식으로 "yyyy-MM"을 지정하면 String으로 년월만 담겨서 parse에 오기 때문에
형식은 "yyyy-MM-dd"가 되겠지만, dd에 대한 정보가 없어서 00이 담길 것이다.
따라서, 그냥 format의 지정 형식도 parse할 형식과 똑같이 하는 것이 복잡하지 않고 직관적일 것 같다.
최종 포맷 변경 코드
@CreatedDate // Entity가 생성되어 저장될 때 시간 자동 저장
@Column(updatable = false) // updatable = false : column 수정 시 값 변경을 막는다.
private LocalDateTime createdDate;
@PrePersist
public void onPrePersist() {
String customLocalDateTimeFormat = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
LocalDateTime parsedCreateDate = LocalDateTime.parse(customLocalDateTimeFormat, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
this.createdDate = parsedCreateDate;
}
참고
java) LocalDateTime , String 형식 변경
java) LocalDateTime , String 형식 변경
사실 Date 클래스들의 경우 검색을 해서 사용하는 경우가 대부분이다. 그렇지만 날짜 관련 클래스의 사용빈도는 의외로 많이 있었다. 게임쪽을 예를 들면 타임어택과 같은 컨셉이나 이벤트성 미
awse2050.tistory.com
Spring Boot JPA 게시판 LocalDateTime format 변경하기
Spring Boot JPA 게시판 LocalDateTime format 변경하기
2021-12-02T16:23:47.960583 LocalDateTime에서 기본으로 적용되는 날짜 포맷이다. T는 날짜 뒤에 시간이 있다는 것을 알려주는 ISO 날짜 형식이라고 한다. 저 T를 포함해 밀리세컨드 단위까지 보여지는 것이
dev-coco.tistory.com
'하루 작성 Today Project > Study' 카테고리의 다른 글
LocalDateTime 주요 메소드 정리 (0) | 2022.11.02 |
---|---|
Try-with-resource를 통한 자원 해제 처리 (0) | 2022.11.02 |
DTO에 기본 생성자가 필요한 이유 (5) | 2022.11.02 |