아래와 같이 게시물 작성, 수정, 삭제, 조회 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;
}
그랬더니 성공적으로 작성날짜와 수정날짜가 동작하게 되었다!
이전의 방법으로 날짜가 디비로 넘어가지 않은 것의 원인을 고민해 보았는데 한꺼번의 많은 코드를 여기저기서 사용하고 적용하다 보니까 충돌이 발생한 것 같다는 결론을 내렸다.
다음부터는 이러한 일이 발생해도 침착하게 대응 방법을 찾고 결과로 도출할 수 있는 개발자가 되어야겠다.
UPDATE!!!
팀원들과 코드 리뷰를 하며 해당 오류에 대해 함께 고민한 결과, @EnableJpaAuditing 에노테이션을 넣지 않은 것을 깨닫게 되었다.
넣고 Timestamped를 상속받으니 날짜가 원활하게 확인되었다.
@EnableJpaAuditing 에 관한 정보는 아래 포스트에 정리해놓았다!
https://earlgrey-is-here.tistory.com/78
TIL) @EnableJpaAuditing 은 무엇인가?
@EnableJpaAuditing 스프링 프레임워크에서 JPA를 사용할 때 제공하는 기능 중 하나입니다. 이 어노테이션을 사용하면 엔티티(모델 클래스)의 생성일자와 수정일자를 자동으로 기록해줍니다. 이렇게
earlgrey-is-here.tistory.com
'TIL (Today I Learned)' 카테고리의 다른 글
TIL) @ResponseBody란 무엇인가! (0) | 2023.08.20 |
---|---|
TIL) @EnableJpaAuditing 은 무엇인가? (0) | 2023.08.03 |
이번 주 목표와 오늘 한 일 (0) | 2023.08.01 |
WIL) 절제가 부족한 개발자 (0) | 2023.07.30 |
TIL) 자바의 정석 기초편 chapter 3 연습문제 - 연산자 (0) | 2023.07.27 |