본문 바로가기
SpringBoot

(2-3) - 스프링부트로 웹 서비스 출시하기 : SpringBoot & JPA로 간단 API 만들기

by ZEC 2021. 2. 9.

안녕하세요:) 저번 시간에 이어서 SpringBoot & JPA로 간단한 API 만들기 (2-3)

시작하겠습니다. 계속 이어지는 글이기 때문에 게시글 링크를 남겨드립니다.

 

 

(2-2) - 스프링부트로 웹 서비스 출시하기 : SpringBoot & JPA로 간단 API 만들기

안녕하세요:) 저번 시간에 이어서 SpringBoot & JPA로 간단한 API 만들기 (2-2) 시작하겠습니다. 저번 글을 보지 않으셨다면 따라올 수 없기에 전 게시글 링크를 아래에 남겨드립니다. (2-1) - 스프링부트

devzec.tistory.com

생성시간/수정시간 자동화 - 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을 사용하여 화면을 만들어보도록 하시죠!

댓글