사이트픽 블로그
← 목록으로

개발일지 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

  • 첫 번째 댓글을 남겨보세요.