본문 바로가기

Java , Spring63

@Transactional은 private 메서드에서 동작할까? (Spring AOP) @Servicepublic class OrderService { public void placeOrder() { System.out.println("주문 시작"); saveOrder(); // 내부 호출 System.out.println("주문 완료"); } @Transactional private void saveOrder() { System.out.println("DB에 주문 저장"); }} @Transactional은 private 메서드에서 동작할까? 정답은 “동작하지 않는다.”그렇다면 왜 @Transactional은 private 메서드에서 작동하지 않을까?이유를 알기 위해서는 먼저 @Transactional이 어떻게 .. 2025. 10. 14.
토큰, 세션 차이점 비교 최근 프로젝트에서 인증 관련 코드를 확인하다가, 토큰과 세션에 대해 다시 한번 공부하게 되었다. 예전에 블로그에 토큰 관련 내용을 정리한 적이 있지만 시간이 많이지나서 다시 정리해보려한다.토큰과 세션의 가장 큰 차이토큰과 세션의 핵심적인 차이는 데이터를 서버에 저장하느냐, 저장하지 않느냐이다.세션(Session) 은 사용자의 상태를 서버 측 저장소(메모리, DB, Redis 등)에 저장한다.토큰(Token) 은 사용자 정보를 자체적으로 담고 있으며, 서버는 해당 토큰을 검증하기만 한다.물론 토큰 방식도 고도화 과정에서 서버에 데이터를 저장하는 경우가 생긴다.JWT 토큰이란?JWT(Json Web Token)는 인증 정보를 안전하게 전달하기 위해 JSON 기반으로 인코딩된 토큰이다.구조는 Header.Pa.. 2025. 9. 27.
[JSP] JSP의 등장 배경, 동작 원리, 장단점 회사에서 JSP를 사용하는 프로젝트에 참여하게 되었다. 요즘 JSP라고 하면 흔히 “옛날 기술”이라는 평가를 받지만, JSP가 처음 등장했을 당시에는 웹 개발 패러다임을 크게 바꾼 혁신적인 기술이었다.무엇보다 어떤 기술이든 등장 배경, 장단점, 동작 원리를 이해하고 사용하는 것과 그렇지 않은 것 사이에는 큰 차이가 있다고 생각한다. 그래서 이번 기회에 JSP에 대해 정리해보려 한다.JSP의 등장 배경초기 웹 개발에서 HTML은 정적인 페이지로만 동작했기 때문에 서버에서 동적으로 데이터를 삽입하기 어려웠다. 이를 해결하기 위해 등장한 것이 Servlet이다.하지만 Servlet은 자바 코드 안에 HTML을 문자열로 작성해야 해서, 가독성이 떨어지고 유지보수가 어려운 문제가 있었다.// Servlet 예시 .. 2025. 9. 7.
[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.