전체 글 83

[Spring, Redisson] e-커머스 동시성 이슈 분석 및 제어 방법

동시성 이슈일반적으로 생각할 수 있는 동시성 이슈는 여러 프로세스나 스레드가 동시에 실행될 때 이를 비즈니스 로직이나 프로그램에서 처리하지 못해 의도하지 않는 결과가 나오는 상황이라고 생각합니다. 간단한 예시로 들어보자면 콘서트장에서 자리를 예약할 때 여러명이 같은 자리 예매에 성공했다면 그 자리는 누가 앉아야할까요? e-커머스 동시성 이슈 발생 시나리오그렇다면 일반적인 e-커머스에서는 어떤 동시성 이슈들이 발생할 수 있는지 살펴볼까요?잔액이 5,000원인 상황에서 5,000원짜리 물품에 대해 구매하기 버튼을 실수로 두 번 눌러버렸다.재고가 하나 남은 상품을 여러명이 동시에 구매했다.물론 실제 e-커머스 시스템들이 겪는 동시성 이슈는 더 많이 있겠지만 제일 중요한 "돈"과 "상품"에 집중해서 위 두 가지..

개발/항해99 2024.10.30

항해 플러스 백엔드 (4주차 WIL)

4주차 WIL 4주차 KPT를 정리합니다.   1. 문제 (과제, 프로젝트를 진행하면서 부딪혔던 기술적인 문제) 요구사항E-Commerce 시스템 분석 및 설계 자료를 기반으로 기능구현 3주차에 진행한 산출물 베이스로 실제 서버를 구축합니다. 동시성이나 데이터 인덱싱과 같은 고도화는 이후 구현하며각 기능의 완성에 집중합니다. 2. 시도 CQRS 패턴을 적용하려 시도했습니다. 물론 구현 난이도가 있기 때문에 Command DTO의 활용과 Reader, Store를 분리해읽기와 쓰기 Repo를 나눠 사용하였습니다. 물론 단일 DB에서의 효용성은 없겠지만 이후 확장성이나 학습에 목표를 두어 구현을 시도했습니다.  3. 해결 이번 주차에 잘못된 ERD 설계로 Clean한 기능 구현을 하지 못했습니다. 잘못된 E..

개발/항해99 2024.10.19

항해 플러스 백엔드 (3주차 WIL)

3주차 WIL 3주차 KPT를 정리합니다.   1. 문제 (과제, 프로젝트를 진행하면서 부딪혔던 기술적인 문제) 요구사항E-Commerce 시스템 분석 및 설계시퀀스 다이어그램, ERD, 프로젝트 마일스톤 등 기초 산출물 작성 이번주차부터는 이어지는 과제로 분석 - 설계 - 구현의 순서대로 진행이 되는 것 같습니다. 첫 주차는 앞으로 만들 E-commerce 시스템에 대한 설계 부분으로어떤 기술을 채택하는지, 패키지 구조는 어떻게 가져가는지 등 전반적인 구조를 잡습니다. 시퀀스 다이어그램이나 API 명세 작성을 실무에서는 많이 안해봐서 어려움을 좀 겪었습니다. 2. 시도 일반 워드, 엑셀, PPT로만 산출물을 작성해봤지 readme.md 등에 작성하고공유하기 위한 "실용성있는" 산출물은 작성해보지 못했습..

개발/항해99 2024.10.12

항해 플러스 백엔드 (2주차 WIL)

2주차 WIL 2주차 KPT를 정리합니다.    1. 문제 (과제, 프로젝트를 진행하면서 부딪혔던 기술적인 문제) 요구사항아키텍처 준수를 위한 애프리케이션 패키지 설계동시성을 고려한 특강 조회 및 신청 API 서버 구현 1주차와 마찬가지로 단순 기능 구현에 대한 어려움은 없었습니다. 하지만 다른 온라인 강의를 통해 보기좋은 패키지 설계에 대해 살짝만 알았을 뿐DIP와 OCP를 준수하기 위한 노력은 하지 안았기에 구조 자체를 잡게 너무 어려웠습니다. 또한 이전엔 애플리케이션단에서의 Lock을 구현했다면, 다중 인스턴스에서의 동시성 제어를 위해DB Lock과 Redis를 사용했는데 둘 다 고민을 크게 하지 않고 사용했던터라 어려움을 많이 겪었습니다. 2. 시도 공개 Q&A에서 힌트를 얻어 다음과 같이 패키지..

개발/항해99 2024.10.09

항해 플러스 백엔드 (1주차 WIL)

1주차 WIL 9월 21일 항해 플러스를 시작으로 1주간의 KPT를 정리합니다.    1. 문제 (과제, 프로젝트를 진행하면서 부딪혔던 기술적인 문제) PointService를 정상 동작하게 구현하는 Default 과제는 어렵지 않게 해결했습니다. 이후 Step1~Step2인 동시성 제어에서 다뤄본 적이 없었기에 어떠한 방법을 사용해야 하는지전혀 감이 오지 않았습니다. 공개 Q&A 덕분에 ConcurrentHashMap과 Lock에 대한 Keyword를 얻었지만동시성, 순차성 등 용어의 혼선으로 실패만 되는 테스트 케이스에 부딪혔습니다. 2. 시도 처음엔 UserId와 UserPoint 객체를 가지는 ConcurrentHashMap만을 사용하여 로직을 구현하였습니다. 하지만 이는 순차성을 보장할 순 없었..

개발/항해99 2024.09.28

백엔드 6기 WIL (시작하는 마음)

지금까지의 회고당연히 핑계겠지만 개발에 대한 욕심만 있고 SI 특성상 성장하기 힘든 환경탓만 해왔습니다. 정말 성장하고 싶지만 전공자도 아니고, 주변에 도움을 받을 수 있는 사람도 없기에 항상 "어떻게?"가 저의 발목을 붙잡았고 그 핑계로 일만 열심히 하는 성실한 노예가 되었습니다. 성실한 노예가 된 덕분에 회사에서의 인정과 작은 규모의 기업에서는 드문 파격적인 연봉 인상도 받았습니다. 그렇게 1년이 지난 지금 사내 에이스라는 정말 작은 우물안에 갇혀 폐사 직전의 왕자 개구리가 되었습니다. 항해플러스 참여 계기그러던 와중 우연히 광고 배너를 통해 항해99 알고리즘 스터디에 참여하게 되었고 성장에 대한 방향성을 몰라 그저 제자리에 서있던 저에게 아주 큰 동기부여가 되었고 40일간 TIL 전부 제출, 알고리..

개발/공부 2024.09.21

99클럽 코테 스터디 40일차 TIL + Greedy(Optimal Partition of String)

오늘의 과제리트코드 medium으로 분류된 Optimal Partition of String 입니다. 이번 유형은 그리디 입니다.문제https://leetcode.com/problems/optimal-partition-of-string/description/ 먼저 문제 요구사항 요약입니다. 문자열이 주어질 때 각 문자가 하나의 파티션에 최대 한 번씩만 등장하도록 파티션을 나눈 후 파티션의 개수를 반환하는 문제입니다. 먼저 살펴보아야 할 부분은 각 파티션에 문자가 중복되지 않게 어떻게 나누는가? 입니다. 문제의 유형이 그리디인만큼 매번 최선의 선택을 해야 하는데 제약 조건인 "문자가 중복되지 않는다"에 포커스를 맞추면 매우 쉽게 풀 수 있습니다. 문자열이 주어지면 contains를 통해 중복 여부를 확인하..

99클럽 코테 스터디 39일차 TIL + Heap(Reduce Array Size to The Half)

오늘의 과제리트코드 medium으로 분류된 Reduce Array Size to The Half 입니다. 이번 유형은 힙 입니다.문제https://leetcode.com/problems/reduce-array-size-to-the-half/description/ 먼저 문제 요구사항 요약입니다. 배열이 주어질 때 크기를 절반 이하로 줄이기 위해 제거해야 할 최소 요소 수를 반환하는 문제입니다. 요소를 최소한으로 줄이기 위해 가장 많이 중복되는 요소를 먼저 찾습니다.// 빈도수 계산Map freqMap = new HashMap();for (int num : arr) { freqMap.put(num, freqMap.getOrDefault(num, 0) + 1);} 문제의 예시인 {3, 3, 3, 3, 5..

99클럽 코테 스터디 38일차 TIL + Heap(Seat Reservation Manager)

오늘의 과제리트코드 medium으로 분류된 Seat Reservation Manager 입니다. 이번 유형은 힙 입니다.문제https://leetcode.com/problems/seat-reservation-manager/description/  먼저 문제 요구사항 요약입니다. 좌석 예약 프로그램을 디자인합니다. 초기화 함수, 예약, 예약 취소 함수를 구현하면 되는데 예약시에는 가장 낮은 번호의 좌석 번호 순서대로 숫자를 반환합니다. 자료구조로서 힙은 최소 힙 혹은 최대 힙을 사용할텐데 문제의 요건을 보면 "가장 낮은 번호 순서대로" 좌석을 예약한다라고 나와있으니 최소 힙으로 사용하도록 하겠습니다. 이전 문제에서 사용했던 우선순위 큐를 사용할텐데 초기화시 정렬 순서에 따라 정렬된 값을 반환해주는 특성을 ..

99클럽 코테 스터디 37일차 TIL + 스택/큐(Minimum Add to Make Parentheses Valid)

오늘의 과제리트코드 medium으로 분류된 Minimum Add to Make Parentheses Valid 입니다. 이번 유형은 스택/큐 입니다.문제https://leetcode.com/problems/minimum-add-to-make-parentheses-valid/description/  먼저 문제 요구사항 요약입니다. 짝이 맞거나 맞지 않은 괄호가 주어질 때 삽입이나 이동을 통해 온전한 괄호를 만들 수 있는 최소 이동 횟수를 반환하면 됩니다. 문제의 분류가 스택이고 스택 단골 문제인 괄호가 나왔으니 스무스하게 풀어주면 됩니다. 스택 기초 문제로는 짝이 맞는 문자열이라면 true, 맞지 않는다면 false를 반환하는 문제에서 조~금 심화 문제인데 기존의 공식과 똑같이 진행하면 됩니다. 먼저 (를..