[스프링 부트 쇼핑몰 프로젝트 with JPA] 8장 정리
장바구니 기능 구현에는 상품 아이디와 수량을 전달받는 DTO 구현, 회원 별 장바구니 생성, 상품 추가 및 수량 증가 메소드, 장바구니 및 상품 조회, 상품 추가 및 삭제 로직 등이 포함됩니다. 장바구니 조회 페이지는 DTO 클래스를 생성하고, 장바구니 상품 정보를 조회하는 쿼리를 작성합니다. 장바구니 상품 삭제는 서비스 로직을 추가하고, 컨트롤러 클래스에 요청 처리 로직을 추가합니다. 장바구니 상품 주문은 주문할 상품 데이터를 전달받아 주문을 생성하고, 주문한 상품은 장바구니에서 제거합니다.
Apr 08, 2024
🌼장바구니 담기
💡핵심 키워드
- 장바구니에 담을 상품의 아이디와 수량을 전달받을 장바구니 상품 DTO를 구현한다.
- 회원 한 명당 장바구니를 1개 가지므로 처음 장바구니에 상품을 담을 때는 해당 회원의 장바구니를 생성해줘야 한다.
- 장바구니 클래스에 회원 엔티티를 파라미터로 받아서 장바구니 엔티티를 생성하는 로직을 추가한다.
- 장바구니 상품 클래스에 장바구니에 담을 상품 엔티티를 생성하는 메소드와 장바구니에 담을 수량을 증가시켜 주는 메소드를 추가한다.
- 장바구니에 기존에 담겨 있는 상품인데, 해당 상품을 추가로 장바구니에 담을 때 기존 수량에 현재 담을 수향을 더해주는 메소드를 추가한다.
- 장바구니 레포지토리에 현재 로그인한 회원의 장바구니 엔티티를 찾기 위해서 쿼리 메소드를 추가한다.
- 장바구니에 들어갈 상품을 저장하거나 조회하기 위해서 장바구니 상품 레포지토리를 생성한다.
- 장바구니에 상품을 담는 로직을 작성하기 위해서 장바구니 서비스 클래스를 생성한다.
- 장바구니에 담을 상품 엔티티를 조회한다.
- 현재 로그인한 회원 엔티티를 조회한다.
- 현재 로그인한 회원의 장바구니 엔티티를 조회한다.
- 상품을 처음으로 장바구니에 담을 경우 해당 회원의 장바구니 엔티티를 생성한다.
- 현재 상품이 장바구니에 이미 들어가 있는지 조회한다.
- 장바구니에 이미 있던 상품일 경우 기존 수량에 현재 장바구니에 담을 수량 만큼을 더해준다.
- 장바구니 엔티티, 상품 엔티티, 장바구니에 담을 수량을 이용하여 장바구니 상품 엔티티를 생성한다.
- 장바구니에 들어갈 상품을 저장한다.
- 장바구니와 관련된 요청들을 처리하기 위해서 장바구니 컨트롤러 클래스를 생성한다.
- 장바구니에 담을 상품 정보를 받는 장바구니 상품 DTO 객체에 데이터 바인딩 시 에러가 있는지 검사한다.
- 현재 로그인한 회원의 이메일 정보를 변수에 저장한다.
- 화면으로부터 넘어온 장바구니에 담을 상품 정보와 현재 로그인한 회원의 이메일 정보를 이용하여 장바구니에 상품을 담는 로직을 호출한다.
- 결과값으로 생성된 장바구니 상품 아이디와 요청이 성공하였다는 HTTP 응답 상태 코드를 반환한다.
🌼장바구니 조회하기
💡핵심 키워드
- 장바구니 조회 페이지에 전달할 DTO 클래스를 생성한다.
- 장바구니 페이지에 전달할 장바구니 세부정보 DTO 리스트를 조회하는 쿼리를 장바구니 상품 리포지토리에 작성한다.
- JPQL을 이용해서 DTO를 반환할 때는 new 키워드와 해당 DTO의 패키지 클래스명을 적어주고, 생성자의 파라미터 순서를 DTO 클래스에 명시한 순으로 넣어준다.
- 장바구니 서비스 클래스에 현재 로그인한 회원의 정보를 이용하여 장바구니에 들어있는 상품을 조회하는 로직을 작성한다.
- 현재 로그인한 회원의 장바구니 엔티티를 조회한다.
- 장바구니에 상품을 한 번도 안 담았을 경우 장바구니 엔티티가 없으므로 빈 리스트를 반환한다.
- 장바구니 아이디로 장바구니에 담겨있는 상품 정보를 조회한다.
- 장바구니 컨트롤러 클래스에 장바구니 페이지로 이동할 수 있는 메소드를 작성한다.
- 현재 로그인한 사용자의 이메일 정보를 이용하여 장바구니 서비스의 장바구니 리스트 조회 메소드를 호출한다.
- 조회한 장바구니 상품 정보를 뷰로 전달한다.
장바구니 목록 페이지 구현
- 장바구니 목록 페이지의 자바스크립트를 작성한다.
- 주문할 상품을 체크하거나 헤제할 경우 총 주문 금액을 구하는 함수를 호출한다.
- 현재 체크된 장바구니 상품들의 가격과 수량을 곱해서 총 주문 금액을 계산한다.
- 장바구니에 들어있는 상품의 수량을 변경 시 상품의 가격과 상품의 수량을 곱해서 상품 금액을 변경해준다.
- 장바구니에 들어있는 전체 상품을 체크하거나 체크 해제하는 함수를 작성한다.
- 장바구니 상품 클래스에 현재 장바구니에 담겨있는 수량을 변경하는 메소드를 추가한다.
- 장바구니 서비스 클래스에 장바구니 상품의 수량을 업데이트하는 로직을 추가한다.
- 현재 로그인한 회원을 조회한다.
- 자바스크립트 코드에서 업데이트할 장바구니 상품 번호는 조작이 가능하므로 현재 로그인한 회원과 해당 장바구니 상품을 저장한 회원이 같은지 검사하는 로직도 작성한다.
- 장바구니 상품을 저장한 회원을 조회한다.
- 현재 로그인한 회원과 장바구니 상품을 저장한 회원이 다른지 체크한다.
- 장바구니 수량을 업데이트한다.
- 장바구니 컨트롤러 클래스에 장바구니 상품의 수량을 업데이트하는 요청을 처리할 수 있도록 로직을 추가한다.
- HTTP 메소드에서
PATCH
는 요청된 자원의 일부를 업데이트할 때 사용한다. 장바구니 상품의 수량만 업데이트하므로@PatchMapping
을 사용한다. - 장바구니에 담겨있는 상품의 개수를 0개 이하로 업데이트 요청을 할 때 에러 메시지를 반환한다.
- 수정 권한을 체크한다.
- 장바구니 상품의 개수를 업데이트 한다.
- 장바구니 목록 페이지에서 장바구니 상품의 수량을 수정할 경우 업데이트 요청을 하도록 자바스크립트 함수를 추가한다.
- 부분 업데이트이므로
PATCH TYPE
으로 설정한다.
장바구니 상품 삭제
- 장바구니 서비스에 장바구니 상품 번호를 파라미터로 받아서 삭제하는 로직을 추가한다.
- 장바구니 컨트롤러 클래스에 장바구니 상품을 삭제하는 요청을 처리할 수 있도록 로직을 추가한다.
- HTTP 메소드에서
DELETE
의 경우 요청된 자원을 삭제할 때 사용한다. 장바구니 상품을 삭제하기 때문에@DeleteMapping
을 사용한다. - 수정 권한을 체크한다.
- 해당 장바구니 상품을 삭제한다.
- 장바구니 리스트 페이지에 x 버튼을 클릭하면 해당 상품을 삭제하는 로직을 작성한다.
- 장바구니 상품을 삭제하는 경우이므로
DELETE TYPE
을 사용한다. - 삭제 요청이 정상적으로 처리되면 장바구니 페이지를 새로고침한다.
🌼장바구니 상품 주문하기
💡핵심 키워드
- 상품 상세 화면에서 바로 주문하는 것과 달리 장바구니에서 상품 주문은 여러 개의 상품을 하나의 주문에 담을 수 있어야 한다.
- 또한 주문한 상품은 장바구니에서 삭제해야 한다.
- 장바구니 페이지에서 주문할 상품 데이터를 전달할 DTO를 생성한다.
- 장바구니에서 여러 개의 상품을 주문하므로 장바구니 주문 DTO 클래스가 자기 자신을
List
로 가지고 있도록 만든다.
- 장바구니 서비스 클래스에 장바구니에서 주문할 상품 데이터를 전달받아서 주문을 생성하는 로직을 만든다.
- 주문할 상품 리스트를 만든다.
- 현재 로그인한 회원과 주문 상품 목록을 이용하여 주문 엔티티를 만든다.
- 주문 데이터를 저장한다.
- 장바구니 서비스 클래스에서는 주문 로직으로 전달한 주문 DTO 리스트 생성 및 주문 로직 호출, 주문한 상품은 장바구니에서 제거하는 로직을 구현한다.
- 장바구니 페이지에서 전달받은 주문 상품 번호를 이용하여 주문 로직으로 전달할 주문 DTO 객체를 만든다.
- 장바구니에 담은 상품을 주문하도록 주문 로직을 호출한다.
- 주문한 상품들을 장바구니에서 제거한다.
- 장바구니 컨트롤러 클래스에 장바구니 상품의 수량을 업데이트하는 요청을 처리할 수 있도록 로직을 추가한다.
- 주문할 상품을 선택하지 않았는지 체크한다.
- 주문 권한을 체크한다.
- 주문 로직 호출 결과 생성된 주문 번호를 반환받는다.
- 생성된 주문 번호와 요청이 성공했다는 HTTP 응답 상태 코드를 반환한다.
- 장바구니 목록 파일에 장바구니에서 선택한 상품 주문을 요청하도록 자바스크립트 함수를 추가한다.
- 체크된 장바구니 상품 아이디를 전달하기 위해서 배열에 장바구니 상품 아이디를 객체로 만들어서 저장한다.
- 장바구니 상품 아이디를 저장하고 있는 배열을
paramData
객체에 추가한다. - 주문 요청 결과 성공하였다면 구매이력 페이지로 이동한다.
🏁결론
해당 내용을 정리하면서 상품 상세 페이지에서 고객이 관심이 있거나 나중에 주문할 상품을 장바구니에 담아 놓는 기능을 구현하는 법, 장바구니에 담은 상품을 조회하는 페이지를 만들어서 장바구니에 담은 상품을 삭제하거나 여러 개의 상품을 한 번에 주문하는 기능을 구현할 수 있었다.
Share article