spring boot REST API Web 프로젝트 (8) - Entity에 JPA Auditing으로 생성시간/수정시간 적용

2021. 8. 15. 10:00·스프링/스프링부트 RestAPI 프로젝트

스프링 부트 REST API WEB 프로젝트

깃헙 링크

https://github.com/choiwoonsik/springboot_RestApi_App_Project/tree/main/restApiSpringBootApp

수행 목록

  1. 환경구성 및 helloworld 출력
  2. H2 DB 연동
  3. Swagger API 문서 연동
  4. REST API 설계
  5. RestControllerAdvice를 이용한 통합 예외 처리
  6. Entity - DTO 분리
  7. MessageSource를 이용해 예외 메시지 다국화
  8. JPA Aduting을 이용해 객체 생성시간/수정시간 적용
  9. 스프링 시큐리티 + Jwt를 이용해서 인증 및 권한 체크
  10. 스프링 시큐리티 AuthenticationEntryPoint, AccessDenied로 인증 및 인가 예외처리
  11. Jwt AccessToken + RefreshToken으로 보안성과 사용자 편의성 고도화하기
  12. JUnit Test (단위 테스트)
  13. JUnit Test (통합 테스트)
  14. OAuth 2.0 정리
  15. OAuth 2.0 카카오 로그인 part.1 Authorization code + Token 발급
  16. OAuth 2.0 카카오 로그인 part.2 토큰으로 회원 가입 / 로그인
  17. OAuth 2.0 카카오 로그인 테스트 검증
  18. 환경별 설정을 위해서profile 분리하기 

보통 엔티티에는 해당 데이터의 생성 시간과 수정 시간을 포함한다. 언제 만들어졌고, 언제 수정되었는지 등은 추후 유지보수에 매우 중요한 정보이기 때문이다. (유저의 생성날짜가 곧 가입날짜가 될 수 있고, 게시글의 경우 등록날짜가 될 수 있다)

 

따라서 매번 DB에 Entity를 삽입하기 전 / 갱신하기 전에 날짜 데이터르르 등록/수정하게 된다.

 

이러한 코드가 모든 테이블 및 서비스 메소드에 포함된다면 코드가 덕지덕지 더러워지게 되므로 JPA Aduiting을 사용해서 깔끔하게 적용시켜보자.

 

LocalDate를 사용해서 BaseTimeEntity 클래스 생성

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;
}
  • BaseTimeEntity는 모든 Entity의 상위 클래스가 되어 Entity들의 createdDate, modifiedDate를 자동으로 관리하는 역활을 하게 된다

MappedSuperclass

  • JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 필드들(createdDate, modifiedDate)도 Column으로 인식하도록 합니다.

@EntityListeners(AuditingEntityListener.class)

  • BaseTimeEntity 클래스에 Auditing기능을 포함시킨다.

@CreatedDate

  • Entity가 생성되어 저장될 때 시간이 자동으로 저장된다

@LastModifiedDate

  • 조회한 Entity의 값을 변경할 때 시간이 자동으로 저장된다
User Entity가 BaseTimeEntity를 상속하도록 수정
public class User extends BaseTimeEntity {...}
JPA Auditing 애노테이션을 모두 활성화 하기 위해 Application 클래스에 활성화 애노테이션을 추가
@EnableJpaAuditing
@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

}

 

테스트 코드 작성 및 테스트

    @Test
    public void BaseTimeEntity_등록() throws Exception
    {
        //given
        LocalDateTime now = LocalDateTime
                .of(2021, 8, 5, 22, 31, 0);
        userJpaRepo.save(User.builder()
                .name("운식")
                .email("운식@이메일.com")
                .build());

        //when
        List<User> users = userJpaRepo.findAll();

        //then
        User user = users.get(0);

        System.out.println(">>>>>>> createDate = " + user.getCreatedDate()
                + ", modifiedDate = " + user.getModifiedDate());

        Assertions.assertThat(user.getCreatedDate()).isAfter(now);
        Assertions.assertThat(user.getModifiedDate()).isAfter(now);
    }

Hibernate: insert into user (created_date, modified_date, email, name) values (?, ?, ?, ?)
>>>>>>> createDate = 2021-08-05T22:34:42.123485, modifiedDate = 2021-08-05T22:34:42.123485

 

출력결과가 제대로 수행되고 테스트도 통과되었다.

 

결론

이제 등록일 / 수정일이 필요한 모든 Entity는 BaseTimeEntity만 상속받으면 된다.
반응형
저작자표시 (새창열림)

'스프링 > 스프링부트 RestAPI 프로젝트' 카테고리의 다른 글

spring boot REST API Web 프로젝트 (9-2) - 스프링 시큐리티 AuthenticationEntryPoint, AccessDeniedHandler를 이용한 예외처리  (2) 2021.08.19
spring boot REST API Web 프로젝트 (9-1) - 스프링 시큐리티 & Json Web Token을 이용해 인증, 인가, 권한 부여  (7) 2021.08.17
spring boot REST API Web 프로젝트 (7) - MessageSource를 이용해 에러메시지 다국어 제공  (0) 2021.08.13
spring boot REST API Web 프로젝트 (6) - Entity와 DTO의 분리 (Controller 수정)  (0) 2021.08.11
spring boot REST API Web 프로젝트 (5) - 예외처리를 위한 @ExceptionHandler, @ControllerAdvice 적용  (0) 2021.08.09
'스프링/스프링부트 RestAPI 프로젝트' 카테고리의 다른 글
  • spring boot REST API Web 프로젝트 (9-2) - 스프링 시큐리티 AuthenticationEntryPoint, AccessDeniedHandler를 이용한 예외처리
  • spring boot REST API Web 프로젝트 (9-1) - 스프링 시큐리티 & Json Web Token을 이용해 인증, 인가, 권한 부여
  • spring boot REST API Web 프로젝트 (7) - MessageSource를 이용해 에러메시지 다국어 제공
  • spring boot REST API Web 프로젝트 (6) - Entity와 DTO의 분리 (Controller 수정)
구름뭉치
구름뭉치
구름의 개발일기장
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (283)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (28)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (6)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    동유럽
    류블라냐
    키보드 손목 받침대
    마우스
    부다페스트
    크로아티아
    mx master s3 for mac
    마우스 패드
    레이저
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
spring boot REST API Web 프로젝트 (8) - Entity에 JPA Auditing으로 생성시간/수정시간 적용
상단으로

티스토리툴바