반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- react
- cypressBDD
- 헤드퍼스트전략패턴
- git squash
- react-ga
- Git commit 합치기
- 리액트구글애널리틱스
- formik submitting not working
- formik react-query submitting not working
- 시스템설계면접
- 가상면접2장
- cypress React
- gitsquash
- s3이미지다운로드됨
- git commit 협업
- 시스템설계
- 리팩터링2판테스트
- 시스템설계방법
- 리팩토링2판4장
- FirebaseAnalytics
- 테스트코드책
- file not found Error
- 시스템설계면접예시
- 시스템설계면접팁
- 가상면접으로대규모시스템
- awss3
- 가상면접3장
- 디자인패턴
- git commit merge
- 전략패턴
Archives
- Today
- Total
mingg IT
[Spring] EntityListeners 사용하기 본문
this.updatedAt = LocalDateTime.now() 와 같이 많이 DTO에서 많이 사용하는 부분을
EntityListeners를 사용하여 반복된 코딩을 하지 않을 수 있다.
MyEntityListner.java
package com.jps.bookmanager.domain;
import java.time.LocalDateTime;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
public class MyEntityListner {
@PrePersist
public void prePersist(Object o) {
if(o instanceof Auditable) {
((Auditable) o).setCreatedAt(LocalDateTime.now());
((Auditable) o).setUpdatedAt(LocalDateTime.now());
}
}
@PreUpdate
public void preUpdate(Object o) {
if(o instanceof Auditable) {
((Auditable) o).setCreatedAt(LocalDateTime.now());
((Auditable) o).setUpdatedAt(LocalDateTime.now());
}
}
}
setCreatedAt(), setUpdatedAt()을 함수를 사용하기 위해 interface 를 하나 만든다.
Auditable.java
package com.jps.bookmanager.domain;
import java.time.LocalDateTime;
public interface Auditable {
LocalDateTime getCreatedAt();
LocalDateTime getUpdatedAt();
void setCreatedAt(LocalDateTime createdAt);
void setUpdatedAt(LocalDateTime updateAt);
}
Book.java
package com.jps.bookmanager.domain;
import java.time.LocalDateTime;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@NoArgsConstructor
@Data
@EntityListeners(value = MyEntityListner.class)
public class Book implements Auditable{
@Id
@GeneratedValue
private Long id;
private String name;
private String author;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
// @PrePersist
// public void perPersist(){
// this.createdAt = LocalDateTime.now();
// this.updatedAt = LocalDateTime.now();
// }
// @PreUpdate
// public void preUpdate() {
// this.updatedAt = LocalDateTime.now();
// }
}
@EntityListeners(value = MyEntityListner.class) 를 사용한다.
BookRepositoryTests.java
package com.jps.bookmanager.repository;
import com.jps.bookmanager.domain.Book;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class BookRepositoryTests {
@Autowired
private BookRepository bookRepository;
@Test
void bookTest() {
Book book = new Book();
book.setName("jpa 패키지");
book.setAuthor("저자");
bookRepository.save(book);
System.out.println(bookRepository.findAll());
}
}
결과를 확인해보면
맞게 들어간 것을 확인할 수 있다.
@EntityListeners(value = MyEntityListner.class) 부분을 주석처리를 하게 되면 createdAt, updateAt이 null 로 들어간다.
지금은 하나의 DTO로 테스트 했지만 여러 DTO간에 공통된 부분을 묶어서 EntityListener를 사용하면 중복된 코딩을 막을 수 있다.
'BackEnd' 카테고리의 다른 글
[Spring] 스프링 log level 변경하기 (0) | 2021.11.17 |
---|---|
[Spring] JdbcTemplate 사용법 (0) | 2021.08.17 |
[Spring] Swagger UI 사용법 (0) | 2021.07.27 |
[Spring] 네이버 API 사용 예시 (0) | 2021.07.19 |
[Spring] Vs Code lombok 사용하기 (Get, Set 메소드 만들지 않아도됨) (0) | 2021.07.04 |
Comments