어쩔컴종설

cdc wiki
이동: 둘러보기, 검색

목차

프로젝트 개요

기술개발 과제

국문 : 개인정보 보안성을 갖춘 설문조사 폼

영문 : The Survey Service with Enhanced Personal Information Security

과제 팀명

어쩔컴종설

지도교수

홍의경 교수님

개발기간

2022년 3월 ~ 2022년 6월 (총 4개월)

구성원 소개

서울시립대학교 컴퓨터과학부 2019920017 김정현(팀장)

서울시립대학교 컴퓨터과학부 2014920028 오지석

서울시립대학교 컴퓨터과학부 2017920017 김지윤

서울시립대학교 컴퓨터과학부 2018920002 고다현

서울시립대학교 전자전기컴퓨터공학부 2018440059 박재선

서론

개발 과제의 개요

개발 과제 요약

오늘날 온라인 설문조사 시스템은 이미 일상이 되었다. Google Forms와 같은 온라인 설문조사 플랫폼은 동아리 운영, 강의 평가, 공동 구매, 학술 연구 등 아주 폭넓게 활용되고 있다. 그러나 많은 이용 사례에서 조사자는 추후 피조사자에게 연락하기 위해 전화번호, 이메일 주소와 같은 민감한 연락처 정보를 수집한다. 그리고 이러한 개인정보를 수집함과 동시에 수집한 정보를 기한 내 파기하겠다는 동의서를 함께 첨부하는 경우가 많지만, 실제로 조사자가 수집한 정보가 기한 내에 파기되었는지 피조사자 입장에서는 알 수 없었다.

이러한 문제에서 착안하여, 연락처와 같이 민감한 개인정보를 안전하게 보호하는, 기존과 차별화된 온라인 설문조사 플랫폼을 제작하고자 한다. 피조사자가 입력한 전화번호나 이메일 주소와 같은 개인정보를 조사자에게 직접적으로 전달하지 않고, 조사자가 플랫폼을 통해 피조사자에게 문자나 메일을 보낼 수 있도록 하여, 피조사자의 개인정보를 강력하게 보호한다. 또한 조사자에게 편리한 설문조사 폼 생성 기능과, 설문 응답 결과에 대한 효율적인 분석 및 활용성을 제공한다.

개발 과제의 배경

대다수의 설문조사가 구글폼과 같은 설문조사 플랫폼을 통해 온라인으로 이루어지고 있다. 하지만 이러한 기존 플랫폼은 조사자와 피조사자의 요구를 충족시키지 못한다.

배경1: 온라인 설문조사 플랫폼에서의 강력한 개인정보 보호 방법 부재

온라인 설문조사에서 피조사자의 연락처를 요구하는 경우가 빈번하다. 하지만 연락처 수집은 설문조사의 목적이 아니라 조사자가 설문과 관련된 안내사항을 피조사자에게 전달하기 위한 수단으로만 사용되는 경우가 많다. 해당 예시는 다음과 같다.

설문조사의 예시 조사자의 조사 목적과 직접적으로 관련있는 설문 내용 조사자의 목적과 직접적인 관련은 없지만 필요한 설문 내용
A씨는 본인의 연구를 위해 불특정 다수를 대상으로 한 설문조사를 실시하려고 한다. 설문의 내용은 사례 연구를 위한 질문들과, 설문 답변에 대한 소정의 답례(기프티콘)를 전달하기 위한 피조사자의 연락처이다. 사례 연구를 위한 질문 답례(기프티콘)를 전달하기 위한 피조사자의 연락처
B씨는 SNS를 통해 공동구매를 진행할 것이다. 공동구매에 참여할 사람들의 수요를 조사하기 위해 설문조사를 실시하고자 한다. 설문의 내용은 공동구매 참여 수량 등과 같은 구매상품에 대한 주문서정보와 참여자들이 공동구매관련 안내 사항을 수신할 연락처이다. 구매상품에 대한 주문서정보 참여자들이 공동구매관련 안내 사항을 수신할 연락처
C씨는 코딩동아리 신입부원을 온라인으로 모집하고자 한다. 동아리 지원서는 온라인 설문조사를 이용하며, 설문 내용은 선호하는 언어와 지원자의 기술 지식 등이며 합불합 여부를 통보할 연락처이다. 선호하는 언어와 지원자의 기술 지식 합불합 여부를 통보할 연락처

또 연락처와 같은 개인정보의 이용처와 보존기간에 대해서 구체적으로 안내하지 않는 설문조사가 많다. 안내되었다 하더라도 이것이 잘 지켜지는지 피조사자는 알 길이 없다. 이러한 경우에 피조사자의 개인정보 보호는 순전히 조사자의 양심에 따라 이루어진다.

배경2: 기존 설문조사 플랫폼에서 겪는 불편함

설문조사를 통해 유의미한 결과를 얻고자 하는 조사자에게, 응답 결과를 단순한 통계나 그래프로 제공받는 것은 불충분하다. 또 많은 설문조사들이 설문 참여 독려를 위해 응답자를 무작위로 추첨하는 이벤트를 진행하는데, 조사자가 직접 중복 응답자를 제거하고, 다른 서비스를 통해 추첨을 돌려야 하는 불편함이 발생한다. 설문조사 폼을 유연한 형식으로 생성하는 것도 불가하다.

이와 같은 문제를 인식하여 본 프로젝트를 진행하게 되었다. 이를 통해 기대할 수 있는 효과는 다음과 같다.

효과1: 피조사자의 개인정보를 강력하게 보호

조사자가 설문조사의 본 목적을 달성하도록 돕고, 피조사자에게 연락할 방법을 제공하여, 설문조사의 본 목적을 해치지 않고 피조사자의 개인정보를 보호할 수 있다.

효과2: 조사자에게 편리한 연락 서비스를 제공

기존 설문조사 플랫폼의 경우, 수집한 연락처로 연락하기 위해 설문결과를 수합하고 스프레드시트로 정리하여 단체 문자나 메일링 서비스에 연락처 파일을 업로드하는 번거로운 과정을 거쳐야 한다. 그러나 본 프로젝트는 하나의 사이트에서 연락처 수집부터 문자(메일)보내기까지 통합된 서비스를 제공한다.

효과3: 조사자의 개인정보 보호책임 이행을 도움

기존 설문조사 플랫폼의 경우 조사자와 피조사자만 설문조사에 참여한 반면, 본 프로젝트는 그들 사이에 플랫폼이 개입한다. 조사자는 플랫폼에 개인정보 보호책임을 위탁하고, 플랫폼은 피조사자에게 개인정보의 제한된 활용을 약속한다. 플랫폼을 통해서 조사자는 손쉽게 개인정보 보호의무를 다하고, 피조사자의 신뢰를 얻는다.

효과4: 설문조사의 효율성 향상

조사자에게 유연한 설문조사 폼 생성 기능을 제공하고 설문 응답 결과를 효과적으로 분석, 활용함으로써 조사자의 능률을 향상한다.

따라서 본 프로젝트는 설문조사 피조사자의 개인정보를 강력하게 보호함으로써 피조사자의 신뢰를 얻고, 조사자에게 편리한 설문조사 서비스를 제공함으로써 조사자의 능률을 향상시키는 설문조사 플랫폼을 제작하는 것을 목적으로 한다.

개발 과제의 목표 및 내용

목표 내용
연락처에 해당하는 개인정보 보호 조사자가 피조사자의 연락처를 연락의 목적에 맞게 사용 - 개별/단체 문자, 이메일 전송
민감한 설문 내용이 활용 후 파기되는 것을 보장하기 위해, 설문 조사자가 설문 시작 전에 기간을 입력하고 만료시 자동 삭제
편리한 폼 생성 대표적인 템플릿 제공
이전에 제작한 템플릿 재사용 가능
답변 방식 지정 가능
- 객관식 문항의 경우, 다중택1, 다중택다
- 주관식 문항의 경우, 단답형, 장답형, 필수/선택 응답
입력 데이터 형식 지정 가능 - 휴대전화번호, 이메일 주소, 생년월일 등
문항의 지문과 선택지에 이미지, 동영상, URL 등 삽입 가능
설문 응답 결과 조회 설문조사 결과 조회
결과를 스프레드시트로 내보내기
경쟁 서비스는 제공하지 않는 편의 기능 제공 설문 응답자 무작위 추첨 기능
설문 답변 통계, 키워드 분석, 도표화, 그래프화, 히트맵 등의 결과 분석 리포트
여러 답변 중 무작위로 답변을 뽑는 기능
주소로 우편번호를 찾는 모듈
개인정보 파기 기한을 설정한 경우, 기한 만료로 인해 정보를 삭제했을 때 안내 메일을 발송
플랫폼의 수익 창출 구조 문자 및 메일 서비스 유료 이용
특권을 가진 유료 계정
- 설문조사 메인페이지를 만들어서, 메인페이지에 설문이 올라가게 하는 기능
설문조사의 주제에 따라 광고가 타겟팅되는 광고 배너

관련 기술의 현황

관련 기술의 현황 및 분석(State of art)

현재 온라인 설문조사 플랫폼 중 접근성에 가장 좋은 Google 설문지를 기준 살펴보았을 때, 해당 서비스의 특장점은 아래와 같다.

  • 객관식 문항에 대해서 간단한 통계를 보여준다.
  • 단일 문항에 대한 결과분석을 제공한다. 문항간 연관성에 대해서는 분석하지 않는다.
  • 사용자가 입력한 개인정보를 보안성 없이 폼 제작자에게 제공한다.
  • 폼 제작 UI가 아이콘을 클릭하거나 드래그&드랍하는 형식으로 이루어져 있다. 각종 기능을 나타낸 아이콘은 사용자의 직관으로 한 번에 알아차리기 어려워서 익숙하지 않은 사용자들은 폼 제작에 어려움을 겪는다.

기술 로드맵

Ss1.png

시장상황에 대한 분석

경쟁제품 조사 비교
비교 기준 Google 설문지 Survey Monkey
서비스 이용료 무료 부분무료
(월 3만원대)
디자인 및 폼 커스텀 제한됨 유료 서비스
기본 제공 템플릿의 개수 22 169
문항 타입 약 9가지
(다중택일, 다중택다, 단/장답형 등)
약 21가지
(다중선택, 별점 매기기, 이미지 업로더 등)
질문 분기 및 조건부 논리 객관식 및 드롭다운 질문에 사용 가능 Google 보다 좀 더 다양
설문 결과 시각화 응답문항에 대한 간단한 차트 제공 데이터 내보내기와 결과 시각화는 유료 서비스
피조사자의 개인정보를 보호하는 기능

온라인 설문조사를 처음 여는 사용자도 쉽게 디자인할 수 있도록 편리한 UI를 구성하고 대표적인 설문상황에 맞춰 템플릿을 다양하게 제공함으로써 진입장벽을 낮출 수 있을 것이다. 또한 개인정보를 보호한다는 독보적인 서비스도 사생활보호를 중요하게 여기는 사회 풍조와 맞물려 피조사자들이 새로운 플랫폼에서 시행하는 설문에 대해서도 거부감을 줄일 수 있다.

마케팅 전략 제시
  1. 주로 피조사자에 해당하는 일반 대중들에게는 개인정보의 유출에 대한 심각성과 온라인 설문조사에서의 개인정보 보호의 중요성을 일깨우는 내용으로 마케팅한다.
  2. 대학교에서의 학생회, SNS 인플루언서들 등 여러 사람과 소통을 요하는 사람들에게 홍보할 수 있다.
  3. 온라인 설문조사를 자주 활용하는 단체장, 기업들을 대상으로 공격적인 마케팅을 시행한다.
SWOT 분석
Strength 연락처라는 특수한 데이터를 다룸으로써 설문조사와 피조사자에게 연락이라는 두 가지 행위를 한 플랫폼에서 간편하게 제공
Weakness 이미 온라인 설문조사 시장에서 우세한 기업이 존재
Opportunity 설문조사에서 개인정보 보호와 관련된 서비스는 독보적임
Threat 개인정보 보안성을 제공하는 경쟁 서비스의 등장

개발과제의 기대효과

기술적 기대효과

기존의 설문조사 플랫폼들 중에서 개인정보 은닉 및 파기를 보장하는 서비스가 없었다는 점에서, 본 과제를 시작으로 온라인 설문에서의 개인정보 보호 모델/기술에 대한 관심이 높아질 것으로 보인다.

경제적 및 사회적 파급효과

경제적

서비스를 운영할 클라우드 비용을 월 18만원, 배포/문자 비용을 13만원이라고 가정했을 때, 약 월 31만원이 지출될 것으로 예상된다.

그리고 본 서비스의 주된 수입은 아래와 같다.

유료 계정 광고 배너 문자 및 메일 서비스
월 1 만원.
설문조사 메인페이지를 만들어서, 메인페이지에 설문이 올라가게 하는 기능, 자신의 설문조사가 더 많이 대중들에게 노출될 수 있도록, 더 많이 참여될 수 있도록 해줌
설문조사(폼)의 주제에 따라 광고를 타겟팅해서, 광고자가 만족할 수 있도록 하는 광고 배너 설문 참여자에게 문자/메일을 전송하고자 할 때 서비스 UI를 통해 개인/단체 문자 또는 메일을 쉽게 전송할 수 있게 해줌.

초반 몇 달 동안은 손해를 감수하고서라도 많은 대중들에게 폼의 유용성과 실효성에 대해 홍보할 수 있도록 무료로 많은 기능을 제공한다.

사회적
  • 개인정보 보안에 초점을 둔 온라인 설문조사 플랫폼을 시작으로, 온라인 활동 도처에서 개인정보 오남용을 막고 보호를 실천할수 있음을 알릴 수 있다.
  • 소비자들로 하여금 개인정보 유출에 경각심을 갖고 적극적으로 예방해야한다는 의식을 심게 한다. 소비자는 기업에게 개인정보 보호를 보다 강력하게 요구하며 사회전반적으로 진보적인 개인정보 보호 의식을 보편한다.

기술개발 일정 및 추진체계

개발 일정

단계별 세부개발 내용 담당자 개발기간 (월단위) 비 고
3 4 5 6
프론트: 사용자 페이지 구성 회원가입/로그인 박재선,김지윤
마이페이지 박재선,김지윤
설문 폼 제작 페이지 박재선,김지윤
설문 폼 응답 페이지 박재선,김지윤
설문 결과와 레포트 관련 페이지 박재선,
김정현
문자와 메일관련 페이지 고다현,
김정현
요금 충전관련 페이지 고다현, 김정현
메인페이지 고다현, 김정현
프론트:
컴포넌트에 기능 연결
회원가입/로그인 박재선,김지윤
마이페이지 박재선,김지윤
메인페이지 고다현
설문 폼 제작 페이지 박재선,김지윤
설문 폼 응답 페이지 박재선,김지윤
설문 결과 와 레포트 관련 페이지 박재선,
김정현
문자와 메일관련 페이지 고다현,김정현
요금 충전관련 페이지 고다현,김정현
백엔드: DB 구축 및 API 정의 DB 설계 김정현,김지윤,오지석
고다현,박재선
회원가입/로그인 김정현,김지윤,오지석
문자/메일API 김정현,김지윤,오지석
백엔드: 폼 제출 폼 제출 데이터 가공 김정현,김지윤,
고다현
폼 제출 김정현,김지윤,
고다현
결제 김정현,김지윤,
고다현
백엔드:결과보고서 통계 결과 김정현,김지윤,
고다현,오지석
키워드 분석 김정현,김지윤,
고다현,오지석
그래프 생성 김정현,김지윤,
고다현,오지석
통합 테스트 1차: 프론트엔드와 백엔트의 동기화 김정현
2차: 필수 설문 기능 테스트 김정현
최종: 문자/메일 기능 및 통계 분석 테스트 김정현

구성원 및 추진체계

이름 주된 담당 영역 비고
김정현 팀장, 프론트엔드, 백엔드
오지석 백엔드
김지윤 프론트엔드, 백엔드
고다현 프론트엔드, 백엔드
박재선 프론트엔드

설계

설계사양

제품의 요구사항

본 프로젝트는 온라인 설문조사 플랫폼으로서 개인정보라는 특수한 데이터를 조사자에게 은닉함과 동시에 설문조사와 연락 서비스를 통합해서 제공한다. 설문조사의 이용자인 조사자와 피조사자의 관점에서 우리 서비스가 갖춰야 하는 요구 사항은 아래와 같다.

구분 내용
조사자 - 개인정보 보호의무를 간편히 이행
- 피조사자에게 신뢰를 얻음
- 편리한 연락 서비스: 설문결과를 수합하고 엑셀로 정리하여 단체 문자나 메일링 서비스에 연락처 파일을 업로드하는 번거로운 과정 필요 없음
- 유연한 형태의 설문폼 제작 가능: 다양한 질문 유형과 답변 형식, 답변에 따라 특정 문항 활성화
- 보다 높은 설문답변의 활용성: 주관식 답변 키워드 분석, 답변 즐겨찾기, 설문 응답자 무작위 추첨 기능
- 설문 폼 홍보
피조사자 - 개인정보를 강력하게 보호받음
- 특정 유형의 답변(휴대전화번호, 이메일, 주소, 날짜, 시간, 파일업로드)을 보다 간편하게 입력 가능

설계 사양

번호 요 구 사 항 D or W 비고 (중요도)
1 피조사자가 제공한 개인정보는 어떤 형태로든 조사자측에 전달되지 않도록 보호한다. D
2 조사자가 피조사자의 연락처를 직접 조회하지 않고도 문자/이메일 등의 매체로 연락할 수 있도록 기능을 제공한다. D
3 설문조사 참여 과정에서 피조사자가 작성한 정보를 통신 과정과 DB 저장과정을 비롯하여 모두 암호화한다. D
4 설문조사지를 생성할 때 고지한 개인정보 파기 기간이 지날 경우 서버측에서 자동으로 개인정보를 파기한다. D
5 경쟁 플랫폼에서는 제공하지 않는 문항 타입(주소, 연락처, 파일 등)을 제공한다. W
6 설문 응답 결과를 스프레드시트와 같은 외부 형식으로 추출할 수 있도록 한다. W
7 설문 답변 통계, 키워드 분석, 도표화 등의 고급 통계 기능을 제공한다. W

본 과제는 개발 과제 요약 섹션에서 언급한 것처럼, 타 설문조사 플랫폼과 달리 개인정보에 대한 높은 기밀성 및 파기 보장성을 제공한다는 점에서 차별점을 가져야 한다. 이러한 과제 정의에 부합할 수 있도록 요구사항에는 개인정보 기밀성과 관련된 4가지 사항을 가장 중요하게 취급하고 있다. 이 4가지 요구사항을 만족하는 설계를 할 수 있다면, 개인정보 기밀성 측면에서는 타 플랫폼에 대한 우위를 점할 수 있다.

개인정보 기밀성은 피조사자 입장에서는 큰 이점이므로, 우리의 플랫폼을 사용할 만한 큰 메리트가 되지만 설문지를 생산하는 조사자 입장에서는 이미 익숙한 타 플랫폼 대신 본 플랫폼을 사용할 중대한 이유가 되지 않을 수 있다. 이에 따라 타 플랫폼에서 제공하지 않는 조사 편의 기능을 제공하여 조사자의 유입을 유도할 필요성이 있고, 이 사항들을 희망사항(W)로 구분하였다.

개인정보 기밀성 및 보안성을 가장 큰 장점으로 내세우고 있는 본 과제의 정체정을 생각하였을 때, 제품 요구사항이 적절히 작성되었으며 필수사항(D)를 만족하는 것만으로도 과제의 주목표를 달성할 수 있다고 판단할 수 있다.

개념설계안

기존의 설문 시스템
본 과제의 설문 시스템 (조사자-피조사자 간 설문 서비스의 동작 흐름도)

기존의 설문조사 시스템에서는 피조사자가 작성한 모든 내용을 조사자가 볼 수 있었고, 조사자가 피조사자에게 연락을 취하기 위해서는 피조사자의 연락처(전화번호, 이메일)를 수집해야 했다. 그러나 피조사자의 연락처와 그 사람을 특정할 수 있는 개인정보가 함께 조사자에게 전달되게 되므로 개인정보가 외부로 유출되거나 악용되는 문제점이 발생할 수 있다. 또한 개인정보를 수집하면서 설문지에 개인정보 이용 및 파기 기간을 명시해두는 경우가 많지만 해당 개인정보가 정말로 그 기간 후에 파기되는지 보장되지 않는다.

대부분의 이용 사례에서 조사자는 피조사자의 연락처 자체가 필요하다기보다, 피조사자 전체에 대한 공지, 이벤트 당첨에 따른 개인 연락 등 임시적인 연락 수단이 필요한 경우가 많다. 따라서 아래 그림과 같이 기존의 모든 응답 정보를 조사자에게 제공하던 방식에서 벗어나서, 연락처 데이터는 어떤 방식으로든 조사자에게 전달하지 않고 연락이 필요할 경우 플랫폼의 UI를 이용하여 문자/이메일을 전송할 수 있도록 하였다.

상세설계 내용

시스템 전체 개요

조사자가 설문 이후 피조사자에게 연락하기 위해 전화번호 또는 이메일을 함께 수집하는 경우, 조사자는 플랫폼에서 제공하는 연락처 문항 타입을 이용해 손쉽게 관련 문항을 마련할 수 있다. 그리고 설문조사지를 생성하면서 개인정보의 유지 기간을 함께 설정할 수 있는데, 유지 기간이 만료되면 설문 서비스에서 피조사자의 개인정보를 자동으로 파기하여 조사자의 개인정보 보호 의무를 대신 수행한다.

피조사자가 제공한 개인정보는 설문 서비스 DB에는 암호화되어 저장되지만, 조사자에게는 어떤 형태로든 전달되지 않는다. 이는 설문 서비스의 REST API에서 연락처 데이터를 마스킹하여 조사자에게 전달하는 방식으로 구현된다. 그리고 조사자가 피조사자에게 연락을 취하고자 하는 경우 플랫폼의 문자/이메일 전송 기능을 사용한다. 이렇게 되면 피조사자의 연락처 데이터가 조사자에게 결코 전달되지 않으면서도 설문의 모든 과정을 기존과 동일하게 수행할 수 있다.

기능 구현을 위한 세부기술 선택사항 (디자인)

DB 암호화
  • 피조사자가 입력한 개인정보를 조사자에게 제공하지 않는다. 이 정보를 DB상에서도 암호화해서 조사자뿐만 아니라 DB에 접근하는 모든 사용자로부터 개인정보를 보호한다.
  • DB의 레코드를 암호화하고 허가된 프로세스만 복호화할 수 있도록 하여, DB 유출 시에도 개인정보가 외부에 드러나는 것을 방지한다.
설문응답 조사 데이터 분석 지원
  • 각 문항에 대한 분석뿐만 아니라 필터링을 추가해서 연관된 문항의 응답 결과를 비교할 수 있다.(조건부확률, 상관관계)
  • 일반 텍스트로 주어지는 응답에 대해서 공통적으로 등장하는 키워드나 응답 경향을 분석해주는 툴을 도입해서 방대한 설문 결과를 분석하는데 도움을 준다.
웹서비스 구현과 유지에 필요한 툴
  • NoSQL/Cloud (Mongoose, Mongo Atlas)

폼 제작자의 설문내용에 대해 설문마다 다르므로, SQL을 사용하기에는 다소 무리가 있어 NoSQL을 사용한다. NoSQL중 MongoDB를 선택했으며, 클라우드 서비스로 Mongo Atlas를 사용한다.

  • Node(Backend, GraphQL 또는 Rest API)

Node는 확장성 있는 네트워크 애플리케이션(특히 서버 사이드) 개발에 사용되는 소프트웨어 플랫폼이다. 작성 언어로 자바스크립트를 활용하며 논블로킹(Non-blocking) I/O와 단일 스레드 이벤트 루프를 통한 높은 처리 성능을 가지고 있다.내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도의 소프트웨어 없이 동작하는 것이 가능하며 이를 통해 웹 서버의 동작에 있어 더 많은 통제를 가능케 한다.

이 서비스에서 결과 분석을 하기 위해 DB에 요청을 하고, 설문의 내용을 저장할 때 또 DB에 요청하는 등 대부분의 요청에 대해 DB에 접근한다. GraphQL을 사용하면 REST API에서 DB요청을 할 때, DB에 대해서 과도하게 요청하거나, 너무 적게 요청하는 일(Underfetching, Overfetching) 없이 딱 적합하게 DB 서버에 요청할 수 있어서 전반적으로 서버에 대한 성능이 올라갈 수 있다. 또한 URL체계가 없어서 URL, Query, Params에 대한 내용을 관리할 필요가 없다. URL이 많아질수록 개발 시간과 개발에 대한 유지보수를 좀 더 단축시킬 수 있다.

  • React

자바스크립트 라이브러리의 하나로서 사용자 인터페이스를 만들기 위해 사용된다. 기존 프론트 코드 대비 자동적으로 바뀌는 부분만 리렌더링 하도록 하여 성능을 향상시킨다.

  • ORM

DB와 Node간의 연결을 이루어주고, entity를 type화 시켜서 DB와 코드를 동기화시키고 코드를 쉽게 짜는 데 사용한다.

  • Paddle

결제 모듈로 Paddle의 서비스를 사용할 것이다. 다른 결제 서비스들(Stripe 등)은 회사가 필요하지만, Paddle은 현재 회사를 따로 만들지 않아도 결제 서비스가 가능하도록 지원하며, 온라인 자산(온라인 구독 등)에 대해서만 결제가 가능한 결제 서비스이다.

소프트웨어 설계

기능 요구

이 사이트가 제공해야 하는 기능들이 어떤 것인지 간략하게 나열하면 아래와 같다. (기능 측면은 사용자 입장에서 작성하고, 구현에 관한 내부적인 설계에 대한 것을 언급한다.)

구분 기능
공통 - 회원가입, 로그인
피조사자에게 제공 - 로그인 유무에 상관 없이 폼에 응답
- 개인정보 문항(전화번호, 이메일) 중 조사자가 암호화 옵션을 적용한 문항에 응답할 때, 본 문항의 응답이 조사자에게 전달되지 않을 것임을 보여줌
- 개인정보 문항 중 조사자가 파기 기한을 설정한 문항에 응답할 때, 본 문항의 응답이 언제 파기될 것인지 보여줌
- 파기 기한이 설정된 개인정보 문항에 응답했을 경우, 기한 만료로 인해 정보를 삭제했을 때 안내 메일을 발송
조사자에게 제공 - 로그인 유무에 상관 없이 폼에 응답
- 개인정보 문항(전화번호, 이메일) 중 조사자가 암호화 옵션을 적용한 문항에 응답할 때, 본 문항의 응답이 조사자에게 전달되지 않을 것임을 보여줌
- 개인정보 문항 중 조사자가 파기 기한을 설정한 문항에 응답할 때, 본 문항의 응답이 언제 파기될 것인지 보여줌
- 파기 기한이 설정된 개인정보 문항에 응답했을 경우, 기한 만료로 인해 정보를 삭제했을 때 안내 메일을 발송
- 로그인 후 설문조사 폼 제작 및 수정, 삭제 가능
- 이전에 제작한 폼 템플릿 재사용 가능
- 서비스에서 기본 제공하는 폼 템플릿 사용 가능
- 폼의 이름, 설문 시작 여부, 설문 마감 여부, 설문 마감 시간 설정
- 폼 각 문항의 유형 지정 가능 : 객관식, 주관식, 선형배율, 그리드, 개인정보(휴대전화번호, 이메일), 우편번호(주소) 등
- 폼 각 문항의 답변 방식 지정 가능 : 공통-필수/선택응답, 객관식-다중택일,다중택다, 주관식-단답형,장답형
- 입력 데이터 형식 지정 가능 - 휴대전화번호, 이메일, 주소, 날짜, 시간, 파일업로드
- 문항의 지문과 선택지에 이미지, 동영상, 유튜브 URL 삽입 가능
- 답변에 따라 특정 문항이 활성화되도록 설정 가능 (연관된 문항 기능)
- 폼의 문항 중 대표 문항 1개 설정
- 설문조사 결과 조회 - 주관식 문항의 답변 키워드 분석, 시각화된 그래프(도표, 그래프, 히트맵), 조건부확률, 답변 조회, 특정 답변 즐겨찾기
- 설문조사 결과를 스프레드 시트로 출력
- 설문 응답자 무작위 추첨 기능
- 폼에서 개인정보 문항을 포함한 경우 개인정보 파기 기한을 설정
- 폼의 응답으로 등록된 연락처(휴대전화번호, 이메일)로 간편하게 문자/이메일 발송(유료서비스 코인 소비)
- 유료 서비스(월정액, 프리미엄 원회)를 결제할 경우, 메인페이지 배너에 설문폼 홍보 가능
- 코인 충전 기능, 프리미엄 회원 등록 및 해지
- 문자/이메일 발송 내역 조회
- 코인 충전 및 소비 내역 조회
서버 인프라 - 개인정보 문항에 응답한 답변의 경우, 암호화하여 저장
- 조사자가 코인을 소비하여 요청한 문자와 이메일 보내기 요청을 수행
- 문자 메시지와 이메일을 보낸 내역과 코인 충전 및 소비 내역을 자동으로 DB에 등록
- 설문 응답 데이터를 분석 (키워드 분석, Market Basket Model, Correlation)
- 만료 기한이 설정된 폼의 개인정보 문항을 삭제
- 설문조사 참여 링크제작

본 프로젝트는 온라인 설문조사 플랫폼으로서 개인정보라는 특수한 데이터를 조사자에게 은닉함과 동시에 설문조사와 연락 서비스를 통합해서 제공한다. 설문조사의 이용자인 조사자와 피조사자의 관점에서 우리 서비스를 이용해서 얻을 수 있는 이점은 다음과 같다.

대상 이점
조사자 - 개인정보 보호의무를 간편히 이행
- 피조사자에게 신뢰를 얻음
- 편리한 연락 서비스: 설문결과를 수합하고 엑셀로 정리하여 단체 문자나 메일링 서비스에 연락처 파일을 업로드하는 번거로운 과정 필요 없음
- 유연한 형태의 설문폼 제작 가능: 다양한 질문 유형과 답변 형식, 답변에 따라 특정 문항 활성화
- 보다 높은 설문답변의 활용성: 주관식 답변 키워드 분석, 답변 즐겨찾기, 설문 응답자 무작위 추첨 기능
- 설문 폼 홍보
피조사자 - 개인정보를 강력하게 보호받음
- 특정 유형의 답변(휴대전화번호, 이메일, 주소, 날짜, 시간, 파일업로드)을 보다 간편하게 입력 가능

피조사자의 이득이 조사자에 비해 많지는 않지만, 설문 폼을 제작하고 우리 서비스의 기능을 적극적으로 이용하는 대상은 조사자이고, 피조사자는 만들어진 폼에 응답할 뿐이므로, 서비스를 이용하는 조사자의 수가 증가하면 피조사자의 수는 필연적으로 증가한다.

온라인 설문조사를 자주 활용하는 단체장과 기업에게, 서비스를 통해 조사자가 얻을 수 있는 이점을 중심으로 하며 개인정보보호의무를 강조하는 마케팅 전략을 세운다. 주로 피조사자에 해당하는 일반 대중들에게는 개인정보 유출에 대한 심각성과 온라인 설문조사에서의 개인정보 보호의 중요성을 일깨우는 내용으로 마케팅한다. 또한 개인정보 보호 책임에 민감한 단체(관공서 등)에 집중적으로 홍보할 계획이다.

위에 기술한 것을 바탕으로 구체적으로, 어떤 기능을 구현해야 할것인지 기술한다. 이 내용은 Frontend, Backend, DB에 반영될 것이다.

UI 설계

위에서 설정한 기능요구를 충분히 반영할 수 있는 UI를 만들어야 한다. 만들어야 할 페이지와, 각 페이지에서 접근할 수 있는 기능들을 정리하면 아래와 같다.

공통
  • 상단의 메뉴 바

항상 페이지의 상단에 고정되어 있다. 마우스를 위에 올리면 메인페이지로 돌아가는 아이콘, 설문 메뉴, 연락 서비스 메뉴, 공지사항 메뉴로 이동할 수 있는 메뉴 팔레트가 나타난다. 로그인, 로그아웃, 회원가입, 마이페이지 로 이동할 수 있는 링크도 제공한다.

PIC4AD7.png

  • 클립

서비스를 이용하고 있을 때, 현재 어떤 서비스를 이용할 수 있는지 알려주는 안내 표지 같은 용도이다. 화면의 좌측에 책갈피처럼 튀어 나와 있다. 이 클립을 클릭하면 연결된 링크로 이동한다.

PIC4AD8.png

메인 페이지

홈페이지의 대표화면이다. 중앙에 광고 배너와 공개 설문목록이 있다. 프리미엄 회원은 자신의 설문을 메인페이지에 홍보할 수 있다. 광고배너나 설문 목록을 클릭하면 해당 설문에 바로 참여할 수 있다.

  • 광고 배너

화면의 상단 중앙에 광고 배너가 위치한다. 이는 일반적인 웹 사이트에서 표시되는 광고 뿐만아니라, 특정 설문 조사에 대한 홍보 광고가 될 수 있다.

  • 현재 참여할 수 있는 공개 설문

공개적으로 진행하는 설문 조사가 메인 페이지의 중앙부에 위치한다. 이는 유료 계정을 사용하는 조사자가 진행하는 공개 설문으로, 유료 계정을 사용하는 조사자는 자신의 설문조사가 메인 페이지에 노출되게 할 것인지를 각 설문조사마다 개별적으로 설정할 수 있다.

로그인, 로그아웃, 회원가입 페이지, 아이디찾기, 비밀번호찾기
  • 로그인 페이지

상단의 메뉴 바에서 로그인 버튼을 누르면 로그인 페이지로 이동한다. 아이디와 비밀번호를 입력하고 로그인할 수 있는 컴포넌트를 제공한다. 아이디 찾기, 비밀번호 변경 페이지 (3-4)로 이동할 수 있는 버튼을 제공한다. 로그인에 성공하면 메인페이지로 돌아간다.

PIC4AEA.png

  • 로그아웃

페이지를 따로 만들지 않고, 상단의 메뉴 바(1-1)에 로그아웃 버튼을 누른다.

  • 회원가입 페이지

회원가입을 위한 정보를 입력하고, 이메일 인증을 수행하는 페이지를 만든다. 필요한 컴포넌트는 사용자 ID*, 사용자 인증을 위한 E-Mail*, 사용자 이름*, 사용자 비밀번호*, 비밀번호 확인*, 이용약관 동의* 등이다. *표는 필수 입력 항목이다. 입력하는 정보는 사용자를 DB에 추가하기 위해 필요한 속성들이다.

PIC4AFB.png

  • 아이디 찾기, 비밀번호 변경하기 페이지

이메일로 등록된 회원정보를 조회한다. 사용자가 아이디나 비밀번호를 잊은 경우, 회원가입 시 등록한 이메일 주소로 사용자의 아이디를 보낸다. 비밀번호는 메일 인증 후 재설정할 수 있다.

설문 페이지

본 시스템은 설문의 상태를 3가지로 정의해 관리하는데, 아래 그림과 같이 “디자인 중”, “설문 중”, “마감 완료” 상태가 존재한다.

설문의 3가지 상태
상태
설명
디자인
설문을 처음 만들고 문항 디자인을 하는 단계이다. 설문 제목, 마감일, 파기 기한 등을 설정할 수 있다. 디자인이 확정된 후에는 '설문 중'상태로 바꿀 수 있다. '설문 중'상태나 '마감 완료' 상태에서 '디자인 중' 상태로 돌아올 수 없다.
설문
디자인을 마치고 설문을 실시하는 단계이다. 설문의 설정(제목, 파기 기한 등)을 변경할 수 없다. 설문의 마감일은 바꿀 수 있다. 설문참여 링크를 생성해서 피조사자들이 설문에 참여할 수 있으며, 제출된 답변을 확인할 수 있다.
마감
완료
설문조사가 마감된 상태이다. 이 상태에서는 사용자가 더 이상 답변을 제출할 수 없다. '설문 중'에 수동으로 마감 완료로 바꾸거나 등록한 마감일에 자동으로 바뀔 수 있다. 원한다면 다시 '설문 중' 상태로 바꿔 새로운 응답을 받을 수 있다.
  • 내 설문 페이지

로그인한 사용자가 이전에 만든 설문(폼)들을 한 자리에 모아 볼 수 있는 페이지이다. '설문'은 세 가지 상태가 존재한다. 디자인 중(설문 시작 전), 설문 중, 마감완료된 설문 이 세 가지 상태의 설문을 분류해서 보여준다. 설문 아이콘에는 설문의 제목이 쓰여 있다. 설문 버튼을 클릭하면 해당 설문의 정보 페이지로 이동한다.

PIC4B0C.png

  • 설문 정보 페이지

로그인된 사용자가 자신이 소유한 설문의 정보를 확인하고, 수정할 수 있는 페이지이다. 설문 디자인의 미리보기를 제공한다. 설문의 이름, 설문 시작날짜, 마감날짜, 공개여부 등 간단한 설정을 수정할 수 있다. '제출된 답변 확인' 버튼을 누르면 설문 답변 확인 페이지로 이동한다. 설문의 디자인(섹션, 문항의 배치 등)을 수정하려면 '설문 디자인 수정하기' 버튼을 눌러서 설문 디자인 페이지로 이동한다.

PIC4B0D.png

  • 새 설문 만들기 페이지(템플릿 선택 페이지)

로그인한 사용자는 새 설문은 만들 수 있다. 사이트가 기본적으로 제공하는 템플릿과, 사용자가 이전에 만들었던 설문 중 하나를 골라 템플릿을 재활용할 수 있다. 템플릿 미리보기를 제공하며, '선택' 버튼을 누르면 선택한 템플릿과 구조가 같은 설문을 제작해서 DB에 추가하고, 해당 설문의 설문 디자인페이지로 이동한다.

PIC4B1E.png

  • 설문 디자인 페이지
폼-섹션-질문 간의 포함 관계
학교 폭력 경험 설문조사에서 트리거를 사용하는 예시

설문의 구조는 폼-섹션-질문의 포함관계로 정의된다. 폼은 1개 이상의 섹션을 포함하며, 한 섹션은 1개 이상의 질문을 포함한다. 어떤 질문의 선택지는 다른 섹션을 활성화한다. 이를 이용해 아래와 같은 연관된 문항 기능을 구현할 수 있다.

예를 들어, 학교 폭력 가해 및 피해 경험을 조사하는 설문 조사에서 학생이 응답한 바에 따라 다음으로 어떤 문항을 보여줄지를 결정하고 싶다고 가정하자. 이 때, Q1에서 가해 경험이 있다고 응답하면 섹션 1 이후 섹션 2로 진행하고, Q2에서 피해 경험이 있다고 응답하면 섹션 3로 진행한다.

PIC4B31.png

이 페이지에서는 화면 문항에 추가할 수 있는 문항 목록이 나타나 있다. 문항 버튼은 문항의 생김새를 형상화한 그림과 문항의 유형명으로 이루어져 있다. 직관적인 디자인으로 누구나 쉽게 폼을 제작할 수 있다. 폼을 디자인하는 과정에서 폼 제작자는 폼-섹션-질문 의 포함관계를 자연스럽게 인지할 수 있으며 쉽게 활용할 수 있어야 한다. 직관적이면서도 친절한 UI를 제작해야 한다. 각주 1에서 설명한 것과 같이, 대표 문항을 설정할 수 있으며, 개인 정보 질문의 경우 암호화 옵션과 만료 기한을 설정할 수 있다.

설문 답변 확인 페이지

PIC4B32.png

암호화 옵션이 지정된 개인정보 질문에 대한 답은 표시되지 않는다.

  • 답변 목록 확인 페이지

제출된 답변을 제출 순번, 대표문항 답 혹은 즐겨찾기 여부 순으로 목록에 나타낸다. 위 그림에서 대표문항은 이름을 묻는 질문1로 설정되었다. 목록에서 특정 답변만 즐겨찾기 추가/해제할 수 있으며, 전체 답변의 즐겨찾기 해제도 할 수 있다. 답변 내용을 스프레드 시트(엑셀)로 출력할 수 있다.

  • 답변 문항별 확인 페이지

답변을 문항별로 분류해서 보여준다. 주관식은 토큰 목록을 보여주며, 객관식은 그래프(차트)로 보여준다.

  • 답변 통계 확인 페이지

조사사의 편의성을 위해 응답 결과로부터 의미있는 통계적 사실을 제공하기 위해 총 3가지의 통계 분석 기능을 제공한다.

연락 서비스 페이지

PIC4B42.png

로그인된 사용자가 사용할 수 있으며, 1개 이상의 설문을 만들어서 답변을 받은 경우에만 이용할 수 있다. 또한 연락서비스를 이용하려고 하는 대상 설문에 연락처를 묻는 질문이 있는 경우에만 이용할 수 있다.

  • 문자 보내기 페이지

화면의 왼쪽 패널에서 사용자가 가진 설문 중 하나를 택한다. 그러면 아래에 해당 설문에 포함된 답변들이 목록에 나타난다. 목록에서 수신자를 선택하고 내용을 입력하면 문자를 보낼 수 있다. 목록에서 임의로 수신자를 선택할 수도 있지만 5-1에서 즐겨찾기를 미리 선택해 놓은 경우 즐겨찾기된 답변만 선택해서 수신자를 선정할 수도 있다. ‘전송’ 버튼을 누르면 문자 메시지 전송 성공 여부를 보여준다. 코인이 부족하면 전송하지 않는다. 수신자 연락처 중 일부 불량 연락처가 있다면 나머지 연락처에대해서만 전송하고 불량 건수는 제외하고 코인을 차감한다. 발송 실패한 내용은 이용 기록 페이지(5-3)에서 자세히 확인할 수 있다.

  • 이메일 보내기 페이지

이용 방법은 문자 보내기 페이지(5-1)과 유사하고, 내용 입력 후 ‘전송’ 버튼을 누르면 이메일 전송 성공 여부를 보여준다.

  • 이용 기록 페이지

사용자가 이용한 연락서비스의 기록을 보여준다. 이용 기록에서 특정 연락 건에 사용된 수신자 목록과 연락 내용을 재활용할 수 있다. 만약 폼의 개인정보 파기 기한이 지난 경우 기록에 있더라도 해당 수신자에게 다시 연락을 할수는 없다.

공지사항 페이지

관리자가 등록한 공지사항을 보여준다. 최신순으로 정렬된다. 목록으로 보여주고, 제목을 클릭하면 내용을 펼쳐서 보여준다.

PIC4B43.png

마이페이지

PIC4B54.png

  • 회원정보 변경

회원의 이름, 비밀번호, 프리미엄 회원 등록/해지를 할 수 있다.

  • 코인 충전하기

연락서비스를 이용할 때 필요한 코인을 충전할 수 있다.

  • 코인 충전/사용 내역

코인을 충전하고 사용한 내역을 보여준다.

과금 정책

본 시스템은 유료로 제공되는 두가지 서비스를 가지고 있다.

코인

카드 결제로 충전할 수 있다. 문자와 메일 1건당 1코인을 필요로 한다. 1코인은10원이며 부가세포함 가격이다. 최소 결제 금액은 1000원(100코인)이며 이후 자유롭게 충전할 수 있다. 코인을 충전하면 이용 기록이 남는다. 한 번 충전한 코인은 소멸되지 않는다.

월정액

월정액 결제로 프리미엄 회원이 될 수 있다. 프리미엄 회원은 진행중 인 설문을 공개해서 메인페이지 배너에 홍보할 수 있다. 금액은 5000원/월 이다.

DB 엔티티 구성

한 설문조사에 포함되는 문항의 순서와 타입이 다양할 수 있으므로, 고전적인 관계형 데이터베이스보다는 NoSQL(MongoDB)를 이용하는 것이 더 용이할 것으로 판단하였다. 구현할 엔티티들의 설명과 역할을 정리하면 아래와 같다.

  1. USER - 이용자: 회원 관련 데이터를 모두 저장한다.
  2. 설문조사지 관련 데이터
    1. FORM - 폼(설문조사지): 개별 설문조사지를 의미하며, 문항들의 집합인 섹션을 포함하는 상위 집합이다.
    2. SECTIONS - 섹션: 설문조사지를 이루는 개별 섹션으로, 문항들을 포함하는 집합이다.
    3. 질문
      1. CLOSED_QUESTIONS - 객관식 질문
      2. OPENED_QUESTIONS - 주관식 질문
      3. LINEAR_QUESTIONS - 선형배율 질문
      4. GRID_QUESTIONS - 그리드 질문
      5. PERSONAL_QUESTIONS - 개인정보 질문
    4. 답변
      1. SUBMISSIONS - 제출답변: 특정 피조사자의 한 설문조사지에 대한 응답 단위, 각 문항에 대한 답변들의 집합
      2. LINEAR_ANSWER: 선형배율 답변
      3. CLOSED_ANSWER: 객관식 답변
      4. OPENED_ANSWER: 주관식 답변
      5. PERSONAL_ANSWER: 개인정보 답변
      6. ADDR_ANSWER: 주소 답변
      7. FILE_ANSWER: 파일 업로드 답변
      8. GRID_ANSWER: 그리드 답변
  3. 결제 및 사용 내역
    1. CONTACT - 문자/이메일 발신 내역
    2. COINCHARGE - 코인 충전 내역
    3. COINCONSUMPTION - 코인 소비 내역
  4. 인증 내역
    1. VERIFICATION - 사용자에 대한 인증 코드 저장

User, Form, Submissions만 실제 스키마로 저장하고 Answer은 Virtual Schema로 저장해서 Submission에 내재하고, Section과 Question은 Virtual Schema로 저장해서 Form에 내재되는 형식으로 설계하였다.

내재되는 형태가 아닌 참조를 하게 되면, Form과 Section이 관계를 맺고, 또 Section과 여러 타입의 Question이 관계를 맺는다. 참조 형식에서 새로운 Question document를 추가하면, NoSQL에서는 관계에 대한 연산이 강제되지 않으므로 관계에 대한 연산을 트랜잭션을 통해 관리해야 한다. 또한, NoSQL은 탐색의 조인에 대해서 성능면에서 떨어지는 경향을 보인다.

Survey Secret 서비스는 Form의 탐색, Submission의 생성이 요청의 많은 부분을 차지한다. 만약 참조된 형태로 작성한다면 Form의 탐색시마다 Question과 Section을 같이 탐색해야 하며(조인 연산), Submission의 생성시마다 Answer 여러개를 만들고 연결하며 Form과도 연결한다(트랜잭션). 즉, NoSQL의 단점인 조인 연산과 트랜잭션에 집중하게 된다. 따라서 참조 형태가 아닌 내재된 형태로 설계한다.

또 Question에는 여러 유형이 있는데, Question 유형 당 하나의 Schema를 작성하지 않고 DB에서 Question의 유형에 따라 validation하기 위해서 MongoDB의 discriminator 기능을 사용하였다. MongoDB의 discriminator는 스키마를 상속 하는것과 비슷한 원리로, Question마다 중복되는 속성을 가지고 있는 하나의 슈퍼타입을 만드는 것이다.

악의적인 요청이 있을 수 있으므로, 질문 내용 등 유저가 입력할 수 있는 필드에 대해서는 모두 길이 제한을 둔다.

백엔드 설계

GraphQL은 하나의 end point를 만들고, 클라이언트에서 쿼리를 작성하면 백엔드에서 처리하는 방식이다. 새로운 기능이나 추가적인 데이터가 필요하더라도 서버측 코드를 수정할 필요 없이 클라이언트의 코드만 수정하면 되고 API 요청에 대한 상세한 내용들을 따로 유지할 필요가 없다.

GraphQL을 사용하면, Over-fetching과 Under-fetching을 해결할 수 있다. Over-fetching이란, 서버의 응답에 내가 필요로 한 정보 외에도 불필요한 정보들이 포함되는 경우이다. 물론, REST API에서도 end point를 하나 추가해서 해결할 수 있지만, 이럴 경우 유지보수 측면에서도 좋지 않고 서버, 클라이언트를 수정해야 한다. 이를 해결함으로써 불필요한 데이터의 양이 줄어들고 네트워크 측면에서도 오버헤드가 줄어든다. Under-fetching이란, 둘 이상의 end point에 대해 데이터를 요청하는 경우이다. GraphQL에서는 여러 Request를 하나로 통합해 요청할 수 있다.

배포 환경에서 많은 부하가 걸렸을 때 서버의 성능을 최대한으로 올리고 API의 유지보수, 상세에 대한 부담을 줄이기 위해 REST API보단 GraphQL에 중점적으로 서버를 구성하였고, 서버의 안정성을 조금 더 올리기 위해 JavaScript 보다는 TypeScript를 사용하였다. 하지만, TypeScript와 GraphQL을 같이 사용할 경우 GraphQL과 TypeScript 타입을 정의하는 코드가 반복되는 경향이 생겨서 유지보수에 매우 좋지 않았고 이 문제를 해결하기 위해서 NestJS 프레임워크를 사용하였다.

로그인 기능은 JWT을 사용하였으며, 사용자가 로그인 후 유효한 사용자라면 사용자의 id 정보 등을 묶어서 JWT를 만들고 사용자에게 보낸다. 클라이언트가 요청하는 API에 대해 JWT를 헤더에 포함해서 보내면 클라이언트에서 받은 JWT를 이용해 유효성 검사 후 해당 데이터를 클라이언트에게 보내는 식으로 작동한다.

각각의 요청에 대한 입력은 class-validator를 사용해서 유효성 검사를 진행하며, 올바르지 않은 형식의 입력이 온다면, 바로 리턴한다. 올바른 형식이 오더라도 올바르지 않은 값이 전달된다면 백엔드에서 유효성 검사 후 리턴한다.

Form, Submission, User에 대해서 생성하거나 수정하는 경우에는 NoSQL은 관계에 대한 연산을 강제하지 않으므로 반드시 multi-collection에 대한 transaction을 통해서 연산을 진행한다. 내재된 형태로 DB를 설계하였으므로, Form의 탐색시에는 조인연산이 진행되지 않고, Submission의 생성시에는 Form과만 연결하는 식으로 트랜잭션의 단위가 작아진다.

Form에 Questions를 넣을 때에는 순서를 맞추어서 넣는다. 서버에 요청되는 API의 횟수는 Form의 조회가 Form의 생성보다 압도적으로 많으므로, 생성 시에 순서를 맞추고, 조회 시에는 빠르게 폼에 대한 정보를 받을 수 있게 한다.

Form을 검색하거나, 모든 Form을 가져오는 연산 등에 대해선 pagination을 적용한다. 스크롤링해서 끝에 다다르면 또 요청하도록 해서 서버에 과부하가 걸리지 않도록 한다. 문제 등에 첨부된 사진과, 유저의 프로필 사진은 AWS S3를 사용해서 클라우드 스토리지에 저장한다. 메일 서비스는 MailGun API를 사용하였으며, 이메일 인증은 사용자마다 랜덤한 코드를 생성해서 DB에 저장한 후, 사용자가 메일에 첨부한 링크를 누르면 DB에 저장된 코드와 비교해서 인증하는 방식으로 작동한다.

문자 서비스는 알리고 API를 사용한다.

인프라 및 데이터 암호화

피조사자가 제공하는 모든 데이터는 통신부터 DB 저장에 이르기까지 모두 암호화되어 전달된다. 따라서 악의적인 공격자는 통신 과정에서 중간자 공격을 하거나 DB 파일을 탈취하더라도 원본 데이터를 알 수 없다. 각 과정에서 시행하는 암호화를 정리하면 아래와 같다.

  • 피조사자가 전송하는 응답 데이터: 피조사자가 제공하는 모든 데이터는 SSL(Secure Sockets Layer)로 암호화되어 전송된다. 수신측은 서버(Amazon EC2)에서 동작하는 Nginx 컨테이너이고, Nginx가 데이터를 수신하면 이를 내부의 React/Nest 컨테이너에 전송한다. Nginx, React, Nest 컨테이너는 Docker의 네트워크를 이용해 통신하므로 EC2 내부에서는 암호화를 하지 않는다.
  • Nest에서 Mongo Atlas로 전송하는 쿼리: Nginx 통신과 마찬가지로 SSL로 보호된다.
  • DB 읽기/쓰기: DB에 저장되는 모든 데이터는 MongoDB의 WiredTiger Storage Engine을 이용해 AES-256으로 암호화된다. 암호화에 필요한 마스터키는 로컬에 저장하지 않고, AWS의 KMS(Key Management Services)에 저장함으로써 승인된 Endpoint/Process만 키에 접근할 수 있도록 한다.

PIC4B55.png

통계 기능 설계
응답 경향성 분석 (Market-Basket Model)

조사자 입장에서 다수의 객관식 문항들 간 응답 경향성을 제공하면 설문조사 결과 해석에 큰 도움을 줄 수 있다. 여기서 말하는 응답 경향성은, 객관식 문항의 선택지 간 Association Rules를 찾아내는 것인데, 아래 예시는 기업을 상대로 기업의 규모와 진출하고자 하는 시장 및 기술을 묻고 있다.

Market-basket-example.png

위 예시에서 언급된 응답 경향 처럼, “특정 선택지 A를 택할 경우, 주로 선택지 B도 함께 선택한다.” 와 같은 Association Rules를 생각할 수 있다. 이러한 문제 상황은 Market-Basket Model로 설명되며, 이를 위해 Backend에서 PCY Algorithm을 통해 자주 등장하는 Itemset을 찾고 Association Rules를 추출할 수 있다.

Backend에서 신뢰성이 높은 Association Rules를 찾아냈다면, 이를 Frontend에서 목록으로 표시한다.

수치 응답 상관 계수 (Pearson Coefficient)

객관식, 선형 배율 문항에 대하여 문항 응답 간 상관계수를 계산하여 제공한다. 여기서 상관 계수란, 수치적으로 표현되는 여러 변수들에 대하여 임의의 변수 쌍이 어떤 관계를 보이는가를 -1~1 사이의 값으로 표현한 것으로 Pearson Coefficient를 일반적으로 사용한다.

예를 들어, 피조사자의 운동 빈도와 골격근량, 체중을 각각 조사하는 설문조사가 있다고 하자. 그렇다면 운동 빈도, 골격근량, 체중 3가지 변수 간에 어떤 상관 관계가 존재하는지를 수치화하여 3x3 행렬로 표현할 수 있다.

Pearson-example.png

키워드 분석 (Word Cloud)

주관식(단답형, 장답형) 문항에 대하여 자주 언급된 키워드로 Word Cloud를 생성한다. 한국어 문장 구조에 대한 전처리를 수행하여 조사를 제거하고 동사 원형을 복구 한 뒤 실행되며, 자주 언급된 단어로 아래와 같은 구름 형태의 이미지를 생성한다.

예를 들어, 강의 평가를 위한 설문 조사에서 강의에 대한 느낀 점과 희망사항을 서술하는 문항이 존재한다고 하자. 그렇다면 아래와 같이 자주 등장한 단어를 크고 눈에 잘 띄는 방식으로 Word Cloud를 생성한다.

PIC4B65.png

결과 및 평가

완료 작품의 소개

프로토타입 사진 혹은 작동 장면

  • 메인 페이지

PIC4B88.png

  • 설문 디자인 페이지

PIC4B98.png

포스터

아래 두 이미지는 본 서비스의 특장점을 홍보하기 위한 배너 이미지이다. 첫 번째 이미지는 서비스의 가장 큰 장점인 개인정보 보안성을 강조하여 서비스가 가진 장점을 서술하였으며, 두 번째 이미지는 유료 회원이 사용할 수 있는 설문 결과 통계 기능, 폼 홍보, 연락 서비스를 강조하였다.

PIC4B76.png

PIC4B87.png

관련사업비 내역서

항 목
(품명, 규격)
수 량 단 가 금 액 비 고
현금
직 접 개 발 비 장소대여비 (더스터디카페, 6인실) 1 72 72 72
Amazon EC2 (t4g.medium, SSD 60GB, 2개월) 1 94 94 94
MongoDB Atlas (M10, 1개월) 1 70 70 70
알리고(문자 API, 충전형) 1 55 55 55
회의비(식비) 1 73 73 73
합 계 364 364 364

완료작품의 평가

각 기능에 대한 완성/미완성 여부를 정리한 표는 아래와 같다.

대분류 중분류 소분류 기능 완성 여부
(Yes or No)
연락처에 해당하는 개인정보 보호 조사자가 피조사자의 연락처를 연락의 목적에 맞게 사용 응답 중 연락처가 조사가에게 제공되지 않음 Yes
개별문자/단체문자 Yes
이메일보내기 Yes
민감한 설문내용에 대한 활용후 파기 설문 조사자가 설문 시작 전에 기간을 입력하고 만료시 자동 삭제 Yes
편리한 폼 디자인 폼 생성 대표적인 템플릿 제공 Yes
이전 제작 템플릿 재사용 Yes
폼 디자인 문항 입력 (객관식 문항: 다중택1, 다중택다, 주관식 문항: 단답형, 장답형, 필수/선택 응답) Yes
대표적인 입력 데이터 형식 지정 (휴대전화번호, 이메일 주소, 생년월일 등) Yes
문항 중 지문과 선택지 등에 이미지/동영상/URL 등 삽입 No
폼 정보 수정 (폼 이름, 설명, 마감기한, 개인정보 만료 기한) Yes
설문 응답 문항 유형 응답 다양한 문항 유형에 대한 응답 성공 Yes
섹션 트리거 기능 응답에 따라 동적으로 설문지 구성 Yes
설문 응답 결과 조회 설문 조사 결과 조회 설문결과 목록과 개별 설문 응답 확인 Yes
문항별로 설문의 결과모아보기 Yes
결과를 스프레드 시트로 내보내기 No
기타 편의기능 설문 응답 즐겨찾기 추가/해제 Yes
경쟁업체는 제공하지 않는 편의 기능 제공 결과 분석 리포트: 키워드 분석, 도표화, 그래프화, 히트맵 Yes
설문 답변 추첨: 답변들 중 랜덤한 답변을 선택하는 기능 제공 Yes
주소로 우편번호를 찾는 모듈 제공 Yes
개인정보 파기 기한을 설정한 경우, 기한 만료로 인해 정보를 삭제했을 때 안내 메일을 발송 No
플랫폼의 수익 창출 구조 문자 및 메일 서비스 유료 이용 Yes
특권을 가진 유료계정 Yes
기타 공개설문 검색 Yes
랜덤 추천 설문 메인페이지에 배치 Yes
완성 21
미완성 3
백분율 환산 87.5 %

그리고 위 표를 바탕으로 완료된 작품을 평가하여 점수를 계산하면 아래와 같다.

평 가 항 목 평가방법 적용기준 개 발
목표치
비중
(%)
평가결과
점수 (환산)
1. 기능 구현의 충실도 모든 기능에 접근할 수 있고 잘 동작하는지 확인한다. 기능표에서 완성된 기능의 비율을 10점으로 환산 (소수점 아래 버림) 10점 20 7점 (14%)
2. 보안성 DB 또는 API가 공격받았을 때 데이터의 무결성이 보장되는지 확인한다. API를 외부에서 임의로 호출할 수 있는지, DB 데이터 해싱 여부 등을 확인하고 결점이 발견되었을 때마다 -1점 10점 20 10점 (20%)
3. 서버 반응성 한 번에 몇 개의 제출을 받을 수 있는지 확인한다. 스트레스 테스트로 어느정도의 부하를 버티는지 확인하면서 부하의 정도를 5단계로 나누어 1~5점 부여 5점 15 3점 (9%)
1,000개의 응답을 동시에 제출하였때, 이를 처리하는데 10초가 소요되었다.
4. 설문 조사자의 만족도 설문 조사자가 사이트를 통해서 가능한 모든 기능을 사용하고 일련의 과정을 쉽게 해결할 수 있는가? (주관적 평가) 매우 그렇다 5점
그렇다 4점
보통이다 3점
아니다 2점
매우 아니다 1점
5점 15 5점 (15%)
5. 설문 피조사자의 만족도 설문 피조사자가 설문 응답에 있어서 어려움을 느끼지 않는가? (주관적 평가) 매우 그렇다 5점
그렇다 4점
보통이다 3점
아니다 2점
매우 아니다 1점
5점 15 5점 (15%)
6. 설문 피조사자의 개인정보 보호 보장 설문 피조사자가 본인이 입력한 개인정보가 어떻게 활용되고 언제 파기될 것인지 예상할 수 있고, 개인정보가 적절하게 보호되고 있음을 느끼는가? (주관적 평가) 매우 그렇다 5점
그렇다 4점
보통이다 3점
아니다 2점
매우 아니다 1점
5점 15 5점 (15%)
총계 (비중) 88%

향후계획

사용자들이 더 편하게 사이트를 이용할 수 있도록 편의성 패치와 튜토리얼 제작이 필요하다. 또한 부하테스트를 통한 성능 검증 및 성능 개선을 할 것이다. 또한 유스케이스를 조사해 더 다양한 템플릿을 제공할 계획이다.