아래 프로젝트는 Ringle 부트캠프에서 배운 내용을 복습하는 내용입니다.
Ringle Bootcamp 2주차 과제 중 하나인 [Google Form with React].
Google Form은 잘 만들어진 좋은 사이트이기 때문에 많이 사용을 했었지만, 직접 만들게 될 것이라고는 상상도 못했다.
React에서 useState, useEffect, React Memo, redux immutability가 어느정도 익숙해졌다면 도전해볼만한 과제라고 한다.
다양한 데이터베이스들로 구성해볼 수 있겠지만, 이 프로젝트에서는 firebase의 NoSQL로 데이터베이스를 구성할 것이다.
Google Form를 만든다면, 먼저 어떤 식으로 구성을 할지 설계를 해야 한다.
1. 어떤 페이지들로 구성이 되어있는지
2. 각 페이지 별로 어떤 기능이 있는지
3. 각 페이지 별 기능을 위해 어떠한 state들을 어떤 구조로 만들 것인지
4. 기능 별 state 가운데에서도 중복으로 사용될만한 state들은 무엇인지?
위와 같이 구상을 했다면, 반은 성공한 것이다.
Google form은 크게 4가지로 구분을 할 수 있다.
Form을 만드는 사람이 원하는 대로 Form을 구성하는 페이지
질문 추가, 삭제 기능
질문 유형 중 checkbox나 radio일 때 option을 추가, 삭제, 수정 기능
질문에 대한 title, Subtitle 추가, 수정
제출 시 제작된 질문을 다른 사람이 확인할 수 있도록 서버로 보내주는 기능
<추가로 넣을 수 있는 기능>
질문을 만드는 페이지부터 살펴본다.
유저의 input을 받는 형태는 질문
이고, 우리가 만들 형태는 다음과 같다.
이러한 형태를 바탕으로 질문 별로 state가 어떻게 구성되는지를 한번 생각해보자.
질문의 유형은 다르다고 해도, 각 질문의 기본적인 구성은 비슷하다.
공통 부분을 포함한 나머지 부분을 살펴보면,
[
{uuid: 123, text: "firebase"},
{uuid: 456, text: "Mongo DB"},
{uuid: 789, text: "MySql"}
]
와 같이 구성되어야 할 것이다.
공통 부분을 포함한 나머지 부분을 살펴보면, checkbox와 별반 다르지 않은 것을 알 수 있다.
설명 부분이므로, 공통 부분만 있으면 된다.
공통 부분을 포함한 나머지 부분을 살펴보면, text만 있으면 되는 것을 알 수 있다.
state에 대한 구상을 마쳤다면, 전체적으로 어떻게 관리를 할지 구상해야 한다.
questions라는 array 내부에 radio, checkbox, text와 같은 질문들을 추가, 수정, 삭제할 수 있도록 구성해야 한다.
다음과 같이 데이터가 구성되어있다고 가정해보자.
console.log(questions)
[
{
questionType: "text",
title: "구글폼 만들기에 오신 분들을 환영 합니다. 제목을 적어주세요.",
subtitle: "설명을 적어주세요",
uuid: "125s-1x12f-1cva-1sdf"
},
{
questionType: "checkbox",
title: "알고 있는 기술들을 모두 선택해주세요"
subtitle: "조금이라도 알면 선택해주세요",
uuid: "af12-1ssf2f-d111f-vsdf1"
options: [
{text: "react", uuid: "1dsf-kjh12-a1nv-wjsdf"},
{text: "Node JS", uuid: "2dsf-kjh12-a1nv-wjdsdf"},
{text: "GraphQL", uuid: "3dsf-8888-19dn-1jsd3"},
]
},
{
questionType: "radio",
title: "제일 잘 알고 있는 기술을 한가지 선택해주세요"
subtitle: "only one",
uuid: "1f12-1ssf2f-d111f-vsdf1"
options: [
{text: "react", uuid: "2dsf-kjh12-a1nv-wjsdf"},
{text: "Node JS", uuid: "3dsf-kjh12-a1nv-wjdsdf"},
{text: "GraphQL", uuid: "4dsf-8888-19dn-1jsd3"},
]
}
]
이 프로젝트는 firebase로 이루어지기 때문에 데이터 구성은 어떻게 해야할지 감이 안올 수 있다.
앞으로 이런 방식으로 구성해나갈 예정이다.
state 관리에 대해서는
questions array의 마지막에 새로운 데이터를 추가해주면 되고, 특정 question을 수정한다면 어떤 questions을 수정하는지 인덱스를 찾아서 수정하고자 하는 항목을 수정하면 된다.
삭제도 이와 같은 순서로 진행하면 된다.
물론 추가, 수정, 삭제는 최종적으로 state가 업데이트될 때에 이루어진다.