지금까지 학습한 React를 활용하여 mbti 테스트를 할 수 있는 간단한 프로그램을 만드는 실습을 했다.
제공해준 pdf 파일에 실습 초기 셋팅부터 자세히 적혀있어서 차근차근 따라하며 정리할 수 있는 시간이었다.
npx create-react-app [프로젝트명]
으로 설치 후 필요없는 파일 및 코드 정리
npm i reudx react-redux @reduxjs/toolkit
npm i styled-components
import ReactDOM from "react-dom/client"; import App from "./App"; import { configureStore } from "@reduxjs/toolkit"; import rootReducer from "./store"; import { Provider } from "react-redux"; const store = configureStore({ reducer: rootReducer }); const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <Provider store={store}> <App /> </Provider> );
🔹 src/store/modules/mbti.js
const initialState = { mbtiResult: "", // mbti 테스트 후 나온 유형 ex) ENTP page: 0, // 0: 인트로 페이지, 1~n: 선택 페이지, n+1: 결과 페이지 // 질문 목록 survey: [ { question: "퇴근 직전에 동료로부터 개발자 모임에 초대를 받은 나!\n\n퇴근 시간에 나는?", answer: [ { text: "그런 모임을 왜 이제서야 알려 준거야! 당장 모임으로 출발한다", result: "E", }, { text: "1년 전에 알려줬어도 안갔을 건데 뭔... 더 빠르게 집으로 간다", result: "I", }, ], }, {...}, {...}, {...}, ...], // "결과에 대한 설명" explanations: { ESTJ: { text: "무리한 개발 일정만 아니라면 일정을 철저하게 지킬 당신의 MBTI 는!", img: "/assets/estj.jpg", }, ISTJ: {...}, ENTJ: {...}, INTJ: {...}, ESFJ: {...}, ISFJ: {...}, ENFJ: {...}, INFJ: {...}, ESTP: {...}, ISTP: {...}, ENTP: {...}, INTP: {...}, ESFP: {...}, ISFP: {...}, ENFP: {...}, INFP: {...}, }, };
🔹 src/store/modules/mbti.js
- action type 상수화
const CHECK = "mbti/CHECK"; const NEXT = "mbti/NEXT"; const RESET = "mbti/RESET";
- action 함수
export function check(result) { return { type: CHECK, payload: { result }, }; } export function next() { return { type: NEXT, }; } export function reset() { return { type: RESET, }; }
dispatch로 넘겨준 action type에 따라 어떻게 동작할 지 각각 설정해준다.
🔹 src/store/modules/mbti.js
export function mbti(state = initialState, action) { switch (action.type) { case CHECK: // 선택한 값 저장 return { ...state, mbtiResult: state.mbtiResult + action.payload.result, // ex) "IS" + "F" -> "ISF"+"J" }; case NEXT: // 다음 페이지로 이동 return { ...state, page: state.page + 1, // 기존 페이지에서 + 1 }; case RESET: // 메인 페이지로 이동 return { ...state, page: 0, // 0번째 페이지로 mbtiResult: "", // 결과 reset }; default: return state; } }
src/pages
, src/components
폴더 만들고
필요한 페이지와 컴포넌트 생성하기
styled-components로 global style 적용하기
src/components/GlobalStyle.js
만들기- import
createGlobalStyle
후 GlobalStyle 이라는 변수에 정의import { createGlobalStyle } from "styled-components"; const GlobalStyle = createGlobalStyle` @font-face { font-family: 'ONE-Mobile-POP'; src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2105_2@1.0/ONE-Mobile-POP.woff') format('woff'); font-weight: normal; font-style: normal; } body { font-family: 'ONE-Mobile-POP', sans-serif; padding-top: 1em; white-space: pre-wrap; } ul, ol { list-style: none; padding-left: 0px; } `; export default GlobalStyle;
src/App.js
에서 import 후 사용한다. 이 때 최상단 컴포넌트 위에 위치시킨다.import GlobalStyle from "./components/GlobalStyle"; function App() { const page = useSelector((state) => state.mbti.page); const survey = useSelector((state) => state.mbti.survey); return ( <> <GlobalStyle /> {/* 조건부 렌더링으로 페이지 분기 처리 */} <Main>{page === 0 ? <Start /> : page !== survey.length + 1 ? <Mbti /> : <Result />}</Main> </> ); }