2. Freshcode - 사용자 인증에 따른 상품 관리 API

문승준·2021년 11월 11일
0
post-thumbnail

과제 프로젝트 소개

제출 과제 레포지토리 링크

API 문서 링크

과제 내용

  • 로그인 기능

    • 사용자 인증 / 인가 구현

    • 상품 추가 / 수정 / 삭제는 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개씩 과제를 하기 때문에 돌아가면서 역할을 맡으면 된다고 생각했다.

사용 기술 스택

  • Back-End : Python, Django Framework, MySQL
  • Deploy : AWS EC2
  • ETC : Git, Github, Postman

개발 과정

1일차 - 모델링과 초기세팅

  • 기능 구현에 필요한 최소한의 모델링을 작성했다. 상품 안에는 다양한 옵션과 태그가 있다는 전제로 관계를 설정했다.

  • Tag의 경우 실제 사이트에서는 상품마다 1개씩만 보여지는데, 카테고리와는 구별된 일종의 필터링 역할을 한다고 판단했다.

    따라서 하나의 상품이 여러개의 태그를 가질 수 있도록 관계를 설정했다.

  • Users 테이블의 role 필드에는 admin 혹은 user라는 값이 들어갈 수 있다.

  • 초기세팅시 SECRET_KEYDATABASES 정보는 환경변수로 설정해주었다.

    -> 배포 상황에서 디버그 모드와 허용 호스트 부분을 수정해야 했는데, 다음번에는 배포용 setting을 구분하여 관리해보아야겠다.

2일차 - 상품관리 기능 구현

  • 팀원들과 django app과 view 설계에 대해 미리 토론을 했고 SignInView, ProductView, ProductDetailView 세가지 부분으로 나누고 각자 하나씩 맡아서 개발하기로 했다. 내가 맡은 부분은 상품 상세 조회 및 수정, 삭제 기능을 위한 ProductDetailView를 맡았다.

  • 가장 고민했던 부분은 상품 수정 기능이다. HTTP patch 메소드 요청을 받아서 django 쿼리셋 update 메소드로 구현하려고 했다. 수정하려는 데이터만 body에 담아 요청하면 업데이트가 되어야 한다.

    • 데이터의 모든 키값을 get으로 받아오고 없는 경우 default를 None으로 설정하기?

      -> 경우의 수를 생각하며 구현은 가능하겠지만 코드가 너무 길어진다.

    • update의 매개변수로 **data를 넣어서 구현했다.

      -> dict 형태인 data를 key=value 형태로 unpacking해서 키워드 인자로 넣어준다.

      -> 이전 프로젝트때 filter 기능을 구현하기 위해 사용했던 방법으로 코드의 길이를 현저하게 줄일 수 있다.

  • User 관련 기능을 구현한 팀원이 admin_decorator를 작성해주었고 인증, 인가 기능 구현을 위해 함수 위에 붙여주었다.

느낀점과 개선점

팀 프로젝트

  • 과제 내용 자체에는 큰 어려움이 없었지만, 역시나 많은 팀원이 짧은 기간안에 결과물을 만들어내는 부분이 제일 어려웠다. 모델링부터 각자의 의견이 있고 기능을 구현하는 방식도 모두 다를 수 밖에 없다. 혼자 정신없이 하다가 나중에서야 다른 팀원과 맞추기위해 수정을 하는 경우도 있고, 누군가는 개발이 빠를수도 느릴수도 있다. 그런 차이들을 좁혀가는 방법을 고민하고 노력하는 과정에서 팀워크 능력이 길러지는 것 같다.

  • 단순히 개발을 잘하는 것과 개발팀에서 협업을 잘하는 것은 다르다는 얘기가 이해가 된다. 혼자만 더 많이 배우고, 더 많이 기여하려는 태도는 이번 과제들과 맞지 않는다. 다른 동료들과 합을 맞추고 함께 성장하고 배워간다는 마음가짐으로 앞으로 남은 과제들에 임해야겠다.

  • 나중에서야 다른 팀원의 코드를 자세히 보게되었고 나와 다른 컨벤션을 사용하는 것을 알게되었다. 얼핏 보기에는 큰 차이가 없지만 하나의 프로젝트 안에 다른 컨벤션이 적용되어 있다면 추후 유지보수에도 좋지 않을 것이다. 다음번부터는 팀 컨벤션을 더 명확하게 정해야겠다. 또한 다른 팀원이 작성한 코드도 틈틈이 보면서 참고해야겠다.

전에 배웠던 기술 적용하기

  • NoSleepPlace 팀 프로젝트를 할때 Dictionary comprehension를 활용한 필터링 기능을 구현했었다. 그 과정에서 **kwags 매개변수와 packing, unpacking의 개념을 공부했었는데 이번에 적용해볼 수 있었다.

    JSON 같은 딕셔너리 형태의 데이터 객체를 Django 쿼리셋 메소드의 매개변수로 사용할때 **data로 넣어주면 해당 data가 unpacking되며 key=value 형태로 입력된다.

  • 위 내용은 앞으로도 적극적으로 이용해서 완전히 내것으로 만들어야겠다. 새로운 기술을 배울때 사용법뿐만 아니라 원리와 개념도 확실히 이해해야 다음번에도 적극적으로 응용 할 수 있는 것 같다. 기능 구현에만 급급해하지말고 프로젝트 후에라도 새롭게 배운 개념을 정리하고 회고하고 리팩토링해야겠다.
profile
개발자가 될 팔자

0개의 댓글