💬
14:40-15:30 (50분)

성도 관리 & 문자 발송 앱

태그별 문자 전송, 새가족 환영 메시지 자동화

🎯 학습 목표

  • CRUD 기반 성도 관리 시스템 구축
  • SMS API (Aligo/NCP SENS) 연동
  • 태그 기반 필터링 및 단체 문자
  • 메시지 템플릿 및 자동화

📱 SMS API 소개

알리고 (Aligo)

💰 가격: 건당 15원~

✅ 장점: 저렴, 간편, API 사용 쉬움

📞 용도: 소규모 교회, 개인 사용

🔗 웹사이트: smartsms.aligo.in

NCP SENS (Naver Cloud)

💰 가격: 건당 9원~

✅ 장점: 대용량, 안정적, 통계

📞 용도: 대규모 교회, 기업

🔗 웹사이트: ncloud.com

💻 실습: 단계별 진행

STEP 1DB 스키마: 성도 관리 (8분)

🤖 프롬프트

Prisma로 Member 모델을 만들어줘:
- name (이름)
- phone (전화번호, unique)
- email (이메일)
- birthdate (생년월일)
- address (주소)
- group (소속: 청년부/장년부/어린이부)
- role (직분)
- tags (태그 배열: 새가족, VIP, 봉사자 등)
- registeredAt (등록일)
- notes (비고)

Message 모델도 만들어줘:
- to (수신자 전화번호)
- message (내용)
- status (대기/전송완료/실패)
- sentAt (전송 시각)
- errorMessage (실패 사유)

STEP 2백엔드: 성도 관리 API (10분)

🤖 프롬프트

NestJS로 Member CRUD API를 만들어줘:
GET /members - 전체 조회 (페이지네이션, 검색, 필터)
POST /members - 신규 등록
GET /members/:id - 상세 조회
PATCH /members/:id - 정보 수정
DELETE /members/:id - 삭제

검색 기능: 이름, 전화번호, 이메일로 검색 가능하게
필터 기능: 소속, 태그로 필터링 가능하게
정렬 기능: 이름순, 등록일순 정렬 가능하게

📊 페이지네이션 예시

GET /members?page=1&limit=20&search=김&group=청년부

Response:
{
  data: [...members],
  total: 150,
  page: 1,
  totalPages: 8
}

STEP 3백엔드: SMS 발송 서비스 (12분)

🤖 프롬프트 1 - Aligo 연동

NestJS에 Aligo SMS 서비스를 만들어줘.
환경변수로 ALIGO_API_KEY, ALIGO_USER_ID, ALIGO_SENDER를 받아줘.

sendSMS 메서드:
- to: 수신자 번호 (또는 배열)
- message: 메시지 내용
- 결과를 Message 테이블에 저장

axios로 Aligo API 호출:
POST https://apis.aligo.in/send/
Body: key, user_id, sender, receiver, msg

💡 SMS 서비스 구조

// sms.service.ts
@Injectable()
export class SmsService {
  async sendSMS(to: string[], message: string) {
    const results = [];
    
    for (const phone of to) {
      try {
        // Aligo API 호출
        const response = await axios.post(...);
        
        // DB에 성공 기록
        await prisma.message.create({
          data: { to: phone, message, status: 'SENT' }
        });
        
        results.push({ phone, success: true });
      } catch (error) {
        // DB에 실패 기록
        await prisma.message.create({
          data: { 
            to: phone, 
            message, 
            status: 'FAILED',
            errorMessage: error.message 
          }
        });
        
        results.push({ phone, success: false });
      }
    }
    
    return results;
  }
}

⚠️ SMS API 테스트 주의

실제 문자가 발송되고 비용이 청구되므로, 테스트 시 본인 번호로만 테스트하세요!

STEP 4프론트엔드: 성도 관리 화면 (10분)

🤖 프롬프트

Next.js로 성도 관리 페이지를 만들어줘:

상단:
- 검색창 (이름/전화번호)
- 필터 (소속별, 태그별)
- "신규 등록" 버튼

테이블:
- 이름, 전화번호, 소속, 태그
- 각 행에 "수정" "삭제" 버튼
- 체크박스 (문자 발송용)
- 페이지네이션

하단:
- "선택된 XX명에게 문자 보내기" 버튼

STEP 5프론트엔드: 문자 발송 화면 (10분)

🤖 프롬프트

문자 발송 모달을 만들어줘:

1. 수신자 목록 표시 (선택된 사람들)
2. 템플릿 선택 드롭다운:
- 환영 메시지
- 생일 축하
- 행사 안내
- 직접 작성
3. 메시지 입력 영역 (바이트 수 표시)
4. 변수 삽입 버튼: {name}, {church}
5. 미리보기
6. "전송" 버튼

전송 후 결과 표시:
- 성공 XX건, 실패 XX건
- 실패한 번호 목록

📝 메시지 템플릿 예시

환영 메시지

{name}님, {church}에 오신 것을 환영합니다! 하나님의 사랑이 함께 하시길 기도합니다. 🙏

생일 축하

{name}님! 생일을 진심으로 축하드립니다. 🎂 하나님의 축복이 가득하시길 기도합니다!

🤖 자동화 기능

NestJS Cron으로 자동 발송

🤖 프롬프트

NestJS의 @nestjs/schedule을 사용해서 다음 자동 작업을 만들어줘:

1. 매일 오전 9시: 오늘 생일인 성도들에게 축하 문자
2. 매주 토요일 오후 6시: 내일 예배 안내 문자
3. 새가족 등록 시: 즉시 환영 문자 발송

💡 구현 예시

@Injectable()
export class AutoMessageService {
  @Cron('0 9 * * *') // 매일 오전 9시
  async sendBirthdayMessages() {
    const today = new Date();
    const members = await prisma.member.findMany({
      where: {
        birthdate: {
          month: today.getMonth() + 1,
          day: today.getDate()
        }
      }
    });
    
    for (const member of members) {
      await smsService.sendSMS(
        [member.phone],
        `${member.name}님! 생일을 축하드립니다! 🎂`
      );
    }
  }
}

🚀 확장 아이디어

📊 발송 통계

월별 발송량, 비용, 성공률 차트

📅 예약 발송

특정 날짜/시간에 자동 발송

📸 MMS (사진문자)

이미지 첨부 문자 발송

💾 엑셀 import/export

대량 등록 및 백업

✅ 완성 체크리스트

👨‍🏫 강사 노트

⏰ 가장 긴 세션: 50분이므로 중간 휴식 없이 집중! 템포 유지 중요

💳 API 키: 실습용 Aligo 계정 미리 준비 (충전 필요). 또는 데모 모드로 진행

🎯 핵심: "이제 여러분은 교회 전체 성도에게 문자를 보낼 수 있습니다!"

⚠️ 비용 안내: SMS 비용 명확히 설명. 월 예산 계획 중요성 강조

🔐 개인정보: 전화번호 등 민감 정보 관리 주의사항 반드시 언급

💡 실전 팁: "새가족에게 일일이 전화하던 것을 자동화!"