본문 바로가기

Java & Kotlin/Spring26

Request Rate Limiting with Spring Cloud Gateway - 3. RateLimiterFilter 파헤치기 이전 포스팅에서 Spring Cloud Gateway에서 제공하는 RateLimiterFilter를 사용하여 Request Rate Limiting 기능을 적용하는 방법에 대해 알아보았다. 이번 포스팅에서는 내부적으로 어떤 식으로 RateLimiterFilter가 Request Rate Limiting 기능을 하는지에 대해 파헤쳐보도록하자. 전체 코드는 여기에서 확인 가능하다. RateLimiterFilter application.yml 에서 설정한 RateLimiterFilter는 RequestRateLimiterGatewayFilterFactory 를 살펴보면 된다. 이 필터의 apply 메서드가 리턴하는 GatewayFilter 코드를 보면 전체적인 틀을 파악할 수 있다. RequestRateLim.. 2022. 2. 8.
Request Rate Limiting with Spring Cloud Gateway - 2. RequestRateLimiter 필터 적용 앞서 개요에서 Spring Cloud Gateway에서 기본적으로 Request Rate Limiting 기능을 제공한다고 하였다. 이번 포스팅에서는 Spring Cloud Gateway에서 기본적으로 제공하는 Request Rate Limiting 기능과 이를 사용하는 방법에 대해 알아보도록 하겠다. 전체 코드는 여기에서 확인 가능하다. RequestRateLimiterFatewayFilterFactory in Spring Cloud Gateway Spring Cloud Gateway에서 기본적으로 제공하는 Request Rate Limiting에 대한 필터는 org.springframework.cloud.gateway.filter.factory.RequestRateLimiterGatewayFilter.. 2022. 2. 3.
Request Rate Limiting with Spring Cloud Gateway - 1. 기본 프로젝트 생성 전체 코드는 여기에서 확인 가능하다. 예제는 기존 시스템 구성에 Request Rate Limiting 기능을 추가하는 식으로 진행할 것이다. 그러기 위해서는 앞서 말한 기존 시스템을 구성할 것이다. 어느정도 현실성 있는 예제를 위해 API Gateway에서 인증을 확인하는 기능을 추가하였다. Request Rate Limiting 기능은 이 바탕으로 추가할 것이다. API 서버 먼저 API 서버를 생성해보자. 프로젝트 생성 Spring Web dependency만 추가한 SpringBoot 프로젝트를 생성한다. Controller 추가 그리고 요청을 처리하기 위해 Controller를 추가한다. 이 API 서버는 단순하게 하나의 endpoint를 통해 모든 GET 요청을 처리하도록 처리하였다. pack.. 2022. 1. 30.
Request Rate Limiting with Spring Cloud Gateway - 0. 개요 MSA 환경이라면 클라이언트가 직접 API 서버와 통신하기 보다는 아래 그림과 같이 API Gateway를 통해 클라이언트와 API 서버가 통신을 하게 될 것이다. API 서버 앞 단에위치하는 API Gateway 특성 상 보안이나 요청 로깅 등의 미들웨어 기능을 담당하기도 한다. 같은 맥락에서 API Gateway를 운용할 때, 클라이언트 요청에 대해 요청량 제한을 거는 Request Rate Limiting 기능도 API Gateway에서 처리하는 것이 일반적이다. Spring Cloud 프로젝트에서 제공하는 API Gateway인 Spring Cloud Gateway에서도 Request Rate Limiting 기능을 기본적으로 제공하고 있다. 이번 포스팅 시리즈는 Spring Cloud Gate.. 2022. 1. 30.
[Spring with Kotlin] sealed class로 다양하게 요청 받기 예제 코드는 여기에서 확인할 수 있다. 서버 API를 만들다보면 동일한 리소스에 대해 다른 요청 파라미터를 받아야할 때가 있다. 기본적인 파라미터는 동일하지만 리소스의 타입에 따라 다른 파라미터를 추가적으로 받아야할 때 sealed class를 활용하여 하나의 리소스에 대한 다양한 요청 DTO를 관리할 수 있다. 예를 들어 유저를 등록하는 API가 있다고 하자. 기본적으로 서비스에서 가입 시 유저로부터 이름, (로그인 ID로써)이메일, 비밀번호를 받아야한다면 요청 파라미터는 다음과 같은 data class로 나타낼 수 있을 것이다. data class UserSignUpRequest( @field:NotBlank val name: String, @field:Email val email: String, @.. 2022. 1. 28.
@Profile 대신 @Conditional로 유연하게 Bean 등록하기 @Profile을 사용하면 spring.profiles.active에 따라 Bean을 등록하거나 하지않거나 할 수 있다. 하지만 @Profile은 String 값을 입력받기 때문에 하드 코딩으로 인해 일괄 변경이 힘들 때가 있고, 여러 profile 조건이 붙는 경우 스프링에서 처리할 수 있는 문법을 알아야하는 등 불편한 점이 있다. 그래서 개인적으로 @Profile을 사용하기 보다는 @Conditional을 사용해서 profile 별 Bean 등록 처리하는 것을 선호한다. 이번 포스팅에서는 @Conditional과 이를 사용하여 @Profile을 대체하는 방법에 대해 알아보자. 예제 코드는 여기에서 확인할 수 있다. @Conditional 먼저 @Conditional 에 대해 알아보자 @Conditio.. 2022. 1. 1.