[데브노트] 웹 프로젝트

개인 프로젝트에 MSA를 도입한 이유

남건욱 2025. 9. 10. 14:29

목차

    반응형

    Devnote 프로젝트 구성

    1. 개인 프로젝트에서 MSA는 오버 엔지니어링일까?

    포트폴리오를 위한 개인 프로젝트를 시작할 때면 늘 같은 고민에 빠진다. "어떤 아키텍처를 선택할 것인가?" 가장 익숙하고 빠른 방법은 모든 기능을 하나의 프로젝트에 담는 모놀리식 방식이다. 하지만 MSA를 경험해보고 싶은 마음을 무시할 수 없었다. 과연 학습 목적의 개인 프로젝트에 오버 엔지니어링은 아닐까?

    devnote 프로젝트를 시작하며 나는 이 질문에 "그럼에도 불구하고 MSA로 가자"고 답했다. 이번 글에서는 그 결정의 이유와 초기 설계 과정을 작성했다.

     

    2. 이번 프로젝트에 MSA를 선택한 이유

    이번에 진행한 개인 프로젝트 Devnote는 개발자를 위한 콘텐츠(유튜브 영상, 뉴스)를 수집하고 댓글, 통계, 랭킹 등 기능을 제공하는 플랫폼이다. 단순히 CRUD만 있는 웹사이트가 아닌, 여러 독립적인 기능들이 유기적으로 연결되어야 했다.

     

    2-1. 독립적인 확장과 장애 격리

    news-youtube-service는 외부 API에 의존적이므로 언제든 지연되거나 실패할 수 있다. 만약 YouTube 데이터 수집 로직이 중단되더라도, 로그인이나 댓글 작성 같은 기능에는 아무런 영향이 없어야 했다. 각 기능의 장애가 다른 기능으로 전파되는 것을 막기 위해 서비스 분리는 필수적이었다.

    2-2. 다양한 기술 스택의 실험

    콘텐츠 검색 기능에는 Elasticsearch를, 자동 분류에는 Google Gemini AI를, 실시간 통계에는 Redis를 적극적으로 활용하고 싶었다. 각 서비스에 대해 가장 적합한 기술을 채택해 구성했다.

    2-3. 학습과 경험

    무엇보다 MSA 환경에서 발생하는 다양한 문제들(서비스 간 통신, 데이터 일관성, 중앙화된 설정 등)을 직접 경험하고 해결해나가는 과정 자체가 이 프로젝트의 가장 큰 학습 목표였다.

     

    3. 어떻게 서비스를 나눌 것인가?

    서비스를 분리하는 기준은 명확했다. 도메인 주도 설계(DDD) 관점에서, 비즈니스 도메인을 기준으로 각 서비스가 하나의 명확한 책임을 갖도록 6개의 마이크로서비스로 분리했다.

     

    3-1. User Service

    회원가입, 로그인 등 사용자 인증/인가와 댓글, 찜 등 모든 커뮤니티 활동을 총괄한다.

    3-2. News-Youtube Service

    외부 RSS와 YouTube API를 통해 새로운 개발 콘텐츠를 수집하는 역할만 전담한다.

    3-3. Processor Service

    수집된 원시 데이터를 받아 AI로 분류하고 DB에 저장하며, 검색 API를 제공하는 데이터 처리의 핵심이다.

    3-4. Stats Service

    모든 서비스에서 발생하는 이벤트를 수집하여 트래픽, 랭킹 등 의미 있는 통계를 계산하고 제공한다.

    3-5. API Gateway

    외부의 모든 요청을 받아 담당 서비스로 라우팅하는 단일 진입점이다.

    3-6. Eureka Server

    각 서비스들이 서로의 위치를 찾을 수 있도록 돕는 중앙 안내 데스크 역할을 수행한다.

     

    4. 왜 Spring Cloud, Kafka인가?

    분리된 서비스들은 그 자체로 독립된 애플리케이션일 뿐, 이들을 하나의 시스템처럼 묶어줄 서비스가 필요했다.

     

    4-1. Spring Cloud

    서비스들이 유동적인 환경에서도 서로를 이름으로 찾을 수 있게 해주는 Eureka와, 클라이언트가 각 서비스의 주소를 알 필요 없이 하나의 입구를 통해 모든 기능에 접근하게 해주는 Spring Cloud Gateway는 MSA의 필수적인 뼈대였다.

    4-2. Kafka

    User Service에서 콘텐츠에 대한 '찜'이 발생했을 때 Processor Service가 직접 API를 호출하는 동기 방식은 시스템 간의 강한 결합을 만든다. 이를 해결하기 위해 Kafka를 도입했다. User Service는 "찜이 추가됐다"는 이벤트만 Kafka에 발행하고, Processor Service와 Stats Service는 이 이벤트를 구독하여 각자 필요한 작업을 비동기적으로 처리한다. 이로써 서비스 간 의존성이 제거되고 유연성이 극대화되었다.

     

    5. 느낀점

    개인 프로젝트에 MSA를 도입하는 것은 분명 큰 도전이었다. 하지만 서비스별 독립성을 확보하고 다양한 기술을 실험하며 이벤트 기반 아키텍처의 장점을 체감하는 소중한 경험이었다.

    다음 글에서는 Docker Compose를 이용해 프로젝트에 설계했던 데이터베이스, Kafka, ELK 등 복잡한 인프라 환경을 구축하는 과정을 다뤄볼 예정이다.

    반응형

    '[데브노트] 웹 프로젝트' 카테고리의 다른 글

    Devnote 프로젝트  (0) 2025.09.10
    프로필사진

    남건욱's 공부기록