2차 프로젝트 7일째
1. Audit 도메인 최종 보완
목적
- 관리자가 시스템 내 변경 이력(공간 등록/수정, 회원 정지/복구, 관리자 크레딧 지급, 예약 강제 취소 등)을 검색하고 추적할 수 있도록
GET /api/v1/admin/audit-logs 조회 API 및 최적화 인덱스를 제공함.
변경 사항
- 조회 API: 기존 API 계약을 변경하지 않고
GET /api/v1/admin/audit-logs에 6개 검색 필터(actorMemberId, action, targetType, targetId, dateFrom, dateTo)와 기본 크기 20의 페이징 응답을 추가.
- 날짜 및 정렬 계약: KST 날짜 반개구간
[dateFrom 00:00:00, dateTo + 1일 00:00:00)과 서버 고정 createdAt DESC, id DESC 정렬을 적용하고, 날짜 역전은 400 VALIDATION_FAILED로 처리.
- Flyway V9 마이그레이션:
audit_logs 테이블에 idx_audit_logs_created_id (created_at, id) 복합 인덱스를 추가하여 생성 시각 기준 목록 조회와 동률 ID 정렬 성능을 보장.
- 기존 조회 회귀 보강: 최근 회원 상태 감사 로그도
createdAt DESC, id DESC로 조회하여 동일 초에 생성된 정지·복구 로그에서 최신 행을 결정적으로 선택.
- 보안 및 무결성: ADMIN 권한만 접근 가능하며, 조회 트랜잭션(
@Transactional(readOnly = true))은 감사 로그를 자체 생성하지 않음.
검증
- 감사 및 연관 도메인 타깃 테스트 (8개 클래스 41개 전체 통과, 실패 0 / 오류 0 / 건너뜀 0):
JAVA_HOME=/opt/homebrew/opt/openjdk ./gradlew test --tests '*AuditLogServiceTest' --tests '*AuditLogServiceTransactionTest' --tests '*AuditLogRepositoryTest' --tests '*AuditLogQueryServiceTest' --tests '*AdminAuditLogControllerTest' --tests '*AdminAuditLogSecurityIntegrationTest' --tests '*AdminMemberServiceTest' --tests '*AdminMemberServiceIntegrationTest' --rerun-tasks --no-daemon
- 백엔드 전체 테스트 (51개 XML 파일 314개 전체 통과, 실패 0 / 오류 0 / 건너뜀 0):
JAVA_HOME=/opt/homebrew/opt/openjdk ./gradlew test --rerun-tasks --no-daemon
- 형상 검증:
git diff --check 및 신규 파일의 trailing whitespace·충돌 마커 검사 통과. 각 커밋 스테이징 후 git diff --cached --check를 실행.
제외 범위
- 프론트엔드 관리자 감사 로그 페이지 UI 연동 (별도 작업)
- 엔티티 및 스키마에 존재하지 않는
ipAddress 컬럼 추가 (현재 요구사항 범위 밖)
- 감사 로그 보존 기간·삭제·마스킹 정책
- 선택 필터 조합별 추가 인덱스 튜닝
2. 왜 이걸 구현했는지를 생각해야 한다
- 팀장이 왜 이 로직을 바꿨는지, 이게 어떻게 작동하는지에 대해서 제대로 대답하지 못해서 결국 AI로 내용을 정리해서 건네는 것으로 마무해버림.
- 뭔가 중요한 로직을 변경하기 전에는, 반드시 "Why?" 를 떠올리는 습관을 들이지 않으면 안 된다.
- 이 습관이 배제된 상태로 수많은 작업이 쌓이게 되면 어느 순간 어디에서 오류가 났는지 판단할 수 있는 능력이 없어지기 때문에, 나 자신의 가치를 낮추는 행위로 이어지게 됨.
3. 문서 최신화
- 거의 막바지에 다다른 프로젝트라서 이전 문서와 많은 점이 상이했기 때문에, 이를 갱신하는 일을 맡아봄.
- 물론 이후로도 문서가 바뀔 일이 생길 수도 있겠지만... 오래된 문서를 AI가 참고해버리는 불상사를 방지하는 일은 중요하니까.
- 아직 하지 않았지만, Swagger UI로 API 관련 문서화 작업도 해둬야하지 않을까 싶긴 하다.
- ...내가 해보겠다고 해볼까?
4. 이후에 할 일
- 우선 오늘 하겠다고 얘기했던 관리자의 공간 등록 시 이미지를 업로드하는 기능을 구현해봐야겠다.
- GPT 5.6 Sol을 통해 해결할 수도 있는 문제기도 하지만... 토큰이 모자랄 수도 있겠으니 여차하면 Gemini 3.8 flash (추론 높음 단계)로 해보는 것도 방법이겠다.
- 프론트엔드의 경우, 내 예약 페이지에 표시되는 운영 시각 표기가 전체 출력인 것을 시간만 출력하는 것으로 수정하는 게 좋을 것 같다...