Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ Generated by IntelliJ AI based on repository scan (2025-08-31 16:52)
- DTO(요청/응답/커맨드)는 현재 domain에 위치하며 컨트롤러에서 변환하여 사용 (근거: policy 문서).
- 영속성(JPA)
- 의존성: `spring-boot-starter-data-jpa`, DB: MySQL(H2 for test), P6Spy (근거: `build.gradle`)
- 저장소 규약: Spring Data Repository 인터페이스는 `app/persist`에 위치 (예: `MemberRepository`, `MovieRepository`).
- 트랜잭션 경계는 app 서비스 (예: `MovieCommandRepository`에 `@Transactional`).
- 저장소 규약: Spring Data Repository 인터페이스는 `app/persist`에 위치 (예: `MemberRepository`, `ShowRepository`).
- 트랜잭션 경계는 app 서비스 (예: `ShowCommandRepository`에 `@Transactional`).
- 보안(Spring Security/JWT)
- JWT 파싱/인증: `adapter/security/JwtFilter`가 Authorization 헤더 `Bearer <token>` 처리 (근거 파일).
- SecurityFilterChain 설정과 우선순위: `SecurityConfig`
Expand All @@ -73,8 +73,9 @@ Generated by IntelliJ AI based on repository scan (2025-08-31 16:52)
에이전트가 코드를 작성할 때 반드시 준수해야 하는 가독성 중심 규칙입니다.

5.1 네이밍
- 클래스/인터페이스: 명확한 도메인 언어 사용 (예: MovieRegisterer, PaymentGatewayClient)
- 메서드: 동사+목적어 (예: registerMovie, validateToken, findMemberByEmail)

- 클래스/인터페이스: 명확한 도메인 언어 사용 (예: ShowRegisterer, PaymentGatewayClient)
- 메서드: 동사+목적어 (예: registerShow, validateToken, findMemberByEmail)
- 변수/필드: 축약 금지, 문맥 명확히 (예: memberEmail, jwtTokenSecret)
- 테스트 메서드: 시나리오 기반 네이밍 (예: shouldFailWhenPasswordIsInvalid)

Expand Down Expand Up @@ -198,7 +199,7 @@ docker compose up -d

- 파일/이름 규칙
- API 스펙: `docs/specs/api/<resource>_<action>.md` 또는 엔드포인트 의미가 드러나는 snake_case 파일명 사용
- 근거: `docs/specs/api/login.md`, `member_register.md`, `movie_register.md`, `reissue.md`
- 근거: `docs/specs/api/login.md`, `member_register.md`, `show_register.md`, `reissue.md`
- 정책 문서: `docs/specs/policy/<topic>.md`
- 근거: `docs/specs/policy/application.md`, `authentication.md`, `authorization.md`, `test.md`
- 도메인 설계: `docs/specs/domain.md`
Expand All @@ -208,7 +209,7 @@ docker compose up -d
2) 요청 섹션 구성
- 메서드, 경로, 헤더 코드블록, 본문 JSON 예시(필수 필드 포맷 포함)
- 실행 가능한 curl 예시를 제공
- 근거 예시: `docs/specs/api/login.md`, `member_register.md`, `movie_register.md`, `reissue.md`
- 근거 예시: `docs/specs/api/login.md`, `member_register.md`, `show_register.md`, `reissue.md`
3) 응답 섹션 구성
- 상태코드 명시, 응답 JSON 예시 제공(필수 필드 포함)
4) 테스트 섹션 구성
Expand Down Expand Up @@ -253,7 +254,7 @@ docker compose up -d
- 실행 불가한 모호한 명령 예시 금지. 검증되지 않은 외부 의존성 언급 금지.

- 예시 스니펫 스타일
- curl: 실제 경로/헤더/본문 포함(예: `docs/specs/api/movie_register.md`의 curl 예시)
- curl: 실제 경로/헤더/본문 포함(예: `docs/specs/api/show_register.md`의 curl 예시)
- JSON: 축약하지 말고 필요한 필드를 명시, 포맷은 pretty 또는 단일 라인 일관 유지.

---
Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
# booking — 영화 예매 시스템 (개요 중심 README)

이 문서는 프로젝트를 어떻게 실행하는지보다는, 이 프로젝트가 무엇인지, 어떤 구성과 아키텍처를 가지는지, 어떤 기술을 왜 선택했는지, 그리고 어떤 방식으로 개발하는지를 설명합니다. 모든 주장은 저장소 내 문서/코드에 대한 링크로 근거를 제시합니다.
# booking — 공연 예매 시스템 (개요 중심 README)

- 저장소 루트: 단일 모듈(Spring Boot) 프로젝트

---

## 1. 프로젝트 소개
영화 예매(Booking) 도메인을 다루는 학습 목적의 Spring Boot 애플리케이션입니다. 헥사고날 아키텍처(Ports & Adapters)를 채택하여 도메인 규칙을 프레임워크로부터 분리하고, 보안/웹/영속성 같은 어댑터 계층을 통해 외부 세계와 상호작용합니다.

공연 예매(Booking) 도메인을 다루는 학습 목적의 Spring Boot 애플리케이션입니다. 헥사고날 아키텍처(Ports & Adapters)를 채택하여 도메인 규칙을 프레임워크로부터 분리하고, 보안/웹/영속성
같은 어댑터 계층을 통해 외부 세계와 상호작용합니다.

- 도메인 개요: [docs/specs/domain.md](docs/specs/domain.md)
- 아키텍처/개발 규칙: [docs/specs/policy/application.md](docs/specs/policy/application.md)
Expand Down Expand Up @@ -41,7 +41,8 @@
---

## 4. 도메인 모델 요약
- Movie (Aggregate Root): 제목, 감독, 장르, 상영시간, 개봉일, 등급, 줄거리, 포스터URL, 출연진 등. 팩토리/커맨드 기반 생성.

- Show (Aggregate Root): 제목, 감독, 장르, 상영시간, 개봉일, 등급, 줄거리, 포스터URL, 출연진 등. 팩토리/커맨드 기반 생성.
- Member (Aggregate Root): 닉네임, userId, email, passwordHash, 권한 목록. 비밀번호 해시 일치 검증.

자세한 속성과 규칙: [docs/specs/domain.md](docs/specs/domain.md)
Expand Down Expand Up @@ -73,8 +74,7 @@ Build/Test 구성 근거: `build.gradle`의 `tasks.named('test')` 설정(Profile
## 7. 보안 개요
- 필터 기반 JWT 인증: `JwtFilter`가 Authorization `Bearer <token>`을 파싱해 SecurityContext 설정.
- 경로별 권한: `SecurityConfig`의 `@Order(1) apiChain`
- 공개: `POST /api/member`, `/api/auth/login`, `/api/auth/reissue`
- 권한 필요: `POST /api/movie`는 `ROLE_DISTRIBUTOR`
- 차후 추가 작성
- 예외 처리: `CustomAuthenticationEntryPoint`, `CustomAccessDeniedHandler`

근거: `src/main/java/org/mandarin/booking/adapter/security/*`
Expand All @@ -97,7 +97,7 @@ Build/Test 구성 근거: `build.gradle`의 `tasks.named('test')` 설정(Profile
- 로그인: [docs/specs/api/login.md](docs/specs/api/login.md)
- 회원 가입: [docs/specs/api/member_register.md](docs/specs/api/member_register.md)
- 토큰 재발급: [docs/specs/api/reissue.md](docs/specs/api/reissue.md)
- 영화 등록: [docs/specs/api/movie_register.md](docs/specs/api/movie_register.md)
- 공연 등록: [docs/specs/api/show_register.md](docs/specs/api/show_register.md)

각 문서 하단의 테스트 체크리스트가 수용 기준입니다.

Expand Down
6 changes: 6 additions & 0 deletions docs/devlog/250904.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
## 예찬

페어 프로그래밍에서 싱글 프로젝트로 전환됐다. 이에 따라서 요구사항을 혼자 제어 가능한 수준으로 좁히고 도메인 영역의 복잡성을 최소화 하기 위해 다양한 추천 시스템이 필요한 영화 예매 서비스 보다는 공연 예매
서비스로 프로젝트를 진행하는것이 추후 도메인 요구사항을 빠르게 쳐내는데에 적합하다고 판단되어 도메인 전환을 진행했다.

기존 Movie 도메인이 Show로 전환된 부분이랑 기타 일부 자잘구리한 변경사항을 제외한다면 아직까지는 큰 변화는 없다. 이 부분에 대해 [도메인 명세서](../specs/domain.md)에 나름 적어봤다.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
### 요청

- 메서드: `POST`
- 경로: `/api/movies`
- 경로: `/api/show`
- 헤더

```
Expand All @@ -19,7 +19,7 @@
- curl 명령 예시

```bash
curl -i -X POST 'http://localhost:8080/api/movie' \
curl -i -X POST 'http://localhost:8080/api/show' \
-H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ0ZXN0MTIzNCIsInJvbGVzIjoiUk9MRV9ESVNUUklCVVRPUiIsInVzZXJJZCI6InRlc3QxMjM0Iiwibmlja05hbWUiOiJ0ZXN0IiwiaWF0IjoxNzU2NDM4MjIzLCJleHAiOjE3NTY0Mzg4MjN9.DN0wZb8BdKY-7Grd0KAALXf88KX3iF_tg6UmcfotkFOlbRoRnSuY1nNVUFfZk2TxP0hvju3A8AglK3mt_hnutQ' \
-H 'Content-Type: application/json' \
-d '{
Expand Down Expand Up @@ -48,7 +48,7 @@
{
"status": "SUCCESS",
"data": {
"movieId": 1
"showId": 1
},
"timestamp": "2024-06-10T12:34:56.789Z"
}
Expand All @@ -57,7 +57,7 @@
### 테스트

- [x] 올바른 요청을 보내면 status가 SUCCESS이다
- [ ] 올바른 요청을 보내면 응답 본문에 movieId가 존재한다
- [ ] 올바른 요청을 보내면 응답 본문에 showId가 존재한다
- [x] Authorization 헤더에 유효한 accessToken이 없으면 status가 UNAUTHORIZED이다
- [x] title, director, runtimeMinutes, genre, releaseDate, rating이 비어있으면 BAD_REQUEST이다
- [x] runtimeMinutes은 0 미만이면 BAD_REQUEST이다
Expand Down
Loading