프로젝트/✍️ [전공자들]

[전공자들 15] 날짜데이터를 어떻게 관리할 것인가

병아리는삐약삐약 2024. 3. 12. 11:57

프로젝트 마무리만 남겨두고, 여러 사정으로 거의 세달만에 진행하게 되었다. 

 

마무리단계에 접어들면서 남은 부분 중 하나는 바로 날짜와 관련된 것이었는데

회원가입일, 글/댓글 작성일 등의 날짜데이터를 어떻게 저장할 지가 고민이었다. 

 

먼저, 화면상으로 나타내고 싶었던 날짜 형식은 

 

이런 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);
}

 

+ 게시글 수정, 회원가입, 댓글, 대댓글 작성 기능에도 동일한 코드 추가

+ 수정일 또한 당장은 사용하지 않을 속성이지만 데이터 관리상 필요할 것 같아서, 일단 글을 수정할 때마다 함께 업데이트 시켜주는 코드를 추가했다. 

 


 

 

의도한 대로 정상적으로 출력하는 결과를 얻을 수 있었다!!!