본문 바로가기

DevOps

모놀리식에서 MSA로, 우리 서비스의 변화

1. 왜 MSA로 전환했을까?

우리 서비스는 처음부터 모놀리식 아키텍처로 개발되었습니다. 모놀리식 구조는 초기 개발과 배포가 빠르다는 장점이 있었지만, 서비스가 성장하면서 몇 가지 문제점이 나타났습니다.

🚨 모놀리식의 한계

  1. 배포와 유지보수의 어려움: 서비스의 한 부분만 수정해도 전체 애플리케이션을 다시 빌드하고 배포해야 했습니다.
  2. 확장성 문제: 특정 기능(예: 인증 서비스)에 트래픽이 집중될 경우, 전체 애플리케이션의 성능이 저하되었습니다.
  3. 팀별 독립 개발의 어려움: 모든 팀이 하나의 코드베이스에서 작업해야 했기 때문에, 병목 현상이 발생했습니다.
  4. 기술 스택 변경의 어려움: 새로운 기술을 적용하려면 전체 애플리케이션을 수정해야 했습니다.

이러한 문제를 해결하기 위해 MSA (Microservices Architecture) 로 전환을 결정했습니다.


2. MSA로 전환하면서 변화한 점

🔄 AuthService 분리

먼저 인증 및 권한 관리를 담당하는 AuthService를 모놀리식에서 분리하여 독립적인 마이크로서비스로 만들었습니다.

AuthService 주요 변경점

  • 독립적인 서비스로 분리하여 개별 배포 가능
  • Spring Cloud Gateway를 활용하여 인증 API를 게이트웨이를 통해 통합 관리
  • JWT 기반 인증 시스템을 적용하여 확장성과 보안 강화
  • Redis를 활용한 세션 관리 및 캐싱 적용

📌 환경별 설정 분리

기존 모놀리식에서는 application.yml 하나의 설정 파일에서 모든 환경을 관리했지만, MSA에서는 서비스마다 개별 설정을 유지할 수 있도록 변경했습니다.

환경별 application.yml 관리 방식

  • application-common.yml: 공통 설정 (JPA, Redis, Eureka 등)
  • application-dev.yml: 개발 환경 설정 (로컬 DB, Swagger 활성화 등)
  • application-prod.yml: 운영 환경 설정 (보안 강화, 환경 변수 적용 등)

🛠 JWT & Redis 도입

AuthService를 분리하면서 JWT 기반 인증을 적용했고, 세션 관리와 캐싱을 위해 Redis를 도입했습니다.

JWT & Redis 적용 방식

  • JWT: 인증 시 Access Token & Refresh Token 발급
  • Redis: 블랙리스트 토큰 저장 및 세션 관리
  • 환경 변수 기반 관리: JWT_SECRET 값을 환경변수로 설정하여 보안 강화
jwt:
  secret: ${JWT_SECRET:default-secret-key}
  access:
    expiration: ${JWT_ACCESS_EXPIRATION:1800000} # 30분
  refresh:
    expiration: ${JWT_REFRESH_EXPIRATION:604800000} # 7일

⚡ 배포 및 운영 자동화

모놀리식에서 MSA로 전환하면서 배포 방식도 개선했습니다.

변경된 배포 프로세스

  • Docker 기반 컨테이너화 (Dockerfiledocker-compose.yml 활용)
  • Kubernetes 환경에서 마이크로서비스 관리
  • CI/CD 파이프라인을 구축하여 자동 배포 (GitHub Actions, Jenkins 활용)

3. 마이크로서비스 전환 후 효과

MSA로 전환한 이후, 서비스 운영에서 다음과 같은 변화를 경험했습니다.

✅ 주요 개선 사항

  1. 배포 속도 향상: 개별 서비스 단위로 배포할 수 있어, 작은 변경도 빠르게 반영 가능
  2. 확장성 증가: 트래픽이 몰리는 서비스만 개별적으로 스케일 업 가능
  3. 유지보수 편의성 증가: 팀별로 독립적으로 개발 및 배포 가능
  4. 보안 강화: 인증 서비스 분리로 보안 정책을 강화하고 관리 효율 증가

4. 앞으로의 계획

이번 MSA 전환을 시작으로, 앞으로 다른 서비스들도 점진적으로 분리할 계획입니다.

🚀 추가적으로 분리 예정인 서비스

  • UserService: 사용자 관리 기능 분리
  • FeedService: 피드 및 게시글 관리 기능 분리
  • NotificationService: 알림 서비스 분리

MSA는 단순한 구조 변경이 아니라, 운영과 개발 방식을 근본적으로 개선하는 과정입니다.
앞으로도 지속적인 개선을 통해 더 나은 서비스를 제공할 수 있도록 노력하겠습니다! 💪