๐ Entity Listener
์ด๋ฒคํธ์ ๋ฐ๋ฅธ ์ํฐํฐ์ ์ ์ฒ๋ฆฌ, ํ์ฒ๋ฆฌ
JPA์์ ์ ๊ณต๋๋ 7๊ฐ์ง ์ด๋ฒคํธ
- ์ ์ฒ๋ฆฌ Listener
- @PrePersist (persist ํธ์ถ ์ )
- @PreUpdate (merge(update) ํธ์ถ์ )
- @PreRemove (delete ํธ์ถ์ )
- ํ์ฒ๋ฆฌ Listener
- @PostPersist
- @PostUpdate
- @PostRemove
- @PostLoad select(์กฐํ) ํ์ ํธ์ถ
์ํฐํฐ์ ์ง์ ์ ์ํ๋ ๋ฐฉ์
@PrePersist
public void prePersist() {
log.info("prePersist ํธ์ถ");
}
@PostPersist
public void postPersist() {
log.info("postPersist ํธ์ถ");
}
@PostLoad
public void postLoad() {
log.info("postLoad ํธ์ถ");
}
Auditng
โ๏ธ ์๋ ๋ฉ์๋๊ฐ ์ ์๋ ์ํฐํฐ์ persist(์ ์ฅ) ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด persist ์ ์ ์๋ ๋ฉ์๋๋ฅผ ๋จผ์ ์ํํ๋ค.
Listener๋ฅผ ํตํด persist์ ์๋์ผ๋ก ํ๋ ์ด๊ธฐํ ๊ฐ๋ฅ
@PrePersist
public void prePersist() {
this.createdAt = LocalDateTime.now();
this.updatedAt = LocalDateTime.now();
}
โ๏ธ ์๋ ๋ฉ์๋๊ฐ ์ ์๋ ์ํฐํฐ์ update(์์ ) ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด update ์ ์ ์๋ ๋ฉ์๋๋ฅผ ๋จผ์ ์ํํ๋ค.
Listener๋ฅผ ํตํด ์์ ์๊ฐ์ ์๋์ผ๋ก ๊ฐฑ์ ๊ฐ๋ฅ
@PreUpdate
public void preUpdate() {
this.upadtedAt = LocalDateTime.now();
}
EntityListener ํด๋์ค ์์ฑ
โ๏ธ EntityListener Class ์์ฑ
public class MyEntityListener{
...
}
โ๏ธ Entity์ ์์ฑํ EntityListener Class๋ฅผ ๋ฑ๋ก
@EntityListeners๋ฅผ ํตํด ์ ์ํ ๋ฆฌ์ค๋ ํด๋์ค๋ฅผ ์ฌ๋ ค ๊ฐ ๋ฑ๋ก ๊ฐ๋ฅ
@EntityListeners(value = MyEntityListener.class)
public class User{
...
}
๋ณ๊ฒฝ์ ๋ํ ํ์คํ ๋ฆฌ ๋ง๋ค๊ธฐ
User ์ํฐํฐ์ ๋ํ ํ์คํ ๋ฆฌ๋ฅผ ์ ์งํ๊ณ ์ ํจ
- @PreUpdate๋ฅผ ์ด์ฉํด์ ์ ๋ฐ์ดํธ ์ด์ ์ํฐํฐ์ ์ํ๋ฅผ ๋ฐฑ์
- User์ ๋์ผํ UserHistory ์ํฐํฐ ์์ฑ
- UserEntity์ Listener ํด๋์ค ์์ฑ
โ๏ธ ๋ฆฌ์ค๋ ํด๋์ค ์์ฑ
public class UserListener{
@PreUpdate
public void preUpdate(Object o) {
User user = (user) o;
UserHistory userHistory = new UserHistory();
userHistory.setName(user.getName());
userHistory.setEmail(user.getEmail());
userHistory.setAge(user.getAge());
userHistory.save(userHistory);
}
}
Listener ํด๋์ค์์ Bean์ ์ฃผ์ ๋ฐ๋ ๋ฐฉ๋ฒ
๋ฆฌ์คํฐ ํด๋์ค์์๋ ๋ณดํต์ ๋ฐฉ๋ฒ @Autowired, ์์ฑ์ ์ฃผ์
๋ฑ์ผ๋ก ์ฃผ์
์ด ๋ถ๊ฐ๋ฅํจ.
(Listenerํด๋์ค์์ repository ๋ฑ์ ์ฌ์ฉํด์ผํ๋ ๊ฒฝ์ฐ)
์์ฑํ BeanUtilsํด๋์ค๋ฅผ ํตํด Bean์ ์ง์ ์ฐ์ด์ ๊ฐ์ ธ์ด
ApplicationContextAware๋ฅผ ๊ตฌํํ๋ ํด๋์ค ์์ฑApplicationContextAware์ ๊ตฌํ ๋ฉ์๋์ธ setApplicationContext ๊ตฌํ- setApplicationContext์์ ApplicationContext๋ฅผ ๋ฐ์์ฌ ์ ์์.
- ํด๋์ค ํ์ ์ผ๋ก ๋น์ ์กฐํํ ์ ์๋ ๋ฉ์๋ ์ ์ (getBean)
@Component
public class BeanUtils implements ApplicationContextAware {
private static ApplicationContext ac;
// ApplicationContext ์ฃผ์
@Override
public void setApplicationContext(ApplicationContext ac) {
BeanUtils.ac = ac;
}
public static <T> T getBean(Class<T> clazz) {
return ac.getBean(clazz);
}
}
โ๏ธ UserRepository๋ฅผ ๊ฐ๊ณ ์ค๊ณ ์ถ๋ค๋ฉด ?
BeanUtils.getBean(UserRepository.class);
Spring์ด ์ ๊ณตํ๋ Listener
AuditingEntityListener
- Mainํด๋์ค์ @EnableJpaAuditing ์ถ๊ฐ
- @EntityListeners = (value = {AuditingEntityListener.class,})
- @CreatedDate, @LastModifiedDate ์ฌ์ฉ๊ฐ๋ฅ
- @CreatedBy, @LadModifedBy ์ฌ์ฉ๊ฐ๋ฅ
๐ ์๊ฐ์ธ์ฆ

ํจ์คํธ์บ ํผ์ค [์ง์ฅ์ธ ์ค๋ฌด๊ต์ก]
ํ๋ก๊ทธ๋๋ฐ, ์์ํธ์ง, UX/UI, ๋ง์ผํ , ๋ฐ์ดํฐ ๋ถ์, ์์ ๊ฐ์, The RED, ๊ตญ๋น์ง์, ๊ธฐ์ ๊ต์ก, ์๋น์ค ์ ๊ณต.
fastcampus.co.kr