토이 프로젝트 일지 3 : 클라우드 스토리지 서비스를 제공하는 Nodejs 서버 만들기

그림 1. 프로그램 동작 화면
그림 1. 프로그램 동작 화면

1. 시작 계기

이번 프로젝트는 앞선 프로젝트들보다 큰 규모의 복잡한 프로그램들을 어떻게 체계적으로 설계할 수 있는지를 학습하는 것을 목표로 시작하게 되었다. 필자는 Dropbox 를 주로 애용하고 있어서, 이쪽 서비스에 대해서 자세히 알고 있어서 Dropbox의 필수 기능들을 구현해보는 방향으로 프로젝트를 시작하게 되었다. 개발 기간은 약 3달 정도로 잡았으며, 다른 분과 협업을 통해서 제작했다. 협업에 참여해주신 lucky6030님에게는 깊은 감사의 말씀을 드린다.

2. 프로젝트 개요

가. 프로젝트 소개

1. 프로젝트 유형: 팀 토이 프로젝트(총 2명)

2. 구현 서비스 : 클라우드 스토리지 서비스

3. 개발 환경 : replit(WEB IDE)

4. 구동 환경 : linux

5. 활용 기술

    - 프론트 엔드 : bootstrap 4

    - 백엔드 : Nodejs-Express, Firebase

        > Firebase의 인증 서비스, 데이터베이스 서비스, 스토리지 서비스를 이용했다.

6. 개발 기간: 2023.1.11 ~ 2023.3.2

7. 담당 역할: 팀장(일정 관리, 작업 분배, 백엔드 및 프론트엔드 개발, 코드 평가 및 통합 작업)

나. 프로젝트 목표

큰 규모의 프로그램을 어떻게 체계적으로 설계할 수 있는지 이해하고, 다른 분들과 협업할 경우 어떻게 하면 충돌 없이 업무를 효율적으로 분배할 수 있는지 학습하는 것을 목표로 했다.

3. 프로젝트 구현

가. 사이트 구조

그림 2. 사이트 맵
그림 2. 사이트 맵

그림 3. 사이트 이미지 맵
그림 3. 사이트 이미지 맵

사이트들은 Main을 중심으로 총 5개의 사이트로 나눠서 작업했다.

- Main : 클라우드 서비스에서 가장 핵심적인 기능들인 파일 업로드 & 다운로드 & 공유 기능들을 제공

- Sign In : 일반 로그인 & 구글 로그인 기능을 제공

- Sign Up : 회원가입 기능을 제공

- File Info : 클라우드에 업로드된 파일 내용을 제공

- File Share : 사용자가 공유한 링크와 연관된 파일 내용을 제공

나. 서버측 구현

그림 4. REST API 구성도
그림 4. REST API 구성도

그림 5. 서버측 계층 설계도
그림 5. 서버측 계층 설계도

이번에도 저번 프로젝트와 유사하게 설계 > 구현 > 리팩토링을 합쳐서 하나의 사이클로 만들어서 반복하는 방식으로 점진적으로 계층적 설계가 만들어지도록 만들었다.

- REST API ROUTER : 클라이언트 요청 시 가장 처음 마주하게 되는 부분이며, 핵심 서비스를 담당

- FIRE BASE SERVICE : 비즈니스와 연관된 파이어베이스 관련 서비스들을 모아둬서 일관성을 향상

- FIRE BASE API : 파이어베이스 각각의 서비스 이용에 대한 일관성 있는 인터페이스를 제공

- BASE MODULE : 기본적인 구현에 필요한 로직들을 각각의 모듈들로 분리해줌

다. 클라이언트측 구현

그림 6. 클라이언트측 계층 설계도
그림 6. 클라이언트측 계층 설계도

- INTERFACE : 클라이언트 마주하게 되는 UI 부분

- CORE MODULE : UI와 가장 밀접하게 연관되었으며, UI 관련 핵심 서비스를 담당

- REST API : 서버에 대한 일관성 있는 인터페이스를 제공

- BASE MODULE : 기본적인 구현에 필요한 로직들을 각각의 모듈들로 분리해줌

라. 디렉토리 다운로드 기능 구현

그림 7. 디렉토리 다운로드 기능 순서도
그림 7. 디렉토리 다운로드 기능 순서도

이 프로젝트의 가장 복잡한 부분은 SSE 통신을 이용해서 실시간으로 진행률을 클라이언트 측에게 표시 시키면서 클라우드상에 업로드된 디렉토리를 다운로드하는 로직이다. 이러한 로직은 그림 7과 같은 순서도로 요약할 수 있다.

4. 프로젝트 소감

이 프로젝트를 통해서 협업이 참 어렵다는 점을 다시 한번 상기하게 되었다. 프론트엔드, 백엔드와 같이 완전히 분리된 영역에서 서로 작업한다면 서로의 주고 받을 인터페이스만 잘 공유하면 코드에 충돌이 날 일은 거의 없지만 동일한 영역에서 작업한다면 충돌이 안 나도록 할당시킬 작업을 세심하게 나누면서도 팀원의 수준을 생각해서 적당한 작업을 줘야 하는 점은 마치 다중 스레드를 구현하는 것과 같이 꽤 머리가 아픈 부분이었다. 하지만, 팀원이 잘 따라줘서 여러 막히는 부분들을 수월하게 돌파할 수 있었다. 팀 협업에서 가장 중요한 점은 프로젝트 도중에 막힐 경우 이를 팀원과 공유하는 것이라고 본다. 다른 사람이 도와주면 빠르게 해결되는데 혼자서 이를 해결하려고 끙끙대다가 시간이 많이 허비되는 부분이 많기 때문이다.
또한, 이전 프로젝트에서는 클라이언트 측의 SSE 통신만 구현했는데 이번에는 서버 측의 SSE 통신도 구현하게 되어서 SSE 통신에 대해서 더 깊게 이해할 수 있는 계기가 되어서 만족스러웠다.

5. 관련 링크

이 블로그의 인기 게시물

토이 프로젝트 일지 6 : React/SpringBoot 기술 스택으로 코딩 테스트 서비스 만들기

토이 프로젝트 일지 7 : RedKiwi와 유사한 이벤트 스토밍 기반 마이크로 서비스 만들기

토이 프로젝트 일지 2 : ChatGPT 서비스를 활용하는 크롬 플러그인 만들기