728x90
반응형

WebClient 4

[Spring Cloud Gateway] White List 적용 & WebClient로 권한 체크하기

"게이트웨이에 JWT 필터를 달았더니, 로그인 API 호출할 때도 토큰이 없다고 401 에러를 뱉어요!" 처음 게이트웨이에 인증 필터를 적용했을 때 겪었던 황당한 상황입니다.application.yml에서 라우팅 경로를 쪼개서 필터를 뺐다 꼈다 할 수도 있지만, 설정 파일이 너무 길어지고 관리가 힘들어지죠.게다가 토큰이 유효한지(인증)를 넘어서, "이 사용자가 이 API를 호출할 권한(인가)이 있는가?"를 확인하려면 게이트웨이가 권한 관리 서비스(Auth Service)에 API를 찔러서 물어봐야 하는 경우도 생깁니다.(이건 서비스 별로 다를 수 있는데, 현재 실무에서 몇몇 기능은 보안 강화를 위해 이렇게 적용해둔 부분이 있습니다.)오늘은 이 두 가지 문제를 해결하기 위해, 필터 코드 내부에 White ..

[Spring] WebClient 동기 처리 시 필수! TCP & Block 이중 타임아웃으로 안정성 확보하기 (RestClient 못 쓸 때)

최근 운영 중인 서비스에서 등에 식은땀이 흐르는 경험을 했습니다.잘 돌아가던 Quartz 스케줄러 Job이 어느 순간부터 로그 하나 없이 '멈춤' 상태가 되어버린 것이죠.에러 로그도 없고, 스레드는 살아있는데 작업이 진행되지 않는 좀비 상태였습니다.원인을 파헤쳐 보니 범인은 WebClient의 block() 메서드였습니다.외부 API 통신 중 예상치 못한 네트워크 이슈가 발생했는데, 타임아웃 설정이 제대로 되어 있지 않아 스레드가 무한 대기 상태에 빠진 것이었죠."WebClient는 비동기인데 왜 block을 써?"라고 하실 수 있지만, 레거시 시스템이나 비즈니스 로직상 반드시 동기 처리가 필요한 경우가 있잖아요?게다가 Spring 버전 문제로 최신 RestClient를 도입할 수도 없는 상황이었습니다...

Backend/Spring 2026.02.12

[Spring Cloud] 서비스간 HTTP 통신하기 (OpenFeign)

지난 시간까지 우리는 Eureka(전화번호부)를 만들고, Gateway(정문)를 세웠습니다.이제 외부에서 들어오는 요청은 잘 처리할 수 있습니다.그런데 내부 사정은 어떨까요?MSA 환경에서는 '주문 서비스'가 '재고 서비스'에게 "재고 남았어?"라고 물어보는 등, 서비스 간의 통신이 빈번하게 일어납니다. 과거에는 이를 위해 RestTemplate이 표준이었지만, 지금은 선택지가 너무 많아졌습니다.비동기 처리에 강한 WebClientSpring Boot 3.2에 등장한 신성 RestClient그리고 Spring Cloud의 터줏대감 OpenFeign"요즘 RestClient가 나왔다던데 갈아타야 하나?" 고민하시는 분들도 계실 겁니다. 하지만 저는 4년 차 실무 개발자로서, 복잡한 비즈니스 로직을 다루는 ..

[Spring] 메일 발송 실패가 비즈니스 로직을 막지 않도록: RestClient와 @Async 도입기

기존 사내 프로젝트의 메일 발송 모듈은 동기(Synchronous) 방식으로만 동작하고 있었습니다.즉, 메일 서버에 요청을 보내고 응답이 올 때까지 메인 스레드가 기다려야 했고, 무엇보다 "메일 발송 실패 = 전체 로직 실패(Exception & Rollback)"라는 공식이 성립되어 있었습니다.물론 회원가입 인증 메일처럼 발송 성공이 필수적인 로직에서는 이 방식이 맞습니다.하지만, 단순 알림 메일의 경우, 메일 발송이 실패하더라도 핵심 비즈니스 로직(예: 등록 성공, 결재 성공)은 정상적으로 마무리되어야 합니다."주문은 성공했는데 주문 완료 메일 발송이 터졌다고 결제까지 롤백된다면?"이건 사용자 경험(UX) 측면에서 최악의 시나리오입니다.그래서 이번 기회에 Spring 6.1(Boot 3.2)의 Res..

Backend/Spring 2026.01.23