안녕하세요. J4J입니다.
이번 포스팅은 자동으로 Datetime 설정하는 방법에 대해 적어보는 시간을 가져보려고 합니다.
LocalDateTime 이용하기
[ 1. DB 스키마 구성 ]
create table jpadatetime (
id int auto_increment primary key,
name varchar(100),
create_id varchar(50),
create_at datetime,
update_id varchar(50),
update_at datetime
);
[ 2. Datetime 설정 클래스 생성 ]
package com.spring.datetime.entity;
import java.time.LocalDateTime;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Data
@MappedSuperclass
@SuperBuilder
@NoArgsConstructor
public class Datetime {
private LocalDateTime createAt;
private LocalDateTime updateAt;
@PrePersist // 데이터 생성이 이루어질때 사전 작업
public void prePersist() {
this.createAt = LocalDateTime.now();
this.updateAt = this.createAt;
}
@PreUpdate // 데이터 수정이 이루어질때 사전 작업
public void preUpdate() {
this.updateAt = LocalDateTime.now();
}
}
[ 3. Entity 클래스 생성하여 Datetime 클래스 상속 ]
package com.spring.datetime.entity;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Data
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@NoArgsConstructor
@Entity
@Table(name = "jpadatetime")
public class Jpadatetime extends Datetime {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private String createId;
private String updateId;
}
테스트
위에서 생성한 스키마를 기준으로 자바에서 사용될 Entity와 생성일자, 수정일자 등의 데이터를 적재하기 위해 사용되는 Datetime 클래스를 생성해봤습니다.
위에서 설정한 코드들이 정상적으로 동작되는지 단위 테스트를 이용하여 데이터 작업을 진행해보겠습니다.
먼저 데이터 생성을 위해 코드를 다음과 같이 작성해주겠습니다.
package com.spring.datetime;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.spring.datetime.entity.Jpadatetime;
import com.spring.datetime.repository.JpadatetimeRepository;
@SpringBootTest
class datetimeTest {
@Autowired
JpadatetimeRepository jpadatetimeRepository;
@Test
void insert() {
Jpadatetime jpadatetime = Jpadatetime.builder()
.name("J4J")
.createId("J4J")
.updateId("J4J")
.build();
jpadatetimeRepository.save(jpadatetime);
}
}
위와 같이 코드를 작성한 뒤 테스트를 해보면 다음과 같이 시간을 따로 설정하지 않았음에도 불구하고 정상적으로 들어가는 것을 확인할 수 있습니다.
다음은 데이터 수정 작업을 처리하기 위해 다음과 같이 코드를 작성하겠습니다.
package com.spring.datetime;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import com.spring.datetime.entity.Jpadatetime;
import com.spring.datetime.repository.JpadatetimeRepository;
@SpringBootTest
class datetimeTest {
@Autowired
JpadatetimeRepository jpadatetimeRepository;
@Test
void update() {
Jpadatetime jpadatetime = jpadatetimeRepository.findById(1).get();
jpadatetime.setUpdateId("updateId");
jpadatetimeRepository.save(jpadatetime);
}
}
코드를 작성한 뒤 실행해보면 다음과 같이 생성 일자는 그대로 유지되고 수정 일자만 업데이트가 되며 원하는 데이터가 갱신되는 것을 확인할 수 있습니다.
String 이용하기
위의 코드를 보신 분들 중 자바에서 Datetime의 데이터 타입을 LocalDateTime이 아닌 String으로 하고 싶은 분들도 계실 것이라고 생각합니다.
String을 사용하고 싶으신 분들은 위의 설정에서 Datetime 클래스만 다음과 같이 변경을 해주시면 데이터 타입을 수정했지만 동일한 결과가 나오는 것을 확인할 수 있습니다.
package com.spring.datetime.entity;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Data
@MappedSuperclass
@SuperBuilder
@NoArgsConstructor
public class Datetime {
private String createAt;
private String updateAt;
@PrePersist // 데이터 생성이 이루어질때 사전 작업
public void prePersist() {
this.createAt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
this.updateAt = this.createAt;
}
@PreUpdate // 데이터 수정이 이루어질때 사전 작업
public void preUpdate() {
this.updateAt = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
이상으로 자동으로 Datetime 설정하는 방법에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
'Spring > JPA' 카테고리의 다른 글
[JPA] could not initialize proxy - no Session 에러 (0) | 2021.04.06 |
---|---|
[JPA] MapStruct, Entity ↔ DTO 변환 (1) | 2021.04.03 |
[JPA] ModelMapper, Entity ↔ DTO 변환 (0) | 2021.04.01 |
[JPA] MyBatis와 동시 사용 (DTO/엔티티 통합, 연관관계 매핑) (0) | 2021.03.31 |
[JPA] MyBatis와 동시 사용 (DTO/엔티티 분리) (7) | 2021.03.30 |
댓글