1차 프로젝트는 다양한 카카오 프렌즈 캐릭터 상품들을 구매할 수 있는 카카오 프렌즈샵을 클론하는 프로젝트였는데, 4월 17일 부터 5월 1일까지 2주간 Front-End 3명, Back-End 2명으로 총 5명의 팀원들과 함께 했으며, 백엔드 부분을 맡아서 진행했다.
메인페이지의 홈탭 뷰는 테마별로 메인페이지에 상품이 보여질 수도 있고 테마만 보여질 수도 있고, 또 모든 테마를 클릭하면 테마와 관련된 전체 상품들이 보여져야 했는데 처음에 어떻게 접근해야 할지 고민이 많이 되었다.
결국 홈 탭만을 위해 테마와 메인페이지에 보여질 상품들을 foriegn key로 걸어서 many to many 관계의 Home 테이블을 만들고, 만약 홈 탭에서 상품은 보여주지 않고 테마만 보여줄거라면 상품 foreign key는 null로 지정해주었다.
이후에 뷰를 짤 때는 테마 테이블에서 전체 테마를 가져와 for문을 돌면서 테마의 id, image_url, 테마 이름, 테마 설명을 리스트로 묶고 만약 Home 테이블에서 테마의 id에 상품 이 null 값이 아닌 foreign key로 걸려있다면 그 상품의 image_url, 상품 이름, 상품 가격이 리스트에 함께 담기게 하였다.
홈탭과 마찬가지로 페이지네이션을 구현했는데 offset을 0, limit을 전체 상품 리스트의 길이로 정해 만약 쿼리스트링으로 limit과 offset이 들어오지 않는다면 상품의 전체가 보여지게 하였고, offset과 limit이 쿼리스트링으로 들어온다면 그에 맞춰 페이지네이션이 구현되게 하였다.
전체 탭의 필터링 기능도 쿼리스트링으로 들어온 sort_by의 값이 hot이면 판매량순, new면 신상품순, high_price면 높은 가격순, low_price면 낮은가격순으로 정렬되게 구현하였다.
처음에는 if문을 값별로 4번 사용하여 각각의 경우마다 return을 하게 했었는데, return을 4번 적는 것보다 sort_by의 값과 return 값을 각각 딕셔너리의 키와 값으로 만들어서 딕셔너리를 돌며 쿼리스트링으로 들어온 sort_by의 값과 일치하는 키를 return하도록 수정하였다.
장바구니는 post view와 get view 두가지를 만들었는데, 데코레이터를 달아 로그인한 유저 정보와함께 데이터베이스에 저장되거나 유저 정보를 이용해 데이터에 저장된 정보를 가져오게 하였다.
같은 상품을 장바구니에 여러번 담을 시에는 같은 상품이 여러번 저장되는게 아니라 수량만 올라가게 하였고 그것을 구현하기 위해서 cart_data.quantity += 1이 아닌 f() expression을 사용하였는데, F() 표현식을 사용하면 데이터베이스에서 파이썬 메모리로 데이터를 가져오지 않고 모델 필드값을 참조하고 사용하여 데이터베이스 작업을 수행할 수 있게 하며 race condition을 피할 수 있다.