카테고리 없음

Java와 MySQL로 구현한 공연 예매 시스템 프로젝트 회고

superpark 2026. 5. 31. 21:44

유레카 백엔드 비대면 [5/18-5/20]

오늘 배운 것(TIL)

공연 예매 시스템을 기획부터 구현까지 진행하며, 단순히 기능을 만드는 것을 넘어 사용자와 데이터의 흐름을 설계하는 법을 깊이 있게 배웠다.

※  주요 구현 내용

  1. MVC 패턴 설계: View(Swing), Controller(Event 처리), Model(데이터 로직)을 분리하여 코드의 가독성과 확장성을 높였다. 객체지향적인 설계가 왜 중요한지 체감할 수 있었다.
  2. 데이터베이스 연동: MySQL을 사용하여 실제 데이터를 CRUD(생성, 읽기, 수정, 삭제)하는 과정을 구현했다. 특히 예매 시 좌석 상태를 업데이트하는 트랜잭션 개념이 핵심이었다.
  3. 권한 관리 로직: 사용자마다 접근 가능한 범위를 다르게 설정(관리자/일반 사용자)함으로써 시스템 보안의 기초를 다질 수 있었다.

★ 어려웠던 점 & 해결 방법

  • 문제: 좌석을 선택하고 예매가 완료되는 시점에 동시성 이슈가 발생할 수 있다는 점을 인지했다.
  • 해결: 이를 해결하기 위해 예매 처리 시점에 상태값을 확인하는 로직을 보완하고, SQL 쿼리를 최적화하여 데이터 무결성을 유지하는 법을 익혔다.

!  느낀 점

단순히 코드를 짜는 것보다, 사용자의 예매 여정을 그려보고 그에 맞는 DB 구조를 짜는 것이 진정한 백엔드 역량이라는 것을 깨달았다. 다음에는 이 시스템을 웹 프레임워크로 옮겨 더 발전시켜 보고 싶다.

 

1.시스템 아키텍처 

sequenceDiagram

participant User as 사용자(View)

participant Ctrl as Controller

participant Svc as Service

participant DAO as DAO

participant DB as MySQL(DB)

User->>Ctrl: 1. 예매 요청(버튼 클릭)

Ctrl->>Svc: 2. 비즈니스 로직 호출

Svc->>DAO: 3. 데이터 접근 요청

DAO->>DB: 4. SQL 쿼리 실행

(SELECT/INSERT) DB-->>DAO: 5. 결과 반환

DAO-->>Svc: 6. 데이터 전달

Svc-->>Ctrl: 7. 결과 로직 처리

Ctrl-->>User: 8. 예매 완료 화면 출력

 

2. ERD(Entity Relationship Diagram):

  • 데이터베이스 테이블 간의 관계(예: 사용자, 공연, 예매 테이블 간의 관계)를 보여주는 ERD

 

핵심 기능 시연

 

 

 

고민했던 부분 

1. 직면했던 기술적 난관: 동시성 이슈

시스템을 만들면서 가장 먼저 부딪힌 문제는 "여러 사용자가 동시에 같은 좌석을 선택할 때"였습니다. 두 명의 사용자가 같은 좌석을 동시에 클릭했을 때, 둘 다 예매가 성공 처리된다면 시스템의 신뢰도가 크게 떨어질 것이라 판단했습니다.

2. 고민과 해결: SQL 쿼리의 힘

처음에는 단순히 UPDATE만 수행했지만, 이 방식으로는 동시성 문제를 해결할 수 없었습니다. 고민 끝에 상태값 확인과 업데이트를 원자적(Atomic)으로 수행하도록 로직을 개선했습니다.

  • 기존 방식: 단순히 좌석 상태를 변경하는 쿼리
  • 개선된 핵심 쿼리:

위와 같이WHERE 절에 status = EMPTY조건을 추가했습니다. 이를 통해 DB는 현재 좌석이 정말로 비어있을 때만 업데이트를 수행하게 되고, 만약 이미 다른 사람이 예매했다면 업데이트 결과값이 0이 되어 중복 예매를 완벽하게 차단할 수 있었습니다.

 3. 그 외의 고민들
이외에도 시스템의 효율성과 보안을 위해 두 가지 지점을 더 고민했습니다.

권한별 로직 분리: 관리자, 상담원, 일반 회원'의 기능을 효율적으로 분리하기 위해 Controller 단에서 세션 정보를 확인하여 Service 레이어에 대한 접근을 제어했습니다. 보안과 유지보수성을 모두 잡은 구조였습니다.

데이터 추출 최적화: 매출 통계 등을 구할 때, 애플리케이션 내에서 루프를 돌며 계산하는 대신 SQL의 JOIN과 GROUP BY를 활용해 데이터베이스 단에서 연산 결과를 가져오도록 쿼리를 최적화했습니다. 덕분에 성능이 훨씬 개선되었습니다.

4. 회고하며
이번 프로젝트를 통해 좋은 코드는 동작하는 코드 그 이상을 고민하는 것임을 배웠습니다. 앞으로도 단순히 기능을 구현하는 개발자가 아니라, 시스템의 안정성과 확장성까지 고려하는 개발자로 성장하고 싶습니다.