개발일지 2026-07-16
개발일지 (2026-07-16)
개요
학원 알림 템플릿 관리 시스템 구축, 카카오 알림톡 연동, 수강권 상태 복원 버그 수정, 예약 오픈일수 적용 등을 진행했다.
수정/생성 파일 목록
백엔드 (piano-backend)
migration-20260715d-notification-templates.sql(신규) — 학원 알림 템플릿 테이블 + 기본 시드 7종NotificationTemplate.java(신규) — 알림 템플릿 엔티티NotificationTemplateMapper.java/xml(신규) — 학원 커스텀 우선 COALESCE 조회 + UPSERTNotificationTemplateController.java(신규) — 목록/자동발송토글/저장 APIAcademyNotificationSender.java(신규) — 자동 알림 발송기 (SMS + 카카오 알림톡 + SMS 폴백)StudentBookingService.java(수정) — 예약 확정 시 LESSON_CONFIRM 자동 알림 발송, 오픈일수 APIStudentBookingController.java(수정) —/open-days엔드포인트 추가StudentTicketService.java(수정) — DEPLETED 상태에서 취소 시 복원 허용PpurioService.java(수정) —[*N*]형식 변수 치환 추가NotificationTemplateMapper.xml(수정) —kakao_template_code컬럼 SELECT/UPSERT 추가
프론트 — 학원 앱 (academy)
api/notificationTemplates.ts(신규) — 알림 템플릿 API 클라이언트pages/NotificationTemplates.tsx(신규) — 알림 관리 페이지 (규칙 테이블 + 템플릿 편집기 + 미리보기)App.tsx(수정) —/notification-templates라우트 추가
프론트 — 학생 앱 (student)
api/booking.ts(수정) —getOpenDaysAPI 추가pages/LessonBookingPage.tsx(수정) — 오픈일수 maxDate 적용, ticketExpiresAt 선언 순서 버그 수정pages/DashboardPage.tsx(수정) — "피아노" 하드코딩 제거pages/MyPage.tsx(수정) — "피아노" 하드코딩 제거pages/LoginPage.tsx(수정) — 슬로건 "음악과 함께 성장하는 특별한 시간"으로 변경
파일별 상세
1. 학원 알림 템플릿 관리
학원별 자동 알림을 관리하는 시스템을 구축했다.
DB 구조:
academy_notification_templates테이블: academy_id=0은 기본값, 학원별 UPSERT로 커스텀- 7개 알림 유형: 레슨 확정, 리마인더, 수강권 만료, 결제 완료, 환불 완료, 상담 예약, 체험 레슨
kakao_template_code컬럼으로 뿌리오 카카오 알림톡 키 저장
발송기 (AcademyNotificationSender):
- 이벤트 발생 → 템플릿 조회(학원 커스텀 우선) → auto_send 확인 → 변수 치환 → 발송
- 카카오 키가 있으면 알림톡 발송, 실패 시 SMS 폴백
- 발송 성패와 무관하게 도메인 트랜잭션은 정상 커밋 (예외 흡수)
2. 카카오 알림톡 연동
뿌리오 카카오 알림톡 API와 연동했다. 변수 형식은 카카오 심사 규격에 맞춰 [*N*] / [*이름*] 형태를 사용한다.
3. 수강권 DEPLETED 복원 버그 수정
예약 3회 → 2회 취소 시 횟수는 복원되지만 status가 DEPLETED로 남는 버그.
- 원인:
restore()에서 ACTIVE만 복원 허용 → DEPLETED는 차단됨 - 수정: DEPLETED도 복원 허용.
incrementSessionSQL이 자동으로 DEPLETED→ACTIVE 전환.
4. 예약 오픈일수 학생 앱 적용
학원 설정의 bookingOpenDays를 학생 앱 달력에 반영. 수강권 만료일과 오픈일수 중 빠른 날짜를 maxDate로 적용.
트러블슈팅 메모
- ticketExpiresAt 선언 전 참조:
maxDateStr계산에서ticketExpiresAt를 사용하는데, 선언이 아래에 있어서 런타임 에러 → 선언 뒤로 이동 - 카카오 알림톡 반려:
{1}형식 →#{변수내용}형식으로 바꿔야 함. 수신자 액션("신청하신", "예약하신") 명시 필요 - 알림 관리 페이지 배포 누락: tar가 제대로 안 올라가서 이전 번들이 서빙됨 → 번들 해시 확인 필수
결론 / 배운 점
- 알림 발송은 도메인과 분리해야 한다. 알림 실패로 예약/결제가 롤백되면 안 된다. 예외를 흡수하고 이력만 남기는 패턴이 안전하다.
- 카카오 알림톡 심사는 까다롭다. 변수 형식(
[*N*]), 수신자 액션 명시, 광고성 문구 제한 등 규격을 미리 파악해야 한다. - DEPLETED 상태 전환은 양방향이어야 한다. 차감 시 ACTIVE→DEPLETED는 되는데 복원 시 역방향이 안 되면 데이터 불일치가 생긴다.
댓글 0
- 첫 번째 댓글을 남겨보세요.