프로젝트 소개


담당자별 문자 수신, 설문폼 관리, 중복 체크, 실적 통계를 통합 관리하는 웹 애플리케이션입니다. 외부 SMS 수신 API와 연동하여 자동으로 문자를 수집하고, 담당자별로 데이터를 분류하여 관리합니다. 또한 설문폼 기능을 통해 고객 응답을 수집하고, 중복 체크 시스템을 통해 정확한 실적 통계를 제공합니다.



주요 기능


1. SMS 수신 및 통합 데이터 관리


외부 SMS 수신 API와 연동하여 자동으로 문자를 수신하고 저장합니다. RESTful API 엔드포인트에서 API 키 인증을 통해 외부 시스템으로부터 문자 데이터를 받아 데이터베이스에 저장합니다. 담당자 번호를 자동으로 매칭하여 각 담당자별로 데이터를 분류합니다.


  • 외부 SMS 수신 API 연동 (API 키 기반 인증)
  • 담당자 번호 자동 매칭 및 분류
  • 010으로 시작하는 번호만 저장 (데이터 품질 관리)
  • SMS와 설문폼 데이터를 통합 데이터베이스에 통합 관리


담당자별 문자 관리 및 인센티브 계산 시스템

2. 설문폼 생성 및 관리


관리자는 담당자별로 개별 설문폼을 생성하거나, 모든 담당자가 공유하는 통합 설문폼을 만들 수 있습니다. 설문폼 편집기에서는 텍스트, 이메일, 전화번호, 텍스트 영역, 선택, 라디오, 체크박스 등 다양한 필드 타입을 지원합니다. 각 필드는 데이터베이스 컬럼에 매핑할 수 있어 자동으로 데이터가 저장됩니다.


  • 담당자별 개별 설문폼 + 통합 설문폼 지원
  • 다양한 필드 타입 지원 (텍스트, 이메일, 전화번호, 텍스트 영역, 선택, 라디오, 체크박스)
  • 필드별 데이터베이스 컬럼 매핑 기능
  • 설문폼 이미지 업로드 및 관리
  • 설문폼 활성/비활성 토글 기능


담당자별 문자 관리 및 인센티브 계산 시스템

3. 중복 체크 시스템


고객 번호 기준으로 중복 데이터를 체크하는 시스템입니다. 관리자가 설정한 두 가지 기간(기본 30일, 60일)을 기준으로 중복 여부를 판단합니다. 각 레코드의 생성 시간을 기준으로 과거 데이터를 조회하여 중복 횟수를 동적으로 계산합니다. 이 시스템을 통해 정확한 실적 통계를 제공합니다.


  • 두 가지 중복 체크 기간 설정 (기본 30일, 60일, 관리자가 변경 가능)
  • 레코드별 생성 시간 기준 동적 중복 계산
  • 관리자는 두 조건 모두 확인, 일반 담당자는 60일 조건만 확인
  • 중복 조건 일수는 시스템 설정에서 관리


담당자별 문자 관리 및 인센티브 계산 시스템

4. 실적 체크 대시보드


담당자별 실적을 날짜 범위와 중복 체크 기간을 선택하여 조회할 수 있는 대시보드입니다. RESTful API를 통해 선택한 날짜 범위 내의 데이터를 조회하고, 각 레코드별로 중복 여부를 계산하여 통계를 생성합니다. 누적 DB 수집 개수, 중복 누적개수, 중복 제외 순 집계를 담당자별로 표시합니다.


  • 날짜 범위 선택 및 중복 체크 기간 선택 (관리자만)
  • 담당자별 실적 통계 (누적 DB 수집 개수, 중복 누적개수, 중복 제외 순 집계)
  • 날짜별 상세 통계 (신규 DB 수집 개수, 중복 DB 개수, 중복 제외 순 집계)
  • 엑셀 내보내기 기능


담당자별 문자 관리 및 인센티브 계산 시스템

5. 닉네임별 통계


담당자별 닉네임을 기준으로 일일 및 누적 통계를 제공합니다. RESTful API를 통해 선택한 날짜의 당일 데이터와 월 1일부터 선택한 날짜까지의 누적 데이터를 조회합니다. 중복, 실 디비(중복 제외), 누적(월 1일부터 누적, 중복 제외) 통계를 제공합니다.


  • 담당자별 닉네임 기준 통계
  • 일일 통계 (중복, 실 디비)
  • 누적 통계 (월 1일부터 선택한 날짜까지, 중복 제외)
  • 날짜 선택 기능


담당자별 문자 관리 및 인센티브 계산 시스템

6. 통합 데이터 관리


SMS와 설문폼 데이터를 통합 데이터베이스에 통합하여 관리합니다. DataTables를 사용하여 서버 사이드 페이징, 정렬, 검색 기능을 제공합니다. 담당자별, 날짜 범위별 필터링이 가능하며, 관리자는 데이터 삭제 및 비고 수정이 가능합니다.


  • SMS와 설문폼 데이터 통합 관리
  • DataTables를 활용한 서버 사이드 페이징 및 정렬
  • 담당자별, 날짜 범위별 필터링
  • 데이터 상세 보기 (팝업 창)
  • 관리자 전용 데이터 삭제 및 비고 수정 기능
  • 엑셀 내보내기 기능


담당자별 문자 관리 및 인센티브 계산 시스템




제작 과정


기술 스택


Node.js와 Express.js를 기반으로 한 서버 사이드 애플리케이션입니다. MySQL 데이터베이스를 사용하여 데이터를 저장하고, EJS 템플릿 엔진을 사용하여 서버 사이드 렌더링을 구현했습니다. Passport.js를 사용한 세션 기반 인증과 speakeasy를 활용한 OTP 2단계 인증을 구현했습니다.


  • 백엔드: Node.js, Express.js
  • 데이터베이스: MySQL (mysql2)
  • 템플릿 엔진: EJS
  • 인증: Passport.js (Local Strategy), express-session, express-mysql-session
  • OTP 인증: speakeasy, qrcode
  • 파일 업로드: multer
  • 기타: bcryptjs (비밀번호 해시), dayjs (날짜 처리), cors


주요 구현 내용


외부 SMS 수신 API와 연동하기 위해 RESTful API 엔드포인트를 구현했습니다. API 키 기반 인증을 통해 외부 시스템으로부터 문자 데이터를 받아 담당자 번호를 자동으로 매칭하고 저장합니다. 중복 체크 시스템은 각 레코드의 생성 시간을 기준으로 과거 데이터를 조회하여 중복 횟수를 동적으로 계산합니다.


설문폼 기능은 JSON 형식으로 폼 구조를 저장하고, 동적으로 HTML 폼을 생성합니다. 각 필드는 data-db-column 속성을 통해 데이터베이스 컬럼에 매핑되어 자동으로 저장됩니다. 통합 데이터 관리 페이지에서는 DataTables를 사용하여 서버 사이드 페이징과 정렬을 구현했습니다.


실적 체크 대시보드에서는 선택한 날짜 범위와 중복 체크 기간을 기준으로 각 레코드별로 중복 여부를 계산하여 통계를 생성합니다. 이 과정에서 많은 데이터베이스 쿼리가 발생하므로, 각 담당자별로 순차적으로 처리하여 정확한 통계를 제공합니다.



특별히 고민했던 부분


중복 체크 시스템 구현 시, 각 레코드의 생성 시간을 기준으로 과거 데이터를 조회해야 하는데, 이는 많은 데이터베이스 쿼리를 발생시킵니다. 실적 체크 대시보드에서 날짜 범위가 넓고 담당자가 많을 경우 성능 문제가 발생할 수 있어, 각 레코드별로 순차적으로 처리하는 방식을 선택했습니다.


OTP 2단계 인증 구현 시, OTP 시크릿 키를 데이터베이스에 저장할 때 보안을 위해 AES-256-GCM 암호화를 적용했습니다. 암호화 함수를 통해 OTP 시크릿 키를 암호화하여 저장하고 복호화하여 사용합니다.


설문폼 데이터 저장 시, 고객 번호를 자동으로 추출하여 데이터베이스에 저장합니다. 폼 필드 중 전화번호 필드를 찾아 고객 번호를 추출하고, 010으로 시작하는 번호만 저장하도록 검증합니다.






작동 방식


1. SMS 수신 프로세스


외부 시스템에서 문자를 수신하면 RESTful API 엔드포인트로 POST 요청을 보냅니다. API 키 인증을 통해 요청을 검증하고, 담당자 번호를 추출하여 매칭합니다. 고객 번호가 010으로 시작하는 경우에만 데이터베이스에 저장합니다.



담당자별 문자 관리 및 인센티브 계산 시스템

2. 설문폼 제출 프로세스


고객이 설문폼에 응답을 제출하면 RESTful API 엔드포인트로 POST 요청을 보냅니다. 폼 데이터에서 고객 번호를 추출하고, 폼 구조에 따라 JSON 형식으로 저장합니다. 고객 번호가 010으로 시작하는 경우에만 데이터베이스에 저장합니다.



담당자별 문자 관리 및 인센티브 계산 시스템

3. 중복 체크 프로세스


데이터가 저장될 때마다 중복 체크 로직을 실행하여 중복 횟수를 계산합니다. 각 레코드의 생성 시간을 기준으로 과거 데이터를 조회하여, 설정된 기간(30일, 60일) 내에 같은 고객 번호가 있는지 확인합니다. 중복 횟수는 데이터 조회 시 실시간으로 계산됩니다.



담당자별 문자 관리 및 인센티브 계산 시스템

4. 실적 통계 생성 프로세스


대시보드에서 날짜 범위와 중복 체크 기간을 선택하면, RESTful API를 통해 해당 기간의 데이터를 조회합니다. 각 레코드별로 중복 여부를 계산하여 담당자별 통계를 생성합니다. 날짜별 상세 통계도 함께 제공하여 일별 실적을 확인할 수 있습니다.



담당자별 문자 관리 및 인센티브 계산 시스템




기술적 세부사항


아키텍처


Express.js를 기반으로 한 MVC 패턴을 따릅니다. 서버 파일에 모든 라우트와 비즈니스 로직을 구현했으며, views 디렉토리에 EJS 템플릿을 배치했습니다. public 디렉토리에 정적 파일(CSS, 이미지)을 저장합니다.



데이터베이스 설계


주요 데이터 구조는 다음과 같습니다:


  • 사용자 정보 테이블: 담당자 및 관리자 정보 관리
  • 통합 데이터 테이블: SMS와 설문폼 데이터 통합 저장
  • 설문폼 정보 테이블: 설문폼 구조를 JSON 형식으로 저장
  • 시스템 설정 테이블: 중복 체크 기간 등 시스템 설정 관리
  • 접근 로그 테이블: 사용자 접근 기록 관리


보안 구현


Passport.js를 사용한 세션 기반 인증을 구현했습니다. 비밀번호는 bcryptjs를 사용하여 해시화하여 저장합니다. OTP 2단계 인증은 speakeasy를 사용하여 구현했으며, OTP 시크릿 키는 AES-256-GCM으로 암호화하여 저장합니다. 인증 미들웨어를 통해 라우트별 접근 권한을 제어합니다.



API 구조


RESTful API 패턴을 따릅니다. 주요 API 기능은 다음과 같습니다:


  • 외부 SMS 수신 API: POST 요청으로 문자 데이터 수신
  • 통합 데이터 조회 API: DataTables 서버 사이드 페이징 지원
  • 실적 통계 조회 API: 담당자별 실적 통계 제공
  • 닉네임별 통계 조회 API: 닉네임 기준 일일 및 누적 통계
  • 설문폼 제출 API: POST 요청으로 설문폼 응답 저장
  • 설문폼 관리 API: 설문폼 생성 및 수정


담당자별 문자 관리 및 인센티브 계산 시스템

프론트엔드 구현


EJS 템플릿을 사용하여 서버 사이드 렌더링을 구현했습니다. DataTables를 사용하여 데이터 테이블의 페이징, 정렬, 검색 기능을 제공합니다. Material Symbols 아이콘을 사용하여 UI를 구성했습니다. 엑셀 내보내기 기능은 SheetJS (xlsx) 라이브러리를 사용하여 구현했습니다.



담당자별 문자 관리 및 인센티브 계산 시스템

성능 최적화


실적 체크 대시보드에서 많은 데이터베이스 쿼리가 발생하므로, 각 담당자별로 순차적으로 처리하여 메모리 사용량을 최적화했습니다. DataTables의 서버 사이드 페이징을 사용하여 대량의 데이터도 효율적으로 처리합니다. 읽기 전용 쿼리와 쓰기 쿼리를 분리하여 데이터베이스 부하를 최적화했습니다.



담당자별 문자 관리 및 인센티브 계산 시스템

에러 처리 및 로깅


모든 RESTful API 엔드포인트에서 try-catch 블록을 사용하여 에러를 처리하고, 적절한 HTTP 상태 코드와 에러 메시지를 반환합니다. 로그 출력 기능을 사용하여 시스템 동작을 기록하며, SMS 수신 시에는 상세한 로그를 출력하여 디버깅을 용이하게 합니다.



담당자별 문자 관리 및 인센티브 계산 시스템