- lessonReservation 프로젝트 기본 구조 설계
- DDD 패키지 구조 설계 및 생성
- applicationInfra (공통 인프라)
- lesson (수업 도메인)
- reservation (예약 도메인)
- checkin (체크인 서브도메인)
- member (회원 도메인)
systemNotice (시스템알림메세지 서브도메인) // 향후 추가- checkin (체크인 도메인)// 0826 예약 도메인의 서브도메인으로 이동
- Docker 환경 설정 (MySQL + Redis)
- 기본 설정 파일들 생성 (application.yml, build.gradle 등)
- BaseEntity 추상 클래스 생성 (JPA Auditing)
- Redis, Swagger 설정 클래스 구현
- lessonReservation 프로젝트 도메인 설계
- Exception Infra 구현
- 도메인 설계
- DDL, 샘플데이터DML 작성
- 엔티티들 구현
- security with jwt
- 도메인 Exception 클래스 구현 및 엔티티에 적용(AuthException 미구현)
- 수업 정원 수정에 대한 고민:
- 정원 수정시 예약회원들의 확정 <-> 대기 상태 변경이 이뤄져야 함.
- 정원 감소시 확정상태의 예약자의 상태변경+대기큐 변경 필요.
- 지금은 정원 증원수를 인풋으로 받아 그만큼 대기 큐에서 확정으로 승격만 처리하는 룰 설정
- DDD 규칙 준수를 위한 구조 개선:
- ReservationDomainService 및 CheckinDomainService 도메인 서비스 생성
- Aggregate 경계 위반 문제 해결 (예: Reservation에서 lesson.isReservable() 직접 호출 제거)
- 엔티티 책임 명확화: 각 엔티티는 자신의 상태와 불변식만 관리
- 도메인 서비스를 통한 여러 Aggregate 간 협력 로직 처리
- JUnit5 + AssertJ + Mockito 기반 단위 테스트 작성
- Member 엔티티 단위 테스트 작성 (MemberTest.java)
- 회원 생성, 검증, 도메인 메서드 테스트
- Password 단위 테스트 작성 (PasswordTest.java)
- 비밀번호 생성, 암호화, 일치 확인, 변경, 불변성 테스트
- Lesson 엔티티 단위 테스트 작성 (LessonTest.java)
- 수업 생성, 검증, 상태 변경, 도메인 메서드 테스트
- Reservation 엔티티 단위 테스트 작성 (ReservationTest.java)
- 예약 생성, 취소, 확정, 체크인 가능 여부 테스트
- Checkin 엔티티 단위 테스트 작성 (CheckinTest.java)
- 체크인 생성, 검증, 도메인 메서드, 비즈니스 시나리오 테스트
- 도메인 서비스 테스트 코드 작성:
- ReservationDomainServiceTest: 예약 생성/취소/확정 검증 로직 테스트
- CheckinDomainServiceTest: 체크인 시간/자격 검증 로직 테스트
- Member 엔티티 단위 테스트 작성 (MemberTest.java)
- security with jwt
- Lesson Repository, DTO, Application Service 구현
- Member Repository, DTO, Application Service 구현
- Lesson Repository, DTO, Application Service 단위테스트
- Member Repository, DTO, Application Service 단위테스트
- Reservation Repository, DTO, Application Service (Query) 구현
- Application Service(Command) 구현 중 - redis 분산락, 캐싱
- Reservation Repository, DTO, Application Service (Query) 단위테스트
- Application Service (Command) 구현 - redis 분산락, 캐싱
- Application Service (Command) 단위테스트 & 통합테스트(Testcontainers-MySQL, Redis)
- Event Driven Architecture 적용
- 수업 캔슬 시 해당 수업의 모든 예약 취소 처리
- 수업 정원 증가 시 대기열에서 확정으로 승격 처리
- 회원 비활성화 시 해당 회원의 모든 예약 취소 처리
- Checkin Repository, DTO, Application Service 구현
- service 메서드 DTO 반환으로 수정 및 테스트코드 수정
- 로그인/로그아웃 DTO~컨트롤러까지 구현
- 관리자(admin) 관련 세팅
- 로그인: Admin 이메일로 로그인 → JWT 토큰에는 이메일만 저장
- API 요청: JWT 토큰을 헤더에 포함하여 요청
- 토큰 검증: 토큰 디코딩하여 회원 이메일 추출 -> MemberRepository에서 회원 객체 조회
- Admin 판별: 조회한 객체의 ID가 -1L과 일치하는지 확인
- 권한 부여: Admin이면 런타임에 ADMIN 권한 부여
- 단위 테스트 구현
- redis 캐시 TTL 설정 - 수업 시작시간으로 설정해 수업 시작 후에는 자동 삭제
- 도메인 컨트롤러 구현
- adminController, (일반회원 또는 퍼블릭)Controller 따로
- 도메인 컨트롤러 단위 테스트 구현
- 캐시 셀프 힐링
- 캐시 셀프 힐링 로직 추가 위해 파람으로 수업id 대신 수업 객체 받는 것으로 수정
- 연관된 모든 코드 수정
- 없는 수업이거나, 예약불가인 수업(즉 캔슬되거나 수업이 시작하여 캐시가 삭제/만료된 수업)은 셀프힐링 제외
- role-based 시큐리티 적용
- ADMIN역할 구분
- ADMIN controller 접근 권한 제어
- 시큐리티 설정 클래스 수정
- 전체 플로우 통합테스트
- SystemIntegrationTest.java 작성 및 설정 세팅
- 멱등성보장 필터 추가
- 30초 이내 동일 요청(요청 헤더에 포함된 멱등성 키가 같은)에 같은 리스폰스 주기 위해 레디스에 응답 캐싱
- 문서 정리
- README.md 업데이트
- 설계 결정 사항 문서화
- 성능 고려사항 정리
- 미완 항목 및 개선 방안 정리