TIL 20240109- JPA Auditing

2024. 1. 9. 22:05스프링

오늘은 createdAt과 updatedAt를 넣어보는 작업을 할 것이다.

 

JPA Auditing을 이용해서 해볼 생각인데,

 

Audit은 감시하다, 감사하다라는 뜻으로 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능이다. 도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후에 update를 하는 경우 매번 시간 데이터를 입력하여 주어야 하는데, audit을 이용하면 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어주는 것이라고 한다.

 

data class PostResponse(
    val id: Long,
    val title: String,
    val content: String,
    val createdAt: LocalDateTime,
    val updatedAt: LocalDateTime
)

 

PostResponse에 LocalDateTime 데이터 타입을 넣어주어 생성하게 하였고, 

Post 엔티티에 따로 createdAt, updatedAt 을 넣어 주는 것이 아니라

 

아래처럼 BaseTimeEntity를 작성해 준 후, 

 

@MappedSuperclass
@EntityListeners(AuditingEntityListener::class)
abstract class BaseTimeEntity {

    @CreatedDate
    @Column(nullable = false, updatable = false)
    var createdAt: LocalDateTime = LocalDateTime.MIN
        protected set

    @LastModifiedDate
    @Column(nullable = false)
    var updatedAt: LocalDateTime = LocalDateTime.MIN
        protected set
}

 

getter는 모든 곳에서 허용하되, setter만 protected으로 바꿔서 동일패키지에 속하는 클래스와 하위클래스 관계에서 접근 가능한 범위내에서만 값을 변경 할 수 있도록 하였다.

 

MIN 같은 경우 지원되는 최소 날짜를 의미 하는 것으로 공식 문서를 참고하였다.

 

 

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html

 

LocalDateTime (Java Platform SE 8 )

Returns a copy of this date-time with the specified field set to a new value. This returns a LocalDateTime, based on this one, with the value for the specified field changed. This can be used to change any supported field, such as the year, month or day-of

docs.oracle.com

 

 

nullable = false, updatable = false 이라는 부분에 대해서도 간략히 정리하자면,

nullable = false은 널 값을 받지 않는다는 뜻이다.

 

마찬가지로 updateable = false 는 update 시점에 막는 기능이며,

 

updateable :

엔티티 수정 시 이 필드도 같이 저장한다.
false 로 설정하면 데이터베이스에 수정하지 않는다.
읽기 전용일 때 사용한다. 

 

이외에도 insertable이 있는데,

insertable = false 는 insert 시점에 막는 것이다.
insertable :
엔티티 저장 시 이 필드도 같이 저장한다.
false 로 설정하면 데이터베이스에 저장하지 않는다.
읽기 전용일 때 사용한다. 

 

 

 

 

그리고 우선 post의 엔티티에 상속 받게 하였다!

 

@Entity
@Table(name = "post")
class Post(title: String, content: String) : BaseTimeEntity() {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Long? = null

    @Column(nullable = false)
    var title = title

    @Column(nullable = false)
    var content = content
}

 

그리고 toResponse 부분에

fun Post.toResponse(): PostResponse {
    return PostResponse(
        id = id!!,
        title = title,
        content = content,
        createdAt = this.createdAt,
        updatedAt = this.updatedAt
    )
}

 

createaAt 부분을 this.createdAt, updatedAt 부분을 this.updatedAt 으로 해주었다..

사실 title이나 content 처럼 작성했다가 계속해서 빨간 줄이 뜨길래,, 우째야하지 싶었는데

this 해당 키워드를 사용한 클래스 자신을 지칭할 때 사용하는 것이니까,, 적당할 것 같아서...! 수정해주었더니 잘 되었다.

 

 

 

 

이렇게 자동적으로 나오는 것을 볼 수 있다!!

 

 

이제 나머지 comment나 앞으로 만들 user 부분도 추가해서 올릴 생각이다.

 

 


새로운 개념을 알게 돼서 좋았다.. 사실 응용해서 해본건데,, 첨에 잘 안되다가 포기 하지 않고 해보니까 입력값이 잘 나오게 되었다 ㅠㅠㅠ 후,, 아직은 직접 코드를 하나하나 입력해서 한 것은 아니지만,, 이제 내 것으로 만들어야지,,

이번주는 첫 프로젝트인만큼 정신없어서 복습을 하진 못하겠지만 주말을 통해서 했던거 다시 보고 시도해보고 할 생각이다! 이론도 조금 더 찾아봐서 이해 해보는 시간을 가져야 할 것 같다.

'스프링' 카테고리의 다른 글

TIL 20240115- 뉴스피드 프로젝트 KPT 회고  (2) 2024.01.15
TIL 20240110- MVC 패턴  (0) 2024.01.10
TIL 20240108- 뉴스피드 프로젝트 시작  (0) 2024.01.08
TIL 20240105  (0) 2024.01.05
TIL20231231  (0) 2023.12.31