![[삽질록] DataIntegrityViolationException예외 해결 : AuditingFields → JpaConfig 설정하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0g1oW%2FbtsI4TpUisR%2FZskfwQepeBrxe9dBnvqdFK%2Fimg.png)
Jpa Auditing 이란?
Spring Data JPA에서 누가, 언제에 대한 값을 자동으로 넣어주는 기능
🆘 문제상황
not-null property references a null or transient value : cohttp://m.project.sns.domain.Post.createdAt
org.springframework.dao.DataIntegrityViolationException: not-null property references a null or transient value : cohttp://m.project.sns.domain.Post.createdAt
→ JPA 연동 테스트를 진행하던 중에 위의 insert 테스트의 Post savedPost = postRepository.saveAndFlush(post); 에서 에러가 발생했다.
@Column(nullable = false) 가 적용되어 있는 컬럼에 null 값을 넣으면서 발생한 문제였다.
Post class
Auditing class
@EntityListeners(AuditingEntityListener.class)
: BaseTimeEntity는 모든 Entity의 상위클래스가 되어 Entity들의 createdDate, modidiedDate를 자동으로 관리하는 역할
: Jpa Entity들이 @MappedSuperClass가 선언된 클래스를 상속할 경우, 클래스의 필드를 컬럼으로 인식하도록 함
예외 발생의 이유
@EnableJpaAuditing 어노테이션이 없으면 Spring Data JPA는 Auditing 기능을 활성화하지 않기 때문에,
@CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 어노테이션이 전혀 동작하지 않는다.
→ 이로 인해 createdBy, modifiedBy와 같은 필드가 초기화되지 않고 null 상태로 남아 있게 됨
→ 이 필드들이 @Column(nullable = false)로 설정되어 있기 때문에, null 값으로 데이터베이스에 저장하려고 하면 DataIntegrityViolationException이 발생함
✅ 해결
해결방법
- @EnableJpaAuditing 어노테이션을 꼭 설정하여 JPA Auditing 기능을 활성화하자!
- 또한, AuditorAware 빈을 정의하여, createdBy와 modifiedBy 필드에 저장될 사용자의 정보를 제공해야 한다!
→ Configuration으로 선언되어있는 빈을 테스트 코드에 적용시키자
JpaConfig 설정
Spring Security나 인증 기능을 적용하지 않은 상태에서, @CreatedBy는 누구인지 식별할 수 없다.
이것을 셋팅하기 위해 설정이 필요하다.
- @EnableJpaAuditing : jpa auditing 기능을 활성화
- @Bean : 리턴되는 객체가 IoC 컨테이너 안에 빈으로 등록
- AuditorAware<String> 인터페이스 : 현재 시스템에서 활동 중인 사용자를 식별하여 반환하는 역할
- 예시 : createdBy와 modifiedBy 필드에 저장될 사용자의 이름을 제공
⇒ JpaConfig 클래스에 정의된 JPA Auditing 기능과 AuditorAware 빈이 현재 애플리케이션 컨텍스트에 포함되며, 이를 통해 Post와 같은 엔티티에서 Auditing 필드(createdAt, createdBy, modifiedAt, modifiedBy)가 정상적으로 작동한다.
Configuration으로 선언되어있는 빈을 테스트 코드에 적용 - @Import(JpaConfig.class)
⇒ 테스트성공
✅ Git
'Back-end > Error' 카테고리의 다른 글
[삽질록] Docker Desktop 설치시 "sw_vers" $PATH 에러 해결 (0) | 2024.09.18 |
---|---|
[삽질록] 민감 정보의 환경변수 치환 후 테스트 실패 현상 (0) | 2024.08.30 |
[삽질록] Spring Security 인증 구현 하고 insert 테스트 오류 (AuditorAware) (0) | 2024.08.29 |
[삽질록] Spring Security 인증 구현 이전에 테스트 코드 실행 시 401 에러 해결 (0) | 2024.08.17 |
[ERROR] (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 (0) | 2022.04.27 |