반응형
1. JPA Auditing
프로젝트를 진행하다보면 Entity에 데이터를 언제 생성하고 수정했는지 보여주는 필드를 사용하는 경우가 많습니다.
사용자가 데이터를 업데이트 하거나 생성할 때 시간 값을 직접 넣어주고 변경하는 것은 귀찮고 실수로 인해 놓치는 경우가 발생할 수 있습니다.
이럴 때 JPA의 Auditing 기능을 이용하면 쉽게 이런 문제점을 해결할 수 있습니다.
JPA는 Entity를 지켜보다 이벤트에 반응해 생성, 수정일자 값을 자동으로 넣어준다 (Auditing : 감사)
2. Auditing 기능 활성화하기
@EnableJpaAuditing
@SpringBootApplication
public class JpaApplication {
public static void main(String[] args) {
SpringApplication.run(JpaApplication.class, args);
}
}
auditing 기능을 사용하기 위해 @EnableJpaAuditing 어노테이션을 추가해줍니다.
3. Entity 작성 및 Auditing 적용
@Entity
@EntityListeners(AuditingEntityListener.class)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String password;
@CreatedDate
private LocalDateTime createAt;
@LastModifiedDate
private LocalDateTime updateAt;
}
@EntityListeners : Entity를 DB에 적용하기 전 커스텀 콜백을 요청합니다.
@CreatedDate : 데이터 생성일자를 자동으로 저장합니다.
생성된 날짜는 변경되면 안되기 때문에 @Column(updatable = false) 넣어주기도 한다.
@LastModifiedDate : 마지막으로 데이터가 수정된 일시를 자동으로 저장합니다.
테스트코드 작성
@DataJpaTest
class UserTest {
@Autowired
UserRepository userRepository;
@Test
@DisplayName("auditing 테스트")
void user_auditing() {
User user = new User("12345");
User savedUser = userRepository.save(user);
assertAll(
() -> assertNotNull(savedUser.getCreateAt()),
() -> assertNotNull(savedUser.getUpdateAt())
);
}
}
4. @MappedSuperClass를 이용한 공통 매핑정보 분리
createAt 과 updateAt 같은 필드는 여러 테이블에서 공통적으로 사용되는 경우가 많습니다. 이 때 공통필드가 들어있는 BaseTimeEntity를 만들어 상속을 통해 편리하게 사용할 수 있습니다.
@MappedSuperClass는 엔티티에서 공통적으로 사용하는 매핑 정보가 필요할 때 주로 사용합니다.
@MappedSuperClass를 부모 클래스에 선언하고 해당 클래스를 상속받아서 이용합니다.
BaseTimeEntity
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@CreatedDate
private LocalDateTime createAt;
@LastModifiedDate
private LocalDateTime updateAt;
}
UserEntity
@Entity
@Getter
@Table(name = "`user`")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class User extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String password;
public User(String password) {
this.password = password;
}
}
위에서 작성했던 테스트 코드를 돌려보면 테이블에 create_at 필드와 update_at 필드가 정상적으로 생성되고,
테스트 코드도 통과한 것을 볼 수 있습니다.!
반응형
'Backend > JPA' 카테고리의 다른 글
[JPA] 프록시, 지연로딩, 즉시로딩은 무엇인가? (0) | 2024.06.17 |
---|---|
[JPA] Spring Data JPA란? (0) | 2024.06.12 |
[JPA] 영속성 컨텍스트 (0) | 2023.07.24 |
[JPA] JPA란 무엇일까? (0) | 2023.07.17 |
[JPA] @JpaDataTest에서 Auditing 기능 사용하기 (0) | 2023.06.23 |