[1st project cart API]

바울·2022년 7월 23일
0

문제가 많았던 카트view.. 하면서 많은 걸 배웠지만 매우 머리가 아팠던 거 같다..

아까 작성해둔 데코레이터를 사용하기 위해 signin_decorator를 임포트해 주었다. 나머지 사항들은 코드를 보면서 알아보자.

장바구니담기


우선 장바구니에 상품을 담기전에 요청한 사용자가 권한이 있는 사용자인지 확인하기 위해 데코레이터를 이용해 확인해 주었다. 사용자 인증이된 사용자의 정보를 user변수에 넣어준다. 그후 상품옵션과 수량을 받은 후 변수에 넣어준다.

상품 수량은 최소 1개 이상이므로 만약 상품수량이 정수가 아닐경우 에러를 반환해준다.

그 후에 카트에 정보를 담아주어야 하는데 만약 이미 장바구니에 있는 상품을 또 담을경우 같은 테이블에 똑같은 데이터를 생성해주면 매우 효율적이지 않을 것이다. 그래서 get_or_create를 사용해 준다. 말그대로 데이터를 조회한 후 데이터를 생성하는 것이다. get으로 조회한후 만약 데이터가 이미 데이터베이스에 존재하는 데이터면 is_created에 Flase가 담겨 밑에 있는

cart.quantity = cart.quantity + quantity
cart.save()

이미 장바구니에 존재하는 상품이면 사용자가 요청한 상품에 수량만 업데이트가 되는 코드를 실행시켜주고 데이터베이스에 데이터가 없다면 is_created에 True가 담겨 정삭적으로 장바구니에 요청한 정보를 create한다. 원래 create를 할 때 에는 모든 데이터를 create를 하지 않을 경우 에러가 나지만 quantity필드에 default값을 0을 주었기 때문에 에러가 나지않고 create 하는 것이다.

장바구니조회


장바구니에 상품을 담았으면 상품을 구매하기 위해 장바구니로 이동을 해야한다. get메소드를 이용해 구현해 주었다. 위에처럼 우선 사용자의 권한을 확인 후에 그 사용자가 장바구니에 담은 모든 정보들을 carts변수에 담아준다.

그 후에 List Comprehension을 통해 장바구니에 보여주고자 하는 정보를 리스트에 담 후 반복문을 돌려 하나씩 데이터를 하나씩 가져온후 보내주는 로직을 구현했다. List Comprehension을 사용하면 좋은점은 리스트안에 코드를 작성해서 실행시킬 수 있어 코드가 간결해진 다는 것이다.

장바구니삭제


장바구니에 상품을 잘못 담았을 경우 그 상품을 삭제해야 된다. http메소드 delete를 이용해 구현해 주었다. 일단 인증이된 유저와 유저가 삭제하고싶은 장바구니에 있는 상품을 cart라는 변수에 담은후 cart.delete를 통해 삭제시켜주면 된다.

장바구니수량 수정


patch라는 메소드를 사용했는데 put대신 patch를 사용한 이유는 다음과 같다. 일단 둘의 차이점은

PUT : 리소스의 모든 것을 업데이트 한다.
PATCH : 리소스의 일부를 업데이트 한다.

한 사용자에 대해 여러 정보를 객체로 수집하여 서버로 보내는 경우, PUT은 보내지지 않은 정보에 대해서는 null값으로 업데이트하지만, PATCH는 기존 데이터를 유지하는 방식으로 대응한다.

우리는 상품의 수량만 수정하기 때문에 patch를 사용하였다.

일단 수량만 수정하기 때문에 키값으로 quantity를 받고 인증이된 유저는 무조건 변수에 담아준 후에 최소 수량은 1이기 때문에 1보다 작을경우 에러를 반환해 주었다. 그후 cart테이블 안에있는 사용자가 요청한 상품의 아이디 cart에 담아준 후에 그 수량을 업데이트 시켜주는 코드를 구현했다. 예외처리로 MulitipleObjcetsReturned를 사용해 주었는데 만약 요청받은 값이 하나가 아니라 여러개일 경우 반환되는 에러이다.

0개의 댓글