안녕하세요:) 저번 시간에 이어서 SpringBoot & JPA로 간단한 API 만들기 (2-3)
시작하겠습니다. 계속 이어지는 글이기 때문에 게시글 링크를 남겨드립니다.
생성시간/수정시간 자동화 - JPA Auditing
보통 Entity에는 해당하는 데이터의 생성 및 수정시간을 포함을 시키는데요.
이것은 차후 유지보수를 하거나 데이터의 정확성을 판단하는 데 있어서 중요한 정보입니다.
그렇기 때문에 날짜 데이터를 등록/수정하는 코드가 여기저기에 들어가게 됩니다.
그래서 JPA Auditing을 사용하도록 하겠습니다.
package com.zecgwon.webservice.domain;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
src/test/java/com/zecgwon/webservice/domain 경로에
BaseTimeEntity.java 클래스를 만들어줍니다.
BaseTimeEntity 클래스는 모든 Entity들의 상위 클래스가 되어 Entity들의 createdDate, modifiedDate를 자동으로 관리하는 역할입니다.
- @MappedSuperclass
- JPA Entity 클래스들이 BaseTimeEntity을 상속할 경우 필드들(createdDate, modifiedDate)도 컬럼으로 인식하도록 합니다.
- @EntityListeners(AuditingEntityListener.class)
- BaseTimeEntity클래스에 Auditing 기능을 포함시킵니다.
- @CreatedDate
- Entity가 생성되어 저장될 때 시간이 자동 저장됩니다.
- @LastModifiedDate
- 조회한 Entity의 값을 변경할 때 시간이 자동 저장됩니다.
...
public class Posts extends BaseTimeEntity {
...
}
추가가 다 되셨다면 Posts 클래스가 BaseTimeEntity를 상속받도록 변경해줍니다.
@EnableJpaAuditing // JPA Auditing 활성화
@SpringBootApplication
public class SpringWebserviceApplication {
public static void main(String[] args) {
SpringApplication.run(SpringWebserviceApplication.class, args);
}
}
마지막으로 JPA Auditing 어노테이션들을 모두 활성화시킬 수 있도록 Application 클래스에 활성화 어노테이션 하나를 추가하겠습니다.
JPA Auditing 테스트 코드 작성하기
package com.zecgwon.webservice.domain;
import com.zecgwon.webservice.domain.posts.Posts;
import com.zecgwon.webservice.domain.posts.PostsRepository;
import org.junit.After;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.time.LocalDateTime;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {
@Autowired
PostsRepository postsRepository;
@After
public void cleanup() {
/**
이후 테스트 코드에 영향을 끼치지 않기 위해
테스트 메소드가 끝날때 마다 respository 전체 비우는 코드
**/
postsRepository.deleteAll();
}
@Test
public void 게시글저장_불러오기() {
//given
postsRepository.save(Posts.builder()
.title("테스트 게시글")
.content("테스트 본문")
.author("zecgwon@gmail.com")
.build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
assertThat(posts.getTitle(), is("테스트 게시글"));
assertThat(posts.getContent(), is("테스트 본문"));
}
@Test
public void BaseTimeEntity_등록 () {
//given
LocalDateTime now = LocalDateTime.now();
postsRepository.save(Posts.builder()
.title("테스트 게시글")
.content("테스트 본문")
.author("zecgwon@gmail.com")
. build());
//when
List<Posts> postsList = postsRepository.findAll();
//then
Posts posts = postsList.get(0);
assertTrue(posts.getCreatedDate().isAfter(now));
assertTrue(posts.getModifiedDate().isAfter(now));
}
}
앞전에 추가했었던 테스트 코드에 BaseTimeEntity_등록 테스트 메서드를 하나 더 추가해줍니다.
테스트 코드를 실행하면 정상적으로 테스트가 통과한 걸 확인할 수 있습니다.
그럼 실제로 앱을 실행하고 포스트맨으로 데이터를 전송해보면!
이렇게 created_date와 modified_date의 값이 추가된 것을 확인할 수 있습니다.
이렇게 해서 SpringBoot & JPA로 간단 API 만들기가 끝났고요!
다음 시간에는 View Template을 사용하여 화면을 만들어보도록 하시죠!
'SpringBoot' 카테고리의 다른 글
(3-2) - 스프링부트로 웹 서비스 출시하기 : SpringBoot & Handlebars로 화면 만들기 (0) | 2021.03.07 |
---|---|
(3-1) - 스프링부트로 웹 서비스 출시하기 : SpringBoot & Handlebars로 화면 만들기 (1) | 2021.02.14 |
(2-2) - 스프링부트로 웹 서비스 출시하기 : SpringBoot & JPA로 간단 API 만들기 (0) | 2021.02.09 |
SpringBoot H2 DB 연결 에러 (0) | 2021.02.09 |
(2-1) - 스프링부트로 웹 서비스 출시하기 : SpringBoot & JPA로 간단 API 만들기 (0) | 2021.02.07 |
댓글