티스토리 뷰

스프링 부트 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만 상속받으면 된다.
반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday