BE/Spring Boot

[Spring Boot] Spring Cloud란? / Spring Cloud Gateway

셰욘 2025. 3. 18. 19:53
728x90

Spring Cloud란?

https://spring.io/projects/spring-cloud

 

Spring Cloud

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, short lived microservices and

spring.io

 

Spring Cloud는 마이크로서비스 아키텍처(MSA)를 구축할 때 필요한 다양한 기능을 제공하는 Spring 프레임워크의 확장 프로젝트

 

마이크로서비스 간의 통신, 분산 환경에서의 서비스 관리, 로드 밸런싱, 서비스 등록 및 발견 등의 기능을 제공하여 대규모 시스템을 쉽게 개발할 수 있도록 도와준다.

 

 


Spring Cloud의 주요 기능

Service Discovery (Eureka, Zookeeper) 마이크로서비스가 동적으로 등록되고 검색될 수 있도록 관리
API Gateway (Spring Cloud Gateway) 모든 요청을 한 곳에서 받아 마이크로서비스로 전달
Load Balancing (Spring Cloud LoadBalancer) 서비스 트래픽을 여러 인스턴스로 분배
Circuit Breaker 장애 발생 시 자동으로 대체 로직 실행
Distributed Configuration (Spring Cloud Config) 애플리케이션 설정을 중앙에서 관리
Messaging & Event-Driven (Spring Cloud Stream, Kafka) 마이크로서비스 간 비동기 메시지 처리
Tracing & Monitoring 서비스 간 호출 추적 및 성능 모니터링

 

 

 

Spring Cloud을 왜 사용할까?

  • 마이크로서비스의 복잡성을 줄여준다.
  • 서비스 간의 통신을 쉽게 구성할 수 있다.
  • 확장성유연한 배포 가능
  • 각 마이크로서비스가 독립적으로 개발 및 배포될 수 있다.

 

 

 

build.gradle에 추가

ext {
    set('springCloudVersion', '2024.0.0')
}

dependencyManagement {
    imports {
        mavenBom("org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}")
    }
}

 

 


Spring Cloud Gateway란?

마이크로서비스의 API Gateway 역할을 수행하는 프레임워크

클라이언트의 요청을 적절한 마이크로서비스로 전달하고, 로드밸런싱, 보안 등의 기능을 수행하는 역할을 한다.

 

예를 들어 마이크로서비스에 유저 서비스, 주문 서비스, 결제 서비스 가 있다고 가정할 때,

클라이언트가 각각의 서비스를 호출하려면 각각의 서버 주소를 알아야 하고, 보안 및 로드 밸런싱 관리도 어려워진다.

-> 이 문제를 해결해주는 것이 바로 게이트웨이다.

 

 

 

Spring Cloud Gateway는 클라이언트의 모든 요청을 한 곳에서 받아서 적절한 마이크로서비스로 전달해준다.

클라이언트는 Gateway 하나만 호출하면 된다.

 

 

로드 밸런싱이란?

더보기

로드 밸런싱(Load Balancing)은 여러 개의 서버(서비스)로 트래픽을 분산시켜서 부하를 줄이고, 성능과 안전성을 높이는 기술

 

한 서버가 과부화 걸리지 않도록 여러 서버에 요청을 골고루 나눠주는 것이다.

트래픽을 분산시켜 성능을 높이고, 장애 발생 시 대체 서버로 요청을 보내는 것

 

 

게이트웨이가 8080번,

유저 서비스가 8081번, 주문 서비스가 8082번에서 실행되고 있을 때

 

/user/** 로 요청이 오면 8081 포트로 전달하고,

/order/** 로 요청이 오면 8082 포트로 전달한다.

 

-> 클라이언트는 http://localhost:8080/user 같은 API Gateway만 호출하면 된다.

 

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: http://localhost:8081
          predicates:
            - Path=/user/**
        - id: order-service
          uri: http://localhost:8082
          predicates:
            - Path=/order/**

 

 

 

 

build.gradle에 라이브러리 추가

dependencies {
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
}

 

 

 


API Gateway를 사용할 때 발생할 수 있는 문제

엔티티 참조 문제

게이트웨이를 사용하면 마이크로서비스 간 도메인 모델(Entity) 공유 문제가 발생할 수 있음

 

❌ 문제점

  • 마이크로서비스 간 엔티티 클래스가 중복되거나, 인식되지 않는 문제 발생.
  • @Entity가 각 서비스에서 올바르게 스캔되지 않아 참조 오류 발생 가능.

✅ 해결 방법

  • 컴포넌트 스캔 범위를 지정 → @ComponentScan("패키지 경로")로 필요한 패키지만 스캔.
  • 공통 엔티티 프로젝트(common 프로젝트) 생성 → common 모듈을 따로 만들어 엔티티를 모아두고, 모든 서비스가 의존하도록 설정.

 

 

JWT 인가 처리 문제

게이트웨이를 사용할 때 각 서비스에서 따로 JWT 검증을 할지, 게이트웨이에서 검증할지 결정해야 함.

 

❌ 문제점

  • 모든 서비스에서 따로 JWT를 검증하면 중복 코드 발생 & 성능 저하.
  • 게이트웨이에서만 JWT를 검증하면 내부 서비스에서 추가 검증이 어려울 수도 있음.

✅ 해결 방법

  • 게이트웨이에서 JWT 필터 설정하여 검증 → 인증된 요청만 내부 서비스로 전달.
  • 게이트웨이에서 JWT 검증 후, User 정보를 요청 헤더에 포함하여 내부 서비스에서 활용.
  • 특정 API는 게이트웨이에서 인가하고, 일부 API는 내부 서비스에서 추가 검증 수행.
728x90