🚀 팀 프로젝트 전체 회고
잘 지킨 부분
- 기능별 패키지 구조 개선: 디렉토리로 체계적 분리
- 개별 브랜치 관리: 브랜치로 독립적 작업 진행
- 코드 리팩토링 시도: 중복 코드 제거 및 구조 개선 노력
개선이 필요한 부분
- 동시 작업으로 인한 충돌: 같은 기능을 여러 명이 작업하여 코드 충돌 발생
- 작업 현황 공유 부족: 리팩토링 진행 상황이 팀원들에게 충분히 공유되지 않음
- 그라운드 룰 준수 미흡: 코드 변경 전 사전 논의 과정 부족
프로젝트 목표 달성도
1. "개인의 성장이 아닌 팀의 성장에 집중하기"
- 현실: 개별 작업이 많아 팀 성장보다는 개인 작업에 치중
- 개선필요: 서로의 코드 리뷰하고 지식 공유하기
2. "컴한 화려한 프로젝트보다 기본이 단단한 프로젝트 만들기"
- 잘한 점: 기본적인 CRUD, 페이징, 검색 기능 구현
- 점검필요: 코드 구조가 정말 단단한가? (현재 리팩토링 중)
3. "싸우지 않기, 예쁘게 함 말 하기"
- 잘한 점: 큰 갈등 없이 진행
- 더 나아가기: 건설적인 피드백 문화 만들기
그라운드 룰 준수도
1. "회의 시 1인 1건 제시하기"
- 점검: 회의에서 모든 팀원이 의견을 냈는가?
2. "이슈 사항 or 수정 사항은 바로 공유하고"
- 아쉬운 점: 카트/주문 기능 리팩토링 시 사전 공유 부족
3. "출결 이슈 사전 공유하기"
- 잘한 점: 대체로 잘 지켜진 것 같음
4. "공지 메시지는 확인 후 꼭 이모지 표시하"
- 점검: 단톡방에서 잘 지켜지고 있는가?
5. "일간 미팅하기"
- 아쉬운 점: 매일 미팅이 제대로 이루어졌는가?
앞으로의 액션 플랜
즉시 실행
- 코드 변경 전 팀원들에게 미리 알리기
- 매일 오전 10분 스탠드업 미팅 재개
- 이슈 사항 즉시 공유 문화 정착
다음 스프린트부터
- 코드 리뷰 의무화
- 페어 프로그래밍 도입
- 지식 공유 세션 진행
📦 내가 맡은 도메인: 주문 처리 (Checkout & Reservation)
1. 구현 기능
1-1. 장바구니 → 주문 생성 전환
- 선택된 cartId 목록을 세션에 저장해 /reservation 으로 이동
- 총 금액 계산 후 Order · OrderItem · Reserve · Payment 4개 테이블에 일괄 INSERT
1-2. 주문 완료 처리
- 주문 완료 시 장바구니 초기화
- 결제 성공 직후 removeCartItems(selectedIds) 호출해 DB·결제UI 동시 정리
1-3. 주문 상세내역 페이지 (orderDetail.jsp)
- 객실명 · 체크인/체크아웃 · 결제금액 · 리뷰 가능 여부 표시
1-4. 결제 완료 페이지 (payment_success.jsp)
- 예약번호, 숙소·객실 썸네일, 결제요약, ‘예약 목록으로 이동’ CTA 제공
1-5. 주문 목록 (orderList.jsp) / 주문 상세 조회
- “주문 상태 – 숙소명 – 체크아웃 D+N” 카드형 리스트, Ajax 페이징
- 결제 상태 · 주문일자 · 리뷰 가능 여부 DB 반영
1-6. 회원/비회원 예약 내역 조회
- 비회원: 첫 이용 시 임시 고객 생성 → 쿠키(nonMemberId)에 id 저장
- 조회 로직
- 로그인 회원 있음: 회원 주문만 표시
- 로그인 없음: 쿠키 없음 → “예약 내역 없음” 출력
- : 쿠키 존재 → 비회원 주문 표시
1-7. 트랜잭션 처리
- @Transactional 어노테이션으로 한 번에 commit → 일관성 보장
2. 설계
2-1. 핵심 클래스
- ReservationController: 화면 전환 · 세션 관리
- OrderService & OrderServiceImpl: 비즈니스 로직 단일 진입점, @Transactional
- ShoppingCartService: 장바구니 CRUD, 주문 완료 시 정리 담당
2-2. 주문 생성 플로우
- cartItems 로부터 totalPrice 계산
- orders → order_items 순차 INSERT 후 key 취득
- 각 item당 Reserve · Payment 레코드 생성 (Mapper 분리)
- 성공 시 commit, 예외 시 rollback
2-3. 리뷰 작성 가능 로직
- OrderServiceImpl.calculateReviewEligibility()
- 체크아웃 + 7일 이내 여부 계산해 canWriteReview 플래그 세팅
2-4. DB 설계
- orders (PK: order_id)
- order_items (PK: item_id, FK: order_id)
- reserves (PK: reserve_id, FK: room_id)
- payments (PK: payment_id, FK: reserve_id)
2-5. 예외·Validation
- 중복 결제에 대한 IllegalArgumentException 으로 명확히 전달
2-6. 화면(View)
- JSP + JSTL ▶ header/footer 공용 fragment 재사용
- 예약/결제 화면 하단 ‘결제하기’ 버튼 disabled → 필수 입력 검증 후 enable
👩💻 협업 시 느낀 점
- Cart·Room 도메인 담당자와 JSON 필드 정의 & URI 규칙 조율이 중요했다.
- Git Flow(feature → develop → main) 적용 덕분에 merge conflict 최소화, PR 단위도 작게 유지해 리뷰 효율 ↑
💡 개인 회고
- Spring @Transactional 의 편리함과 동시에, “하나의 트랜잭션 = 하나의 도메인 시나리오” 원칙을 지키려 노력했다.
- 처음에는 단순 카트 삭제만 했는데, “결제 실패 시 카트 복구” 요구사항을 놓쳐 RollbackFor 설정을 추가로 고민하게 됐다. 실패 시점별 예외 클래스를 세분화한 경험이 기억에 남는다.
- 직접 JSP를 열어보고 mock 데이터를 띄워보니 로직-화면 간 미스매치를 빠르게 찾을 수 있었다. 백엔드라도 화면을 보는 습관의 중요성을 깨달았다.
- 다음 스프린트에서는 테스트 코드(JUnit + MockMvc)를 더 촘촘히 작성해 회귀 버그를 줄이고 싶다. 현재 OrderServiceTest가 부족해 리팩터링 때 위험 부담이 있었다.
- 전반적으로 ‘주문-결제-재고’ 프로세스를 처음부터 끝까지 설계-구현해 보며 트랜잭션 설계, DB 정규화, RESTful URL 설계의 중요성을 체감했다. 이 경험이 이후 대용량 트래픽 서비스 설계 시 큰 도움이 될 것 같다.
- 다음에 시도할 것들을 정리해보면 아래와 같다.
- 데일리 스탠드업 미팅 실시
- PR 템플릿 적극 활용
- 실시간 소통 채널 활성화
- 작업 전 이슈 등록
- 코드 리뷰 의무화
- API 문서 자동화 (Swagger)
- 단위 테스트 습관화
'Project > YaNubJa - ep 1' 카테고리의 다른 글
| [커널아카데미] 백엔드 12기 13주차 - YaNubJa : ep.2 (0) | 2025.06.23 |
|---|---|
| [커널아카데미] 백엔드 12기 12주차 - YaNubJa : ep.1 (0) | 2025.06.15 |