본문 바로가기
TIL (Today I Learned)

TIL) Timestamped로 게시물 작성, 수정시간/날짜를 추가해보자

by Won's log 2023. 8. 3.

아래와 같이 게시물 작성, 수정, 삭제, 조회 API를 만들었다. 그런데 작성, 수정 날짜가 나오지 않아서 골머리를 앓고 있었다.

 

  • 전체 게시글 목록 조회 API
    • 제목, 작성자명(nickname), 작성 날짜를 조회하기
    • 작성 날짜 기준으로 내림차순 정렬하기
  • 게시글 작성 API
    • 토큰을 검사하여, 유효한 토큰일 경우에만 게시글 작성 가능
    • 제목, 작성 내용을 입력하기
  • 게시글 조회 API
    • 제목, 작성자명(nickname), 작성 날짜, 작성 내용을 조회하기 (검색 기능이 아닙니다. 간단한 게시글 조회만 구현해 주세요.)
  • 게시글 수정 API
    • 토큰을 검사하여, 해당 사용자가 작성한 게시글만 수정 가능
  • - 게시글 삭제 API
    • 토큰을 검사하여, 해당 사용자가 작성한 게시글만 삭제 가능

기존에 사용했던 방법은 Entity(Post)에 Timestamped를 사용해서 등록날짜와 수정날짜를 요청, 반환하는 방법을 사용하였다.

public class Post extends Timestamped { ... }
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Timestamped {

    @CreatedDate
    @Column(updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime createdAt;

    @LastModifiedDate
    @Column
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime modifiedAt;
}

그런데 다른 코드와 충돌이 일어났는지 어떠한 이유로 createdAt과 modifiedAt이 null 값으로 나타났다.

콘솔을 확인해 보니 데이터 자체가 디비로 넘어오지 않은 것 같았다.

 

그래서 검색을 해보니 꼭 Timestamped를 상속하지 않아도 엔티티에 자체로 넣는 것도 방법이라는 생각이 들었다. 다음과 같이 추가하였고 기존에 Timestamped는 주석처리를 해두었다. 

public class Post {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String content;

    @ManyToOne
    @JoinColumn(name = "user_id", nullable = false)
    private User user;

    @CreationTimestamp
    @Column(name = "created_at", updatable = false)
    private LocalDateTime createdAt;

    @UpdateTimestamp
    @Column(name = "modified_at")
    private LocalDateTime modifiedAt;
    }

그랬더니 성공적으로 작성날짜와 수정날짜가 동작하게 되었다!

포스트맨으로 값 확인
테이블에서 id가 5번 부터 날짜 디비가 확인된다!

이전의 방법으로 날짜가 디비로 넘어가지 않은 것의 원인을 고민해 보았는데 한꺼번의 많은 코드를 여기저기서 사용하고 적용하다 보니까 충돌이 발생한 것 같다는 결론을 내렸다.

 

다음부터는 이러한 일이 발생해도 침착하게 대응 방법을 찾고 결과로 도출할 수 있는 개발자가 되어야겠다.

 


UPDATE!!!

 

팀원들과 코드 리뷰를 하며 해당 오류에 대해 함께 고민한 결과, @EnableJpaAuditing 에노테이션을 넣지 않은 것을 깨닫게 되었다.

넣고 Timestamped를 상속받으니 날짜가 원활하게 확인되었다.

 

@EnableJpaAuditing 에 관한 정보는 아래 포스트에 정리해놓았다!

https://earlgrey-is-here.tistory.com/78

 

TIL) @EnableJpaAuditing 은 무엇인가?

@EnableJpaAuditing 스프링 프레임워크에서 JPA를 사용할 때 제공하는 기능 중 하나입니다. 이 어노테이션을 사용하면 엔티티(모델 클래스)의 생성일자와 수정일자를 자동으로 기록해줍니다. 이렇게

earlgrey-is-here.tistory.com