올해 사이드 프로젝트를 통한 역량 향상의 필요성을 느끼고, 간만에 사이드 프로젝트 동아리를 운좋게 합격해서 들어갔습니다.
현재 MVP 배포를 끝낸 상태에서, 5월 중순에 진행한 온보딩 기간부터 현 시점까지의 회고를 짧게나마 작성해보려 합니다.
온보딩 ~ MVP 배포 기간 동안 마주한 상황들에 대한 해결 과정
제가 올해 사이드 프로젝트를 해야겠다고 생각한 것은, 기술 역량 향상도 목적이 있긴 했으나 협업 상황에서 발생하는/발생 가능한 여러 상황들에 대해 능동적으로 다양한 방법들을 써보며 "아 이런 상황에선 이런 방법을 쓰면 더 효율적으로 일을 굴릴 수 있구나" 같은 것들을 익히고 싶던 것도 있습니다. 그래서 이번 프로젝트에서 나름대로 여러 가지를 먼저 제안하고 공유했는데, 그런 것들 위주로 회고글을 작성해봤습니다. (그래서 기술적인 관점에서 고민했던 것들은 최대한 이 글에서는 배제하고, 일을 굴리는 관점에서 고민했던 곳들 위주로 작성했습니다)
1. 기능명세서와 와이어 프레임 등이 미흡했던 문제
기획팀으로부터 작성된 기능명세서를 받았으나 개발 관점에서 보면 정의가 좀 더 필요하다고 생각되는 부분들이 보였습니다.

구체적으로 이 기능이 동작할 때 어떤 데이터들을 사용하고 어떤 데이터들을 받는지, 이 기능이 어떤 흐름과 조건에서 동작하는지, 어떤 유효성과 예외가 있는지에 대한 정의가 다소 부족하다고 느꼈습니다. 또한 세부적인 정책 정의가 필요하다고 느끼는 부분들도 있었습니다(~를 하면 ~를 할 수 없게 한다 등).
암튼 이런 부분들을 기획팀에게 되물어봐서 정확한 스펙 정의를 해야 했는데, 이걸 4명의 개발자 각자가 기획팀에게 물어보면 불필요한 핑퐁이 더 많아지고 오히려 정리하기 더 힘들어질 것 같다고 생각했습니다. 그래서 노션 페이지를 파서 개발자끼리 기능 명세서에 추가적으로 정리가 필요하다고 생각되는 부분들을 취합하고 이 문서를 기획팀으로 전달하자고 제안을 드렸는데요, 다들 좋다고 해주셔서 이 방법을 적용했습니다.

그리고 프로젝트 진행 과정 중 전반적으로 기획팀과 개발자 사이에 "이거는 뭘로 해야 해요?"라던지 "이거는 어떤 값 써야 해요?"를 주고받으며 핑퐁하는데 시간도 많이 걸리고 서로 스트레스도 많이 받는 것 같다고 느꼈습니다. 사실 백엔드는 화면에 대한 영향도를 크게 받지는 않지만 프론트엔드는 화면에 대한 영향도도 크게 받기 때문에, 특히 프론트엔드 개발자와 기획팀 간에 이런 일이 많은 듯 합니다. 뭐 암튼.. 그럴 때는 차라리 개발자들이 먼저 기획팀에게 본인들이 원하는 형태로 기능명세서나 화면 설계서 등을 작성해달라고 요청해주는 게 좋겠다는 생각이 들었습니다. 아무래도 PM이나 PD 직군은 개발을 직접 해보지 않은 이상 개발 친화적(?)인 문서 작성을 처음부터 하기에는 힘들 것 같기 때문에 아싸리 처음부터 개발자들이 원하는 형태의 기능명세서 템플릿을 드리면 어떨까라는 생각입니다. 저는 개인적으로 기능명세서는 다음과 같은 템플릿으로 작성되면 좋겠다는 생각이 이번에 든 것 같습니다.

물론 하나의 예시긴 하나, 위 형태로 기능명세서가 작성된다면 데이터의 흐름(입력과 출력)이 잘 드러나고 예외와 조건도 잘 명시되어 있다고 생각합니다. 그래서 다음에 또다시 사이드 프로젝트를 하게 된다면 아싸리 처음부터 이런 양식으로 만들어달라고 해보는 것도 괜찮다는 생각입니다.
2. 기획/디자인 기간이 늘어나던 문제
대부분 기획단계의 산출물이 나와있어야 개발이 가능하기 때문에 기획과 디자인이 기간이 늘어나면 개발자는 붕 뜨게 될 수도 있는데요, 개인적으로 프로젝트 극 초기부터 이런 상황이 발생할 수 있다고 생각했습니다. 그래서 제가 적용했던 방법은 처음부터 개발자 분들끼리 서로 먼저 할 수 있는 것들을 해두자고 말한 것입니다. 동일직군 개발자끼리 서로 사용할 기술스택과 버전을 맞춰 둔다든가, 커밋 컨벤션 등을 정해둔다든가, 프로젝트 공통 설정 세팅을 미리 한다든가 등등.. 또한 개인적으로 로그인/회원가입 기능은 MVP 단계에서 필요없다고 생각하지만 기획과 디자인 기간이 생각보다 더 늘어난다면 미리 만드는 게 좋겠다 싶어 이것도 미리 해보자고 할려고 했으나, MVP 단계에서 로그인 기능을 넣는 것이 다소 늦게 결정되어 로그인 기능을 미리 만들지는 못 했습니다 (프로젝트 설정을 좀 더 빨리 했으면 미리 만들 수 있었겠다라는 아쉬움이 있네요)
3. 프로젝트 공통 설정에 대한 문제
백엔드 파트는 이번에 멀티 모듈을 도입하여 프로젝트를 해보기로 했고, 이에 대한 프로젝트 세팅을 제가 하게 됐습니다. 하지만 함께 협업할 백엔드 개발자 분이 Spring을 주력으로 하시던 분이 아니기도 했고, 멀티 모듈 프로젝트가 생소한 개념일 수 있어 많이 헷갈려 하실 수 있겠다는 생각이 들었습니다. 그래서 프로젝트 세팅에 대한 가이드 문서를 만들면 좋겠다는 생각에 다음과 같이 노션에 프로젝트 가이드 문서를 만들어서 공유드렸습니다.

4. api 명세와 배포 전 api 테스트 방안에 대한 문제
프론트엔드 분들이 어떻게 백엔드 파트에서 개발한 api에 대해 연동 테스트를 하도록 할지도 고민이었습니다. 회사라면 스테이징 서버와 개발 서버를 운영하고 있기에 개발 서버에 백엔드 파트에서 개발한 내용을 배포해두면 프론트엔드 분들이 개발 서버로 테스트를 해볼 수 있지만, 사이드 프로젝트에서는 비용 이슈로 그렇게 하기는 힘들었습니다. 그렇다고 프론트엔드 분들이 본인 로컬에 백엔드 서버를 직접 띄워서 테스트하는 건 비효율적이라 생각해서 같이 회의를 했었는데, 백엔드 파트에서 OpenApi 스펙의 yaml파일을 만들어서 주면 프론트 파트에서 Mock서버를 만들어서 테스트하는 식으로 합의를 보게 됐습니다.
우선은 개발에 들어가기 전에 노션을 통해 api 명세 문서를 만들었고, ai의 힘을 활용해 노션에 작성했던 명세를 openapi 스펙의 yaml로 변환하여 프론트 파트로 전달했습니다. 그리고 api 명세 수정이 있을 때마다 명세 불일치 문제를 만드는 것을 피하기 위해 즉시 노션에 있던 명세 문서를 수정하고 yaml파일을 바꿔서 다시 전달드리는 식으로 운영했는데, 수기로 노션 문서까지 수정해야 하니 당연히 불편했습니다. 그래서 yaml파일을 커밋하면 레포지토리에 커밋된 yaml파일을 읽어 redoc 문서를 정적으로 배포해주는 워크플로우를 등록해서 다음과 같이 api 명세서 문서를 운영하도록 전략을 바꿨습니다.

다만! yaml파일은 아직 수기로 수정하고 있습니다. 백엔드 단 기능 변화가 있을 때마다 그에 따라 yaml파일을 자동으로 재추출하도록 워크플로우를 등록하면 아예 api 명세 문서 배포 플로우를 자동화할 수 있지만 이 부분은 우선순위 이슈로 현 시점에서는 아직 설정을 안 했습니다.
5. 기능 흐름에 대한 세부적인 정리가 필요했던 문제
대개의 경우 신규 리소스 등록(Create) 시 해당 리소스의 key값을 클라이언트에서 지정하지 않습니다. 하지만 저희 서비스는 게임을 저장할 때 해당 게임을 구성하는 이미지들의 경로도 함께 저장해야 하며, 이 이미지들은 백엔드에서 준 S3 presigned url에 업로드하게 되는데요. 이때 저는 관리의 용이성을 위해 S3 버켓에 해당 게임 아이디(key값)로 디렉토리를 만들고 그 하위에 다음과 같이 저장하도록 하고 싶었습니다.

다만 이렇게 할려면 백엔드에서 클라이언트로 presigned url을 발급해줄 때 해당 게임이 사용하는 gameId(key값)를 서버가 알고 있어야 하는데요. 이때 문제는 게임을 신규로 등록하는 경우는 gameId를 어떤 걸 쓰는지 모르기 때문에, 게임을 신규로 등록할 때 게임이 사용하게 될 gameId를 미리 지정한 다음 다음 이를 활용해 presigned url을 발급하는 식으로 게임 등록 흐름을 설계했습니다.
이렇다보니 게임을 신규로 등록할 때 해당 게임이 사용하는 key값을 클라이언트가 요청 데이터에 함께 보내는 형태가 되기도 했고, 프론트엔드 분들 입장에선 presigned url에 이미지를 저장하는 것이 생소한 흐름일 수 있겠다는 생각이 들었습니다. 그래서 게임을 등록하는 흐름에 대한 명세 느낌의 문서를 만들면 좋겠다는 생각에 다음처럼 문서를 만들어 공유드렸습니다.


프론트엔드 개발자 분이 다음처럼 메시지 남겨주셨었는데 나름 뿌듯한 순간이었습니다 :)
6. 배포 후 예상치 못하는 상황이 생길 수 있던 문제
MVP 배포 전, 프론트 서버와 백엔드 서버가 미리 배포된 상태에서 서로 연결이 잘 되는지 등을 테스트해보면 좋겠다는 생각이 들었으나, 이런저런 이슈들로 배포 일정이 조금씩 연기되며 해당 테스트들을 여유있게 할 수 없던 상황이 됐습니다. 대표적으로 예상되는 문제로는 프론트에서 백엔드 서버로 HTTP 요청이 안 간다든지, S3 이미지들이 로딩이 안 된다든지, CORS 문제가 생긴다든지 등이 있었습니다. 또한 백엔드 프로젝트는 local 프로필에서는 H2 DB를 사용하도록 설정한 것 등이 있었기 때문에 prod 프로필에 대한 설정을 다 마쳤는지 등도 배포 시에 점검이 필요한 상황이었습니다. 그래서 아예 이런 이슈들이 발생할지를 체크리스트로 만들어 활용하면 좋을 것 같아서 별도 문서로 만들어서 공유했습니다.

그래서 다행히(?) MVP 배포 후 이미지가 로딩이 안 된다든지 등 설정 미흡으로 인한 이슈는 없었습니다.
또한 아무래도 제가 평일 낮에는 회사에 있다보니 이때 이슈가 터지면 대응이 어렵겠다는 생각이 들어, ERROR 레벨의 로그는 디스코드를 통해 발송하도록 추가 설정을 개발해서 적용해뒀습니다.

다음 번에 이렇게 하면 좋겠다 싶은 점, 이런 거 있으면 좋겠다 싶은 것들
1. PR 리뷰 자동화
사실 저희 팀 프론트 분들이 코드래빗이라는 서비스를 통해 PR을 자동화한 걸 보고 "오 이거 괜찮은데?"라는 생각이 들었습니다. 물론 돈을 내야 하는 서비스긴 하나 그럴 만한 가치가 있다는 생각이 들었는데요, 다음에 프로젝트를 할 때는 초기에 이런 거를 제안해서 세팅해서 사용하면 괜찮다는 생각이 들었습니다.
2. 좀 더 효율적인 API 명세 작성과 공유 방법
아무래도 개발한 것이 당장 없는 상태에서 API 명세서를 먼저 만들기 위해 노션을 통해 명세 문서를 만든 다음 AI를 통해 OpenAPI 스펙의 yaml파일로 변환하여 사용했는데, 이 과정에서 좀 더 효율적인 방법은 없었을까 라는 생각이 듭니다. 프로젝트 설정을 하는 초기에 빠르게 yaml파일을 구축하는 방법이 있을지 좀 더 고민해야 할 것 같네요.
3. 테크리더의 필요성
아무래도 개발자들 각각이 기획팀과 소통하는 것보다는 개발자들 의견과 상황을 취합해서 기획팀과 소통하는 구조가 효율성 측면에서 더 나을 것 같다는 생각이 중간중간 든 적이 있어서, 그런 역할을 하는 테크리더가 있으면 어떨까라는 생각이 들었습니다. 백엔드 파트 리더, 프론트 파트 리더로 분리해도 될 것 같기도 하네요. 다만 오히려 테크리더를 거쳐서 의견이 전달되는 구조가 안 좋게 작용할 수도 있겠다는 생각이 한편으로 들기도 합니다. 그래도 효율성 측면에서의 장점이 있긴 할 것 같아서 다음 번에 프로젝트를 하게 되면 초기 단계에서 테크리더를 선출해보는게 어떻냐는 의견을 내보려고 합니다.
감상
간만에 사이드 프로젝트 동아리에 참가해서 퇴근 후에도 시간을 투자해서 진행하고 있습니다. 기술 역량 향상, 일 굴리는 방법 습득 등의 목적(?)이 있어서 신청했기 때문에 최대한 적극적으로 하고 있는데, 사이드 프로젝트라는 특성 상 녹록치 않은 점들도 분명 있는 것 같습니다. 하지만 그런 과정에서도 기술적으로 안 해본 기술을 사용하며 배우는 것도 있고, "아 이렇게 해보니까 좋네", "아 이렇게 하는 것보다 이렇게 하는 게 낫네" 등 일을 굴리는 관점에서도 배우는 것들이 있어서 개인적으로 만족하고 있습니다. 현재 고도화 기간이기 때문에 최대한 고도화 기간에 집중하고, 내년에도 기회가 된다면 사이드 프로젝트를 해보고 싶다는 생각입니다.
※ 이 활동은 젝트에서 진행한 프로젝트에 대한 회고입니다. 관심 있으신 분들은 둘러보세요.

젝트
젝트(JECT)는 다양한 포지션 멤버들과 협업할 수 있는 IT 사이드 프로젝트 동아리예요. 홈페이지에서 더 자세한 내용을 확인해보세요!
ject.kr