Round 2 회고

2025. 11. 7. 16:01·Loopers 2기

회고 

 

요구사항 정리는 한적 있지만

상세하게 작성한적도 없고, 다이어그램은 그려본 적이 한번도 없어서 코드 구현보다 어려운 과제였습니다. 

 

 


1. 좋아요 기능의 멱등성 보장

멱등성이 뭐죠? 

멱등성이란 동일한 연산을 여러 번 수행해도 결과가 달라지지 않는 성질을 말합니다

 

그래서 좋아요 기능의 멱등성 보장은 어떻게 하죠? 

 

멱등성이 보장된다는건 뭐지?

 

- 같은 사용자가 같은 게시물에 좋아요를 100번 눌러도, 좋아요는 딱 1개만 저장되어야 한다는 거라고 합니다. 

 

 

결론: 몇 번을 눌러도 좋아요는 1개만 저장되는 게 멱등성 보장

잘못된 경우 (멱등성 X)

사용자 A가 게시물 1번에 좋아요 3번 클릭
→ DB에 좋아요 3개 저장됨
→ 좋아요 개수 3 증가
→ ❌ 문제!

 

올바른 경우 (멱등성 O)

사용자 A가 게시물 1번에 좋아요 3번 클릭
→ DB에 좋아요 1개만 저장됨
→ 좋아요 개수 1만 증가
→ ✅ 정상!

 

 

그러면 이걸 어떻게 보장하지?

 

가장 확실한 방법:

 

1. DB에 유니크 제약

UNIQUE KEY (user_id, post_id)

 

- 이렇게 하면 같은 사용자 + 같은 게시물 조합은 절대 중복 저장 안됨

 

네트워크 지연으로 똑같은 요청이 2번 와도, 첫 번째만 저장되고 두 번째는 무시됩니다. 

 

2. 애플리케이션 레벨에서 제어 

 

- 좋아요 데이터 존재여부 확인 후 분기 처리


2. 재고 및 포인트 동시성 제어 

여러 사용자가 동시에 주문할 때 발생할 수 있는 문제:

상황: 상품 재고 10개, 사용자 A와 B가 동시에 각각 8개씩 주문

[동시성 제어 없이]
T1: A가 재고 조회 (10개) ✓
T2: B가 재고 조회 (10개) ✓  ← 문제: 둘 다 10개로 보임
T3: A가 재고 차감 (10 - 8 = 2개)
T4: B가 재고 차감 (10 - 8 = 2개)  ← 재앙: 실제로는 -6개여야 함!
결과: 총 16개 판매, 재고는 2개로 표시 → 데이터 정합성 깨짐 ❌

 

🧠 처리 방안

- 비관적 락 적용

[비관적 락 적용 후]
T1: A가 재고 조회 + 락 획득 (10개) 🔒
T2: B가 재고 조회 시도 → ⏳ 대기 (A의 락이 풀릴 때까지)
T3: A가 재고 차감 (10 - 8 = 2개)
T4: A의 트랜잭션 커밋 + 락 해제 🔓
T5: B가 재고 조회 + 락 획득 (2개) 🔒
T6: B가 재고 부족 확인 (2 < 8)
T7: B에게 InsufficientStockException 발생
결과: A만 주문 성공, B는 재고 부족 에러 → 정합성 보장 ✅

 

왜 비관적 락인가?

 

선택 이유:
1. 주문/재고는 충돌 가능성이 높음 (인기 상품일수록)
2. 재시도 로직보다 락으로 확실히 제어하는 것이 안전

 


3. 외부 시스템 연동 실패 시 트랜잭션 롤백

- 주문 생성 후 외부 시스템(배송/결제 등) 연동 필요
- 외부 시스템 장애 시 이미 차감된 재고와 포인트 처리 방법?

 

🧠 처리 방안

외부 시스템 연동을 트랜잭션 범위에 포함하여 연동 실패 시 재고 및 포인트 차감 자동 복원


 

 

블로그 글 작성도 조금 더 발전할 수 있을거 같은데 다음에는 좀 더 시간을 들여서 작성할 수 있도록 해야겠습니다. 

'Loopers 2기' 카테고리의 다른 글

쿠폰 중복 사용 버그, 비관적 락 한 줄로 해결하기  (0) 2025.11.21
재고 차감, 검증은 몇 번 해야 할까?  (0) 2025.11.14
Round 1 회고  (0) 2025.10.31
'Loopers 2기' 카테고리의 다른 글
  • 쿠폰 중복 사용 버그, 비관적 락 한 줄로 해결하기
  • 재고 차감, 검증은 몇 번 해야 할까?
  • Round 1 회고
고구마와 감자
고구마와 감자
Amor DevFati는 김연자-Amor Fati에 Development(개발)의 Dev 를 첨가하여 만든 이름
  • 고구마와 감자
    Amor DevFati(아모르 개발파티)
    고구마와 감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (156)
      • Loopers 2기 (4)
      • 스프링 (5)
      • 알고리즘 (113)
        • 백준 (70)
        • 프로그래머스 (7)
        • 인프런_자바코테강의 (20)
        • 리트코드 (5)
        • 해커랭크 (0)
        • 코드업 (3)
        • 이것저것 (7)
      • 자바 (7)
      • GIT (0)
      • 파이썬 (1)
      • 개발이론 (4)
      • JPA (0)
      • 김영한 강의 (13)
        • 모든 개발자를 위한 HTTP 웹 기본 지식 (2)
        • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (6)
        • 스프링 핵심 원리 - 기본편 (5)
      • 일기 및 아무말 적기 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    1598
    첫 글자를 대문자로
    11023
    백준
    조교는 새디스트야!!
    그대로출력하기2
    3059
    5988
    10178
    고려대학교에는 공식 와인이 있다
    2921
    할로윈의 사탕
    16673
    홀수일까 짝수일까
    스프링 핵심 원리
    14656
    2857
    카이사르 암호
    11966
    10409
    4458
    등장하지 않는 문자의 합
    2의 제곱인가
    꼬리를 무는 숫자 나열
    5361
    1247
    Mini Fantasy War
    전투 드로이드 가격
    더하기 3
    남욱이의 닭장
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고구마와 감자
Round 2 회고
상단으로

티스토리툴바