안녕하세요! 👋
이번 포스팅부터 Spring Boot, JPA, 그리고 Redis를 활용하여 직접 기획하고 구현한 영화 예매 웹 서비스 개발기를 시리즈로 연재해 보려고 합니다.
단순히 동작만 하는 코드를 짜는 것을 넘어, "실제 서비스였다면 마주쳤을 백엔드 문제들을 예비 개발자의 시선에서 어떻게 해결할 것인가?"에 초점을 맞추어 치열하게 고민하고 설계한 과정들을 담아내려 합니다.
이번 1편에서는 전체적인 프로젝트 소개와 핵심 아키텍처 방향성에 대해 이야기해 보겠습니다.
1. 🎬 프로젝트 개요
- 프로젝트 주제: 동시성 제어와 효율적인 예매 만료 처리를 갖춘 영화 예매 백엔드 시스템 개발
- 개발 기간: (개인 프로젝트 진행 기간 기입)
- 주요 목표:
- 견고하고 확장성 있는 DB 설계
- 비즈니스 요구사항을 정확히 담아내기 위해 개념적·논리적·물리적 데이터베이스 구조 설계 - 동시성 정합성 보장
- 다중 좌석 예매 시 발생할 수 있는 Race Condition(이중 예약)을 방어하기 위한 Redis 분산 락 도입 - 시스템 부하 최소화
- 주기적인 DB 스캔 폴링 방식에서 벗어나, Redis TTL 이벤트 기반으로 동작하는 효율적인 예매 만료(PENDING) 처리
- 견고하고 확장성 있는 DB 설계
2. 🛠️ 사용 기술 스택 (Tech Stack)
- Backend
- Java 17+, Spring Boot, Spring MVC, Spring Data JPA, QueryDSL - Frontend
- Thymeleaf, Bootstrap, HTML/CSS/JS - Database & In-Memory
- MySQL (영구 저장소 / 메인 DB), Redis (분산 락 및 인메모리 캐시 / 만료 이벤트 처리)
※ UI/UX는 Thymeleaf와 Bootstrap을 기반으로 하되, AI 툴의 도움을 받아
효율적으로 구현하여 온전히 탄탄한 백엔드 아키텍처와 로직 설계에 집중할 수 있었습니다!
3. 💡 핵심 고민과 아키텍처 방향성
영화를 예매하는 서비스를 만들면서 가장 먼저 마주친 벽은 "데이터의 무결성"과 "성능"이었습니다. 단순 기능 구현을 넘어, 예비 백엔드 개발자로서 실무에서 마주할 수 있는 기술적 문제들을 직접 부딪히고 해결해 보고자 다음과 같은 방향성을 잡았습니다.
- 데이터베이스 설계의 중요성:
- 영화, 상영관, 좌석, 예매, 회원 간의 복잡한 연관 관계를 어떻게 하면 무결성 깨짐 없이 깔끔하게 담아낼 수 있을까? ERD 작성부터 상세 테이블 정의서까지 뼈대를 단단하게 잡는 데 많은 공을 들였습니다.
- 동시성 제어 (Concurrency Control):
- 여러 사용자가 동시에 같은 좌석을 선점하려 할 때, 중복 예약이 발생하지 않도록 어떻게 막아야 할까?
- DB 락(비관적/낙관적 락)과 인메모리 기반의 Redis 분산 락(Redisson)을 비교하며 가장 적합한 아키텍처를 고민했습니다.
- 결제 대기(PENDING) 상태의 만료 처리:
- 좌석을 선점하고 10분 이내에 결제하지 않으면 자원을 다시 풀어주어야 합니다.
- 매번 1분마다 DB를 긁어오는(Polling) 스케줄러 방식에서 벗어나, 시스템 부하를 최소화할 수 있는 Redis TTL 이벤트 기반 구조로 리팩토링을 진행했습니다.
4. 📚 앞으로의 연재 계획 (Series Roadmap)
이번 시리즈는 다음과 같은 순서로 깊이 있게 다뤄볼 예정입니다.
- [1편] 프로젝트 개요 및 핵심 아키텍처 방향성 (현재 글)
- [2편] 데이터베이스 설계 프로세스 (ERD 및 상세 테이블 정의서)
- [3편] 초기 구현 계획 및 전체 시스템 흐름도 (Architecture & Flow)
- [4편] 동시성 제어의 모든 것 (비관적·낙관적 락 검토 및 Redis Redisson MultiLock 도입기)
- [5편] 성능 개선 리팩토링 (스케줄러에서 Redis TTL 이벤트 & Warm-up으로 진화하기)
- [6편] 뚝딱뚝딱 만들며 깨달은 것들 (프로젝트 후기)
탄탄하게 다져놓은 데이터베이스 설계부터 시작해, 예비 백엔드 개발자로서 치열하게 고민하고 학습했던 기술적 도전들이 차근차근 풀려나갈 예정입니다. 다음 2편인 데이터베이스 설계 프로세스에서 이어뵙겠습니다! 🚀