Skip to content

JaeBaeWon/backend

Repository files navigation

🎟️ 티켓팅 플랫폼 백엔드

📑 목차

  1. 서비스 개요
  2. 기획 배경
  3. 기존 서비스와의 차별점
  4. 주요 기능
  5. 핵심 기능 구현

🎟️ 서비스 개요

클라우드 환경 기반 고가용성 티켓팅 플랫폼
대규모 동시 접속 환경에서 안정적인 좌석 선점, 예매, 결제 기능을 제공.


📌 기획 배경

🎭 공연 산업 성장

  • 전년도 동분기 대비 306억 원 증가
  • 대형 공연뿐 아니라 중소형 공연 시장도 확대 중

🚀 신규 플랫폼의 등장

  • 우리은행 티켓팅 플랫폼 진출 예정
  • 중소형 공연과의 상생 가치 실현 가능

🔎 기존 서비스와 차별점

1. 피싱 사이트 피해 방지

  • 공연 알림 예약 시, 공식 예매 사이트 주소를 메일로 발송
  • 사용자가 안전하게 바로 접속 → 피싱 위험 최소화

2. 잔여석 확인의 어려움 해결

  • 기존 사이트: 잔여석 확인 불편
  • 본 플랫폼: 상세 페이지 UI에서 즉시 확인 가능

3. 결제 단계 이전의 이선좌 문제 해결

  • 기존: 결제 단계에서 이선좌 발생 → 다시 좌석 선택 필요
  • 개선: 좌석 선택 시 즉시 이선좌 여부 확인 가능

백엔드 아키텍처

image

🛠️ 주요 기능

✅ 피싱 방지 프로세스

image image

✅ 잔여석 확인 UI

image

✅ 실시간 이선좌 방지

image

⚙️ 핵심 기능 구현

좌석 선점 동시성 제어

  • 인기 티켓팅 환경에서 한 좌석에 다수 사용자가 동시에 요청 → 동시성 이슈 발생
  • 해결책: Redis 분산락(Redisson) 적용

🔑 핵심 코드

// Redis Lock으로 좌석 이선좌 관리
public boolean tryLockSeat(Long seatId) {
    RLock lock = redissonClient.getLock(SEAT_LOCK_PREFIX + seatId);
    String seatKey = SEAT_STATE_PREFIX + seatId;

    try {
        if (lock.tryLock(1, 10, TimeUnit.SECONDS)) {
            String seatStatus = redisTemplate.opsForValue().get(seatKey);

            if (!"RESERVED".equals(seatStatus)) {
                // Redis에 임시 선점 상태 저장 (TTL: 5분)
                redisTemplate.opsForValue().set(seatKey, "RESERVED", 5, TimeUnit.MINUTES);
                return true;
            }
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } finally {
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
    return false;
}

🧪 JUnit 테스트 결과

image image image image
  • 동시 요청 테스트 (100좌석 × 100명 요청)
image image
  • 결과: 모든 좌석이 단 한 명만 선점 성공

⚠️ 추후 고려사항

  • 현재 Redis Lock TTL = 5분

  • 문제 상황:

    • 사용자가 선점 성공 후 결제 전에 오류로 이탈 → 유령락(ghost lock) 발생

    • 해당 좌석은 5분간 선점 불가 → 매출 손실 위험

➡ 대응 방안 필요

  • 장애 감지 시 락 강제 해제 로직

  • 결제 흐름과 선점 상태를 실시간 동기화

  • 일정 주기 점검(batch)으로 유령락 복구

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages