[Spring Cloud MSA] Config, Gateway, Eureka까지 MSA 핵심 구조 쉽게 이해하기

2025. 4. 15. 00:04·BackEnd/Spring & JPA

마이크로서비스 아키텍처(MSA, Microservice Architecture)를 처음 접했을 때, 여러 개의 서비스가 어떻게 서로를 찾고 통신하는지 궁금하지 않으셨나요?

  • "수십 개의 서비스가 있는데, 클라이언트는 이걸 어떻게 호출하지?"
  • "매번 설정 파일을 서비스마다 일일이 고쳐야 하나?"
  • "서비스 IP가 바뀌면 호출은 어떻게 하지?"

이러한 고민들을 해결하기 위해 등장한 것이 바로 Spring Cloud입니다.

Spring Cloud는 마이크로서비스 환경에서 반복적으로 발생하는 문제들을 자동화하고 추상화하여 보다 쉽게 시스템을 구축할 수 있게 도와주는 도구입니다.

이번 글에서는 Spring Cloud의 개념을 먼저 알아보고, 실무에서 자주 사용하는 핵심 구성 요소들인

  • API Gateway
  • Config Server
  • Service Discovery (Eureka)

에 대해 각각 개념 → 역할 → 설정 예시 → 왜 필요한가?의 구조로 쉽고 자세하게 설명하겠습니다.

1. Spring Cloud

Spring Cloud는 마이크로서비스 아키텍처(MSA)를 쉽게 구축할 수 있도록 도와주는 오픈소스 프레임워크 집합입니다.

Spring Boot와 자연스럽게 통합되어 있으며, MSA 환경에서 자주 발생하는 문제를 해결하기 위한 여러 기능을 제공합니다.

Netflix OSS 기반으로, Spring Boot와 자연스럽게 통합되며 다음과 같은 기능들을 제공합니다.

1.1 Spring Cloud의 필요성

MSA 구조에서는 다음과 같은 문제가 자주 발생합니다.

  • 서비스 수가 많아질수록 설정 관리가 어렵다
  • 서비스 위치(IP/Port)가 동적으로 바뀌기 때문에 호출이 까다롭다
  • 클라이언트가 서비스마다 직접 호출하면 보안/성능/유지보수에 문제
  • 장애 전파, 로깅, 인증 처리 등 공통 기능이 반복 구현된다

이러한 문제들을 Spring Cloud는 다음과 같은 구성 요소들로 해결해 줍니다.

1.2 제공 기능 요약

구성 요소 기능 설명
Spring Cloud Config 설정 중앙화 Git 등 외부 저장소에서 설정을 로딩하여 서비스에 제공
Eureka 서비스 탐색/등록 동적으로 배포되는 서비스의 위치를 자동으로 찾고 연결
API Gateway 진입점 및 라우팅 클라이언트 요청을 적절한 서비스로 전달, 공통 필터 적용
Load Balancer 부하 분산 여러 인스턴스 중 하나를 선택하여 트래픽 분산
Circuit Breaker 장애 격리 장애 전파 방지를 위한 회로 차단 기능
Tracing/Logging 요청 추적 Sleuth, Zipkin 등을 통해 전체 요청 흐름 시각화
Messaging 이벤트 중심 통신 Kafka, RabbitMQ 등으로 서비스 간 비동기 통신 가능

Spring Cloud는 MSA에 필요한 거의 모든 기능을 모듈 형태로 제공하기 때문에, 개발자는 비즈니스 로직에 집중할 수 있습니다.

2. Spring Cloud MSA 핵심 구성 요소

2.1 API Gateway - 클라이언트 요청의 관문

1) 정의

API Gateway는 모든 클라이언트 요청의 단일 진입점입니다. 일종의 프론트 도어(Front Door)로서, 클라이언트의 요청을 받아 적절한 백엔드 마이크로서비스로 전달해주는 역할을 합니다.

단순한 요청 전달뿐 아니라, JWT 인증, 라우팅, 필터링, 로깅, 보안 등 공통 처리 로직도 함께 수행합니다.

2) 주요 역할

역할 설명
요청 라우팅(Routing) 클라이언트 요청 경로를 기반으로 내부 서비스로 분배 (/api/v1/members/** → MEMBER-SERVICE)
인증/인가 처리 JWT 토큰 검증, 사용자 권한 확인 등 보안 기능 수행
요청 필터링(Pre/Post Filter) 공통 헤더 삽입, 로깅, 응답 가공 등
CORS 처리 브라우저 보안 정책 우회를 위한 Cross-Origin 설정 처리
Rate Limiting API 호출 횟수 제한 → 과도한 요청 방지
로깅 및 트래픽 모니터링 요청/응답 추적, 로그 저장, 추적 ID 추가 등
로드 밸런싱 여러 서비스 인스턴스 중 하나에 요청 전달 (Eureka와 연동)

3) 설정 예시

📌 API Gateway 측 application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: member-service  # 해당 라우팅의 식별자 (이름)
          uri: lb://MEMBER-SERVICE  # 로드 밸런서를 통해 Eureka에서 등록된 'MEMBER-SERVICE'로 라우팅
          predicates:
            - Path=/api/v1/members/**  # 해당 경로로 들어오는 요청을 이 라우팅으로 연결
  • id: 라우트의 고유 식별자 (모니터링이나 디버깅 시 유용)
  • uri: 로드 밸런싱 방식으로 요청을 전달할 서비스 식별자, lb://는 Spring Cloud LoadBalancer를 의미
  • predicates: 어떤 요청을 해당 라우팅에 적용할지를 정의 (Path, Header, Method 등 사용 가능)

4) 왜 필요한가?

  • 클라이언트가 여러 마이크로서비스를 직접 호출하지 않아도 되게끔 추상화
  • 인증, 로깅, 모니터링 등을 공통 처리 지점에서 수행하여 코드 중복 최소화
  • Gateway를 기준으로 보안 정책(CORS, HTTPS 등) 적용이 용이
  • BFF(Backend For Frontend) 패턴 구현에도 유리

2.2 Config Server - 설정 중앙 집중화

1) 정의

Spring Cloud Config Server는 중앙 집중형 설정 관리 서버입니다. 여러 마이크로서비스의 설정 파일(application.yml, .properties)을 한 곳에서 관리합니다.

보통 Git 저장소에 저장된 설정 파일을 불러와 각 서비스가 자신의 설정으로 사용합니다.

2) 주요 역할

역할 설명
설정 중앙화 설정을 서비스마다 개별 관리하지 않고 공통된 저장소(Git)에서 불러옴
환경 분리 application-dev.yml, application-prod.yml로 환경 별 설정 분리 가능
설정 변경 반영 Spring Cloud Bus + Actuator를 이용해 Hot Reload 가능
보안 정보 관리 DB 계정, API Key, OAuth Secret 등을 안전하게 관리 가능
버전 관리 Git 기반으로 설정 변경 이력 추적 가능

3) 설정 예시

📌 Config Server 측 application.yml

spring:
  cloud:
    config:
      server:
        git:
          uri: https://github.com/your-org/config-repo  # 설정 파일이 저장된 Git 저장소 주소
  • uri: 설정 파일들을 관리하는 Git 저장소의 위치, application.yml, application-dev.yml 등의 파일을 여기서 관리
  • 이외에도 username, password, searchPaths, cloneOnStart 등 옵션을 함께 설정할 수 있음

📌 클라이언트 측 bootstrap.yml

spring:
  application:
    name: member-service  # Config Server에 설정 요청 시 사용할 서비스 이름 (application-{name}.yml)
  cloud:
    config:
      uri: http://localhost:8888  # Config Server의 주소 (기본 포트는 8888)
      profile: dev  # application-{profile}.yml에 해당하는 설정 사용
      label: main  # Git 브랜치 이름
  • name: 이 이름으로 Config Server는 Git에서 application-member-service.yml 같은 파일을 찾음
  • profile: 환경 구분 (dev, prod, test 등)
  • label: Git 브랜치 이름 (예: main, develop)

4) 왜 필요한가?

  • 마이크로서비스가 많아질수록 각 서비스의 설정을 로컬에 직접 관리하는 것은 매우 비효율적
  • 설정 변경 시 재배포 없이 실시간 반영 가능 (Spring Cloud Bus 활용)
  • 설정을 Git으로 관리하기 때문에 버전 관리, 롤백, 변경 추적이 쉬움
  • 환경에 따라 다른 설정을 한 곳에서 관리 가능 (dev, prod, test 등)

2.3 Service Discovery (Eureka Server) - 유연한 통신을 위한 핵심

1) 정의

Eureka는 넷플릭스 OSS 기반의 서비스 레지스트리입니다.

각 마이크로서비스는 Eureka에 자신의 위치(IP, Port 등)를 등록하고, 다른 서비스는 이를 검색(Discovery)해서 통신할 수 있습니다.

고정된 IP가 없는 클라우드 환경에서 필수로 사용됩니다.

2) 주요 역할

역할 설명
서비스 등록(Registration) 서비스가 기동될 때 Eureka에 자신을 등록 (IP, Port)
서비스 검색(Discovery) 다른 서비스가 Eureka를 통해 IP, 포트 정보를 가져옴
헬스 체크 등록된 서비의 상태 확인 및 자동 제거 → 비정상 서비스는 자동 제거 (Spring Boot Actuator 연동 시)
동적 라우팅 IP가 바뀌어도 문제없이 통신 가능 (DNS 역할)
로드밸런싱 연동 Gateway, FeignClient 등과 연동하여 인스턴스 분산 호출 가능

3) 설정 예시

📌 Eureka Server 측 application.yml

eureka:
  client:
    register-with-eureka: false  # Eureka 자신은 등록하지 않음
    fetch-registry: false  # 다른 서비스 레지스트리도 조회하지 않음
  server:
    enable-self-preservation: false  # 개발환경에서는 서비스 자동제거 활성화를 위해 false 처리
  • register-with-eureka: Eureka 서버 자체는 자신을 레지스트리에 등록할 필요 없기 때문에 false
  • fetch-registry: Eureka 서버는 다른 레지스트리를 조회하지 않기 때문에 false
  • enable-self-preservation: default는 true지만, 테스트용 환경에서는 false로 설정해서 테스트 시 정상적으로 서비스 제거됨

📌 클라이언트 서비스 측 application.yml

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka  # Eureka 서버의 주소
  • defaultZone: 클라이언트가 자신을 등록하고, 다른 서비스를 찾기 위해 연결할 Eureka 서버의 URL
  • 여러 개의 Eureka 서버를 클러스터로 운영할 경우 쉼표로 구분해 복수 입력 가능

4) 왜 필요한가?

  • 클라우드 환경에서 서비스 인스턴스는 동적으로 배포되며 IP가 고정되어 있지 않음, 즉 IP가 고정되지 않은 환경에서 서비스 간 통신을 안정적으로 유지
  • Eureka를 통해 고정된 주소 없이도 동적으로 서비스 호출이 가능, 라우팅 가능
  • API Gateway, FeignClient 등과 연동하여 부하 분산과 장애 대응도 자동화 가능

3. 전체 흐름 요약

[Client]  
   ↓  
[API Gateway]  
   - 요청을 받아 적절한 서비스로 전달  
   - 인증/인가, CORS, 로그 수집 등 공통 처리  
   ↓  
[Service Discovery (Eureka)]  
   - 각 마이크로서비스가 Eureka에 등록됨  
   - Gateway는 이 정보를 참고해 라우팅  
   ↓  
[각 마이크로서비스(member, order 등)]  
   - Config Server를 통해 환경별 설정 자동 로딩  
   ↕  
[Spring Config Server]  
   - Git에서 설정 파일 읽어와 서비스에 전달

4. 결론

Spring Cloud를 활용하면 마이크로서비스를 구성하는 데 필요한 많은 공통 작업을 효율적으로 처리할 수 있습니다.

  • 설정은 Config Server로 중앙 관리하고,
  • 요청은 API Gateway를 통해 인증·필터링된 뒤 서비스로 전달되며,
  • 각 서비스는 Eureka를 통해 동적으로 통신하고,
  • 그 외 부하 분산, 장애 대응, 분산 로깅까지 모든 MSA 요소가 자연스럽게 통합됩니다.
구성 요소 핵심 역할 왜 필요한가?
Spring Cloud MSA 전반 지원 도구 세트 설정, 라우팅, 탐색, 장애 대응 등 공통 문제 해결
API Gateway 요청의 중앙 진입점 인증, CORS, 로깅, 필터 처리 등 공통 기능 집중
Config Server 설정 파일 중앙화 Git 기반 설정 관리 및 환경별 분리, 실시간 반영
Eureka 서비스 등록/탐색 유동 IP 환경에서 안정적 통신을 가능하게 함

Spring Cloud는 단순한 프레임워크를 넘어서 MSA 환경에서 개발과 운영을 안정적으로 구현할 수 있게 도와주는 기반 인프라입니다.

처음에는 구성 요소들이 많아 복잡해 보일 수 있지만, 각 요소의 역할을 정확히 이해하고 설계에 반영하면 확장성과 유지보수성이 뛰어난 시스템을 구축할 수 있습니다.

'BackEnd > Spring & JPA' 카테고리의 다른 글

[Spring Boot] MySQL Master/Slave 복제 설정과 Read/Write 자동 분기 처리 방법 정리  (0) 2025.03.24
[Spring] @RequestPart를 활용하여 JSON + MultipartFile 동시 전송하기 (Feat. 게시판에서 게시물 생성과 첨부 파일 업로드 한번에 처리하기)  (0) 2025.02.13
[Spring Data JPA] JPA 엔티티 설계 시 생성자 접근 제한을 PROTECTED로 설정하는 이유  (0) 2025.01.21
[Spring] @ResponseBody VS ResponseEntity<T>  (0) 2025.01.06
[Spring] @Controller VS @RestController  (0) 2025.01.06
'BackEnd/Spring & JPA' 카테고리의 다른 글
  • [Spring Boot] MySQL Master/Slave 복제 설정과 Read/Write 자동 분기 처리 방법 정리
  • [Spring] @RequestPart를 활용하여 JSON + MultipartFile 동시 전송하기 (Feat. 게시판에서 게시물 생성과 첨부 파일 업로드 한번에 처리하기)
  • [Spring Data JPA] JPA 엔티티 설계 시 생성자 접근 제한을 PROTECTED로 설정하는 이유
  • [Spring] @ResponseBody VS ResponseEntity<T>
개발자 동긔
개발자 동긔
배우고 느낀점들을 기록합니다. 열정 넘치는 백엔드 개발자로 남고싶습니다.
  • 개발자 동긔
    Donker Dev
    개발자 동긔
  • 전체
    오늘
    어제
    • Category (39)
      • BackEnd (23)
        • JAVA (15)
        • Spring & JPA (7)
      • Database (4)
      • Computer Science (2)
        • Network (0)
        • Security (0)
        • Web (1)
      • DevOps (6)
        • Docker (1)
        • Jenkins (0)
        • Monitoring (2)
        • CICD (1)
      • 트러블 슈팅 (3)
      • 성능 개선 (1)
      • Project (0)
  • 인기 글

  • 태그

    CICD
    nginx
    Jenkins
    restful api 설계
    인터페이스
    spring boot
    JPA
    spring cloud msa
    java
    SSH
    interface
    와일드카드
    docker compose
    mysql master/slave replication
    @RequestBody
    Database
    restful api
    master/slave db 이중화 처리
    Spring
    docker
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
개발자 동긔
[Spring Cloud MSA] Config, Gateway, Eureka까지 MSA 핵심 구조 쉽게 이해하기
상단으로

티스토리툴바