밤빵's 개발일지
[TIL]20240831 API 게이트웨이 본문
API 게이트웨이는 마이크로서비스 아키텍처(MSA)에서 중요한 역할을 하는 중간 계층으로, 클라이언트 요청을 적절한 백엔드 서비스로 라우팅하고, 요청과 응답을 조작하며, 다양한 기능을 제공한다. 예를 들어, 인증, 권한 부여, 로깅, 로드 밸런싱, 속도 제한, 캐싱, 모니터링 등을 API 게이트웨이를 통해 구현할 수 있다.
🤓API 게이트웨이란?
API 게이트웨이는 클라이언트와 백엔드 서비스 사이에 위치하는 중간 계층으로, 클라이언트 요청을 적절한 서비스로 전달하고 응답을 다시 클라이언트에 반환하는 역할을 한다. 이를 통해 클라이언트는 다양한 서비스 엔드포인트에 직접 접근할 필요 없이 API 게이트웨이를 통해 모든 요청을 관리할 수 있다.
API 게이트웨이의 주요 기능은 다음과 같다.
→ 요청 라우팅(Request Routing):
API 게이트웨이는 클라이언트의 요청을 적절한 백엔드 서비스로 라우팅한다.
→ 인증 및 권한 부여(Authentication & Authorization):
요청을 인증하고, 사용자가 해당 요청을 수행할 권한이 있는지 확인할 수 있다.
→ 속도 제한 및 로드 밸런싱(Rate Limiting & Load Balancing):
클라이언트 요청의 속도를 제한하고, 여러 인스턴스에 트래픽을 분산시킬 수 있다.
→ 캐싱(Caching):
반복되는 요청에 대해 캐싱을 적용하여 백엔드 서비스의 부하를 줄일 수 있다.
→ 로깅 및 모니터링(Logging & Monitoring):
모든 요청과 응답을 기록하고 모니터링하여 애플리케이션의 상태를 확인할 수 있다.
→ 데이터 변환(Data Transformation):
클라이언트와 백엔드 서비스 간의 요청 및 응답 데이터를 변환할 수 있다.
▶API 게이트웨이의 필요성
마이크로서비스 아키텍처에서는 여러 개의 독립적인 서비스가 존재하고, 클라이언트는 여러 서비스와 통신해야 한다. 이 과정에서 각 서비스의 엔드포인트를 클라이언트가 직접 관리하면 복잡성이 증가하고, 보안, 인증, 로드 밸런싱 등의 기능을 개별적으로 구현해야 하는 부담이 생긴다. API 게이트웨이는 이러한 문제를 해결하기 위해 사용된다.
→ 단순화된 클라이언트와 서버 간 통신:
API 게이트웨이는 클라이언트가 모든 마이크로서비스의 엔드포인트를 알 필요 없이 하나의 게이트웨이로 요청을 보낼 수 있도록 한다.
→ 보안 강화:
모든 요청이 API 게이트웨이를 통과하기 때문에 인증, 권한 부여 등의 보안 기능을 중앙 집중화할 수 있다.
→일관된 정책 적용:
로깅, 모니터링, 속도 제한 등 다양한 정책을 중앙에서 일관되게 적용할 수 있다.
▶Spring Boot로 API 게이트웨이 구현하기
Spring Boot와 Spring Cloud Gateway를 사용하여 간단한 API 게이트웨이를 구현하기
▷의존성 추가
→ build.gradle 파일에 Spring Cloud Gateway 의존성을 추가한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
}
→build.gradle 파일 상단에 Spring Cloud 의존성 관리를 위한 코드도 추가해야 한다.
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR12"
}
}
▷ 애플리케이션 설정
→ application.properties 파일에 라우팅 설정을 추가한다. 여기서는 /api/service1/**로 들어오는 요청을 http://localhost:8081로 전달하고, /api/service2/**로 들어오는 요청을 http://localhost:8082로 전달하도록 설정한다.
spring.application.name=api-gateway
server.port=8080
spring.cloud.gateway.routes[0].id=service1
spring.cloud.gateway.routes[0].uri=http://localhost:8081
spring.cloud.gateway.routes[0].predicates[0]=Path=/api/service1/**
spring.cloud.gateway.routes[1].id=service2
spring.cloud.gateway.routes[1].uri=http://localhost:8082
spring.cloud.gateway.routes[1].predicates[0]=Path=/api/service2/**
▷게이트웨이 애플리케이션 클래스
→ Spring Boot 애플리케이션 메인 클래스는 아래와 같이 간단하게 작성한다.
package com.example.apigateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ApiGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ApiGatewayApplication.class, args);
}
}
→ 이렇게 하면 Spring Cloud Gateway가 활성화되어 설정 파일에 정의한 대로 라우팅을 수행한다.
▷간단한 API 서비스 구현
→ 게이트웨이를 통해 요청이 전달될 간단한 서비스도 구현해야 한다. Service1과 Service2라는 두 개의 간단한 서비스를 만들어서 각기 다른 포트에서 실행할 수 있도록 한다.
▽ Service1 예시
package com.example.service1;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Service1Controller {
@GetMapping("/api/service1/hello")
public String hello() {
return "Hello from Service 1";
}
}
▽Service2 예시
package com.example.service2;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Service2Controller {
@GetMapping("/api/service2/hello")
public String hello() {
return "Hello from Service 2";
}
}
→ 이와 같이 간단한 서비스를 구성한 후, API 게이트웨이를 통해 요청을 전달하고 응답을 받을 수 있다.
▶내용 요약
API 게이트웨이는 클라이언트와 백엔드 서비스 간의 중간 계층으로서 요청 라우팅, 인증 및 권한 부여, 로드 밸런싱, 속도 제한, 모니터링 등 다양한 기능을 제공한다. 이를 통해 마이크로서비스 아키텍처에서 복잡성을 줄이고, 보안과 관리의 편의성을 극대화할 수 있다. Spring Boot와 Spring Cloud Gateway를 사용하여 간단한 API 게이트웨이를 구현해보면서 간단하게라고했는데 분명 예시 코드를 보면서도 뭐가 뭔지 아직은 이해하기 어려운거같다😵💫
'개발Article' 카테고리의 다른 글
[TIL]20240902 테스트코드 (0) | 2024.09.03 |
---|---|
[WIL]20240901 N+1문제해결 : 프로젝트 코드에서 해결하기 (1) | 2024.09.01 |
[TIL]20240830 locust,nGrinder 부하테스트 (0) | 2024.08.31 |
[TIL]20240829 웹훅(Webhook) (0) | 2024.08.29 |
[TIL]20240828 인 컨텍스트 러닝(In-Context Learning) (1) | 2024.08.28 |