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는 내부 서비스에서 추가 검증 수행.
'BE > Spring Boot' 카테고리의 다른 글
[Spring Boot] Eureka란? / 스프링 부트에서 Eureka, Gateway 설정 (0) | 2025.03.19 |
---|---|
[Spring Boot] 멀티 모듈 프로젝트 생성 / API Gateway 연결 (0) | 2025.03.18 |
[Spring Boot] STOMP란? / 간단한 채팅방 구현 (0) | 2025.03.18 |
[Spring Boot] WebSocket과 Kafka로 실시간 채팅 구현 (0) | 2025.03.18 |
[Spring Boot] 웹 소켓(Web Socket)을 사용해 실시간 채팅 구현 (0) | 2025.03.17 |