개발일지 2026-08-09
음악학원 플랫폼 개발일지 (2026-08-09)
개요
이날은 CS 문의(Q&A) 관리 화면 강화가 메인이었다. 관리자 문의 상세를 2단 넓은 모달로 리디자인하고, (1) 담당자(본사 직원) 배정, (2) 담당자 역할(운영자/CS) 표시, (3) 같은 학원의 이전 CS 문의 조회, (4) 고객에게 안 보이는 관리자 전용 내부 메모를 붙였다. 여기에 더해 08-07 에 만든 학원변경 승인 로직을 확장해 승인 시 담당강사 초기화 + 새 학원 원장에게 문자 알림을 추가했다.
수정/생성 파일 목록
백엔드 (piano-backend)
.../admin/qna/QnaAdminController.java/QnaAdminService.java/QnaAdminMapper.java/QnaAdminDto.java(수정) — 담당자 배정 / 이전 문의 조회 / 내부 메모mapper/QnaAdminMapper.xml(수정)migration-20260809-qna-assignee.sql,migration-20260809b-qna-memo.sql(신규).../student/academychange/AcademyChangeRequestService.java(수정) — 승인 시 담당강사 초기화 + 원장 문자.../academy/student/StudentMapper.java/mapper/StudentMapper.xml(수정)
프론트 (admin)
admin/src/popups/inquiries/InquiryDetail.tsx(대폭 리디자인) — 2단 레이아웃 넓은 모달admin/src/api/inquiries.ts(수정) — 담당자 배정 / 이전 문의 / 내부 메모 API
파일별 상세
1. CS 문의 상세 2단 모달 리디자인
기존 좁은 문의 상세를 좌: 문의 본문/답변, 우: 메타(담당자·이전문의·내부메모) 의 2단 넓은 모달로 재구성했다(d59bc6e, InquiryDetail.tsx +189/−75). 정보 밀도가 높은 CS 화면은 세로로 길게 스크롤하기보다 2단으로 펼치는 게 응대 속도에 유리했다.
2. 담당자(본사 직원) 배정 + 역할 표시
문의별로 담당 직원을 지정할 수 있게 드롭다운을 붙였다. 배정 컬럼을 추가하고(migration-...-qna-assignee.sql), 담당자 이름 옆에 역할(운영자/CS)을 함께 표시해 "누가 무슨 자격으로 잡고 있는지"를 한눈에 보이게 했다.
// inquiries.ts
export const assignInquiry = (id: number, assigneeId: number) =>
client.patch(`/admin/qna/${id}/assignee`, { assigneeId });
3. 같은 학원의 이전 CS 문의 조회
문의 상세에서 같은 학원이 과거에 넣은 CS 문의를 배너/리스트로 함께 보여준다. 반복 클레임이나 맥락 있는 응대에 필요한 히스토리를 한 화면에서 파악할 수 있다.
<!-- QnaAdminMapper.xml — 같은 학원 이전 문의 -->
<select id="findRelatedByAcademy" resultType="QnaAdminDto">
SELECT id, title, status, created_at
FROM qna
WHERE academy_id = #{academyId} AND id != #{excludeId}
ORDER BY created_at DESC
</select>
4. 관리자 전용 내부 메모 (고객 미노출)
문의에 대해 고객에게는 안 보이는 내부 메모 컬럼을 추가(migration-...-qna-memo.sql)했다. 담당자 인수인계나 "이건 환불 검토 중" 같은 내부 판단을 답변과 분리해 기록한다. 응답 DTO 에서 이 필드는 관리자 API 로만 내려간다(고객용 API 에는 미포함).
5. 학원변경 승인 확장 — 담당강사 초기화 + 원장 문자
08-07 에 만든 학원변경 승인이 실제로 학생을 새 학원으로 옮길 때, 이전 학원 기준으로 물려 있던 담당강사를 초기화하고, 새 학원 원장에게 "학생이 배정되었습니다" 문자를 보내도록 확장했다(b0edf14).
// AcademyChangeRequestService — 승인 시 후처리
studentMapper.clearAssignedTeacher(studentId); // 담당강사 초기화
studentMapper.moveToAcademy(studentId, newAcademyId); // 학원 이관
smsSendService.notifyOwnerNewStudent(newAcademyOwner, student); // 새 원장 통지
결론 / 배운 점
- CS 화면은 응대 맥락(이전 문의·담당자·내부 메모)을 한 화면에 모아주는 게 실제 처리 속도를 좌우한다.
- 내부 메모는 고객 응답과 물리적으로 분리(다른 컬럼 + 관리자 전용 API)해야 실수로 노출되지 않는다.
- 승인 같은 상태 전이는 "전이 자체"뿐 아니라 딸린 후처리(재배정·통지)를 같은 서비스 메서드에 묶어 누락을 막는다.
댓글 0
- 첫 번째 댓글을 남겨보세요.