오늘은 2주차 강의를 모두 시청 한 뒤 레벨1 과제를 진행하였다.
과제는 간단한 게시글 작성, 조회, 수정, 삭제의 CRUD기능 구현이었다.
이전에 스프링으로 진행했던 CRUD구현이기도 하고 강의에서도 했던 기능들이라 큰 어려움 없이 모든 기능을 구현할 수 있었다.
그래서 이전에 진행했던 프로젝트와 어떻게 다르게 진행했는지 회고해보기로 했다.
우선 기존의 CreatedAt과 ModifiedAt을 Entity에 저장할때에는 Service에서 직접 Date객체를 사용하여 현재시간을 Entity에 set하였지만 이번 과제에서는 JPA Auditing을 적용하였다.
JPA Auditing이란 JPA가 특정한 이벤트에 반응하여 등록일, 수정일, 등록자 등과 같은 데이터를 입력해준다.
특히 생성시간, 수정시간은 포스팅, 게시글, 댓글 등 다양한 엔티티에 자주 활용되는데 각각의 엔티티에 모두 같은 로직을 작성하는것은 비효율적이다.
@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;
}
우선 추상클래스를 선언한다.
@MappedSuperclass
Entity 클래스가 해당 추상 클래스를 상속할 경우 추상 클래스에 선언한 멤버 변수를 컬럼으로 인식할 수 있다.
@EntityListeners(AuditingEntityListener.class)
해당 클래스에 Auditing기능을 포함시켜 준다.
@CreatedDate
@Column(updatable = false)
Entity객체가 생성되어 저장될 때 시간이 자동으로 저장된다.
최초 생성시간이 저장되고 그 이후에는 수정되면 안되기 때문에 updatable = false옵션을 추가한다.
@LastModifiedDate
@Column
조회한 Entity객체의 값을 변경할 때 변경된 시간이 자동으로 저장된다.
최초에는 생성시간과 같은 시간이 저장되고 그 이후에는 변경 시간이 저장되기 때문에 updatable = false옵션을 추가하지 않았다.
@Temporal(TemporalType.TIME_STAMP)
DB에는 시간을 나타내는 타입이 세가지인데
- DATE ex) 2023-01-01
- TIME ex) 20:21:14
- TIMESTAMP ex) 2023-01-01 20:22:38.771000
※ 주의사항
서버를 실행시키는 @SpringBootApplication이 있는 클래스에 @EnableJpaAuditing을 추가해주어야 JPA Auditing기능을 사용할 수 있다.
그 후에 JPA Auditing을 적용하고싶은 Entity클래스에서 추상클래스를 상속받으면 된다.
테이블에서 볼 수 있듯 엔티티에는 id, title, password, content, author만 존재하지만 DB의 테이블에는 created_at과 modified_at이 함께 저장되어있다.
'백엔드(Back End) > Spring' 카테고리의 다른 글
[TIL]20230629 - Resttemplate, JPA Entity연관 관계 (0) | 2023.06.29 |
---|---|
[TIL]20230628 - Spring Security, Spring Ec2 배포 (0) | 2023.06.29 |
[Spring] JDBC (0) | 2023.06.26 |
[Spring] HTTP 데이터를 객체로 처리하는 방법 Model Attribute와 Request Body (0) | 2023.06.26 |
[Spring] HTTP 데이터를 변수로 처리하는 방법 Path Variable과 Request Param (0) | 2023.06.26 |