로그인 기능
사용자 인증 / 인가 구현
상품 추가 / 수정 / 삭제는 admin 권한을 가진 사용자만 가능
- admin 예시
EMAIL: admin@freshcode.me
PASSWORD: admin
ROLE : [admin]
상품 관리 기능
상품 상세 및 전체목록 조회
일반 유저와 관리자 권한 분리
유닛테스트
Database 는 RDBMS를 이용
로그인 기능은 JWT 인증 방식을 구현
Swagger나 Postman을 이용하여 API 테스트 가능하도록 구현
개발해봤던 API와 기능면에서 큰 차이는 없었지만, 사용자의 권한을 설정하는 부분은 처음이었다.
우선은 모델링시 users 테이블에 role 컬럼을 추가해 admin과 user를 구분하는 방법이 떠올랐다.
백엔드 6명
내가 속한 기능 구현팀 3명 -> DB Modeling, 로그인 기능, 상품관리 기능, unit test, Postman 문서 작성
배포팀 3명 -> 개발 및 배포 환경 설정, README 작성
과제를 6명이 나누면 담당 역할이 너무 적어지고 오히려 효율성이 떨어진다고 생각했다. 또한 과제마다 개인이 습득하고 성장할 수 있는 부분에 집중하고자 했다. 그래서 프로젝트를 크게 두가지 부분으로 나누고 세명이 한팀이 되어 Pair Programming 방식으로 진행했다.
배포팀의 담당 분량이 적을 순 있겠지만 aws, docker를 더 공부할 기회로 삼기로 했다. 어차피 매주 2개씩 과제를 하기 때문에 돌아가면서 역할을 맡으면 된다고 생각했다.
기능 구현에 필요한 최소한의 모델링을 작성했다. 상품 안에는 다양한 옵션과 태그가 있다는 전제로 관계를 설정했다.
Tag의 경우 실제 사이트에서는 상품마다 1개씩만 보여지는데, 카테고리와는 구별된 일종의 필터링 역할을 한다고 판단했다.
따라서 하나의 상품이 여러개의 태그를 가질 수 있도록 관계를 설정했다.
Users 테이블의 role 필드에는 admin 혹은 user라는 값이 들어갈 수 있다.
초기세팅시 SECRET_KEY
와 DATABASES
정보는 환경변수로 설정해주었다.
-> 배포 상황에서 디버그 모드와 허용 호스트 부분을 수정해야 했는데, 다음번에는 배포용 setting을 구분하여 관리해보아야겠다.
팀원들과 django app과 view 설계에 대해 미리 토론을 했고 SignInView, ProductView, ProductDetailView 세가지 부분으로 나누고 각자 하나씩 맡아서 개발하기로 했다. 내가 맡은 부분은 상품 상세 조회 및 수정, 삭제 기능을 위한 ProductDetailView를 맡았다.
가장 고민했던 부분은 상품 수정 기능이다. HTTP patch 메소드 요청을 받아서 django 쿼리셋 update 메소드로 구현하려고 했다. 수정하려는 데이터만 body에 담아 요청하면 업데이트가 되어야 한다.
데이터의 모든 키값을 get으로 받아오고 없는 경우 default를 None으로 설정하기?
-> 경우의 수를 생각하며 구현은 가능하겠지만 코드가 너무 길어진다.
update의 매개변수로 **data를 넣어서 구현했다.
-> dict 형태인 data를 key=value 형태로 unpacking해서 키워드 인자로 넣어준다.
-> 이전 프로젝트때 filter 기능을 구현하기 위해 사용했던 방법으로 코드의 길이를 현저하게 줄일 수 있다.
과제 내용 자체에는 큰 어려움이 없었지만, 역시나 많은 팀원이 짧은 기간안에 결과물을 만들어내는 부분이 제일 어려웠다. 모델링부터 각자의 의견이 있고 기능을 구현하는 방식도 모두 다를 수 밖에 없다. 혼자 정신없이 하다가 나중에서야 다른 팀원과 맞추기위해 수정을 하는 경우도 있고, 누군가는 개발이 빠를수도 느릴수도 있다. 그런 차이들을 좁혀가는 방법을 고민하고 노력하는 과정에서 팀워크 능력이 길러지는 것 같다.
단순히 개발을 잘하는 것과 개발팀에서 협업을 잘하는 것은 다르다는 얘기가 이해가 된다. 혼자만 더 많이 배우고, 더 많이 기여하려는 태도는 이번 과제들과 맞지 않는다. 다른 동료들과 합을 맞추고 함께 성장하고 배워간다는 마음가짐으로 앞으로 남은 과제들에 임해야겠다.
NoSleepPlace 팀 프로젝트를 할때 Dictionary comprehension를 활용한 필터링 기능을 구현했었다. 그 과정에서 **kwags 매개변수와 packing, unpacking의 개념을 공부했었는데 이번에 적용해볼 수 있었다.
JSON 같은 딕셔너리 형태의 데이터 객체를 Django 쿼리셋 메소드의 매개변수로 사용할때
**data
로 넣어주면 해당 data가 unpacking되며key=value
형태로 입력된다.