[전공자들 15] 날짜데이터를 어떻게 관리할 것인가
프로젝트 마무리만 남겨두고, 여러 사정으로 거의 세달만에 진행하게 되었다.
마무리단계에 접어들면서 남은 부분 중 하나는 바로 날짜와 관련된 것이었는데
회원가입일, 글/댓글 작성일 등의 날짜데이터를 어떻게 저장할 지가 고민이었다.
먼저, 화면상으로 나타내고 싶었던 날짜 형식은
이런 yyyy-MM-dd HH:mm 형식이었다.
내가 선택할 수 있는 방법은 두가지였는데
1. 게시글을 생성할 때 백엔드에서 생성일을 추가하는 방법(문자열 저장)
2. 데이터베이스에 저장될 때 자동으로 생성일을 주입하는 방법(날짜형식 저장)
첫 번째 방법은 백엔드 코드상으로 처리하는 방법인데 java.time.LocalDateTime 클래스를 사용해서 해당 일자를 가져온 후 java.time.format.DateTimeFormatter 클래스를 통해 yyyy-MM-dd HH:mm형식의 문자열로 바꿔서 저장하는 방법이다.
두 번째 방법은 따로 저장하는 코드를 작성 할 필요 없이 @CreateDate 어노테이션을 통해서 데이터베이스에 게시글 도큐먼트가 추가 될 때마다 자동으로 날짜 형식의 생성일을 추가시키는 방법이다.
각 방식에 따른 장단점이 명확해서 어떤 것을 선택할 지 고민을 할 수 밖에 없었다.
처음 선택한 방법은 두 번째 방법이었는데, 그 이유는 코드가 간단해서였다. 어노테이션만 사용하면 알아서 생성일을 부여해주고, 심지어 @LastModifiedDate을 사용하면 수정일까지 자동으로 관리할 수 있으니 편리하다고 생각해서였다.
하지만 곧 문제점이 생겼는데, 날짜형식의 데이터를 그대로 가져와서 화면에 출력하니
사진처럼 가공되지 않은 날짜형식으로 표시되는 것이었다.
그래서 결국 데이터를 가져 올 때마다 표시형식을 바꿔주는 코드를 추가해야 한다는 것을 깨달았고,
그렇다면 트래픽이 많아졌을 때, 예를 들어 한 게시글을 수백, 수천곳에서 동시에 조회를 한다고 가정하면?
그 엄청난 조회수만큼 날짜형식 변환코드를 실행시키는 것보다는 그냥 처음 등록할 때 문자열로 바꿔서 저장해 놓고 그것만 불러오는게 속도상 더 효율적이겠다는 결론을 내렸다.
결과적으로, 첫 번째로 생각했던 방법처럼 게시글을 생성 및 수정할 때 한번, 날짜를 가져와서 문자열로 바꿔 저장하고 그것을 그대로 가져와서 화면에 출력시키는 코드로 수정했다.
//현재날짜를 지정한 형식의 문자열로 바꿔 리턴하는 함수 생성
//메소드가 독립적이고 재사용성이 높다고 판단하여 static으로 작성
public class CustomUtilService {
public static String changeDateToString(){
LocalDateTime today = LocalDateTime.now();
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
return today.format(pattern);
}
}
// 게시글 작성 메소드
@Override
public Article createArticle(Article article) throws Exception {
Member mem = memberService.getCurrentMember();
MemberInfoDto memberProfileDto = modelMapper.map(mem, MemberInfoDto.class);
article.setWriter(memberProfileDto);
⋮
// 기타 article의 다른 속성 초기화 코드
⋮
article.setCreatedAt(CustomUtilService.changeDateToString()); //등록일 추가 부분
return articleRepository.save(article);
}
+ 게시글 수정, 회원가입, 댓글, 대댓글 작성 기능에도 동일한 코드 추가
+ 수정일 또한 당장은 사용하지 않을 속성이지만 데이터 관리상 필요할 것 같아서, 일단 글을 수정할 때마다 함께 업데이트 시켜주는 코드를 추가했다.
의도한 대로 정상적으로 출력하는 결과를 얻을 수 있었다!!!