출금 FAQ 비공개 토글로 운영자 직접 제어 가능해짐
목차
출금 관련 FAQ 비공개 처리 토글 기능을 달고, 1:1 문의 흐름도 함께 손봤다.
왜 이 작업이 생겼나
운영 측에서 FAQ 항목을 일시적으로 숨겨야 할 때마다 개발자에게 직접 요청이 들어오는 상황이 반복됐다. 특히 출금 관련 안내 문구는 정책 변경 주기가 짧은 편이라, 해당 항목을 DB에서 직접 지우거나 플래그를 수동으로 바꾸는 일이 잦았음. 운영자가 직접 공개/비공개를 제어할 수 있는 토글이 없으면 매번 배포나 DB 작업 없이는 대응이 안 되는 구조였다.
거기에 1:1 문의 쪽도 같이 손봐야 할 포인트가 있었다. 문의 등록/답변 흐름에서 일부 케이스가 깔끔하게 처리되지 않던 부분이 있었고, 이번 작업과 맞물려서 같이 개선하는 게 낫겠다 판단했다.
작업 내용
이번에 변경된 파일들은 크게 세 레이어로 나뉜다.
| 레이어 | 파일 | 역할 |
|---|---|---|
| Controller | FAQ 내부 클래스 | 비공개 토글 요청 처리, 상태 응답 |
| Controller | 문의 내부 클래스 | 1:1 문의 흐름 개선 처리 |
| Util | ExcelConfigRegistry.java | 엑셀 설정 레지스트리 연동 |
| SQL | FAQ 쿼리 매퍼 | 공개여부 업데이트 쿼리 추가 |
| SQL | 문의 쿼리 매퍼 | 문의 관련 쿼리 개선 |
| SQL | co 공통 쿼리 매퍼 | 공통 조회 조건 정비 |
FAQ 비공개 토글은 단순해 보이지만 설계 포인트가 몇 가지 있다. 상태값을 Y/N 같은 단순 플래그로 관리할 때, 토글 API가 현재 상태를 받아서 반전시키는 방식으로 갈지, 아니면 명시적으로 "공개 처리", "비공개 처리" 두 엔드포인트로 분리할지 선택이 필요하다. 이번엔 단일 토글 방식으로 처리했는데, 운영자가 실수로 연타했을 때 의도치 않게 뒤집히는 문제가 생길 수 있어서 프론트 쪽에 디바운싱 처리가 함께 가이드됐어야 했다. 나중에 코드리뷰 때 이 부분을 짚어줬다.
// 비공개 토글 처리 예시 패턴 (일반화)
public ResponseEntity<?> toggleFaqVisible(String faqId) {
FaqVO faq = faqService.selectFaq(faqId);
String nextStatus = "Y".equals(faq.getVisibleYn()) ? "N" : "Y";
faq.setVisibleYn(nextStatus);
faqService.updateFaqVisible(faq);
return ResponseEntity.ok(Map.of("visibleYn", nextStatus));
}
쿼리 매퍼 쪽에서는 공개여부 컬럼 업데이트와, 목록 조회 시 비공개 항목을 운영자/일반 사용자에 따라 다르게 필터링하는 분기를 추가했다. 이게 꽤 중요한 부분인데, 일반 사용자 화면에서 비공개 항목이 노출되면 안 되고, 운영자 화면에서는 비공개 항목도 같이 보여서 관리가 가능해야 한다. SQL에서 role 조건으로 분기를 태우는 방식이 익숙하지만, 쿼리가 복잡해지면 MyBatis <if> 태그로 조건 분기를 넣는 게 가독성 면에서 낫다.
<!-- MyBatis 공개여부 필터 예시 -->
<select id="selectFaqList" parameterType="FaqVO" resultType="FaqVO">
SELECT *
FROM FAQ
WHERE 1=1
<if test="isAdmin == null or isAdmin == false">
AND VISIBLE_YN = 'Y'
</if>
ORDER BY SORT_ORDER ASC
</select>
ExcelConfigRegistry.java가 같이 바뀐 건, FAQ 목록을 엑셀로 내려받을 때 비공개 항목 포함 여부를 설정으로 제어하기 위한 연동이었다. 엑셀 다운로드 설정을 중앙에서 레지스트리 형태로 관리하고 있던 구조라, 신규 엔티티가 추가될 때마다 여기에 등록해줘야 하는 흐름이었음. 처음 보는 팀원한테는 이 흐름이 암묵지처럼 숨겨져 있어서 온보딩할 때 꼭 짚어주는 포인트 중 하나다.
회고
이런 운영성 기능은 "작은 것 같지만 안 되면 가장 먼저 클레임이 들어오는" 류다. FAQ 비공개 토글 하나가 없어서 긴급 배포나 DBA 협조가 필요했던 상황이 실제로 반복됐고, 이번에 그 고리를 끊었다. 비슷한 운영 도구들—공지 노출 여부, 배너 노출 제어—이 같은 방식으로 운영자 친화적으로 바뀌어야 할 목록이 아직 몇 개 더 남아 있다.
1:1 문의 개선은 이번에 크게 건드리지 않고 핀포인트로 처리했는데, 문의 흐름 전반을 리팩터링하려면 별도 이슈로 분리해서 영향 범위를 다시 분석해야 한다. 한 커밋에 너무 많은 맥락이 섞이면 나중에 git blame 추적이 힘들어진다. 이번처럼 연관성이 높은 CS 도메인이라 같이 묶었지만, 다음번엔 문의 개선은 별도 PR로 가져가는 게 좋겠다고 팀에도 이야기해뒀다.
다음엔 비공개 상태 변경 이력 로깅도 붙여야 할 것 같다.
댓글 0
첫 댓글 달아줘.