장바구니와 주문은 클라이언트 UI가 아니라 서버 검증 흐름이 핵심이다

Server Action은 auth() 소유권을 확인하고, 예상 가능한 실패는 직렬화 가능한 결과로 반환하며, 성공 뒤 캐시를 갱신한다.

1

click

AddToCartButton이 bookId와 quantity를 서버 액션에 넘긴다.

2

auth()

세션이 없으면 /login으로 보내고 문자열 userId를 서버에서 꺼낸다.

3

validate

잘못된 ID·수량·재고 부족은 { success: false, message }로 반환한다.

4

upsert

CartItem을 만들거나 수량을 증가시킨다.

5

revalidatePath

cart와 books 경로에 필요한 호출을 명시해 화면을 최신화한다.

동작서버에서 막아야 할 것화면에서 보여줄 것
장바구니 추가없는 책, 재고 초과, 미로그인CartActionResult의 성공·실패 메시지
장바구니 조회Mongoose 문서와 ObjectId의 Client 직접 전달lean() 결과를 문자열 ID·원시 값의 CartItemDto로 변환
수량 변경0 이하 수량, 다른 사용자 항목 수정pending 상태와 실패 결과 복구
주문 생성빈 장바구니, 가격/재고 불일치예상 거절은 결과, 성공은 redirect