본문 바로가기

Spring/Spring & Spring Boot9

주문/결제 로직에 이벤트를 적용해보자 기존 주문/결제 로직의 문제점기존 구현에서는 주문 생성 → 쿠폰 사용 처리 → 결제 요청 → 재고 차감 → 주문 상태 변경까지의 모든 과정을 하나의 트랜잭션 안에서 처리했다.단일 트랜잭션으로 구현하면 개발은 단순해 보이지만, 실제 운영 환경에서는 다음과 같은 문제점들이 있다.1. 트랜잭션 점유 시간 증가결제 로직에는 외부 PG(Payment Gateway) 연동이 포함된다.PG API 호출은 네트워크 지연과 외부 시스템 응답 시간을 포함하기 때문에, 전체 트랜잭션 점유 시간이 길어진다.그 결과 동시에 여러 주문을 처리하는 상황에서 DB 커넥션 풀을 잠식하거나 락 경합(lock contention)이 발생해 시스템 전체 성능을 저하시킬 수 있다.2. 외부 시스템 장애에 따른 트랜잭션 실패PG 연동 과정에서.. 2025. 8. 29.
장애 대응을 위한 Resilience4j 적용 주문 및 결제 기능은 아래와 같은 흐름으로 진행된다.사용자 -> 주문 요청 -> 결제 서비스 -> PG사 API 결제 요청 (결제 시스템) -> 결제 요청 응답 수신 -> 주문 접수 처리 -> PG사 API 결제 callback 수신 (결제 시스템) -> 결제 성공/실패 처리 -> 주문 완료/실패 처리 이때 결제 시스템과 같은 외부 API의 경우 우리가 의도한 대로 항상 정상적인 응답을 보장하지 않는다.따라서 다양한 장애 상황이 발생할 수 있는데,예를 들면 API 호출 실패 (5xx), API 응답 지연 (타임아웃), 일시적 네트워크 장애, PG사 서버 과부하 등등의 오류가 있으며 이는 단순 재시도만으로는 해결되지 않는다. 이러한 상황에서 Resilience4j를 활용하면,외부 API 호출 시 발생할 수.. 2025. 8. 22.
비관적 락은 정말 느릴까? 실험해봤습니다 락 전략에도 정답은 없다.락은 동시성 문제를 방지하기 위한 대표적인 수단이며, 공유 자원에 여러 사용자가 동시에 접근할 때 그 정합성을 보장하기 위해 사용됩니다.JPA, 데이터베이스에서 동시성을 제어하기 위한 대표적인 방법으로 낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)이 있습니다.대부분의 개발자들이 본능적으로 “낙관적 락이 더 좋다”는 인식을 갖고 있습니다. 저 또한 그렇게 생각해왔었는데 아마 비관적 락의 단점으로 꼽히는 "데드락", "타임아웃" 때문에 그렇게 생각했었던 것 같습니다. 하지만 이번 포스팅에서는 "좋아요 등록/취소 기능"을 중심으로 비관적 락이 무조건 나쁜 것인지, 낙관적 락이 무조건 좋은 것인지에 대해서 알아보려고 합니다. 낙관적 락 vs 비관적.. 2025. 8. 7.
@EnableWebMvc 는 조심해서 사용하자 💡 이번 포스팅에서는 스프링 부트에서 resourceHandler에 대해 겪었던 이슈에 대해서 정리해 보도록 하겠습니다. 상황은 이렇습니다. 스프링 부트 + 타임리프로 개발을 잘 하고 있다가, 톰캣 AJP 설정을 해야 해서 @Configuration과 @EnableWebMvc를 사용하여 설정을 한 후에 갑자기 정적 Web Resource들이 모두 404 Not Found 에러가 발생하기 시작했습니다. 아래는 문제의 코드입니다. @Configuration@EnableWebMvc@RequiredArgsConstructorpublic class SpringServletConfig implements WebMvcConfigurer { private final TomcatAjpProperties tomc.. 2023. 5. 31.
@ControllerAdvice & @RestControllerAdvice 💡 이번 포스팅에서는 @ControllerAdvice & @RestControllerAdvice에 대해 정리해 보도록 하겠습니다. 이전에 @ControllerAdvice, @RestControllerAdvice에 대해 찾아봤던 적이 있는데, 지금 다시 보니 잘 못된 부분이 있어 다시 정리해보고자 합니다. 때는 입사한 지 얼마 안 된 신입 때였는데 @ControllerAdvice, @RestControllerAdvice를 찾을 때 공식 문서나 java docs 대신 블로그 자료를 찾았었습니다. @ControllerAdvice를 설명할 때 ExceptionHandler와 같이 설명하는 블로그들을 쉽게 찾아볼 수 있을 것입니다. 보면 공통적으로 전역 예외 처리를 위해 @ControllerAdvice를 사용한.. 2023. 4. 23.
Actuator (액츄에이터) 💡이번 포스팅에서는 Spring Boot의 Actuator (액츄에이터)에 대해서 정리해 보도록 하겠습니다.💡이번 포스팅의 핵심은 Spring Boot의 Actuator란 무엇인지, 사용하는 방법에 초점을 맞췄기 때문에 조금 더 자세한 내용은 추후 따로 정리해 보도록 하겠습니다. 위와 같은 이유로 이번 포스팅에서 정리할 내용은 다음과 같습니다.Actuator란?Actuator 사용하기Actuator EndpointEnabling EndpointsExposing EndpointsImplementing Custom Endpoint Actuator (액츄에이터) 란?actuator를 간단하게 정의하면 Spring Boot 애플리케이션을 제어하고 모니터링하기 위한 도구라고 할 수 있습니다. actuator를.. 2023. 4. 2.
Bean은 무상태(stateless)로 설계하자 💡이 포스팅은 Spring Bean의 무상태(stateless)에 대해 정리한 포스팅입니다. Spring Bean stateless에 대해 학습한 GitHub Repository입니다. GitHub - kiekk/test-spring-bean-stateless Contribute to kiekk/test-spring-bean-stateless development by creating an account on GitHub. github.com Spring Bean에 관해 찾아보면 무상태(stateless)로 설계해야 한다고 합니다. 무상태란 말 그대로 상태가 없는 것을 뜻하며 Bean이 특정 상태를 가지고 있지 않는 경우를 말합니다. 하지만 이 부분을 조금 더 설명해 보면 Bean이라서 무상태(state.. 2023. 3. 27.
스프링 부트 앱에 초기화 코드를 넣는 방법 3가지 💡이 포스팅은 토비 님의 유튜브 영상인 스프링 부트 앱에 초기화 코드를 넣는 방법 3가지을 시청하고 학습한 내용을 정리한 포스팅입니다. 토비 님의 영상을 시청하며 정리한 GitHub Repository입니다. GitHub - kiekk/study-spring-boot-inject-initializer-codeContribute to kiekk/study-spring-boot-inject-initializer-code development by creating an account on GitHub.github.com 바로 본론부터 들어가면 스프링 부트 앱에 초기화 코드를 넣는 방법은 아래와 같이 크게 3가지 방법이 있습니다.CommandLineRunnerApplicationRunner@EventListe.. 2023. 3. 19.
@Controller에서도 ResponseEntity를 사용하면 Rest가 된다?? 💡이번 포스팅은 스프링 커뮤니티에서 한 개발자분이 공유해 주신 내용을 토대로 학습하여 정리한 포스팅입니다. 학습한 내용을 정리한 GitHub Repository입니다. GitHub - kiekk/spring-response-entity-test Contribute to kiekk/spring-response-entity-test development by creating an account on GitHub. github.com 먼저 공유해주신 내용은 다음과 같습니다. 저는 이 내용을 보자마자 흠칫했습니다. 이때까지 무의식에 rest-api를 만들 때 @RestController를 사용하면서 동시에 ResponseEntity를 사용해 왔었기 때문입니다. 제가 ResponseEntity를 사용한 이유는 r.. 2023. 3. 11.