티스토리 뷰
스프링/스프링부트 RestAPI 프로젝트
spring boot REST API Web 프로젝트 (8) - Entity에 JPA Auditing으로 생성시간/수정시간 적용
구름뭉치 2021. 8. 15. 10:00스프링 부트 REST API WEB 프로젝트
깃헙 링크
https://github.com/choiwoonsik/springboot_RestApi_App_Project/tree/main/restApiSpringBootApp
수행 목록
- 환경구성 및 helloworld 출력
- H2 DB 연동
- Swagger API 문서 연동
- REST API 설계
- RestControllerAdvice를 이용한 통합 예외 처리
- Entity - DTO 분리
- MessageSource를 이용해 예외 메시지 다국화
- JPA Aduting을 이용해 객체 생성시간/수정시간 적용
- 스프링 시큐리티 + Jwt를 이용해서 인증 및 권한 체크
- 스프링 시큐리티 AuthenticationEntryPoint, AccessDenied로 인증 및 인가 예외처리
- Jwt AccessToken + RefreshToken으로 보안성과 사용자 편의성 고도화하기
- JUnit Test (단위 테스트)
- JUnit Test (통합 테스트)
- OAuth 2.0 정리
- OAuth 2.0 카카오 로그인 part.1 Authorization code + Token 발급
- OAuth 2.0 카카오 로그인 part.2 토큰으로 회원 가입 / 로그인
- OAuth 2.0 카카오 로그인 테스트 검증
- 환경별 설정을 위해서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 프로젝트' 카테고리의 다른 글
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday