본문 바로가기

전체 글

(4)
기존 서비스를 유지하며 신규 서비스를 어떻게 지원할 수 있을까? 안녕하세요. 이번에 다룰 내용은 기존 서비스를 유지하며 신규 서비스를 제공할 수 있는 방법에 대해 다뤄보려 합니다. 기존에 아래와 같은 서버가 존재한다고 가정해 봅시다. 해당 서버는 회원, 주문, 상품, 정산, 쿠폰, 문의 등등 여러 서비스의 관리 기능을 제공하고 있습니다. 한눈에 봐도 하나의 서버에서 많은 도메인 영역에 걸쳐 서비스를 제공하고 있다는 것을 알 수 있습니다. 위와 같은 상태에서는 개발자가 기존의 시스템을 유지 보수하거나 더 이상 어떤 기능을 추가하는 것이 쉽지 않은 상태일 것입니다. 그렇다면 어떻게 해야 할까요? 바로 서비스를 분리해 주어야 합니다. 하지만 기존 서버에서 제공하는 모든 서비스를 한 번에 분리하는 것은 너무 많은 리소스가 소모되고 또한, 리스크 하기 때문에 보통 아래와 같이..
서로 다른 스프링 시큐리티 버전 간 세션 동기화 최근 새로운 프로젝트를 진행하며 기존 레거시 서버와 동일한 인증 처리(레거시 서버에서 로그인을 하면 새로운 프로젝트의 서버에서도 로그인이 유지되도록)를 위해 세션 동기화를 진행해야 했었습니다. 기존 레거시는 이미 spring-session-data-redis을 사용해 세션 동기화를 해둔 상태였기 때문에 새로운 프로젝트에서도 해당 Redis 서버에 연결만 시켜주면 동기화가 될 것이라고 생각했었습니다. 그러나 실행 결과 두 가지 문제로 인해 동기화가 진행되지 않았는데 그 문제는 다음과 같습니다. 레거시와 다른 프로젝트 패키지 구조 Spring Security 버전 차이로 인한 세션 정보 Deserialize 실패 이제부터 이 두 가지 문제를 해결한 과정을 설명드리도록 하겠습니다. 각 프로젝트의 패키지 구조는..
재고가 한 개 남은 물건을 동시에 여러명이 장바구니에 담으면? (feat. Redis) 비관적 잠금(Pessimistic Lock) 비관적 잠금이란 동일한 데이터를 동시에 수정 할 가능성이 높다는 비관적인 전제로 잠금을 거는 방식을 말합니다. 지난 포스팅에서 MySql의 User Level Lock을 활용한 동시성 제어에 대해 알아보았었는데 해당 방식을 예로들 수 있습니다. MySql에서 문자열을 통해 잠금을 획득하고 해당 잠금이 해제될 때 까지 대기해야하는 User Level Lock은 사용하기에 편리하고 추가적인 인프라 구성이 필요없는 점이 장점이지만 코드가 Block된다는 점이 개발자에게 부담으로 다가올 수 있습니다. 낙관적 잠금(Optimistic Lock) 낙관적 잠금은 동시에 데이터를 수정하지 않을 것이라고 낙관적으로 판단하여 잠금을 거는 방식을 말합니다. 데이터베이스에 락을 거..
재고가 한 개 남은 물건을 동시에 여러명이 장바구니에 담으면? (feat. MySql User Level Lock) 재고 차감 동시성 문제 A라는 상품이 현재 창고에 3개가 남아있는데 이 상품을 동시에 10명이 구매하려고 장바구니에 추가하면 개발자는 먼저 주문한 3명의 장바구니에만 상품이 담기는 결과를 원할 것 입니다. 그러면 원하는 결과가 나오는지 한번 테스트 해보겠습니다. 아래는 테스트를 위한 테이블 입니다. 상품과 주문 테이블은 1:N의 구조입니다. 동시에 10명이 1이라는 id를 가진 상품을 장바구니에 담으려고 시도할 때 아무런 조치를 취하지 않고 단순히 상품의 재고와 현재 주문된 상품의 차이를 통해 재고를 차감시켰을때 결과 입니다. public int addOrder(Long productId) { if(validationQuantity(productId)) { orderMapper.addOrder(produ..