본문 바로가기

Java , Spring60

[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.
[Java] HashMap의 Thread-Safe 와 TreeMap, LinkedHashMap, EntrySet 정리 HashMapMap 이란?Map은 리스트나 배열처럼 순차적으로 해당 요소 값을 구하지 않고 key를 통해 value를 얻을 수 있는 자료 구조이다.특징key는 중복을 허용하지 않는다.value는 중복이 가능하다put 과 getMap은 put과 get을 통해 insert 와 read가 가능하다HashMap map = new HashMap();map.put("people", "사람");map.put("baseball", "야구");String str = map.get("people"); // "사람"containsKey (boolean)Map에 해당 key가 있는지 조사하여 결과값을 리턴한다.boolean hasKey = map.containsKey("people");removeMap의 항목을 삭제할 수 있.. 2024. 10. 7.
[JAVA] Virtual Thread (JDK 21) Virtual Thread프로세스실행중인 프로그램스레드프로세스 내에서 실행되는 실행 흐름 (작업 단위)Virtual Thread2023년 JDK21에 추가된 경량 스레드이다. OS 스레드를 그대로 사용하지 않고 JVM 내부 스케줄링을 통해 수백만개의 스레드 사용이 가능하다.장점생성 및 스케줄링 비용이 저렴하다.Nonblocking I/O를 지원한다.기존 스레드를 상속하여 코드가 호환된다.전통적인 Java의 ThreadJava에서는 OS Thread를 Wrapping 해서 사용한다.(Platform Thread)OS Thread는 생성 개수가 제한적이고, 생성, 유지 비용이 매우 비싸다.이러한 단점을 해결하기 위해 Thread Pool을 사용한다. (생성 비용이 비싸서)전통적인 Java의 Thread를 사.. 2024. 9. 3.