Skip to content

[Fix] PostgreSQL 감사 이력·알림 조회 500 오류 수정 - #140

Merged
hywznn merged 4 commits into
mainfrom
fix/audit_events_500_error
Aug 11, 2026
Merged

[Fix] PostgreSQL 감사 이력·알림 조회 500 오류 수정#140
hywznn merged 4 commits into
mainfrom
fix/audit_events_500_error

Conversation

@krestar

@krestar krestar commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

개요

운영 환경의 /agent 화면에서 Agent 이력을 불러오지 못하고, 헤더 알림 조회도 함께 실패하는 문제를 수정합니다.

브라우저 네트워크 로그에서 다음 요청이 500 Internal Server Error를 반환했습니다.

  • GET /api/v1/audit-events?limit=100
  • GET /api/v1/notifications?size=20

원인

감사 이력과 알림 조회 JPQL은 선택 필터와 cursor를 다음과 같은 형태로 처리하고 있었습니다.

(:cursor IS NULL OR occurred_at < :cursor)

cursor나 선택 필터가 전달되지 않으면 PostgreSQL이 NULL placeholder의 타입을 추론하지 못해 SQLSTATE 42P18이 발생했습니다. H2에서는 동일 쿼리가 정상 동작하기 때문에 기존 통합 테스트만으로는 운영 환경의 실패를 발견하기 어려웠습니다.

변경 사항

감사 이력 조회

  • 고정 JPQL의 nullable 조건을 제거했습니다.
  • CriteriaBuilder로 실제 값이 전달된 필터만 조건에 추가하도록 변경했습니다.
  • 회사, 행위자 유형, 동작, 대상, trace ID, 기간 필터를 기존과 동일하게 지원합니다.
  • created_at, audit_event_id 기반 cursor 페이지네이션과 정렬·조회 제한을 유지했습니다.

알림 조회

  • nullable cursor를 포함한 고정 JPQL을 제거했습니다.
  • 회사와 사용자 조건은 항상 적용하고, unreadOnly와 cursor 조건은 요청된 경우에만 추가하도록 변경했습니다.
  • 최신 알림 우선 정렬과 페이지 크기 제한을 유지했습니다.

회귀 테스트

  • 필터 없이 GET /api/v1/audit-events?limit=100을 호출하는 시나리오를 추가했습니다.
  • 알림 cursor와 unreadOnly 필터를 단독·조합으로 사용하는 시나리오를 추가했습니다.

테스트

H2 API 통합 테스트

.\gradlew.bat test `
  --tests "com.fowoco.server.notification.NotificationSecurityIntegrationTest" `
  --tests "com.fowoco.server.approval.ApprovalAuditIntegrationTest"
  • 결과: BUILD SUCCESSFUL

PostgreSQL 통합 테스트

  • PostgreSQL 16.14 pg-test 컨테이너에 검증용 임시 DB를 생성했습니다.
  • Gradle 캐시를 사용하지 않도록 --rerun-tasks로 위 두 통합 테스트를 다시 실행했습니다.
  • 결과: BUILD SUCCESSFUL
  • 검증 완료 후 임시 DB를 삭제했습니다.

영향 범위

  • 서버의 감사 이력·알림 조회 쿼리 구현만 변경됩니다.
  • API 요청·응답 계약과 데이터베이스 스키마 변경은 없습니다.
  • 프런트엔드 변경은 없습니다.

- nullable cursor와 선택 필터를 포함한 고정 JPQL을 Criteria 쿼리로 변경
- 값이 전달된 조건만 동적으로 추가해 PostgreSQL SQLSTATE 42P18 방지
- 감사 이력의 정렬 및 cursor 페이지네이션 동작 유지
- 무필터 감사 이력 조회와 알림 cursor·미읽음 필터 회귀 테스트 추가
- H2 및 PostgreSQL 16 통합 테스트 검증
@krestar
krestar requested a review from hywznn August 11, 2026 14:19
@hywznn

hywznn commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

개빠르시네요

@hywznn

hywznn commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

CriteriaBuilder로 null 조건을 제외하도록 변경한 방향은 적절하고, 기존 필터·정렬·cursor 처리도 유지되는 것을 확인했습니다. 다만 추가된 두 통합 테스트는 @activeprofiles("test") 때문에 실제로는 H2로 실행됩니다. 이번 장애가 PostgreSQL에서만 발생했던 만큼, CI의 PostgreSQL 환경에서 /audit-events?limit=100과 /notifications?size=20이 200을 반환하는 회귀 테스트를 추가해 주세요. 이 테스트까지 확인되면 머지해도 좋을 것 같습니다.

@hywznn

hywznn commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

기존 이슈도 H2에서만 확인이 되었기에 실배포환경에서 오류가 떴던것처럼 미리 테스트 해보시고 알려주십셔

hywznn
hywznn previously approved these changes Aug 11, 2026
krestar and others added 3 commits August 11, 2026 23:49
CI에서 활성화되는 PostgreSqlAuditNotificationQueryIntegrationTest를 추가했습니다.
DynamicPropertySource로 POSTGRES_TEST_* 환경 변수를 datasource에 연결하고,
pg_catalog.version() 검증을 통해 실제 PostgreSQL에서 실행되는 것도 명시적으로 확인합니다.

해당 테스트에서 아래 요청이 200을 반환하고 seeded 데이터를 정상 조회하는지 검증했습니다.

- GET /api/v1/audit-events?limit=100
- GET /api/v1/notifications?size=20

로컬 psql DB에서도 테스트 통과를 확인했습니다.
@hywznn
hywznn merged commit 1c32205 into main Aug 11, 2026
4 checks passed
@hywznn
hywznn deleted the fix/audit_events_500_error branch August 11, 2026 15:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants