요약 (Summary)
가장 먼저 테크 스펙을 세 줄 내외로 정리합니다. 테크 스펙의 제안 전체에 대해 누가/무엇을/언제/어디서/왜를 간략하면서도 명확하게 적습니다.
- 조편성이란
- 누가/무엇을 : 조편성이란 월부에서 함께 수강하는 사람들끼리 부동산 학습을 위해 짝 지어준 스터디 그룹을 말합니다. 조편성 프로그램은 이를 위해, 어드민 관리자 (CM분들)가 조 편성을 하기 위해, 설문 등록부터 조장/운영진 선발, 조원 배치, 노출확정 등의 기능을 제공합니다.
- 언제/어디서 : 정규강의 신청과 설문 응답이 마감된 이후, 어드민 페이지에서 진행합니다.
- 왜 : 조편성 작업시간을 단축시키기 위함입니다.
배경 (Background)
프로젝트의 Context를 적습니다. 왜 이 기능을 만드는지, 동기는 무엇인지, 어떤 사용자 문제를 해결하려 하는지, 이전에 이런 시도가 있었는지, 있었다면 해결이 되었는지 등을 포함합니다.
- 기존에도 조원 배치 기능이 존재했습니다. 비즈니스 로직이 프론트엔드에 있었는데, 로직이 정상 동작하지 않았을 뿐 아니라, 속도 측면에서도 너무 느렸습니다. 따라서 CM 분들은 프로그램 사용 없이, 조편성 작업을 수동으로 진행하였습니다.
- CM 분들이 수동으로 2000-3000명 사이의 조편성 인원을 조 편성하는 데, 8시간 정도 필요했습니다. 서버 단에서 조원배치 알고리즘을 통해, 조원 배치 작업을 자동화하여 CM 분들의 조 편성 작업시간을 2시간으로 줄일 수 있었습니다.
목표 (Goals)
예상 결과들을 Bullet Point 형태로 나열합니다. 이 목표들과 측정 가능한 임팩트들을 이용해 추후 이 프로젝트의 성공 여부를 평가합니다.
- 운영진을 등록 할 수 있다.
- 조장 선정 결과를 엑셀 파일로 업로드 할 수 있다.
- 조원을 자동으로 배치한다.
- 데이터 새로고침 : 환불 완료된 인원은 조 편성 관리에서 제외한다.
- 월부에서는 환불 대기 기간이 존재합니다. 환불을 신청하더라도 CX팀의 환불 방어를 통해 전체 환불 인원의 10%는 환불을 취소합니다. 따라서 환불 대기자는 일단 명단에 함께 노출되어야 합니다. 단, 환불이 완료된 인원은 목록에서 제외해야 합니다. 이를 시스템에서 자동으로 처리하기 어려운 부분이 있어, 별도 버튼으로 만들어, 사용자가 처리할 수 있도록 처리하였습니다.
- 조원을 수동으로 배치 할 수 있다.
- 관리자는 운영진 선정 결과, 조장 선정 결과, 조원 배치 결과를 확인한 후 최종 확정할 수 있다.
- 조편성이 완료된 최종 데이터를 엑셀 파일로 다운로드 받을 수 있다.
- 커뮤니티 우측 영역에 ‘수강중인 조원들’ 명단에 관리자가 편성한 조 정보가 반영된다.
목표가 아닌 것 (Non-Goals)
목표가 아닌 것은 프로젝트에 연관되어 있으나 의도적으로 하지 않거나 해결하지 않으려 하는 것을 말합니다. 목표가 아닌 것을 정하면 프로젝트 범위를 더 명확하게 할 수 있고, 이 기능도 붙이자, 저 기능도 붙이자 하는 것을 막을 수 있습니다. 목표처럼 목표가 아닌 것도 Bullet Point 형태로 읽기 쉽게 적어 독자가 직관적으로 이해할 수 있도록 합니다. 목표가 아닌 것을 세부적으로 잘 적으면 프로젝트 범위를 넓게 보려 하는 독자들의 폭주를 막을 수 있습니다.
- 설문 등록 및 응답 기능은 이미 시스템화 되어 있습니다. 조편성 시스템에서는 설문은 설문을 조회하여, 응답자의 희망 지역을 조회해오는 등의 기능만 제공합니다.
- 조장 선발은 시스템에서 자동화하지 않습니다. 현재 설문 답변 내용에 존재하는 강의 수강 내역, 지원 동기, 평판 등을 통해 조장을 선발합니다. 지원 동기와 같은 항목은 정성적 평가가 필요하며, 평판은 시스템에서 알 수 없기 때문에 담당자(커뮤니티 매니저)가 담당합니다.
⭐️⭐️ 계획 (Plan)
어떻게 기술적, 엔지니어링적으로 접근할지 상세히 묘사합니다. 만약 어떤 부분을 어떻게 할지 확실히 결정하지 못한 상태라면 어떤 것들을 고려하고 있는지 목록화해서 적습니다. 그렇게 하면 이 문서 리뷰어들이 올바른 결정을 내리도록 도움을 주게 됩니다.
조편성 전체 시나리오 요약
월부에서는 매달마다 정규강의가 오픈한다. 오늘 오픈 상품은 내집마련기초반이다. 관리자는 사전에 (조편성 옵션을 추가하여) 전시상품 등록을 한다. 보통 내집마련기초반에는 1000명-2000명의 신청자가 있다. 신청자들은 관리자가 미리 등록한 설문에 응답하여, 조편성 된다. 조편성은 자신이 희망하는 임장 지역에 따라 편성된다. 본인들이 원하는 지역을 1, 2지망까지 선택하게 된다. 같은 지역을 선택한 사람들끼리 설정한 인원(최소 7명, 최대 10명)으로 조가 구성되며, 조는 조장과 조원로 구성되며, 내부 운영을 위해 등록된 운영진이 있다. 조장이 없으면 조는 만들어질 수 없으며, 조에 조장은 1명이다. 조장은 CM(월부 커뮤니티 매니저)분들이 지원동기와 수강이력 등의 정보를 보고 정해진다. 조장은 해당 지역의 신청 인원에 알맞게 선발한다. 조장의 수가 적절하지 않으면, 비유효 모달이 뜬다. 적정한 조장의 수가 뽑히면, 조원배치 버튼을 눌러, 자동화된 조 선발 로직을 활용하여, 조편성한다. 로직에서 처리 안된 인원들은 UI 상으로 체크박스를 클릭하여, 이미 편성된 조로 보내주거나, 한 조로 묶어 조편성을 완료해줍니다. 미편성 인원이 한 명도 없으면, 노출확정을 누릅니다. 노출확정을 누르면, 커뮤니티 홈에서 함께 수강중인 조원들이 노출됩니다.
전체 데이터 구조
- 테이블에 대한 세부 내용은 DB에서 확인 가능합니다. 주요 필드와 관계만 담았습니다.
데이터 구조 설명
- 전시상품과 조편성 옵션(1:N)
- 조편성 대상 전시상품은 GROUP_YN = 'Y' 인 상품입니다.
- 조편성 옵션은 tb_display_option.OPTION_TYPE_CD = 'GROUP' 인 옵션입니다.
- 상품을 결제한 유저는 유저 학습 정보 tb_user_study가 생성됩니다.
- 조 편성 대상자 정보가 생성되는 시점은 유저가 조편성 대상 전시상품의 조편성 옵션을 선택하여, 결제 한 때 입니다.
- tb_user_group_details와 tb_user_study 간의 관계는 1:1입니다.
- 조와 조장 (1:1), 조와 조원/운영진 (1:N)
- 조와 조장은 1:1 관계입니다. 개념적으로 조장이 없이, 조만 생성될 순 없습니다.
- 조 편성 대상자 정보는 tb_user_group_details 에 저장됩니다.
- 어떤 조에 편성됐는지 확인하려면 tb_user_group_details 의 GROUP_SEQ를 확인하면 됩니다.
- 조 정보는 tb_user_group 데이터에 저장됩니다. 생성되는 시점은 조장이 등록될 때 입니다.
- 조장과 조원, 운영진은 tb_user_group_details의 type 값으로 구분합니다. [LEADER, MEMBER, MANAGER]
- 설문과 질문(1:N), 질문과 객관식 답안(1:N)
- 조편성 대상자 중 설문에 응답하지 않은 유저(user_survey_answer 값이 없는 유저)는 조원배치 대상이 될 수 없습니다. 조편성은 설문 응답을 기반으로 하기 때문입니다.
- 조편성 대상이 되는 질문은 각 설문의 첫번째 객관식 항목입니다. (당시 개발 시간이 빠듯하여, CM 분들과 협의 하에 그렇게 처리해뒀습니다. 별도로 특수 항목으로 빼고 question type으로 구분할 수도 있어 보입니다.)
- 전시상품과 지역별 최대 인원 정보 (1:N), 조와 객관식 답안 (1:N)
- 복수지역 조편성 대상에는 조에는 최종 지역이 노출됩니다. 최종지역이란 1, 2 지망 중 조편성 기준이 되며, 실제 조원배치가 된 지역을 말합니다. tb_user_group 테이블의 survey_question_selection_id 필드입니다.
- 복수지역 조편성 대상 조편성에는 survey_question_selections_capacities 테이블이 따로 존재합니다. UI 상에서 지역 별 최대 인원으로 노출되는 데이터입니다. 조편성 희망권역이 2개 이상인 경우 필요한 정보입니다.
조원배치 핵심 알고리즘 1 [조 인원을 균등하게 나누는 로직]
Use Case Name | 지역 별로 조장 인원에 맞게, 조 인원을 균등하게 나눈다. |
목표 | 지역 별로 조장 인원에 맞게, 조 인원을 균등하게 나눠져야 한다. |
Primary Actor | 어드민 관리자 |
Secondary Actor | N/A |
Pre-condition |
|
Basic Flow |
|
Exceptional Flow |
|
Post-condition |
|
Special Requirements | N/A |
조원배치 핵심 알고리즘 2 [1, 2지망을 고려한 지역별 조장, 조원 인원 선별]
Use Case Name | 1, 2지망을 고려하여 조원 배치한다. |
목표 | 희망지역이 2개인 경우, 1지망을 우선 고려하되 지역별 최대 인원만큼 편성하고 남은 인원들은 2지망을 기준으로 편성한다. |
Primary Actor | 어드민 관리자 |
Secondary Actor | N/A |
Pre-condition |
|
Basic Flow |
|
Exceptional Flow |
|
Post-condition |
|
Special Requirements | N/A |
이외 고려 사항들 (Other Considerations)
고려했었으나 하지 않기로 결정된 사항들을 적습니다. 이렇게 함으로써 이전에 논의되었던 주제가 다시 나오지 않도록 할 수 있고, 이미 논의되었던 내용이더라도 리뷰어들이 다시 살펴볼 수 있습니다.
마일스톤 (Milestones)
프로젝트를 제 시간에 맞추기 위해 테크 스펙의 내용을 바탕으로 추정한 마일스톤을 공유합니다. 실험 계획, 배포 날짜를 포함해 최대한 자세히 적습니다.
- 1차 배포날짜 : 4월 초 (기본 로직 개발)
- 2차 배포날짜 : 4월 말 (리팩토링 및 설계 일부 변경)
- 3차 배포날짜 : 8월 말 (복수지역 대상 조편성 고도화)
조편성 테스트케이스
번호 | 전체 프로세스 | 검증조건 | ||||
1 | 관리자 전시상품 등록 | 조편성 전시상품으로 지정 | 조편성 옵션 포함하여 등록 |
|
||
2 | 조편성 옵션 미포함하여 등록 |
|
||||
3 | 관리자 전시상품 수정 | 조편성 전시상품으로 지정 | 조편성 옵션 포함하여 등록 |
|
||
4 | 조편성 옵션 미포함하여 등록 |
|
||||
5 | 관리자 설문 등록 | 단일 지역 설문 등록 | 질문을 등록하지 않는다. |
|
||
6 | 전시상품을 등록하지 않는다. |
|
||||
7 | 전시상품을 등록한다. | 질문을 등록하지 않는다. |
|
|||
8 | 질문을 등록한다. | 첫번째 질문으로 조편성 희망지역 질문을 등록하지 않는다. |
|
|||
9 | 첫번째 질문으로 조편성 희망지역 질문을 등록한다. |
|
||||
10 | 복수 지역 설문 등록 | 질문을 등록하지 않는다. | ||||
11 | 전시상품을 등록하지 않는다. | |||||
12 | 전시상품을 등록한다. | 질문을 등록하지 않는다. | ||||
13 | 질문을 등록한다. | 첫번째 질문으로 조편성 희망지역 질문을 등록하지 않는다. |
|
|||
14 | 첫번째 질문으로 조편성 희망지역 질문을 등록한다. |
|
||||
15 | 고객 조편성 상품 구매 | 강의 Only 상품 구매 |
|
|||
16 | 온라인 조편성 상품 구매 |
|
||||
17 | 오프라인 조편성 상품 구매 |
|
||||
18 | 구매 후 환불 | 온라인 조편성 고객 설문 답변 | 기간내 환불 요청 |
|
||
19 | 기간 이후 환불 요청 |
|
||||
20 | 오프라인 조편성 고객 설문 답변 | 기간내 환불 요청 |
|
|||
21 | 기간 이후 환불 요청 |
|
||||
22 | 고객 조편성 설문 답변 | 단일지역 고객 답변 |
|
|||
23 | 2개지역 고객 답변 |
|
||||
24 | 운영진 선발 | 운영진으로 선발한다. | 액셀 업로드를 통해 등록한다. |
|
||
25 | 조장 모달에서 검색해서 등록한다. |
|
||||
26 | 관리자 조장 선발 | 조장으로 선발한다. | 액셀 업로드를 통해 등록한다. |
|
||
27 | 조장 모달에서 검색해서 등록한다. |
|
||||
28 | 관리자 조원 배치 | 단일 지역 조원 배치 | 단일지역 0~6명 신청 |
|
||
29 | 단일지역 11명~13명 신청 |
|
||||
30 | 단일지역 14명 이상 신청 | 조장 희망자가 필요 인원보다 적은 경우 |
|
|||
31 | 조장 희망자가 필요 인원보다 큰 경우 |
|
||||
32 | 조장 희망자가 필요 인원만큼 선발된 경우 |
|
||||
33 | 복수 지역 조원 배치 | 지역별 최대 인원 정보가 설정되지 않은 경우 |
|
|||
34 | 지역별 최대 인원 정보가 설정된 경우 | 복수지역 0~6명 신청 |
|
|||
35 | 복수지역 11명~13명 신청 |
|
||||
36 | 복수지역 14명 이상 신청 | 조장 희망자가 필요 인원보다 적은 경우 |
|
|||
37 | 조장 희망자가 필요 인원보다 큰 경우 |
|
||||
38 | 조장 희망자가 필요 인원만큼 선발된 경우 |
|
||||
39 | 관리자 데이터 새로고침 | 환불 완료자가 존재하지 않는 경우 | ||||
40 | 환불 완료자가 존재하는 경우 | 조에 이미 편성 안된 경우 | ||||
41 | 조에 이미 편성된 경우 | 환불자가 조원인 경우 | 환불자가 빠져도 조 인원이 7명 이상인 경우 | |||
42 | 환불자가 빠지면 조 인원이 7명 이하인 경우 |
|
||||
43 | 환불자가 조장인 경우 |
|
||||
44 | 관리자 노출 확정 | 미편성 인원이 남아 있는 경우 | ||||
45 | 미편성 인원이 남아 있지 않는 경우 | 함께 수강 중인 조원들이 조회된다. |
|
'기타' 카테고리의 다른 글
[기타] Tech Spec으로 프로젝트 성공 확률 높이기 (5) | 2024.11.10 |
---|---|
[리팩토링 2판] Chapter 6 기본적인 리팩터링 (0) | 2024.08.26 |
[리팩토링 2판] Chapter 3 코드에서 나는 악취 (2) | 2024.08.12 |
[리팩토링 2판] Chapter 2 리팩터링 원칙 (0) | 2024.08.12 |
[리팩토링 2판] Chapter 1 리팩토링: 예시 (리팩토링의 리듬) (0) | 2024.08.05 |
댓글