Springboot와 JPA를 이용해 개발을 할 때, 보통 엔티티를 만들고 이를 데이터베이스와 매핑하여 테이블을 생성합니다.
테이블의 컬럼(Column)에서 데이터가 생성된 시간 또는 업데이트된 시간을 표시해야 할 경우가 있습니다.
현재 시간과 업데이트 시간을 표기할 방법은 여러 가지 방법이 있지만, 저는 JPA의 어노테이션 중 @CreationTimeStamp와 @UpdateTimeStamp를 이용한 방법에 대해 설명하겠습니다.
그전에 알아야 할 것이 있습니다. 여러 엔티티에서 각각 현재 시간과 업데이트 시간을 표시할 속성이 필요하다고 한다면 우리는 중복되는 같은 코드를 여러 엔티티 코드에 다 작성해야 합니다.
중복되는 코드를 줄이기 위해서, 우리는 @MappedSuperClass 어노테이션을 이용해 공통된 정보를 한 곳에 모아 코드를 작성하여 상속하는 식으로 테이블에 매핑할 수 있습니다.
@MappedSuperClass 란, 무엇인가?
: 공통으로 사용할 필드나 매핑 설정들을 중복으로 작성하지 않고, 한 클래스(BaseEntity) 즉 부모 클래스에 @MappedSuperClass를 지정하여 자식 클래스들이 상속받아 공통된 필드를 사용할 수 있게 해 줍니다.
@MappedSuperClass를 사용한 (부모) 클래스는 테이블과 매핑되지 않으며, 실제로 데이터베이스에는 존재하지 않습니다.
대신, 이 클래스의 매핑 정보는 해당 클래스를 상속받은 자식 클래스에게 상속되어 매핑 정보를 공유합니다.
(자식 클래스와 매핑된 데이터베이스에서는 존재합니다.)
@MappedSuperClass 정리
- 상속 관계이며, 데이터베이스 테이블과 매핑되지 않습니다.
- 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공합니다.
- 조회, 검색이 불가합니다. (em.find() X)
- 직접 생성해서 사용할 일이 없으므로 추상 클래스로 생성합니다.
@CreationTimeStamp, @UpdateTimeStamp란 무엇인가?
: @CreationTimeStamp와 @UpdateTimeStamp는 JPA에서 제공하는 어노테이션으로, 엔티티 클래스의 필드에 사용하여 해당 필드의 생성 시간과 업데이트 시간을 자동으로 관리할 수 있게 해 줍니다.
1. @CreationTimestamp
@CreationTimestamp 어노테이션은 엔티티가 생성될 때 해당 필드에 자동으로 생성 시간을 기록합니다.
즉, 새로운 엔티티 객체가 데이터베이스에 저장될 때, 해당 필드에 현재 시간이 자동으로 저장됩니다.
추가로, @Column(updatable = false)를 설정하여 업데이트되지 않게 합니다.
2. @UpdateTimestamp
@UpdateTimestamp 어노테이션은 엔티티가 업데이트(변경)될 때 해당 필드에 자동으로 업데이트 시간을 기록합니다.
즉, 이미 데이터베이스에 저장된 엔티티 객체가 수정될 때, 해당 필드에 현재 시간이 자동으로 갱신되어 저장됩니다.
추가로, @Column(insertable = false)를 설정하여 insert 쿼리를 통해 생성되지 않게 설정하여, update 쿼리 즉 업데이트 시에만 적용되도록 합니다.
'Spring Framework > JPA' 카테고리의 다른 글
[JPA] Spring JPA 프록시 객체와 지연로딩이란 무엇인가, 사용하는 이유 (1) | 2023.10.09 |
---|---|
[JPA] Spring-JPA 엔티티 값 Update 하기 - save(), 더티체킹(Dirty Checking - set()) (0) | 2023.09.15 |
[스프링부트 API 개발] API 개발 1 - DTO로 데이터 전달하기, 지연 로딩, 컬렉션 최적화 (0) | 2023.08.12 |
[JPA] JPA 연관관계 매핑 및 지연로딩 (다대일, 일대다, 다대다) (0) | 2023.06.22 |
[JPA] JPA 영속성 컨텍스트 이해하기, 영속성 컨텍스트 장점, persist, flush (0) | 2023.05.07 |