본문 바로가기

Java , Spring/Spring33

[MSA] MSA 환경에서 EDA 기반으로 사용자 요청 비동기 처리하기 프로젝트를 진행하며, 성향 분석 요청과 같은 특정 로직에 트래픽이 집중될 것이라 판단하였고, 이에 따라 서비스의 확장성과 안정성을 확보하기 위해 MSA(Microservices Architecture) 를 도입했다.성향 분석 과정은 여러 서비스에 의해 처리되는 복잡한 구조를 가지고 있으며, 초기에 이를 동기 방식으로 처리할지 고민했지만,하나의 서비스 지연이나 실패가 전체 프로세스에 영향을 미칠 수 있기 때문에, 서비스 간 비동기 이벤트 흐름을 기반으로 유연하게 처리할 수 있는 EDA(Event-Driven Architecture) 를 적용했다.이를 통해 각 서비스가 낮은 결합도로 유연하게 연동되며, 이벤트 기반의 통신을 통해 확장성과 장애 대응 측면에서 높은 안정성을 확보할 수 있는 구조를 완성 할 수 .. 2025. 4. 17.
[MSA] Orchestration 기반 SAGA 패턴을 활용한 분산 트랜잭션 처리 이전 글에서(https://bangbaeking.tistory.com/159) Orchestration 기반의 SAGA 패턴을 활용하여 분산 트랜잭션을 처리했다고 언급했는데, 이번에는 그 과정을 좀 더 자세히 정리하고자 한다. 전체적인 구조는 아래와 같다.1. 결제 서비스의 트랜잭션 흐름결제 프로세스 개요현재 결제 관련 플로우는 다음과 같다.클라이언트에서 외부 결제 API에 결제 요청을 보낸다.결제가 성공하면 서버에서 비즈니스 로직이 실행된다.비즈니스 로직 처리 단계비즈니스 로직의 주요 단계는 다음과 같다.결제 내역 저장 (결제 서버)쿠폰 사용 업데이트 (쿠폰 서버)회원 수업 횟수 증가 (회원 서버)2. MSA 환경에서의 분산 트랜잭션 문제현재 서비스는 결제, 쿠폰, 회원 서비스가 각각 독립된 MSA 구.. 2025. 3. 2.
[MSA] MSA 환경에서의 분산 트랜잭션 처리(2PC, SAGA) MSA(Microservices Architecture) 환경에서는 각 서비스가 독립적으로 데이터베이스를 관리하기 때문에 기존의 단일 시스템에서 사용하던 트랜잭션 처리 방식이 적용되기 어렵다. 이를 해결하기 위해 다양한 분산 트랜잭션 관리 기법이 사용된다. 분산 트랜잭션이란?서로 다른 서비스가 하나의 비즈니스 로직에 참여할 때, 모든 서비스의 작업이 성공해야만 전체 트랜잭션이 커밋된다.일부 서비스만 성공하고 다른 서비스가 실패하면 데이터의 일관성이 깨질 수 있으므로, 이를 방지하기 위해 분산 트랜잭션 관리가 필요하다.예시:현재 진행중이 프로젝트를 예시로 들면, 사용자가 외부 결제 API를 통해 결제를 성공했을 때의 처리 과정은 다음과 같다.결제 서버: 결제 내역을 데이터베이스에 저장쿠폰 서버: 쿠폰 사용.. 2025. 2. 23.
[Spring Cloud] MSA 서버 간 호출방식 비교 (RestTemplate, FeignClient, WebClient, RestClient) MSA 프로젝트를 진행하면서, 서비스 간 통신이 필요한 상황이 발생했다. 이를 해결하기 위해 HTTP 클라이언트를 찾아본 결과 RestTemplate, FeignClient, WebClient, RestClient 네 가지 방식이 존재했다. 각 방식의 특징과 장단점을 비교한 후, 우리의 요구사항에 가장 적합한 방법을 선택했다.우리의 경우 MSA에서 서비스 간 호출이 목적이므로, FeignClient를 사용하기로 결정했다. RestTemplate (Spring 5 이전 사용)개발이 중단되었으며, RestClient 사용을 권장한다.RestTemplate은 Spring 5 이전까지 사용되던 동기식 HTTP 클라이언트로,Spring Boot 3.2 이상에서는 RestClient 사용이 권장된다.특징동기 방식(.. 2025. 2. 8.
[Spring Cloud] Spring Cloud Gateway (그리고 Zuul 와 Netty) 최근 MSA 프로젝트를 진행하면서 관련 학습 중 GateWay에 Spring Cloud Gateway와 Zuul가 있다는 것을 알게 되었다. 이에 두 옵션 중 어떤 것을 선택할지 고민하게 되었고, 이를 정리해보려 한다.GateWay란?Gateway는 MSA 아키텍처에서 중요한 구성 요소이다. 클라이언트와 백엔드 서버 사이에서 중앙 진입점 역할을 한다. Gateway의 역할게이트웨이의 역할은 크게 아래와 같다.요청 라우팅클라이언트의 요청을 적절한 마이크로서비스로 전달한다.URL 패턴이나 요청 헤더를 기반으로 요청을 분석하고, 해당하는 서비스로 매핑한다.인증 및 인가 처리클라이언트 요청에 포함된 인증 정보를 확인하여 유효성을 검증한다.JWT 토큰 또는 OAuth2와 같은 인증 방식을 통해 권한을 확인하고, .. 2025. 1. 21.
[Spring] JWT 검증 방법 (대칭키, 비대칭키) JWT 토큰은 어떻게 검증 할까? 그리고 JWT는 대칭키와 비대칭키 중 어떤 방식을 사용할까? 결론 부터 말하자면 서명을 통해 검증하고 대칭키와 비대칭키를 모두 사용할 수 있다. JWT란JWT (JSON Web Token)는 웹 애플리케이션에서 사용자 인증 및 권한 부여를 위해 사용되는 JSON 기반의 토큰 이다.JWT의 구조JWT는 Header, Payload, Signature 3 부분으로 이루어저 있다. 헤더 (Header): 토큰의 타입(JWT)과 사용된 서명 알고리즘(예: HMAC SHA256, RSA 등)을 지정한다.페이로드 (Payload): 토큰에 담길 정보를 포함하는 부분이다. 보통 사용자의 ID, 권한, 토큰의 만료 시간 등과 같은 클레임(Claims)을 포함한다.서명 (Signatur.. 2025. 1. 16.
[Spring] Spring Security 예외를 @ControllerAdvice에서 처리하기 @ControllerAdivce란@ControllerAdvice는 Spring에서 전역적인 예외 처리 기능을 제공하는 어노테이션이다. 이를 통해 애플리케이션의 모든 컨트롤러에서 발생하는 예외를 전역적으로 처리할 수 있다.Spring Security는?Spring Security는 웹 애플리케이션의 보안을 관리하는 프레임워크로, 인증(Authentication)과 인가(Authorization)를 주로 담당한다.Spring Security는 필터 체인(Filter Chain) 방식으로 동작하는 보안 시스템이다.즉, 사용자 요청이 들어올 때마다 필터들이 요청을 차례대로 처리한다.Spring Security는 필터로 구현되어 있기 때문에, 예외를 컨트롤러에서 직접 처리할 수 없다. Filter는 컨트롤러보다 .. 2024. 12. 13.
[Spring] CS 스터디 - 3주차 Spring & Network 3주차(8/7) - Spring & NetworkAOP💡 AOP란? (Aspect Oriented Programing) 관점 지향 프로그래밍을 의미한다. (코드의 중복이 횡단으로 이루어지는 경우) 로깅, 보안, 트랜잭션 관리, 등과 같은 공통적인 관심사를 모듈화 하여 코드 중복을 줄일수 있다.Aspect(관점) - 공통 관심사항을 정의하는 모듈이다.Advice(조언) - Aspect의 동작을 정의, 스프링에서는 5가지 종류의 Advice를 지원한다.Pointcut (포인트컷) - 어떤 메서드가 어떤 Advice를 받을지 결정Join Point(조인 포인트) - Advice가 적용될 수 있는 위치Weaving(위빙) - 대상 코드에 Aspect를 적용하는것, 스프링에서는 컴파일, 클래스 로딩, 런타임 시.. 2024. 8. 11.
[Spring] 선착순 쿠폰 동시성 문제 해결하기 (메세지큐 적용) 동시성 문제란?동일한 하나의 데이터에 두개이상의 프로세스나 스레드가 동시에 같은 데이터에 접근 할때 빌생할 수 있는 문제점을 의미한다. 동시성 문제 발생public void assignCoupon(CreateCouponReq createCouponReq) { // 쿠폰 발급 로직 try{ // 1. 존재하는 쿠폰 이벤트 인지 확인 if(!mapper.isValidEvent(createCouponReq.getCouponGroupId())){ log.error("[error] 쿠폰 발급 실패 - 존재하지 않는 이벤트입니다."); throw new RuntimeException("존재하지 않는.. 2024. 6. 26.