[네이버부스트캠프 웹・모바일 10기] 멤버십 21주차 회고
- 네이버부스트캠프
- 회고
들어가며
이번 주에는 오픈 스테이지에 도전하며 다른 캠퍼들로부터 다양한 피드백을 받았다. 미처 보지 못했던 불편한 흐름이 드러났고, 이를 개선하며 새로운 기능도 여러 개 추가했다. 남은 작업량이 많아 걱정이 컸지만, 팀원 모두가 맡은 부분을 책임감 있게 밀어준 덕분에 안정적으로 완성할 수 있었다. 다만 체력은 한계에 가까웠다. 새벽까지 작업하고 체크인 시간에 겨우 눈을 뜨는 날이 반복됐지만, 끝까지 잘 마무리하고 싶다는 마음 하나로 버텼다.
오픈 스테이지를 준비하면서는 사용자가 직접 써보는 상황을 여러 번 시뮬레이션했고, 그때마다 예상치 못한 오류나 흐름상의 끊김이 발견됐다. 팀원들과 전체 플로우를 주기적으로 점검하며, 발견된 문제는 바로 이슈로 정리해 수정하거나 다음 작업 우선순위에 반영했다. 짧은 주기로 테스트하고 바로 수정하는 방식이 오히려 개발 속도를 끌어올린다는 걸 느꼈고, 덕분에 마지막 데모에서는 치명적인 오류 없이 시연을 마칠 수 있었다.
팀 목표를 개인 우선순위까지 연결하다
지난주에는 구현 우선순위가 조금 미흡하다는 피드백이 있었다. 팀 차원의 우선순위가 각 개인의 실제 작업 우선순위까지 충분히 연결되지 못했던 탓이라고 느꼈다. 그래서 이번 주에는 팀의 하루 단위 목표를 정하는 데 더해, 각자 오늘 어떤 기능을 어디까지 진행할 것인지 계속 공유했다. 그렇게 하니 팀 전체의 방향과 개인의 작업 목록이 자연스럽게 맞춰지는 느낌을 받을 수 있었다.
단순히 팀 목표에 맞춰 진행하는 데서 그치지 않고, 다른 사람들의 작업 속도나 내용에 따라 유동적으로 우선순위를 조정하기도 했다. 예를 들어 백엔드에서 특정 기능이 언제쯤 마무리될지 예상하고, 그동안 빠르게 끝낼 수 있는 다른 작업을 찾아 먼저 처리했다. 이후 백엔드 작업이 끝나면 이를 프론트엔드에서 바로 연결하는 방식으로 작업을 빠르게 이어갈 수 있었다.
기능 완성이냐 리팩토링이냐, 논쟁 끝에 정한 우선순위
"개발자라면 서비스 완성이 먼저다"라는 주제로 팀원들과 꽤 진지하게 논의한 시간이 있었다. 오픈 스테이지가 끝난 뒤 실제 개발에 온전히 집중할 수 있었던 시간은 화요일 오후부터 목요일 밤까지였다. 이번 주까지가 기능 완성의 데드라인, 남은 한 주는 리팩토링과 개선에 집중하는 기간으로 잡혀 있어 한정된 시간 안에 무엇을 우선할지가 중요했다.
그때 남아 있던 작업은 발표 자료 업로드 및 다운로드, 채팅, 참여도 점수 반영, AI 요약, 자잘한 오류 수정 같은 필수 기능들이었다. 팀 안에서는 지금 구조를 정리하고 품질을 더 다듬을지, 아니면 기능을 먼저 다 채우고 나중에 손볼지를 두고 의견이 갈렸다. 다른 팀원들은 지금 상태의 완성도가 생각보다 높지 않으니 조금 더 보강한 뒤에 나아가야 한다는 쪽이었다.
반대로 나는 기능 개발을 이번 주 안에 최대한 밀어붙이고, 남은 기간에는 리팩토링과 구조 개선에 집중하자고 제안했다. 돌아가는 서비스를 만드는 게 최우선이고, 리팩토링과 구조 개선은 시작하면 끝이 없어 데드라인을 고려하면 기능 완성부터 잡는 편이 현실적이라고 봤다. 프론트엔드와 백엔드의 작업 흐름을 잘 정리하면 기능 구현과 동시에 일정 부분의 리팩토링도 병행할 수 있다고 생각했다. 팀원들의 실력을 믿었기에 이번 주 안에 충분히 끝낼 수 있다는 확신도 있었다. 여러 논의 끝에 팀은 우선 기능 완성을 기준으로 방향을 정했다.
논의했던 화요일 오후부터 다음 날 스크럼까지 기능 개발 속도가 눈에 띄게 빨라졌고, PR이 쌓일 정도로 모두가 집중해서 구현을 이어갔다. 목표로 삼았던 대부분의 기능이 그날 실제로 완료됐고, 결과적으로 AI 기능을 제외한 모든 주요 기능과 리팩토링을 이번 주 안에 마무리할 수 있었다. 덕분에 다음 주에는 AI 기능 추가와 리팩토링에 집중할 수 있게 됐고, 전체적으로 더 완성도 높은 서비스와 안정적인 데모로 이어졌다.
코드보다 상황에 집중해 가설을 세우다
테스트를 반복하면서 크고 작은 오류가 계속 보였다. 이를 해결하려고 코드 한 줄보다 문제가 발생하는 상황에 먼저 집중하려 했다. 어떤 조건에서 문제가 생기는지, 어느 시점에 화면이 깨지는지를 바탕으로 가설을 세우고 검증하는 방식을 여러 번 시도했다. 시간이 조금 더 걸리는 것처럼 느껴질 때도 있었지만, 근본 원인을 파악하는 데는 훨씬 도움이 됐다.
참여자의 비디오가 검은 화면으로만 보이는 문제가 그랬다. 다른 참여자의 카메라 수신 요청 자체는 정상적으로 이뤄지고 있어, 서버와의 통신이나 요청 단계 문제는 아니라고 판단했다. 대신 비디오가 실제로 재생 가능한 상태가 되기 전에 재생을 시도하면서, 화면만 먼저 렌더링돼 검은 화면이 뜨는 것이라는 가설을 세웠다. 클라이언트 단에서 비디오가 재생 가능한 시점을 감지해, 그 전까지는 로딩 스피너를 보여주다가 준비되면 재생하도록 흐름을 바꿨다. 그러자 사용자 입장에서는 "멈춘 화면"이 아니라 "준비 중인 화면"으로 자연스럽게 받아들일 수 있었다.
가설이 항상 맞아떨어지지는 않았다. 사용자가 브라우저의 다른 탭을 보고 있을 때 비디오가 멈추는 현상도, 처음에는 탭 전환 이벤트를 감지해서 다시 재생시키면 해결될 거라 생각했다. 하지만 실제 문제의 핵심은 브라우저가 백그라운드 탭의 리소스를 자동으로 제한한다는 데 있었다. 탭 전환 이벤트만 감지해서는 해결되지 않았고, 브라우저의 절전과 스로틀링 특성을 고려한 다른 접근이 필요했다. 이 문제는 아직 완전히 해결하지 못했고, 관련 정책과 예외 조건을 더 조사하며 새로운 가설을 세워 개선해볼 계획이다.
57명 앞에서 오픈 스테이지를 열다
이전에 예고했던 대로 오픈 스테이지를 진행했다. 내가 제안해서 시작된 자리이기도 해서 발표 자료 준비부터 실제 발표까지 직접 챙겼다. 날이 다가올수록 많은 사람 앞에서 발표한다는 사실에 긴장이 됐다. 다행히 개발이 한창 바쁜 시기였음에도 57명의 캠퍼가 참여해 목표로 잡았던 50명을 넘길 수 있었다.
발표는 기획을 가볍게 소개하는 방식으로 시작했다. 서비스를 만들게 된 배경과 해결하려던 문제, 기존 서비스와의 차별점을 핵심만 뽑아 설명했다. 이어서 캠퍼들이 직접 방에 접속해 카메라를 켜고 화면 공유를 해보며 여러 기능을 함께 테스트하는 시연으로 이어갔다.

지난주 회고 시간에는 오픈 스테이지에서 달성하고 싶은 테스트 목표를 미리 정리해뒀다.
- 50명 중 95% 이상이 5초 내 접속을 완료하면 성공
- 발표자의 카메라, 마이크, 화면 공유 세 스트림을 청중 49명 전체가 정상 수신하면 성공
- 발표자 스트림을 10분간 유지했을 때 평균 지연 500ms 이하, 끊김 발생률 3% 미만이면 성공
- 50명이 동시에 투표했을 때 결과가 1초 이내에 99% 이상 실시간으로 동기화되면 성공
수치도 있고 성공과 실패를 분명히 나눌 수 있어 나름 탄탄하다고 생각했는데, 막상 테스트해보니 허점이 많다는 걸 금방 깨달았다. "95% 이상이 5초 내 접속"이라는 기준은 모든 사용자가 동시에 링크를 클릭하고 바로 접속을 시도한다는 전제를 깔고 있었다. 현실에서는 누군가는 늦게 접속하기 마련인데, 이런 맥락을 목표에 반영하지 못한 것이다.
어떤 상황을 가정하고 어떤 조건에서 측정할지, 그 데이터를 어떻게 모을지에 대한 고민 없이 목표부터 세웠다는 게 문제였다. 구글 폼으로 실시간 피드백은 받았지만 정작 중요한 사용 행동과 맥락은 충분히 수집하지 못했다.
바닥난 자신감을 테스트 사이클로 다시 채우다
전체적으로 보면 가능성은 확인했다. 많은 인원이 한 번에 들어왔는데도 서버가 버텨줬고 기본 흐름도 돌아갔다. 하지만 세부적으로 들여다보니 고쳐야 할 문제가 정말 많았다. 화상 연결을 내가 전담하다 보니 화면에서 드러나는 문제 대부분이 곧 내 작업이었고, 이슈 한두 개를 발견하기 시작하자 그동안 보이지 않던 허점들이 연달아 보였다. 인프라, 서버, 다른 프론트 영역은 모두 잘 버텨줬는데 내가 팀원들의 발목을 잡은 건 아닐까 싶어 자신감이 많이 떨어졌다.
그렇다고 자책만 할 수는 없었다. 피드백을 쭉 읽으며 반복적으로 언급되거나 사용성에 크게 영향을 주는 이슈를 우선순위 맨 위에 올리고, 무조건 고쳐야 하는 것과 추후 개선해도 되는 것을 구분했다. 불편함이 가장 많이 몰린 카메라 화면을 중심으로, 카메라가 켜지는 시점, 비디오가 준비되기 전의 화면, 네트워크가 불안정할 때의 처리를 하나씩 손봤다. 오류 상황에서 보여줄 메시지와 자동 복구 범위도 함께 정리해 에러 처리 흐름을 다졌다.
다음 데모까지 남은 시간은 이틀 반이었다. 팀원들이 적극적으로 붙어준 덕분에 눈에 띄는 에러는 대부분 정리했고, 데모에서 10명 정도의 캠퍼와 다시 테스트했을 때는 훨씬 안정적이라는 반응을 들을 수 있었다.
이번 경험으로 기능이 동작하는지만 보는 게 아니라 사용자가 그 기능을 어떻게 경험하는지를 확인하는 과정이 필수라는 걸 깨달았다. 우리가 아무렇지 않게 넘겼던 부분이 다른 사람에게는 충분히 불편하고 낯설 수 있었다. 특히 테스트, 문제 정리, 개선, 다시 테스트로 이어지는 사이클의 효과가 컸다. 할 일이 테스트를 거치며 구체적으로 드러나니 무엇부터 손댈지 헤매지 않았고, 이 사이클이 버그를 줄이는 수준을 넘어 개발 속도와 품질을 함께 끌어올린다는 걸 확인했다.
말로 설명하는 연습이 필요하다
오픈 스테이지에서 가장 크게 느낀 건 발표 자체보다 질의응답 시간에 제대로 답하지 못했다는 점이다. 알고 있는 내용인데도 질문을 받는 순간 말이 꼬이고 핵심이 전달되지 않았다. 그날 아침 팀원들과 이야기하며 정리했던 내용조차 막상 질문을 받으니 흐릿하게만 떠올랐고, 머릿속 생각이 입 밖으로 나오지 않았다.
이전 몇 주 동안은 혼자서도 설명을 소리 내어 뱉어보며 연습했었는데, 프로젝트가 바빠지면서 조금씩 느슨해졌던 것 같다. 문제는 이해하고 있는 내용을 상대 입장에서 구조화해서 설명하지 못한다는 데 있었다. 복잡한 생각은 글로 먼저 정리하고, 문장은 최대한 짧고 간결하게 쪼개어 말하는 연습을 다시 반복하려 한다. 어떤 방법을 시도했고 그 결과가 무엇이었는지를 논리적으로 말할 수 있도록 해보려 한다. 개발자는 코드를 작성하는 것만으로 끝나지 않는다는 생각이 들었다.
나 혼자만 이해하는 구조는 아닐까
구조에 대한 고민은 프로젝트마다 반복되는 이슈였고, 설계가 뒷받침되지 못해 이번에도 부족한 부분이 많았다. 몇 번 구조를 바꿔보며 가장 먼저 든 의문은 이게 나만 이해할 수 있는 구조는 아닐까였다. 관련된 기능을 하나의 역할이라 여기고 한 파일에 몰아넣었을 때, 나는 어디에 무엇이 있는지 추론할 수 있었지만 다른 팀원도 그럴지는 확신이 서지 않았다.
그래서 파일과 모듈의 역할을 더 분명히 나누고, 코드를 열었을 때 위치와 책임을 예측할 수 있는 선까지만 책임을 부여했다. 예전 시니어 피드백에서 들었던 "다른 사람이 코드를 예측 가능하게 만드는 것이 좋은 구조"라는 말이 그 기준이 됐다. 나눌 때마다 이렇게까지 나눈 이유가 뭔지 스스로에게 물었고, 답하지 못하면 지우고 처음부터 다시 설계했다. 폴더를 잘게 쪼개거나 파일을 늘리는 게 아니라, 각 조각이 존재하는 이유를 설명할 수 있어야 한다는 기준이었다.
그래도 지금 구조는 어설픈 초안에 가깝다. 쓸 수 있는 패턴과 예시가 더 쌓여 있었다면 더 빠르고 체계적으로 잡았을 것 같아, 검증된 설계 방식을 공부하는 일이 왜 중요한지 느꼈다. 프로젝트가 끝나면 어떤 구조를 시도했고 어디서 실패했는지 정리해, 다음 선택의 기준으로 삼고 싶다.
정리하며
얼마 안 남았다는 생각 때문인지 마음은 계속 앞으로 달려가는데 몸이 따라오지 못하는 느낌이다. 다른 팀원들이 그동안 쌓아온 작업을 제대로 보여주려면 내가 맡은 부분을 끝까지 책임지고 마무리해야 한다는 압박이 크다. 그래도 아직 시간이 남아 있는 만큼 남은 기간 할 수 있는 최선을 끝까지 쏟고 싶다.
부스트캠프가 끝난 뒤 여운이 남아 있을 때 캠퍼들과 한 번 제대로 얼굴을 보고 인사 나누고 싶다는 마음도 있었다. 처음에는 지금 팀원들과 이전 팀원 정도만 모여 10명 안팎이면 좋겠다고 생각했는데, 인원을 모으다 보니 어느새 20명을 넘어섰다. 이왕 이렇게 된 김에 예전에 스쳐 지나갔던 캠퍼들에게도 한 번씩 연락을 돌렸다. 늘 이름이나 캠 화면으로만 보면 반가웠지만 정작 인사를 나눌 기회는 많지 않았던 사람들과, 기억에 남는 순간을 웃으며 이야기해보고 싶었다.
그렇게 연락을 돌리다 보니 결국 50명 넘는 인원이 모이게 됐다. 지방에서 올라오겠다는 사람들을 보고는 놀랍고도 감사했다. 다들 치열하게 달려온 시간이었던 만큼, 이 자리만큼은 시간이나 작업 걱정 없이 편하게 웃고 떠들다 갔으면 좋겠다.