문제점
최근에 알게 된 어노테이션인 @CreatedDate
와 @LastModifiedDate
를 사용할 때 값이 제대로 들어가지 않는 이슈가 있었다.
- 이유를 찾아보았고 문제는 다음과 같았다.
@EnableJpaAuditing
@EntityListeners
단순히 사용할 필드에 두 어노테이션을 붙히기만 하는 것이 아닌 위 두 어노테이션을 통해 기능을 활성화 해야지 정상적으로 동작한다.
해결
Application 실행 부분에서 @EnableJpaAuditing
어노테이션으로 Auditing 기능을 활성화 해야한다.
@SpringBootApplication
@EnableJpaAuditing
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
이후 사용해야하는 Entity에서 @EntityListeners
어노테이션을 이용하여 엔티티의 변화를 감지하고 생성날짜, 수정날짜를 자동으로 입력할 수 있게 해준다!
@Entity @Getter
@NoArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class Question {
@Id
@GeneratedValue
private Long id;
@Column(length = 100)
private String subject;
@Column(columnDefinition = "TEXT")
private String content;
@CreatedDate
@Column(updatable = false)
private LocalDateTime createDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
추가 팁
BaseEntity를 만들어두어 모든 Entity에 @CreatedDate
와 @LastModifiedDate
어노테이션을 쓰지 않도록 해주면 좋다.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
그러면 Entity에서는 아래처럼 사용이 가능하다.
@Entity @Getter
@NoArgsConstructor
public class Question extends BaseEntity{
@Id
@GeneratedValue
private Long id;
@Column(length = 100)
private String subject;
@Column(columnDefinition = "TEXT")
private String content;
}
참고
'트러블슈팅' 카테고리의 다른 글
[오류를 잡아보자] NoClassDefFoundError / ClassNotFoundException: org.hibernate.dialect.MySQL57Dialect (2) | 2024.01.28 |
---|---|
Kakao Login 시 401 Unauthorized (1) | 2024.01.26 |
[오류를 잡아보자] 생성자 바인딩 이슈 (Cannot resolve parameter names for constructor) (0) | 2024.01.17 |
[오류를 잡아보자] JSON 직렬화에서의 이슈 해결 (through reference chain) (0) | 2024.01.12 |
WSL 설치 오류 (1) | 2023.12.20 |