본문 바로가기

spring boot

@EnableJpaAuditing을 별도의 config 파일에 분리 시 테스트에서 인식 안되는 문제

데이터의 생성일자, 수정일자를 jpa를 통해 자동으로 넣기 위해 BaseEntity를 생성하고, entity 저장 시 등록 되는지 테스트를 해보았으나 결과값이 null로 나왔다.

 

@EnableJpaAuditing을  Application.java에 추가하지 않고 JpaConfig 파일을 별도로 만들어서 추가한 이유는,  Mock 테스트 시 사용하는 @WebMvcTest와 충돌하기 때문이다.

 

위의 이유로 JpaConfig 파일을 별도로 생성했으나, 문제는 테스트할 때 @EnableJpaAuditing이 인식되지 않는건지 계속 createdDate가 null로 나왔다. 

 

JpaConfig.java

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@Configuration
@EnableJpaAuditing //테스트 진행 시@WebMvcTest와 충돌을 막기위해 JpaConfig 별도 생성
public class JpaConfig {

}

 

BaseTimeEntity.java

import java.time.LocalDateTime;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;

import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import lombok.Getter;

@Getter
@MappedSuperclass //JPA Enitiy 클래스들이 BaseTimeEntity을 상속할 경우 필드들도 칼럼으로 인식하도록 함.
@EntityListeners(AuditingEntityListener.class) //클래스에 Auditing 기능을 포함시킴
public class BaseTimeEntity {
	
	@CreatedDate
	@Column(updatable = false)
	private LocalDateTime createdDate;
	
	@LastModifiedDate
	private LocalDateTime lastModifiedDate;

}

 

Member.java (엔티티)

public class Member extends BaseTimeEntity{
...
}

 

MemberTest.java

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class MemberTest {

	@Autowired
	private MemberRepository repository;
    
	@Test
	@DisplayName("회원 저장 확인")
	void test_member() {
		String email = "abc@googole.com";
		String password = "1234";
		String nickname = "foo";
		String salt = encryption.getSalt();
		String encPass = encryption.sha256encode(password, salt);
		
		Member member = Member.builder()
				.email(email)
				.password(encPass)
				.nickname(nickname)
				.role(Role.GUEST)
				.build();
		Member savedUser = repository.save(member); //member 등록
        assertThat(savedUser.getCreatedDate()).isNotNull();
	}

 

이전 다른 프로젝트때는 잘 됐는데 왜 안되나 했더니, 이전에는 테스트 시 @SpringBootTest어노테이션을 이용해 모든 빈을 스캔하고 있어서 JpaConfig도 알아서 인식이 되는거였는데, 이번 테스트에서는 추가하지 않아 Application.java에 @EnableJpaAuditing을 추가하면 인식이 되고, JpaConfig.java에 옳기면 인식이 안되는 것이였다. 테스하는데 모든 빈을 스캔할 필요는 없다고 생각해서 @SpringBootTest를 추가하지 않았는데 이 부분을 신경쓰지 않고 계속 JpaConfig와 BaseTimeEntity만 들여다보고있었다...

JpaConfig만 스캔하고 싶다면 @Import(xxx.class)를 사용하면 된다.

@Import(JpaConfig.class) //Bean 스캔 추가
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class MemberTest {

	@Autowired
	private MemberRepository repository;
    
	@Test
	@DisplayName("회원 저장 확인")
	void test_member() {
		String email = "abc@googole.com";
		String password = "1234";
		String nickname = "foo";
		String salt = encryption.getSalt();
		String encPass = encryption.sha256encode(password, salt);
		
		Member member = Member.builder()
				.email(email)
				.password(encPass)
				.nickname(nickname)
				.role(Role.GUEST)
				.build();
		Member savedUser = repository.save(member); //member 등록
        assertThat(savedUser.getCreatedDate()).isNotNull();
	}

 

참고 블로그 : 

https://hellorennon.tistory.com/9

 

@EnableJpaAuditing을 분리해야하는 이유

JpaAuditing은 무엇일까? Jpa에서는 Audit이라는 기능을 제공하고 있다. Spring Data Jpa 에서 시간에 대한 값을 자동으로 넣어주는 기능이다. 엔티티를 저장하거나 UPDATE하는 경우, 생성 날짜와 수정 날짜

hellorennon.tistory.com

https://mangkyu.tistory.com/242

 

[Spring] 스프링부트 테스트를 위한 의존성과 어노테이션, 애플리케이션 컨택스트 캐싱(@SpringBootTes

스프링부트에서 테스트를 작성하기 위한 다양한 어노테이션(@SpringBootTest, @WebMvcTest, @DataJpaTest)들을 알아보도록 하겠습니다. 실제 테스트를 작성하는 방법은 이 포스팅을 참고해주세요. 1. 스프링

mangkyu.tistory.com