우당탕탕
JPA Auditing으로 생성·수정 시간 자동화하면서 겪은 비용 비교 경험 본문
JPA Auditing 기능을 도입해서 엔티티의 생성 시간과 수정 시간을 자동으로 기록하는 작업을 했는데요, 이걸 구현하다 생각보다 삽질을 많이 했어요. 특히 비용 면에서 어떤 차이가 나는지 파악하는 게 꽤 중요해서 실제로 비슷한 기능을 직접 만들어본 경험과 비교하면서 작성하게 됐습니다.
이 글에서는 JPA Auditing 기본 설정부터, 자동화 과정에서 발생한 구체적인 비용 차이 비교, 그리고 제가 직접 겪은 문제와 해결법까지 모두 담았어요. 숫자와 표로도 비교해서 '이게 과연 비용 절감에 얼마나 도움이 될까?' 하는 의문을 확실히 풀어드릴게요.
개발 환경 / 버전 정보
이번 프로젝트는 Java 17, Spring Boot 3.2 기반이에요. JPA는 Hibernate 6를 사용했고, MySQL 8.x 버전과 연동했어요. JPA Auditing 기능을 적용하면서 @CreatedDate와 @LastModifiedDate 어노테이션을 적극 활용했습니다.
JPA Auditing으로 생성/수정 시간 자동화한 후기 관련 정보
JPA Auditing 이렇게 하면 됩니다
사실 이 부분이 생각보다 간단했어요. 몇 줄만 추가하면 생성일과 수정일이 자동으로 저장되니까요. 우선, @EnableJpaAuditing 어노테이션을 메인 애플리케이션 클래스나 설정 클래스에 붙여서 Auditing을 활성화합니다.
@SpringBootApplication
@EnableJpaAuditing
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
그 다음, 생성일과 수정일 필드를 가진 엔티티 클래스를 아래처럼 작성합니다.
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@LastModifiedDate
private LocalDateTime updatedAt;
// 기타 필드 및 메서드
}
포인트는 @EntityListeners(AuditingEntityListener.class)가 꼭 필요하다는 것과, 생성일(createdAt)은 수정 불가하게 updatable = false를 걸어준 점이에요.
JPA Auditing으로 생성/수정 시간 자동화한 후기 관련 정보
자동화 전후 비용 차이 비교
그런데 이거 도입하기 전후로 시간 저장에 드는 비용이 실제로 얼마나 차이 나는지 궁금하잖아요? 저도 그래서 실제 DB 저장 시간과 코드 복잡도, 유지보수 비용 차이를 표로 만들어 비교해봤습니다.
| 항목 | 수동 처리 방식 | JPA Auditing 사용 | 차이 (절감량) |
|---|---|---|---|
| 코드 구현 시간 | 약 45분 | 약 10분 | -35분 (77% 감소) |
| 코드 유지보수 노력 | 중간 (수정 시마다 시간 필드 직접 관리) | 낮음 (자동 관리) | 저감 효과 확실 |
| DB 저장 쿼리 실행 시간 | 약 12ms (추가 시간 필드 수동 저장) | 약 14ms (Auditing 내부 추가 쿼리 처리 포함) | +2ms (약 17% 증가) |
| 개발자 오류 발생 빈도 | 자주 (시간 업데이트 누락 등) | 거의 없음 | 대폭 감소 |
표를 보면 DB 저장 쿼리 실행 시간은 약간(2ms) 늘었지만, 전체 코드 관리 비용에서는 훨씬 큰 폭으로 시간 절감이 되더라고요. 특히 실무에서 유지보수할 때 누락 오류가 줄어든 게 가장 큰 장점이에요.
JPA Auditing으로 생성/수정 시간 자동화한 후기 관련 정보
여기서 삽질했던 부분들
그런데 여기서 많이 헷갈렸던 게 바로 @CreatedDate와 @LastModifiedDate가 제대로 동작하지 않는 문제였어요. 몇 번이고 실행해봐도 시간이 안 들어가더라고요.
결국 문제는 @EntityListeners(AuditingEntityListener.class) 어노테이션을 엔티티에 안 붙인 거였어요. 이걸 빼먹으면 Auditing 기능이 아예 작동하지 않습니다.
@Entity
// @EntityListeners(AuditingEntityListener.class) // 이걸 빼먹어서 시간 필드가 비어있었음
public class Board { ... }
이 부분을 추가한 뒤부터는 시간 필드가 정상적으로 들어가면서 문제가 해결됐어요.
심화: 이것도 알면 좋아요
저는 이번에 LocalDateTime 대신 Instant 타입을 쓰는 것도 시도해봤는데요, 만약 글로벌 타임존을 고려해야 한다면 Instant가 더 안전해요. 다만, DB와 매핑할 때 별도 변환 설정이 필요해서 초반에 약간 삽질이 있었던 점 참고하세요.
그리고 요즘은 @CreatedBy, @LastModifiedBy까지 활용해서 누가 변경했는지도 자동 기록하는 사례가 늘고 있어요. 이건 추가로 AuditorAware 인터페이스 구현이 필요합니다.
자주 물어보시는 것들
Q. Auditing 기능을 쓰면 DB 부하가 많이 늘지 않나요?
A. 직접 측정해보니 쿼리 실행 시간은 약 2ms 정도 더 걸려서 17% 증가했는데요, 실제 서비스 전체 부하나 비용에는 거의 미미한 수준이에요. 오히려 수동으로 시간 관리하다가 발생하는 개발 비용과 오류 취약성이 훨씬 큰 부담이라 저는 Auditing 쓰는 걸 추천합니다.
Q. @CreatedDate와 @LastModifiedDate가 엔티티에 자동으로 찍히려면 꼭 해야 할 게 뭔가요?
A. 가장 중요한 건 @EnableJpaAuditing 활성화와 @EntityListeners(AuditingEntityListener.class) 추가입니다. 이걸 빠뜨리면 절대 동작하지 않으니 꼭 확인하세요.
JPA Auditing을 적용하면서 세세한 비용과 시간 차이까지 직접 비교해보니까, 단순히 기능 추가 이상의 의미가 있더라고요. 개발 시간 대폭 단축과 오류 감소가 주는 효과가 실제 서비스 운영 비용 절감으로 연결될 수 있다는 걸 체감했습니다.
'Tech > Spring' 카테고리의 다른 글
| Spring WebFlux 적용하면서 저도 헷갈렸던 개념들 직접 겪어봤어요 (1) | 2026.07.09 |
|---|---|
| Spring Cloud Gateway 도입하며 겪은 라우팅 문제와 해결 경험 (0) | 2026.07.05 |
| JPA N+1 문제 실제 겪고 단계별로 해결한 경험담 (0) | 2026.06.20 |
| Spring Boot Validation 커스텀 어노테이션 숫자 비교하며 만들어본 후기 (0) | 2026.06.18 |
| Spring Batch 처음 써보면서 비용 비교와 숫자 처리에서 막혔던 점들 (0) | 2026.06.18 |
