
앞으로 세 번의 프로젝트를 더 거쳐 서비스 ‘런피(LernP)’를 만들어갈 예정입니다.
이 글은 그중 첫 번째 프로젝트에서 제가 개발을 리드하며 겪은 기술/비즈니스적 변화와 협업 방식에 대한 회고입니다.
처음으로 서비스 전체 흐름을 책임지는 역할에 가까운 프로젝트였기에, 더 많이 부딪혀 보자는 마음으로 임했습니다.
좋은 아키텍처는 한 번에 완성되는 구조가 아니라, 같이 쓰면서 계속 다듬어 가는 방향성에 가깝다고 느꼈습니다.
기존 HTML + CSS + JS + LocalStorage 기반 프로젝트를
React + Vite + CSS Modules + Firebase 스택으로 마이그레이션했습니다.
그 과정에서 라우팅 설계, 인증/인가, 데이터 구조를 처음부터 다시 바라볼 수 있었습니다.
Next.js의 편의성에 익숙하다 보니, 라우터 설정과 설계를 충분히 하지 않으면 권한 처리·에러 핸들링에서 문제가 커질 수 있다는 점을 순수 React 환경에서 다시 한 번 느꼈습니다.
Vite를 사용하면서 번들링 과정에 대한 이해도 넓어졌고, Firestore와 Firebase Authentication을 통해 NoSQL 구조 설계 및 인증/인가 플로우 구현을 경험했습니다.
프론트에서 다루기 편한 객체 구조이면서도, 데이터베이스 입장에서는 빠르게 조회 가능한 스키마 사이의 균형을 고민했습니다.
프론트 입장에서 최소한의 데이터 구조 변경으로 대응 가능한지를 기준으로 설계했습니다.
프로젝트가 커질수록 폴더 구조가 깊어지거나, 반대로 한 폴더 안에 파일이 쌓이기 쉽다고 느꼈습니다.
이를 방지하기 위해, 상위는 도메인 단위로 나누고 도메인 내부는 역할(페이지/컴포넌트/로직/유틸) 기준으로 묶는 구조로 설계했습니다.
사용자 입장에서 자연스럽고 서비스 정책 변화에도 유연한 플로우를 만들고자 했습니다.
모두 수강생으로 시작한 뒤 필요 시 강사 권한을 부여하는 방식이 사용자 유입 장벽을 낮춘다고 판단했습니다.
강사는 “수강생으로서” 런피의 기능을 대부분 경험한 뒤, 자연스럽게 “수강생 → 강사”로 전환되는 흐름을 가지게 됩니다.
['USER']['USER', 'INSTRUCTOR']이렇게 한 사용자가 여러 역할을 동시에 가질 수 있도록 해 두면, 추후 기능 단위 권한으로 쪼개기에도 유리하다고 봤습니다.
권한 처리를 설계할 때는
를 함께 고려했습니다.
들어온 뒤에 막는 것이 아니라, 애초에 들어올 수 있는 경로를 제한하는 방식으로 접근했고, 이를 위해 라우팅 가드 패턴을 도입했습니다.
추후에는 Error Boundary를 도입해, 네트워크 오류나 예측하지 못한 런타임 오류에서도 공통 에러 화면과 복구 경로를 제공하는 구조로 확장할 예정입니다.
이번 프로젝트에서는 전역 상태 관리 도구를 당장 도입할 필요는 없다고 판단했습니다.
인증 상태는 Firebase Auth 리스너와 커스텀 훅으로 관리하고, 대부분의 데이터는 Firestore 쿼리 결과를 화면 단위에서 가져오는 방식으로 처리했습니다.
이 두 지점은 다음 프로젝트에서 직접 실험하고, 기준을 세워 볼 예정입니다.
관례적이고 이상적인 플로우에 기대기보다는, 주어진 상황에서 최선의 선택을 빠르게 의사결정해야 합니다.
이전 팀 프로젝트인 KILLPO(킬포)를 통해 기한을 지키는 습관과 기본적인 신뢰가 팀에 얼마나 크게 작용하는지를 깨달았습니다.
이번에도 이 세 가지를 의식적으로 실천하려고 했습니다.
주어진 시간 안에서 팀이 이해할 수 있는 수준의 안정적인 구조를 목표로 했습니다.
위의 세 가지를 우선순위로 두고 의사결정을 했습니다.
개발 리드를 하면서 어떻게 같이 성장하게 도와줄 수 있는지가 더 중요하다고 느꼈습니다.
그래서 동료들과 문제를 어떻게 쪼갤지, 어디서부터 찾아볼지, 어떤 기준으로 선택할지를 함께 고민하려고 했습니다.
단순히 정답을 알려주는 것보다, 문제를 풀어 가는 방식을 나누는 데 더 집중했습니다.
서로에게 어떤 병목이 있었는지, 앞으로 어떻게 개선하면 좋을지 이야기하는 시간을 가졌고, 그 과정이 팀 A의 터닝 포인트가 되었습니다.
무엇이 진짜 문제인지, 어디까지가 개인 스타일이고 어디부터가 팀 룰의 영역인지 헷갈리는 순간이 있었습니다. 각자가 이해하는 이슈 범위도 달라, 같은 내용을 반복하거나 결론이 흐릿해지는 경우도 있었습니다.
그래서 이슈를 먼저 언어화하기로 했습니다.
문서화 및 회의 시간은 절반 이상 줄었고, 그 과정에서 느끼는 부담도 함께 줄었습니다.
초기에는 작업을 도메인 단위로 나눴습니다.
작업 분배를 수평적으로 설계했지만, 실제 흐름은 수직적인 구간이 많았고 일부 구간에서는 개발보다 테스트를 기다리는 시간이 더 길어졌습니다.
도메인 내부의 ‘우선 개발 기능’과 도메인 간 ‘선행 조건’을 미리 정의하지 않았던 것이 병목의 원인 중 하나였습니다.
그래서 앞으로는 작업 단위를 분리할 때는 어떤 기능이 선행되어야 하는지, 어떤 기능은 병렬로 가능한지를 먼저 분석한 뒤 작업을 시작하려고 합니다.
저희는 초기에 코드 컨벤션, Notion 문서화 방식, 회의록, PR 작성 기준, 데일리 스크럼 규칙 등 협업 기준을 먼저 만들어 두고 출발했습니다.
하지만 진행될수록 규칙의 필요성을 느끼는 정도가 서로 달라지면서,
어떤 규칙은 자연스럽게 쓰이고 어떤 규칙은 피로감으로 느껴지는 경우도 있었습니다.
그래서 지금은 형식보다 먼저 “왜 이 규칙이 필요한가”를 팀 전체가 함께 이해하고, 실제로 도움이 된다고 느껴지는 규칙만 남겨가는 것을 목표로 하고 있습니다.
시간을 항상 아끼기 위해 노력해야 한다.
코드를 잘 짜는 것도 중요하지만, 결국 소통을 잘하는 개발자가 좋은 팔로워이자 리더가 된다고 생각합니다.
이 세 가지를 항상 염두에 두려고 합니다.
문서화를 하다가 “피로감이 큰 문서화가 과연 좋은 문서화일까?”라는 질문이 들었습니다.
남은 세 번의 프로젝트에서 팀만의 “좋은 문서화 기준”을 찾아가고자 합니다.
저희는 디자이너 없이 디자인 시스템과 보일러플레이트 코드를 만들면서 AI를 적극 활용했습니다.
AI가 제안한 방향이 맥락과 어긋날 때도 있었고, 프롬프트 작성·수정에도 시간이 든다는 점을 느꼈습니다.
앞으로는 어디까지를 AI에 맡기고 어디부터는 사람이 직접 고민할지에 대한 기준을 더 세밀하게 나누어 균형 있게 활용하는 연습을 해 보려고 합니다.
데모 데이 때 라이브 시연 위주로 진행하다 보니, 폼 입력 등으로 흐름이 늘어지는 구간이 있었습니다.
다음 프로젝트부터는 짧은 데모 영상과 시연용 데이터를 미리 준비해, 발표 시간에는 핵심 플로우에 집중하는 방식으로 개선하려 합니다.
첫 번째 프로젝트를 통해 “협업”이라는 단어를 이전보다 훨씬 구체적으로 떠올리게 되었습니다.
이 회고가 앞으로 세 번 더 이어질 런피 여정의 기준점이 되었으면 합니다.
읽어주셔서 감사합니다.
잘 읽었습니다. 😊