🚀 Flask 미니 프로젝트: 기능 정의 & 흐름 설계 가이드
🏷️ 프로젝트 주제: "당신의 개발자 유형은?"
- 설명: 6개의 질문을 통해 사용자의 개발자 성향을 파악하는 심리테스트 서비스
- 구현 방식: 프론트 최소화, Flask 백엔드 중심(JSON 또는 간단 HTML 응답)
1️⃣ 기능 정의
구분 기능 설명
사용자 입력 | 이름, 나이, 성별 입력 |
질문 진행 | 총 6문항, 객관식 선택 |
답변 저장 | 선택지마다 유형별 점수 누적 (해커형, 설계자형, 예술가형) |
결과 계산 | 누적 점수 기준으로 최종 개발자 유형 결정 |
결과 출력 | 결과 페이지(JSON or HTML) + DB 저장 |
2️⃣ 라우트(URL) 흐름 설계
라우트 경로 메서드 설명
/start | GET | 테스트 시작 화면 (입력 폼 제공) |
/start | POST | 사용자 정보 제출 후 첫 질문으로 이동 |
/questions/<int:id> | GET | id번째 질문과 선택지 제공 |
/questions/<int:id> | POST | 답변 저장 후 다음 질문 or 결과 계산 |
/result/<int:user_id> | GET | 최종 결과 조회 및 출력 |
✅ 예시 흐름:
/start ➡️ /questions/1 ➡️ ... ➡️ /questions/6 ➡️ /result/42
3️⃣ 데이터 흐름
- /start
- 사용자 정보 입력 → 세션 또는 DB에 저장
- /questions/
- 질문 표시 → 답변 제출 시 점수 누적
- 마지막 질문 후 → 결과 계산
- /result/<user_id>
- 최종 결과 반환
4️⃣ 점수 계산 방식 예시
선택지 내용 해커형 설계자형 예술가형
"바로 코딩으로 해결한다" | +2 | 0 | +1 |
"체계적으로 분석 후 접근" | 0 | +2 | 0 |
"창의적 방법을 시도한다" | +1 | +1 | +2 |
- 6문항 누적 점수 ➡️ 최고 점수 유형이 결과로 출력
5️⃣ 팀원 공유 포인트
- 각 라우트별 역할 분담 (예: /questions 처리 담당)
- 세션 관리 vs DB 저장 방식 합의
- 점수 테이블 및 결과 유형 정의
- 예외 처리: 잘못된 접근 시 /start로 리디렉션
🎯 최종 목표
- 하나의 서비스 흐름 완성
- Flask 라우팅 & 데이터 처리 경험 쌓기
- 결과를 저장하고 출력하는 전체 백엔드 로직 구현
🔗 추가로 필요 시: API 테스트(Postman 활용), 결과 통계 기능 확장 가능!
Flask 기반 ‘당신의 개발자 유형은?’ 심리테스트 서비스 설계
1. 기능 정의
이 프로젝트는 Flask 백엔드로 구현되는 심리테스트 웹 서비스로, 사용자의 개발자 성향을 파악하는 “당신의 개발자 유형은?” 테스트를 제공합니다. 주요 기능은 다음과 같습니다:
- 사용자 입력 수집: 테스트 시작 시 이름, 나이, 성별 정보를 입력받습니다. 이는 결과와 함께 저장되어, 어떤 사용자가 어떤 유형 결과를 얻었는지 기록합니다.
- 질문 진행: 총 6개의 문항을 순차적으로 제시합니다. 각 질문은 개발자 성향과 관련된 객관식 문제로, 2~4개의 선택지를 제공합니다. 질문은 하나씩 단계적으로 진행되어 사용자가 한 문항에 응답하면 다음 문항으로 넘어갑니다.
- 답변 저장 및 점수 계산: 사용자가 각 문항의 답변을 선택하면, 백엔드는 그 선택지에 미리 정의된 유형별 점수를 기록합니다. 예를 들어, 각 선택지마다 해커형, 설계자형, 예술가형 등의 점수 배점이 있으며, 백엔드는 사용자의 선택에 따라 해당 유형 점수를 누적합니다. 이 때 점수 누적과 진행 상태 유지를 위해 Flask의 세션 등을 활용하여 사용자별 상태를 저장할 수 있습니다flask.palletsprojects.com.
- 결과 산출: 모든 문항(6개)에 답변을 마치면, 각 유형별로 합산된 점수를 비교하여 최종 개발자 유형을 결정합니다. 예를 들어 누적 점수 중 가장 높은 점수를 받은 유형이 사용자의 결과로 선택될 수 있습니다. 미리 정의된 규칙에 따라 “해커형”, “설계자형”, “예술가형” 등으로 결과를 분류하며, 해당 유형에 대한 간략한 설명이나 피드백을 함께 준비합니다.
- 결과 저장 및 표시: 최종 결과가 결정되면, 앞서 입력받은 사용자 정보와 결과 유형을 함께 데이터베이스 등에 저장합니다. 그런 다음 사용자에게 결과 페이지를 통해 본인의 개발자 유형 결과를 출력합니다. 백엔드는 이 결과를 단순 HTML 템플릿으로 렌더링하여 보여주거나, API용으로 설계된 경우 JSON 형태로 결과 데이터를 응답합니다. (이 서비스는 별도 프런트엔드 없이 백엔드 위주로 동작하므로, HTML 페이지 렌더링이나 JSON 응답과 같은 간단한 출력 형태를 가집니다.)
2. API 라우트 및 URL 구조
이 심리테스트 웹 서비스의 주요 API 엔드포인트와 URL 경로 구성은 다음과 같습니다:
- /start – 테스트 시작 페이지를 담당하는 엔드포인트입니다.
- GET: 초기 시작 화면 또는 JSON 응답을 제공합니다. 사용자가 이름, 나이, 성별을 입력할 수 있는 폼(form)이나 입력 양식을 전송합니다.
- POST: 사용자가 제출한 이름, 나이, 성별 정보를 서버가 받습니다. 서버는 이 정보를 바탕으로 새로운 테스트 세션(또는 사용자 기록)을 생성하고, 첫 번째 질문으로 진행되도록 다음 단계로 연결합니다 (예: 첫 질문 페이지로 리디렉션).
- /questions/<int:id> – 질문 진행 페이지 엔드포인트로, 각 질문을 순서대로 처리합니다. <int:id> 부분은 질문 번호를 나타내는 동적 경로 변수입니다. Flask에서는 이처럼 URL 경로에 <int:id>와 같이 변수를 포함시켜 해당 값을 뷰 함수의 인자로 받을 수 있습니다sitepoint.com.
- GET: id번째 질문의 내용과 선택지를 제공합니다. 예를 들어 /questions/1이면 첫 번째 질문과 그 선택지들을 JSON이나 HTML로 반환합니다. 백엔드는 id를 이용해 해당 번호의 질문 데이터를 가져옵니다.
- POST: 사용자가 id번째 질문에 대해 선택한 답변을 서버로 제출하면 이를 처리합니다. 서버는 요청에 포함된 답변 선택지를 읽어 해당 선택지의 유형별 점수를 사용자 세션 혹은 임시 저장소에 누적합니다. 그런 다음 다음 질문 페이지로 이동해야 하므로, 응답으로 다음 질문의 경로(/questions/<id+1>)로 리디렉션하거나, API인 경우 다음 질문 데이터를 바로 반환합니다. 만약 id가 마지막 질문 번호(6)인 경우에는 다음이 질문이 없으므로 대신 결과 계산 단계로 넘어갑니다.
- /result/<int:user_id> – 결과 페이지 엔드포인트로, 테스트 완료 후 최종 결과를 보여줍니다. <int:user_id>는 해당 결과를 조회할 사용자의 고유 ID입니다. 이 ID는 사용자가 /start 단계에서 정보를 제출하면 서버가 생성하여 부여한 식별자이며, Flask 라우트에서 <int:user_id>로 명시하여 정수 형태로 전달받습니다sitepoint.com.
- GET: user_id에 해당하는 사용자(또는 테스트 세션)의 최종 결과 데이터를 조회하여 반환합니다. 백엔드는 저장된 사용자 결과를 DB 등에서 찾아, 그 사용자의 이름, 선택한 유형 결과(예: “해커형”), 그리고 해당 유형에 대한 설명을 함께 묶어 응답합니다. HTML 응답인 경우 결과 페이지 템플릿을 렌더링하여 보여주고, API일 경우 JSON으로 {"name": ..., "age": ..., "gender": ..., "result_type": ...}와 같은 형식의 데이터를 돌려줍니다.
이상의 경로 설계로 /start -> /questions/1 -> ... -> /questions/6 -> /result/<id> 순서의 RESTful한 흐름을 갖추게 됩니다. 각 URL은 명확한 의미를 지니며, 사용자의 진행 단계에 따라 순차적으로 호출됩니다. (추가로, Flask에서는 url_for() 함수를 사용하여 이러한 경로를 참조할 수 있으며, 브라우저에서 의미 있는 URL 구조를 제공함으로써 사용 경험을 향상시킵니다.)
3. 데이터 흐름과 백엔드 처리 순서
이 절에서는 사용자 요청이 들어온 시점부터 결과를 출력하기까지 백엔드가 처리하는 과정을 순서대로 설명합니다. 전체 흐름을 단계별로 나타내면 다음과 같습니다:
- 시작 페이지 요청: 사용자가 브라우저에서 테스트를 시작하기 위해 /start URL에 접속하면 Flask 백엔드는 해당 Start 페이지를 제공하는 뷰 함수를 실행합니다. 이 함수는 사용자가 입력해야 할 항목(이름, 나이, 성별)이 포함된 폼 HTML을 렌더링하여 반환하거나, API 형태라면 입력 항목 명세를 포함한 JSON을 반환합니다. 사용자는 화면을 보고 본인의 정보를 입력합니다.
- 사용자 정보 제출: 사용자가 Start 페이지에서 폼을 작성해 제출하면 (/start 경로로 POST 요청), 백엔드는 이 요청을 받아 폼 필드에 담긴 이름, 나이, 성별 데이터를 추출합니다. 서버는 이 정보를 검증한 뒤 새로운 결과 레코드(또는 세션)를 생성합니다. 예를 들어 데이터베이스의 UserResult 테이블에 새 행을 추가하고 해당 행의 user_id를 획득하거나, 세션 딕셔너리에 {'name':..., 'age':..., 'gender':...}를 저장합니다. 이렇게 초기화된 사용자 세션/레코드에는 아직 각 유형별 점수는 0으로 초기화되어 있습니다. 그리고 다음 단계로 진행하기 위해 백엔드는 첫 번째 질문 페이지(/questions/1)로 리디렉션 응답을 보내거나, API인 경우 첫 질문 데이터를 바로 응답으로 포함시켜 전달합니다.
- 질문 페이지 진행: 사용자 브라우저는 서버의 지시에 따라 첫 번째 질문 페이지로 이동합니다. 예를 들어 /questions/1에 GET 요청을 보내면, 백엔드는 1번 질문의 내용과 선택지들을 준비하여 응답합니다. 사용자는 제시된 선택지 중 하나를 선택하고 제출(POST)하면, 서버는 그 답변을 받아 처리합니다:
- 먼저 답변 데이터(어떤 선택지가 선택되었는지)를 확인하여 해당 선택지에 배정된 유형별 점수를 가져옵니다. 이 정보는 미리 정의되어 있으며, 서버 측에 하드코딩되어 있거나 DB의 Option 테이블 등에 저장되어 있을 것입니다. 예를 들어 1번 질문의 A선택지를 골랐다면, 해커형 +2점, 설계자형 +0점, 예술가형 +1점 등의 배점이 정해져 있고, 서버는 현재 사용자 세션이나 결과 레코드의 누적 점수에 이를 더합니다.
- 그런 다음 백엔드는 사용자에게 다음 질문 페이지로 이동하도록 응답합니다. 1번 질문 답변 처리 후에는 2번 질문 페이지(/questions/2)로 넘어가야 하므로, Flask에서는 redirect(url_for('questions', id=2)) 등을 통해 리디렉션합니다. API의 경우에도 마찬가지로 다음 질문 데이터를 바로 반환하거나, 클라이언트 측에서 다음 질문을 호출하도록 안내합니다.
- 결과 계산 및 완료: 사용자가 마지막 6번째 질문까지 답변을 제출하면, 백엔드는 다른 질문 때와 마찬가지로 그 답변의 유형별 점수를 누적한 뒤, 이제 더 물어볼 질문이 없으므로 최종 결과를 계산합니다. 즉, 누적된 해커형, 설계자형, 예술가형 점수를 모두 확인하여 가장 높은 점수를 받은 유형 카테고리를 판별합니다. 예를 들어 6문항의 답변을 종합했을 때 해커형 점수가 8점으로 가장 높고 다른 유형 점수는 그보다 낮다면, 해당 사용자의 개발자 유형은 “해커형”으로 결정됩니다. 이런 판정 로직을 거친 후, 서버는 결과를 DB에 저장합니다. (예: 처음 생성한 UserResult 레코드에 result_type 필드값을 채우고, 각 유형 점수와 완료 시각 등을 업데이트합니다.)
- 결과 페이지 응답: 최종 결과가 정해지면, 서버는 사용자에게 결과 페이지를 보여줍니다. 앞 단계에서 누적 점수와 함께 결정된 결과 유형을 토대로, 미리 준비된 결과 설명을 가져와서 /result/<user_id> 경로로 응답하거나 리디렉트합니다. 예를 들어 user_id가 42인 사용자가 테스트를 완료했다면, 백엔드는 클라이언트를 /result/42로 리디렉션시킵니다. 그러면 사용자의 브라우저가 /result/42 GET 요청을 보내게 되고, 서버는 해당 ID로 저장된 이름, 나이, 성별과 결과 유형을 조회하여 최종 **결과 화면(또는 JSON)**을 반환합니다. 이렇게 사용자 측에는 “OOO님은 예술가형 개발자입니다!”와 같은 메시지와 설명이 나타나게 됩니다.
- 테스트 종료 및 다음 액션: 사용자는 결과를 확인하고 테스트를 마칩니다. 필요한 경우 결과 페이지에서 “다시 하기” 등의 버튼을 제공하여 /start로 돌아가 새로운 세션을 시작할 수도 있습니다. 백엔드 측에서는 한 번 완료된 세션에 대해 세션 데이터를 정리하거나 (필요시) 쿠키를 만료시키는 등 후처리를 할 수 있습니다. 또한 누적된 결과 데이터(UserResult 기록)는 지속적으로 저장되어 향후 통계나 다른 용도로 활용될 수 있습니다.
요약하면, 사용자 입력 -> 6개 질문 처리 -> 결과 계산 -> 결과 표시의 흐름으로 백엔드 로직이 진행됩니다. 각 단계에서 Flask 백엔드는 해당 단계에 맞는 라우트로 요청을 받고, 필요한 데이터를 저장하거나 조회하여, 다음 단계로 이동하기 위한 응답을 돌려주는 방식입니다.
4. 설계 예시 (테이블 요약 및 다이어그램)
위 다이어그램은 본 심리테스트 서비스의 전체 라우팅 흐름을 나타낸 것입니다. 사용자가 /start 페이지에서 정보를 입력하고 테스트를 시작하면, Flask 백엔드는 첫 번째 질문 페이지(/questions/1)를 보여줍니다. 그 후 사용자가 각 질
문에 차례로 답하고 진행할 때마다 백엔드는 다음 질문 페이지(/questions/2 … /questions/6)를 순차적으로 제공하며, 마지막 질문에 답변을 제출하면 결과 계산을 수행합니다. 최종적으로 /result/<id> 페이지에서 사용자별 결과 유형을 표시하게 됩니다. 이러한 단계별 흐름은 정해진 순서대로 라우팅되며, 진행 중간마다 필요한 데이터(입력 정보, 답변 선택, 점수 등)는 세션이나 데이터베이스에 일시적으로 저장되었다가 최종 결과와 함께 기록됩니다.
아래 표는 주요 엔드포인트별 동작을 정리한 것입니다:
/start | GET | 시작 화면 또는 입력 폼 제공 (이름, 나이, 성별 입력) |
POST | 사용자 입력 정보 수신 → 새로운 테스트 세션 생성 후 첫 질문으로 이동 | |
/questions/int:id | GET | id번째 질문 및 선택지 제공 (질문 데이터 조회/렌더링) |
POST | id번째 답변 수신 → 해당 선택지 점수를 누적하고 다음 질문으로 진행 (마지막 문항인 경우 결과 계산 단계로 넘어감) |
|
/result/int:user_id | GET | user_id 사용자의 최종 결과 조회 및 표시 (이름, 유형 결과, 설명) |
또한, 질문별 선택지와 유형 점수 배정 예시를 통해 점수 계산 방식을 설명하면 다음과 같습니다. 가령 “문제가 발생했을 때 당신은 어떻게 대응하나요?” 라는 질문이 있고, 세 가지 선택지가 주어졌다고 가정해보겠습니다:
a. 바로 코딩으로 다양한 시도를 해본다 | 2 | 0 | 1 |
b. 문제를 체계적으로 분석하고 설계부터 한다 | 0 | 2 | 0 |
c. 색다른 창의적 해결책을 모색한다 | 1 | 1 | 2 |
위 표에서 예를 들어 사용자가 선택지 a를 고르면 해커형 +2점, 선택지 b를 고르면 설계자형 +2점, 선택지 c를 고르면 예술가형 +2점이 해당 사용자에게 부여됩니다. 이러한 방식으로 6문항을 모두 답하면 각 유형 점수가 합산되며, 최종적으로 어떤 유형의 점수가 가장 높았는지에 따라 사용자의 개발자 유형이 결정됩니다. (예: 해커형 점수 총합이 가장 높다면 “해커형 개발자”로 결과를 표시) 이 로직은 코드 구현 시 사전에 정의된 점수 테이블이나 조건문으로 처리할 수 있습니다. 팀원들은 이와 같은 점수 배정 규칙과 라우팅 흐름을 참고하여 백엔드 로직을 구현하면 됩니다.
각 팀원은 위의 설계 내용을 바탕으로, Flask에서 라우트를 정의하고 (예: @app.route('/questions/<int:id>', methods=['GET','POST']) 등sitepoint.com), 요청 처리 함수 내에서 필요한 데이터 처리(세션 저장, DB 업데이트, 점수 계산 등)를 순서대로 구현하면 됩니다. 이로써 “당신의 개발자 유형은?” 심리테스트 백엔드의 전체 기능과 흐름이 완성되며, 사용자에게 일관된 테스트 진행 경험과 결과를 제공할 수 있게 됩니다.
'프로젝트' 카테고리의 다른 글
🚀 Flask 프로젝트 배포 이후 과정 정리 3 일차 (EC2 + Nginx + SSL + 도메인) (0) | 2025.04.27 |
---|---|
FLASK 미니프로젝트 팀2-1 팀원과 검증 단계 2일차 아침 (0) | 2025.04.25 |
FLASK 미니프로젝트 팀 (초기작업)1-3 심리테스트/설문조사 주제 리스트 (1) | 2025.04.23 |
FLASK 미니프로젝트 팀 (초기작업)1-2 (0) | 2025.04.23 |
FLASK 미니프로젝트 팀 (초기작업)1-1 (0) | 2025.04.23 |