Microservices Expense Tracker 구축에서 배운 교훈

발행: (2025년 12월 29일 오전 02:45 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

Introduction

작은 아이디어를 일부러 복잡하게 만든 적이 있나요? 과도하게 설계하기 위해서가 아니라 실제 시스템이 어떻게 동작하는지 이해하기 위해서 말입니다.
제가 바로 그 방법으로 Expense Tracker를 만들었습니다. 단일 모놀리식 백엔드 대신, 서로 API로 통신하는 여러 마이크로서비스로 나누었습니다. 호기심에서 시작된 실험이 곧 시스템 설계, 데이터 흐름, 인증, 그리고 개별 엔드포인트를 넘어선 사고에 대한 실용적인 교훈으로 이어졌습니다.

이 프로젝트는 “프로덕션‑레디”를 목표로 한 것이 아니라, 책임을 분리했을 때 백엔드 시스템이 어떻게 동작하는지를 배우기 위한 것이었습니다.

Why Microservices for a Small App?

대부분의 작은 애플리케이션은 기본적으로 모놀리식입니다. 모든 것이 하나에 모여 같은 컨텍스트를 공유하고 시간이 지나면서 강하게 결합됩니다. 저는 의도적으로 이를 피했습니다.

제가 이해하고 싶었던 것은:

  • 서비스 간의 통신 방식
  • 여러 서비스에 걸친 인증 동작 방식
  • 책임을 분리하면 백엔드 설계에 대한 사고가 어떻게 바뀌는가

마이크로서비스는 “라우트” 수준이 아니라 시스템 수준으로 사고하도록 강요했습니다. 작은 규모에서도 이 전환은 큰 가치를 제공했습니다.

How the System Is Structured

백엔드는 네 개의 독립적인 서비스로 나뉘며, 각각 명확한 역할을 가집니다:

Auth

사용자 등록, 로그인, 그리고 JWT 생성을 담당합니다. 이 서비스는 정체성과 신뢰를 관리합니다.

Expense

지출 기록 생성, 업데이트, 조회 등 모든 지출 관련 작업을 관리합니다.

Analytics

지출 데이터를 활용해 지출 추세, 카테고리별 비중 등 요약과 인사이트를 생성합니다.

Gateway

프론트엔드의 단일 진입점 역할을 합니다. 모든 요청은 여기서 검증된 후 적절한 서비스로 라우팅됩니다.

프론트엔드는 서비스와 직접 통신하지 않습니다. 모든 요청은 Gateway를 거쳐 JWT가 검증된 뒤에 전달됩니다. Analytics는 지출 데이터를 소비하지만 자체 복사본을 저장하지 않아 시스템을 단순하고 모듈화된 상태로 유지합니다.

Lessons I Learned Along the Way

  • Modularity changes how you think – 책임을 분리하니 즉시 명확성이 생겼습니다. 각 서비스가 목적을 갖게 되어 기능 개발이나 버그 수정 시 정신적 부담이 줄어듭니다.
  • Service communication needs intention – 단순한 REST 호출이라도 설계가 필요합니다. 요청 흐름, 실패 상황, 서비스 간 의존성을 강하게 결합하지 않도록 고려해야 했습니다.
  • Authentication is more than login logic – 서비스 간 JWT 기반 인증은 인증이 신뢰 전파라는 것을 보여줍니다. 한 번 자격 증명을 확인하는 것만이 아니라, 그 신뢰를 여러 서비스에 전달해야 합니다.
  • Systems thinking matters – 함수와 엔드포인트에만 집중하던 사고에서 데이터 흐름, 서비스 경계, 전체 시스템에 미치는 영향을 고려하는 사고로 전환되었습니다.
  • Data handling shapes everything – Analytics는 지출 데이터 구조에 전적으로 의존합니다. 작은 데이터셋이라도 쿼리, 집계, 성능을 미리 생각해야 함을 배웠습니다.
  • Debugging across services is a real skill – 여러 서비스에 걸친 요청을 추적하면서 체계적으로 디버깅하고, 시스템을 연결된 전체로 보는 능력이 향상되었습니다.

Final Thoughts

이 프로젝트는 완벽한 애플리케이션을 만드는 것이 목표가 아니었습니다. 실험하고, 배우고, 성장하는 것이 목적이었습니다.

마이크로서비스로 구축하면서 모듈식 설계, 안전한 통신, 데이터‑주도 기능이 단순한 앱에서도 어떻게 공존할 수 있는지를 체험했습니다. 더 중요한 점은 코드를 작성하는 것뿐 아니라 백엔드 시스템을 논리적으로 사고할 자신감을 얻었다는 것입니다.

결국 저는 단순히 지출을 추적하는 것이 아니라, 개발자로서 성장을 추적했고, 앞으로 더 복잡한 아키텍처를 다룰 준비를 마쳤습니다.

Back to Blog

관련 글

더 보기 »