이용수수료 그리드 공백 버그, 파트너 조건 동적 분기로 해결
목차
증상
- 플랫폼 이용수수료 관리 페이지 진입했는데 그리드가 통째로 비어있음
- 응답 200, 콘솔 에러도 없음, 그런데 list만 빈 배열
- 같은 조건을 DB 콘솔에서 직접 돌리면 row가 정상으로 떨어짐
처음엔 권한 필터인 줄 알았는데 운영자 계정으로도 동일하게 빈 결과였음. 그래서 권한 라인은 일찍 제외함.
원인
파라미터 매핑이 문제였음. 화면 기본 조회 조건은 "당월 전체 파트너"인데, 쿼리에서는 파트너 식별자를 항상 등호 조건으로 묶고 있었음. 그리고 컨트롤러에서는 빈 문자열을 그대로 매퍼에 넘김. 결과적으로 아래처럼 동작했음.
WHERE fee_date BETWEEN #{startDate} AND #{endDate}
AND partner_id = #{partnerId} -- partnerId = '' 가 들어옴
partner_id = '' 로 잘려서 매칭되는 row가 0건. 빈 문자열을 옵셔널 의도로 썼지만 SQL 입장에서는 정확히 빈 문자열 매칭이 됨. 흔히 빠지는 함정.
수정
| 구분 | 수정 전 | 수정 후 |
|---|---|---|
| 빈 파트너ID | 빈 문자열 그대로 매퍼 전달 | 컨트롤러에서 null 정규화 |
| 매퍼 조건 | 무조건 등호 비교 | 동적 조건으로 분기 |
| 기본 조회 | 0건 | 당월 전체 노출 |
매퍼는 흔한 동적 분기 패턴으로 바꿈.
<if test="partnerId != null and partnerId != ''">
AND partner_id = #{partnerId}
</if>
컨트롤러 쪽에서는 빈 값 → null 변환을 한 줄짜리 헬퍼로 빼둠. 같은 함정이 다른 화면에서 또 나올 게 뻔해서 재사용 가능한 형태로 정리함.
배운 점
- 빈 문자열 ≠ null 을 SQL 레벨에서 분리해 생각하지 않으면 조용히 빈 결과를 만드는 버그가 됨
- 화면이 "에러 없이 비어있음"인 유형은 사용자가 신뢰를 잃는 속도가 빠름. 500 에러보다 더 위험할 수도
- 옵셔널 파라미터는 매퍼 진입 직전에 정규화하는 규칙을 팀 컨벤션으로 박아두는 게 낫겠음
검증
회귀 확인은 세 케이스로 돌림.
- 당월 + 전체 파트너 → 정상 표출
- 전월 + 특정 파트너 단건 → 해당 파트너만 노출
- 빈 기간 + 빈 파트너 → 기본값으로 당월 전체
세 케이스 모두 그리드에 데이터 떴음. 회계 담당자에게 전달하고 종료.
다음
댓글 0
첫 댓글 달아줘.