Backend/Spring Boot

RestTemplate
API를 개발하다보면 외부 API 서비스 혹은 다른 서비스 API를 호출해서 데이터를 송,수신 해야하는 경우가 있다. RestTemplate는 Spring 3부터 지원하기 시작한 “동기 방식"의 REST API 호출 방법이다. Http 요청을 작성할 수 있는 템플릿으로서 json, xml 데이터를 Jackson과 함께 간단하게 파싱해서 사용하는 것이 가능하다. Spring 4부터는 비동기 방식인 AsyncRestTemplate를 지원하기 시작했고, 최근 Spring 5부터는 기존의 동기 방식을 포함할 뿐만 아니라 비동기, 넌블로킹 방식도 WebClient를 지원하기 시작했다. 메서드 RestTemplate의 메서드는 아래와 같다. 1. getForObject : GET 메서드를 이용해 요청한 URL로부터..

Converter를 이용해 URI에 Enum 타입 매핑하기
현재 프로젝트에서 사용자가 자신이 수신한 공지사항, 이벤트, QNA, 파티 매칭 관련한 알림을 필터링 해서 읽을 수 있는 기능을 구현하고 있다. 이 때, URI를 “/notify/{notifyType}” 으로 지정하고 String 타입이 아닌 정의한 Enum 타입으로 받는다면 Stirng 타입에서 Enum타입으로 변경하는 추가 로직을 구현없이 편하게 비즈니스 로직에 접근할 수 있다고 판단했다. 물론 URI의 의미 전달까지 제대로 전달할 수 있다고 생각했다. 그래서, URI 엔드포인트에 들어가는 PathVariable 값을 String 값으로 받는 것이 아닌 바로 정의한 Enum 타입으로 받아보는 방법을 정리하고자 한다. Converter? Spring에서 제공하는 Converter를 먼저 간단하게 확인해..

Spring Cloud Config의 설정 파일 비대칭키로 암/복호화
이전에 필요한 환경변수 파일들을 Github에 Config Repository를 하나 생성해 관리했다. Spring Cloud Config Server는 실행 시 이 환경 설정파일들을 애플리케이션이 실행될 때 전파해주었다. 이런 환경설정 파일들을 Public Repository에서 관리하거나 Private Repository에서 관리하더라도 암/복호화를 통해 안전하게 관리해야한다. 일반적으로 암/복호화하는 방식은 크게 대칭키방식과 비대칭키 방식이 있다. 대칭키(Symmetric) : 암/복호화하는 키가 동일한 경우를 의미한다. 대표적으로 AES, SEED, ARIA와 같은 알고리즘이 있다. 비대칭키(Asymmetric) : 암/복호화 하는 키가 다른 경우를 의미한다. 모든 사람이 사용할 수 있는 공개키와..

RestControllerAdvice, ExceptionHandler를 이용한 전역 예외 처리
이전 포스팅에서 프로젝트 애플리케이션이 동작 시 발생하는 다양한 상황에 대해서 메세지를 클라이언트로 전달해주기 위해 Custom Exception을 이용한 사용자 예외 처리를 다뤘다. 이렇게 Custom Exception을 사용하다보니 Web Layer (Controller)에서 로직을 처리해 줄 때 발생하는 예외를 try-catch로 매 로직마다 처리해주어야 했다. try-catch문에 들어가는 로직은 status, message를 담아 보내주는 공통적인 로직인데 이를 한 군데서 전역 처리할 수 없을까? @RestControllerAdvice, @ControllerAdvice ControllerAdvice, RestControllerAdvice는 모든 Controller에서 발생한 예외를 한 곳에저 전..

Spring Cloud Gateway를 이용한 서비스 라우팅 및 JWT 토큰 검증
현재 진행 중인 프로젝트가 MSA 기반의 프로젝트이기 때문에 API Gateway가 필요했다. 클라이언트로부터 들어오는 요청을 라우팅 해주고 특히 사용 중인 마이크로 서비스에서 JWT 토큰을 검증 후 토큰을 파싱해서 사용하는데 동일 로직이 모든 서비스에 들어가는 경우가 생겼다. API Gateway를 서비스 앞 단에서 구축함으로써 필터를 통한 JWT 토큰의 검증 로직을 공통적으로 추출할 수 있고, 마이크로 서비스 간 RestTemplate이나 Feign Client를 이용한 REST API 호출이 필요할 텐데 이 때 Eureka Server와 API Gateway를 사용한다면 보다 효율적일 것이라고 생각했다. Spring Cloud Netflix Zuul, Spring Cloud Gateway 등 API..