April 30, 2023
이 글의 길이는 매우 깁니다. 따라서, 원하는 부분을 찾아갈 수 있는 목차를 제공합니다.
처음에는 회고의 작성에 대해 고민을 많이 했었다. 이 프로젝트를 하면서 심적으로 고생을 많이 했었고, 더불어 프론트엔드 분야에 대해서, 개발에 대해서 까지 많은 생각이 들었다. 그래서 프로젝트가 끝난지 시간이 흘렀음에도 불구하고 프로젝트를 되돌아 볼 용기를 낼 수 없었다.
하지만 지금 시점에서 이 프로젝트를 되돌아보면, 이 프로젝트는 나의 이정표가 되어준 프로젝트였다. 나의 모든 프로젝트 중 가장 ‘소통’에 관하여 많은 고민을 한 프로젝트였고, 처음으로 개발적인 부분 보다 비개발적인 부분을 발전시킬 수 있던 프로젝트였다.
즉, 이전까지의 프로젝트에서는 기술적인 면에 집중을 했다면, 댄버스 프로젝트는 기술적인 면보다 같이 일할 수 있는 사람이 되는 방법을 배울 수 있었다.
이름 | 🪩춤으로 연결되는 댄스 유니버스, 댄버스💫 |
기간 | 2023.02.06 - 2023.03.04 |
인원 | 프론트엔드 2, 백엔드 2, 디자이너 2 |
목표 | 춤을 추는 댄서/댄스팀을 위한 서비스로, 온오프라인 경계 없이 댄스로 연결될 수 있는 댄스 플랫폼 |
Github | https://github.com/dnd-side-project/dnd-8th-1-frontend/ |
이 프로젝트는 사이드 프로젝트 동아리 DND에서 진행했던 프로젝트로 춤을 추는 댄서/댄스팀을 위한 서비스로, 온오프라인 경계 없이 댄스로 연결될 수 있는 댄스 플랫폼이다. 프로젝트 주제는 각 팀원이 제시한 주제 내에서 투표로 정해졌다.
나는 프론트엔드 개발의 역할을 맡았으며, 프론트엔드 팀에서는 일정 관리와 이슈에 대한 결정권을 가진 프론트엔드 팀장룰을 맡았고 개발팀에서는 백엔드와의 소통을 주도하는 역할을 하였다.
도입 목적
Next.js
와 TypeScript
의 경우, 이전의 프로젝트 (Art.zip)에서도 사용하였고 프로젝트에서 해당 기술들을 사용한 경험이 상당히 괜찮았기 때문에 또 다시 사용하게되었다.좋았던 점
Next.js
의 페이지 기반 라우팅과 프레임워크로써의 성격이 처음 합을 맞춰보는 프론트엔드 개발자와 개발하는데의 장벽을 줄여주었다. 오히려 동아리에서 한 작은 사이드 프로젝트였고, 실제 사용자가 별로 없었다는 특성 때문에 Next.js
의 SSR, Image Optimization, code spilitting 과 같은 성능 적인 부분보다는 프레임워크로써 협업을 용이하게 해준다가 더 와닿았다.아쉬웠던 점
Next.js
과 React
의 버전업을 고려하지 않아서, 초반에 SSR 관련 오류를 잡기가 힘들었다. 특히나 이번 프로젝트에서 유달리 Modal
, BottomSheet
와 같은 Portal
을 이용하는 컴포넌트를 많이 만들었는데 React
의 버전 업에 따른 “서버 컴포넌트” 의 특성을 초반에 파악하지 못해 window is not defined
에러를 만나고 말았다.React
의 Suspense
나 Error Boundrary
와 같은 기능을 사용하지 못한게 아쉽다. 특히 우리 프로젝트는 SSR 뿐만이 아니라 CSR로 로딩하는 부분도 상당히 많았으며 서버가 불안정한면이 있었기 때문에, 서버가 불안정하다면 우리 앱도 얄짤없이 해당 부분이 blocking 되면서 UX가 안좋아졌었는데, Suspense나 Error Boundary를 사용하였으면 이런 부분을 프론트엔드 측면에서 조금이나마 개선할 수 있지 않았을까? 라는 생각이 든다.도입 목적
좋았던 점
아쉬웠던 점
도입 목적
swr
을 활용해서 큰 성능 개선을 이룬 것을 보고 해당 라이브러리에 흥미를 느꼈는데, 마침 같은 팀원이 react-query
를 사용할 것을 강력하게 주장하여서 도입하게 되었다.좋았던 점
react-query
의 주요 도입 목적인 서버 상태를 전역적으로 관리할 수 있으며, 클라이언트와 분리한다라는 컨셉에 대해서 배울 수 있었다. 특히나 서버와 클라이언트를 분리해서 서버의 상태는 react-query
에 위임한 라이브러리의 설계를 보고 개인적으로도 CS에서 가장 중요하다고 생각하는 추상화의 개념이 와닿았다. (컴포넌트를 만들 때 데이터와 뷰의 분리에서 데이터를 불러오고, 처리하는 로직을 custom hook으로 빼놓는 코딩 스타일을 권고하는 글이 많았는데, react-query
도 이러한 개념에서 출발하지 않았을까? 라는 생각이 들었다.)react-query
를 통하여 서버 상태를 전역적으로 관리하면 얻을 수 있는 이점을 체험하고 나니 왜 전역 상태를 서버로 관리하려고 하였으며, redux를 비롯한 많은 라이브러리들에서 그동안 비동기 처리를 해결하려고 하였는지 이해가 되었다.react-query
의 일부를 학습하는데는 크게 문제가 없을정도였다. 또한 프로젝트와 함께 진행하고 있던 HTTP 완벽 가이드 스터디와 서버 상태 관리에 관한 내용이 적절한 시너지를 일으켜서, 해당 라이브러리에 대해서 잘 이해할 수 있었다.아쉬웠던 점
도입 목적
좋았던 점
.stories
코드를 짜면서 팀원에게 리뷰를 부탁하기 위해 여러 케이스의 더미 데이터를 만들어서 코드를 구현했는데, 이 부분에서 묘하게 수동 셀프 테스트가 되었던 것 같다.아쉬웠던 점
storybook
과 개발 환경이 달라서, 생각 처럼 동작하지 않는 컴포넌트가 있었다. 대표적으로 포탈을 사용하는 컴포넌트나, 일부 css 속성들(이건 원인을 잘 모르겠다..)이 그래서 스토리북에서 제대로 개발을 했더라고 해도, 실제 앱에 렌더링하면 다르게 보이는 컴포넌트들이 있었다.stroybook
의 경우 컴포넌트 테스트로 지원하는 더욱 강력한 기능들이 있다고 들었다. 후술하겠지만, 우리 프로젝트에서 가장 아쉬운 점 중 하나가 테스트의 부재인데, storybook
의 기능을 더 잘 알아보고 사용하였다면 좀 더 단단한 환경을 구축할 수 있지 않았을까 싶다. (특히나 코드 리뷰, 테스터가 서로 밖에 없었기 때문에 더욱 중요한 사항이라고 생각한다.)지금까지 진행했던 프로젝트에서 소통 문제를 크게 겪은 적은 없었지만, 이번 프로젝트에서 처음으로 소통에 대한 문제를 경험하고, 개발 일정에 큰 영향을 미치게 되었다. 개발 팀의 경우, 나를 제외하고 모두 팀 프로젝트에 익숙하지 않은 사람들이었고 이로 인해 slack
, notion
, github
과 같은 협업 도구 역시 익숙하지 않은 상태였다. 특히 가장 큰 문제점은 개발팀에서 나를 제외하고 모두 안면이 있는 관계였고, 프론트엔드 팀원과 백엔드 팀원은 이미 친분이 있는 상태였던 것이다.
따라서 초기에 프로젝트에 대한 소통이 친분이 있는 사람들끼리의 1:1 연락으로 이루어졌고, 요청 사항 역시 마찬가지로 슬랙에 요청 → 슬랙의 메시지를 확인하지 않거나, 안건이 급하다고 생각해서 1:1로 연락함 → 내가 모르는 형태 + 요청과 다른 형태로 기능이 만들어짐 의 사이클로 소통에 상당한 어려움이 생겼다.
이 문제를 해결하기 위하여, 동아리 운영진을 비롯한 데브코스에서 함께 했던 사람들에게 상담을 요청하였고 상담을 통해 느낀 점은 프론트엔드 개발자로서 애플리케이션에 대한 소통에 적극적으로 임해야 하며, 우리 팀이 프로젝트를 무사히 끝내기 위해서는 미스커뮤니케이션을 최소화하는 것이 우선이라는 것 이었다.
처음 백엔드 개발자와 소통이 잘 안되었을 때는 물론 (나도 사람이니까) 답답함을 느꼈지만, 어쨌든 프로젝트를 완성하기 위해서는 함께 작업을 해야하는 사람들이라는 것을 깨달았다.
따라서 백엔드 개발자와 소통이 안되는 이유에 대해서 생각해보았고, 이를 해결하기 위한 방안을 모색해보았다. 그들과 소통이 안되는 이유는 다음과 같았다.
서로의 역할에 대한 이해 부족 → 프로젝트에서 프론트엔드의 역할에 대해서 이야기 하고, 대화로 풀어나가기
요구 사항에 대한 잘못된 이해 → 요구사항을 구체적으로, 객관적으로, 근거와 함께 설명하기
...
조회하는 API 만들어 주세요. API의 내용에는 ...
, ...
, ...
, ...
가 있었으면 좋겠습니다. 정도로만 요청했으나 들어오는 데이터들이 프론트엔드에서 원하는 방식과 다르게 들어오는 경우가 있었다.이를 위하여 프론트엔드 측에서 백엔드에게 API를 요청하기 위한 형식을 정의하였고, 최대한 구체적인 형식과 읽는 사람에 있어서 설득할 수 있을 근거와 함께 요구사항을 요청하도록 노력하였다.
전체 프로젝트의 현재 진행 방향 (큰 그림)에 대한 개발자들의 이해 부족 → 데일리 스크럼을 통하여, 서로 프로젝트의 진행 현황을 공유하기
이러한 노력 덕분에 프로젝트의 소통 문제가 점차 개선되었고, 팀원들 간의 미스커뮤니케이션도 줄어들었다. 결과적으로 프로젝트는 원활하게 진행되어 마무리 단계에 도달할 수 있었다.
이 경험을 통해 개발적인 부분 뿐만이 아니라 비개발적인 부분 역시 프로젝트의 성공 여부에 큰 영향을 미칠 수 있다는 것을 깨달았다. 앞으로 개발자로서의 커리어를 이어가면서, 소통을 개선하기 위한 노력을 게을리하지 않고 다양한 사람들과 협업할 수 있는 역량을 기르기 위해 노력해야겠다고 다짐했다.
비록 개발적인 면보다 비개발적인 면에 집중한 프로젝트지만, 개발의 본질이란 기술적으로 문제를 해결하는 과정이기에 기술적인 인사이트 역시 얻을 수 있었다. 특히 이번에는 주요 환경 설정에 대한 코드를 자주 작성하게 되었는데 이를 작성하면서 구현뿐만이 아닌, 뒤에서 돌아가는 로직에 대해서 생각할 수 있었고 자동화의 중요성 까지 생각해졸 수 있었다.
set-cookie
를 통하여 직접 클라이언트에 쿠키를 설정해주는 방식 이였다.HTTP 완벽 가이드
스터디를 진행하고 있었고 관련 내용의 경우 책에는 없는 최신의 내용이였으나 스터디 팀원이 공유해준 내용이었으므로 해매지 않고 빠르게 구현할 수 있었다.https
를 사용하는 서버에서 클라이언트에 쿠키를 설정하기 위해서는 현재 크롬 브라우저 기준 SameSite
속성의 기본값이 None
에서 Lax
로 변경되었으며, SameSite=None
을 이용할 경우 secure cookie
를 사용하는 것이 강제되었다. 따라서 개발 환경에서 정상적인 로그인을 구현하기 위해서는 개발 환경을 https를 사용하여 띄워야 했다.next.js
의 api
를 서버와 서버끼리는 CORS가 없다라는 것을 활용하여 next.js
의 api
를 인증 프록시 서버 처럼 활용하는 방안을 찾아볼 것이다.react-query
를 사용해야 했다는 것이다.react-query
를 이용하여 SSR을 사용할 때 prefetchQuery
를 사용해야 했는데, 인증을 위해 추가되어야 하는 점은 사용자 인증 정보 (토큰 정보)에 따라 api를 새로 호출해야 했었으므로 queryKey
에 accessToken도 함께 넣어줘야 했다.react-query
에 queryKey
를 잘 설정해야 한다는 점을 몸소 배울 수 있었다. 이번에도 진행하고 있던 HTTP 완벽 가이드
스터디가 도움이 많이되었는데, 스터디에서 캐시와 관련된 내용에서 깊게 공부할 수 있었기 때문에 react-query
의 queryKey
가 더욱 잘 와닿았다.react-query
역시 클라이언트와 서버상태의 분리, 네트워크 요청 향상 이라는 목표를 위하여 기본 자바스크립트의 요청과 Cache의 개념 을 통해서 풀어나간 사례라는 생각이 들었다. 이를 통해 모든 응용의 기초는 기본기는 사실을 더욱 상기시킬 수 있었다.TypeScript
가 대표적인 예인데, type narrowing
과 같은 코드 안정성을 높일 수 있는 기법을 충분히 활용하지 못한 것이 아쉽다.axios
를 사용했지만 (익숙하니까), HTTP 완벽 가이드
스터디에서 배운 내용을 통해 XHR
기반이 아닌 fetch
와 AbortController
같은 web API를 사용하면 지금과 비슷한 로직을 구현하면서도 현재 웹 생태계와 더 잘 어울리는 코드를 작성할 수 있었을 것 같다.next.js
와 React
는 서버 컴포넌트와 useTransition
, Suspense
와 같은 기능이 추가되었는데, 이 기능을 활용하면 현재 프로젝트를 더욱 안정적이고 세련되게 만들 수 있었을 것이다.결국, 나에게 필요한 것은 내가 알고 있는 지식이 내가 알고 있지 않을 수도 있다는 점이었다. 이는 특히 프론트엔드 개발자에게 중요하다. 프론트엔드 개발은 트랜드가 빠르게 변하고 사용하는 라이브러리/프레임워크의 논리도 빠르게 바뀌기 때문에, 이전에 내가 사용하던 기술이 약간의 시간이 흘러도 그것이 아닐 수 있다는 것이다.
프로젝트를 통해 안일했던 나와 마주할 수 있었고, 이를 개선하기 위해 다음과 같은 활동을 계획하였다.
새로운 버전이 나온 라이브러리/프레임워크를 공식문서 기반으로 공부하기
React
와 Next.js
는 나의 주요 기술이므로, 이들에 대한 이해와 단단한 기반을 갖추는 것이 중요하다. 따라서 주요 기술들에 대한 학습을 통해 강점을 만들어 나갈 것이다.React
의 경우 새로운 공식 문서 번역자를 모집하고 있어서, 번역자로 지원하였다. 이를 통해 오픈소스 컨트리뷰션을 할 기회가 생겼고, 공식 문서를 번역하면서 공식 문서 친화적인 개발자가 될 수 있을 것이다.시간이 걸리더라도 지식과 코드에 주체적인 사고를 담기
Chat GPT
와 같은 AI 도구를 사용하여 사고의 시간을 가져야겠다.