← wiki

Spring Cloud — 흩어진 서비스를 하나처럼 묶는 도구 모음

서비스를 하나로 크게 만들면(모놀리식) 단순하다. 코드도 한 군데, 배포도 한 번, 설정도 한 파일이다. 그런데 서비스가 커지고 팀이 늘면 이 "하나"가 족쇄가 된다. 작은 수정에도 전체를 다시 배포해야 하고, 결제 트래픽이 몰리면 전혀 상관없는 회원 기능까지 같이 느려진다. 그래서 큰 덩어리를 여러 개의 작은 서비스로 쪼개는 마이크로서비스(MSA)로 간다.

그런데 쪼개는 순간, 모놀리식에선 공짜였던 것들이 전부 새로운 문제가 된다. 한 파일이던 설정은 수십 개로 흩어지고, 같은 프로세스 안에서 함수 호출이던 것은 네트워크 통신이 되며, 서비스들은 서로의 주소조차 모른다. Spring Cloud는 바로 이 "쪼갰더니 생긴 문제들"을 각각 담당하는 도구들의 모음이다. 이 글은 개별 도구를 깊게 파기 전에, 무엇이 어떤 문제를 맡는지 지도를 먼저 그린다.

설정 흩어짐Config
서로 못 찾음Eureka
입구 제각각Gateway
장애 전파Resilience
Spring Cloud는 '하나의 제품'이 아니다

Spring Cloud는 단일 라이브러리가 아니라, MSA에서 반복되는 문제들을 푸는 여러 하위 프로젝트의 우산이다. Config Server, Eureka(서비스 디스커버리), Gateway, 회로 차단기 등이 각각 별개의 모듈이고, 필요한 것만 골라 쓴다. 이 글은 그 우산 아래 무엇이 있는지를 본다.


1. 쪼개면 생기는 네 가지 공통 문제

마이크로서비스로 가면 거의 항상 같은 문제들을 만난다. 도구를 보기 전에, 왜 그 도구가 필요한지부터 분명히 해두자. 도구는 항상 문제의 답이지, 그 자체가 목적이 아니기 때문이다.

  1. 1
    설정이 수십 곳에 흩어진다

    서비스마다 DB 주소·키·플래그를 따로 들고 있다.

    DB 비밀번호 하나 바꾸려면 10개 서비스의 설정 파일을 각각 고치고 전부 재배포해야 한다. 설정을 한 곳에 모아 중앙에서 뿌리는 장치가 필요하다 → Config Server.

  2. 2
    서비스끼리 서로를 못 찾는다

    주문 서비스가 결제 서비스의 주소를 어떻게 아는가?

    서비스는 수시로 죽고 살아나고 늘어난다. IP를 코드에 박아두면 그때마다 깨진다. 서비스들이 자기 위치를 등록하고 서로를 이름으로 찾는 전화번호부가 필요하다 → Eureka(서비스 디스커버리).

  3. 3
    클라이언트 입구가 제각각이다

    프론트가 수십 개 서비스 주소를 다 알아야 하나?

    인증·CORS·로깅 같은 공통 처리를 서비스마다 중복으로 넣게 된다. 모든 외부 요청을 받는 단일 현관을 두면 깔끔하다 → API Gateway.

  4. 4
    한 서비스 장애가 전체로 번진다

    결제가 느려지면 그걸 부르는 주문도 같이 멈춘다.

    한 서비스의 지연·실패가 그걸 호출하는 다른 서비스의 스레드를 잡아먹어 연쇄로 무너진다. 실패하는 호출을 빨리 끊어내는 차단기가 필요하다 → 회로 차단기(Resilience4j).

이 네 문제는 서로 독립적이지 않다. 게이트웨이가 요청을 받아 적절한 서비스로 넘기려면 먼저 그 서비스의 위치를 디스커버리에서 찾아야 하고, 각 서비스는 Config에서 설정을 받아 부팅된다. 즉 이들은 한 무대 위에서 맞물려 돌아간다.


2. 네 조각이 맞물려 도는 모습

문제를 하나씩 풀어주는 도구들이 실제로 어떻게 연결되는지 한 번에 보자. 하나의 외부 요청이 들어왔을 때, 이 조각들이 차례로 개입한다.

클라이언트시스템 내부
GET /orders/42

Gateway 단일 입구로 진입

인증·라우팅 결정

Gateway가 어느 서비스로 보낼지 판단

order-service 위치 조회

Eureka에서 실제 주소 획득

order → payment 호출

내부 서비스끼리도 Eureka로 찾아 통신

200 OK

각 서비스는 Config에서 받은 설정으로 동작

역할 분담 한눈에

Config Server: 설정을 중앙에서 뿌린다. Eureka: 서비스들이 서로를 이름으로 찾게 한다. Gateway: 외부 요청의 단일 현관이자 공통 처리 담당. 회로 차단기: 실패가 번지지 않게 끊는다. 네 가지는 각각 독립된 글로 더 깊게 다룬다.

각 조각의 자세한 동작은 별도 글로 나눈다. Config Server는 "설정을 어떻게 중앙화 하는가", Eureka는 "서비스들이 어떻게 서로를 찾는가", API Gateway는 "단일 입구가 무엇을 해주는가"를 각각 깊게 다룬다. 이 글은 그 전에 전체 지형을 머리에 넣어두기 위한 것이다.


3. 도구를 쓰기 전에 따져볼 것

Spring Cloud의 도구들은 강력하지만, MSA 자체가 복잡성의 비용을 동반한다는 걸 잊으면 안 된다. 모놀리식 하나면 끝날 일을, 디스커버리·게이트웨이·설정 서버까지 굴려야 하는 인프라로 바꾸는 것이기 때문이다.

MSA + Spring Cloud가 맞는 경우
  • ·팀·도메인이 많아 독립 배포가 절실하다
  • ·기능별로 트래픽·확장 요구가 크게 다르다
  • ·한 부분의 장애를 다른 부분과 격리해야 한다
  • ·이미 서비스가 여러 개로 쪼개져 있다
오히려 과한 경우
  • ·팀이 작고 서비스가 한두 개뿐이다
  • ·트래픽이 균일하고 확장 압박이 없다
  • ·운영할 인프라 인력·도구가 부족하다
  • ·모놀리식으로도 충분히 빠르고 단순하다

정리하면 Spring Cloud는 "서비스를 쪼갰기 때문에 새로 생긴 문제들"의 표준 해법 묶음이다. 설정·발견·입구·격리라는 네 축으로 기억해 두면, 개별 도구를 배울 때 "이건 그 중 어느 문제를 푸는 거지?"로 자리를 잡을 수 있다. 도구가 먼저가 아니라 문제가 먼저다.


한 장 요약

  1. 1

    모놀리식을 MSA로 쪼개면 설정·발견·입구·장애격리가 새 문제로 떠오른다.

  2. 2
    Config Server

    흩어진 설정을 한 곳에 모아 중앙에서 각 서비스에 뿌린다.

  3. 3
    Eureka

    서비스들이 자기 위치를 등록하고 서로를 이름으로 찾는 전화번호부.

  4. 4
    API Gateway

    모든 외부 요청의 단일 현관 — 인증·라우팅·공통 처리를 한 곳에서.

  5. 5
    회로 차단기

    실패하는 호출을 빨리 끊어 장애가 연쇄로 번지는 걸 막는다.

  6. 6
    전제

    MSA는 복잡성 비용을 동반 — 작은 시스템엔 모놀리식이 더 나을 수 있다.