데이터의 생성일자, 수정일자를 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