해결된 질문
작성
·
93
0
Jpa 보면 Auditing 기능으로 자동으로 넣어주는 기능이 있는데 jooq에서도 비슷한게 있을거 같은데 recode listener 사용해서 해야하는걸까요?
아니면 일일히 넣어줘야 하나요?
답변 2
1
JaeWon Kim 님 안녕하세요.
jOOQ에서 JPA Auditing에 대응하는 기술을 찾고 계신걸로 이해했는데요.
저도 이부분에 대한 답을 얻기위해 정말 많이 찾아다녔었습니다.
결론부터 말씀드리면 jOOQ 오픈소스 버전에서 해당기능을 사용하려면
RecordListener가 유일한 답입니다.
(개인적으로는 상용 라이센스가 제공하는 Audit Columns를 사용 할 수 있더라도, RecordListener가 더 효율적일것으로 생각됩니다.)
RecordListener를 사용하면 JPA Auditing과 유사하게 insert, update, delete 등의 작업시에 추가작업을 할 수 있습니다.
@Override
public void insertStart(RecordContext ctx) {
if (ctx.record().field(TABLE.CREATED_AT) != null) {
ctx.record().set(TABLE.CREATED_AT, LocalDateTime.now());
}
}
이건에 대한 문의는 꽤 많았고, 대표적으로 창시자가 답변한 깃헙 문의 이슈와 제가 다른 질문에서 한 답변도 참고해보면 좋을것같아요
만약 라이센스를 구매한 경우, jOOQ의 Audit columns 기능을 사용하시면 RecordListener 없이도 Auditing을 사용 할 수 있는데요.
이 기능의 장점은 그 어떤 DB접근 기술에서도 구현 하지못한 다중 row 벌크 update 에서도 Auditing이 가능하다는 점입니다.
현존하는 대부분의 db 접근 기술은 이런 쿼리에서 Auditing이 불가능하지만, jOOQ의 Audit columns 은 해당 쿼리에서도 동작합니다.
UPDATE users
SET status = 'INACTIVE',
updated_at = NOW()
WHERE last_login < '2024-01-01';
다만, 문서를 보시면 해당 기능을 사용하는데 필요한 컬럼들을 설정에서 문자로 지정 해야해서
만약 컬럼명이 다 다르다면 꽤 긴 설정을 해야 할 수도 있습니다.
추가적으로 궁금하신 점 있으면, 댓글 달아주세요! 추가적으로 답변드리도록 하겠습니다.
0
안녕하세요, 인프런 AI 인턴입니다. JaeWon Kim님.
jOOQ에서는 JPA의 Auditing 기능과 유사한 기능을 기본적으로 제공하지는 않습니다. 하지만, Record Listener를 통해 생성일, 생성자, 수정일, 수정자와 같은 메타데이터를 관리할 수 있습니다.
RecordListener를 사용하면 삽입(insert)와 갱신(update) 이벤트를 감지하여 해당 필드를 자동으로 업데이트할 수 있습니다. 다음은 간단한 예시입니다:
public class AuditRecordListener extends DefaultRecordListener {
@Override
public void insertStart(RecordContext ctx) {
// 생성일, 생성자 설정
ctx.record().setValue(CREATED_AT, LocalDateTime.now());
ctx.record().setValue(CREATED_BY, "system"); // 실제로는 현재 사용자 아이디를 사용
}
@Override
public void updateStart(RecordContext ctx) {
// 수정일, 수정자 설정
ctx.record().setValue(UPDATED_AT, LocalDateTime.now());
ctx.record().setValue(UPDATED_BY, "system"); // 실제로는 현재 사용자 아이디를 사용
}
}
위 예시에서 CREATED_AT, CREATED_BY, UPDATED_AT, UPDATED_BY는 데이터베이스 테이블의 컬럼입니다.
공식 문서를 통해 더 자세한 정보를 확인하실 수 있습니다. 필요에 따라 이를 확장하여 프로젝트에 맞게 사용하시면 됩니다.
이러한 방법을 사용하면 매번 수동으로 데이터를 설정할 필요가 없으며, RecordListener로 일괄적으로 처리할 수 있어 유지보수가 수월해집니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아 생각했던것보다 이슈사항도 많고 여러가지 복잡한 작업이었군요,,
일단 record로 설정하는걸로 적용시켜보도록 하겠습니다 상용으로 사용할 생각은 없어서 유료버전은 사용안하려구요 잘 안되면 다시 문의드릴게요