대략 두 달간동안 개인 프로젝트를 하며 진행했다. 취준을 하던차에 자기소개서들을 작성하면서 작성했던 자기소개서를 보기좋게 관리해주는 서비스
가있다면 좋겠다는 생각으로 직접 만들어봐야겠다싶어 시작하게 되었다.
혼자서 프로젝트를 하면서 확실히 협업의 중요성을 더욱 느껴지게 되었다. 협업을 통해서 팀원들과 데이터의 스키마를 같이 상의하거나 어떤 라이브러리가 더 적합할지에 대한 협의가 필요한데 혼자서 하려하니 이게 과연 적합할지에 대한 고민을 공유하기에 다소 부족함이 있었다. 그리고 UI/UX적인 요소도 팀원들과 의논을 통해서 진행했다면 더욱 짧은 시간안에 완성될 수 있지 않았을까하는 생각을 갖게 되었다. 😭 😭
2023.02 ~ 2023.04
이번 프로젝트에서는 상태관리에 대해서 어떤 라이브러리를 사용할까에 대한 고민이 있었다. 상태관리를 위한 대표적인 라이브러리로 Redux
가 있고, 서버의 상태관리를 관리하는 라이브러리로 React Query
가 있다. Redux
와 React Query
는 모두 React 애플리케이션에서 상태를 관리하기 위한 라이브러리이지만, 사용목적에 따라서 차이가 있다.
Redux는 상태를 전역적으로 관리
하는 데 중점을 두고 있지만, React Query는 데이터 가져오기
와 캐싱
에 중점을 두고 있다. 따라서, Redux는 대규모 애플리케이션의 복잡한 상태 관리에 적합하며, 상태가 전역에서 공유되는 경우에 사용하는 것이 적합하다.
React Query는 API 호출과 데이터 캐싱을 간단하게 처리하기 위한 목적으로 React Query는 각각의 데이터를 독립적으로 가져오고 관리하며, 컴포넌트 단위로 사용된다. 따라서 SPA나 중간 규모의 애플리케이션에 적합성이 있다.
사용자 개인의 데이터르 관리하는 서비스로서
CRUD
가 많기에 보다 나은 사용경험을 적용하기 위해서 React Query로 캐싱된 데이터를 이용하는 것이 좀 더 적합하지 않을까(?)하는 생각이 들어 React Query를 사용했다.
CSS-in-JS의 라이브러리로 대표적으로 Emotion
과 styled-components
가 있다. 블로그나 사이트들 등을 참고해보니 대게 emotion
이 styled-components
보다 조금 가볍고 빠르다고 알려져있다.
Button
을 만들었을때 추가적인 CSS요소가 필요할 수 있었다. 이떄 CSS
Props를 내려주므로써 그때그떄 대응이 편리했다./** @jsx jsx */
을 컴포넌트마다 작성해야하는 단점이 있었다.결론적으로 테마나 글로벌 스타일을 전역적으로 타입을 선언해서 사용하는 것에 더 사용이 유용하여 emtion을 적용하였다.
사용자들이 자기소개서 작성을 할 때, 사람마다 스타일이 있겠지만 나같은 경우도 벨로그와 같은 글을 작성할 때, 수시로 임시저장
기능을 한다. 그렇기떄문에 임시 저장
을 구현해야겠다는 생각을 하게 되었다.
먼저 사용자의 입장에서 사용 흐름을 정리해보면 다음과 같았다
1. 글을 작성하기 위해 +
버튼을 누른다.
2. 글 작성 페이지로 들어간다.
3. 글을 작성하던 도중 임시 저장
버튼을 누른다.
4. 뒤로가기
혹은 다른 네비게이션 메뉴 버튼을 클릭 후, 페이지 이동을 한다.
5. 다시 작성했던 글을 보기 위해 임시 글 페이지에 들어간다.
6. 임시 글 목록에서 해당 글을 클릭한뒤, 작성 페이지로 이동한다.
7. 이때 이동시 해당 글의 페이지 url은 /parma
가 뒤에 들어간다.
8. 이에 맞게 데이터가 불러와진다.
따라서, 글을 작성하는 행위에 있어서 작성 페이지
, 작성한 글의 상세 페이지
가 필요했다.
결국 기능은 비슷하기에 하나의 컴포넌트에서 재사용이 가능하도록 구현하는 것이 좋겠다는 생각을 하게 되었다.
초기에 작성할 때는 POST
를 해야하고, 도중에 임시 저장을 할 땐, PUT
을 해야하는데 이때를 어떻게 구분을 할 수 있을까 생각을 하였을때, 단순히 useState
로 상태관리해보자니 새로고침시 다시 초기화된다는 단점이 있었다 따라서, Recoil
을 통해 전역상태 라이브러리를 사용하여 새로고침에도 대응하는 것이 좋겠다 판단 하였다.
페이지에 들어올 때, /:id
params
가 없다면 빈문자열을 전역상태로 넣고, 있을 경우에 해당 /:id
params를 전역상태에 넣어준다.
POST
를 사용하고 return된 데이터의 id를 전역상태로 관리해준다.
처음에 Server-side에서 /api/v1/search
의 라우터를 통해 검색 로직을 작성하다보니 한가지 의문이 들었다.
과연 나의 데이터안에서 검색 요청을 하는 것인데, 굳이 api 요청을 하는 것이 적합할까??
어쨋든 firebase 내에서도 쿼리를 통해 데이터를 찾고 해당 데이터를 가져오고 가져온 데이터를 뿌려주는 역할을 하겠지만 보다 많은 유저가 사용하고 많은 데이터가 있을 경우 개인의 데이터를 찾기에 이러한 방법이 적합할지 의문이었다.
React Query
React query
의 가장 강력한 위력은 데이터 캐싱에 있지 않을까 한다. 미리 캐싱된 데이터를 가공 처리하여 검색할 때마다 보여주면 굳이 검색 요청을 하지 않아도 되기에 요청의 비용도 줄일 수 있었다.
혼자서 진행하다보니 정말 많은 공부와 지식을 쌓는 좋은 경험이었지만 반대로 아주 베이스가 되는 부분들 부터 서버와 데이터 스키마 등 기능적인 부분에서도 혼자서 고민하며 진행하다보니 시간적 소요가 정말 길어졌지 않을까 했다.😇😇
하지만 혼자인 나에게 한줄기 빛 같던 선생님이 있었는데 그건 바로 The King GPT!!!
물론 GPT자체에만 의존한다면 정말 검증도 되지 않은? 코드들을 알려주거나 확실치 않은 답변을 내려줄때가 많다. 따라서 공식문서와 적절히 교차 검증은 필수이다.
덕분에 일의 능률이나 생산성이 정말 크게 상승될 수 있었던 The King GPT야 고맙다!