결제대행사 충전 화면 개선과 조회 쿼리 최적화
목차
무엇을 건드렸나
결제대행사 연동 충전건의 상세 화면과 리스트 화면을 손봤음. 어드민에서 보던 충전 상세는 정작 운영자가 필요한 정보가 흩어져 있어서 매번 DB 스크립트로 까봤는데, 이걸 화면에서 한 번에 확인 가능하게 정리.
작업한 레이어 정리하면 이런 모양:
| 레이어 | 변경 포인트 |
|---|---|
| 어드민 컨트롤러 | 상세 응답 DTO 평탄화, 리스트 필터 파라미터 추가 |
| 사용자 API | 마이페이지 충전 내역에서 보여줄 노출 필드 정리 |
| 브라우저 풀 | 자동화 검증용 풀 재사용 로직 손봄 |
| 충전 SQL | 조인 줄이고 인덱스 태우는 방향으로 재작성 |
충전 SQL 다시 짠 이유
리스트 쿼리가 거래 테이블 + 파트너 + 결제수단 다 풀조인 후 정렬하는 구조였음. 데이터 늘면서 슬로우쿼리 알람이 자꾸 떠서 다음 두 가지 정리:
created_at인덱스 타도록 조건 순서 변경, 함수 감싸던 부분 제거- 파트너 정보는 리스트에선 ID + 이름만, 상세 조회 시 별도 쿼리로 분리
-- before: 풀조인 + 함수
WHERE DATE(c.created_at) BETWEEN ? AND ?
-- after: 인덱스 사용 가능
WHERE c.created_at >= ? AND c.created_at < ?
밴드 단위로 끊어서 쿼리하니 평균 응답이 눈에 띄게 줄었음. 파트너 조인을 한 번 빼는 것만으로도 효과가 컸는데, 리스트에서 굳이 필요 없는 정보였음에도 관성으로 붙어 있던 케이스.
컨트롤러 정리하면서 깨달은 것
어드민과 사용자 API가 같은 도메인을 보는데 응답 스펙이 살짝 달라서, 공통 프로젝션을 만들고 컨트롤러에서 필요한 필드만 뽑아 쓰도록 했음. 처음엔 DTO를 분리할까 했는데 중복이 너무 심해서 공용 한 개 + 어노테이션으로 노출 제어하는 쪽이 깔끔.
- 어드민: 내부 상태값, 정산 메모, 원본 응답 코드 노출
- 사용자: 결과 라벨, 금액, 일시만 노출
상태값 라벨링 규칙도 한 군데로 모았음. 전에는 화면마다 PENDING/CONFIRMED 한글 변환을 따로 짜고 있어서 "처리중"과 "대기"가 같은 상태에 다른 라벨로 노출되는 사고가 있었음.
브라우저 풀 손본 이유
화면 회귀 검증을 자동화 도구로 돌리는데 충전 상세 페이지가 새로 추가되면서 시나리오가 늘었고, 매번 새 컨텍스트를 띄우니 시간이 길어졌음. 풀에서 컨텍스트를 재사용하되 쿠키/스토리지는 시나리오 시작 시 초기화하도록 변경. 동시 실행 수 상한도 환경변수로 빼서 로컬과 빌드 환경 분리.
회고
- 화면 개선이라고 시작했지만 실제 손이 가장 많이 간 건 SQL과 응답 스펙 정리
- "운영자가 매번 DB 까서 본다" = 화면이 부족하다는 신호로 받기
- 자동화 검증을 추가할 때 풀 운영 비용도 같이 본다
다음
댓글 0
첫 댓글 달아줘.