2차 프로젝트 돌아보기

Chris-Yang·2021년 11월 3일
4

Project

목록 보기
3/4

> 프로젝트 개요

일단 결과물!!



▶︎ KREAM 클론 프로젝트

팀 프로젝트의 목표는 KREAM이라는 커머스 웹사이트입니다.

크림은 한정판 신발을 경매를 통해 구매할 수 있는 서비스를 제공하는 사이트입니다.


사이트의 특징은 경매 시스템을 기반으로 하고있는과 동시에 경매가로 형성된
가격을 바탕으로 즉시구매/판매도 가능한 독특한 시스템을 갖추고 있습니다.

누군가 가장 높은 가격으로 구매 등록을 해 놓으면 그 가격으로 즉시판매할 수 있고,
가장 낮은 가격으로 판매등록을 해 놓으면 그 가격으로 즉시구매 할 수 있습니다.

🥕 github 주소:
https://github.com/wecode-bootcamp-korea/25-2nd-SUNKREAM-backend/blob/main/README.md



▶︎ 개발기간 / 팀원

- 개발 기간: 2021/10/18 ~ 2021/10/29

- 개발 인원:

  • Front-End 4명 : 김현진, 박산성, 이선호, 하상영
  • Back-End 3명 : 박치훈, 양가현, 송영록


▶︎ 구현 내용

  • 소셜로그인/회원가입
  • 상품 목록 + 필터링 + 검색
  • 상품 상세페이지
  • 입찰 시스템
  • SNS게시판(CRUD) - 댓글,태그
  • 결제(포인트)
  • 마이페이지


▶︎ 나의 역할

  • 소셜로그인/회원가입
  • 관심상품 등록/삭제(마이 페이지)
  • 관심상품 등록 시 해당 상품 전체 관심횟수 증•차감(상품 상세 페이지)


▶︎ 두번째 프로젝트에 대한 마음가짐

첫번째 프로젝트에서 애자일(Agile) 개발 프로세스를 잘 지키지 못하여
약 10일간의 개발기간 중 7일을 ERD 작성에만 쏟고 반성했던 경험이 있습니다.

완벽한 결과물을 내놓아 수정을 최소화하고 API 개발에 집중하려했던 의도였지만
수정사항은 계속해서 생긴다는 교훈을 뼈저리게 체험했었습니다.

따라서 이번 프로젝트에서는 빠른 피드백과 소통을 최우선으로 정했습니다.

그리고 자기만의 세상이 강한 blocker가 되지 말자 또한 함께!





> 개발 환경

개발 환경은 1차 프로젝트와 거의 동일했기 때문에 타이틀과 짧은 소감만
기록해 두겠습니다.

▶︎ 공동/개인 도구

✔️ Trello: 프로젝트 진도를 각자 관리하면서 전체 진행상황 확인이 가능합니다.


✔️ Erdcloud: 무료 ERD툴로 공동작업이 가능한 완소 도구입니다!


✔️ Git&github: rebase라는 개념을 처음으로 배우고 적용해보며 또 새로웠습니다.🤤


✔️ Python: 언어도 도구라고 생각하며 파이썬은 쉬우면서 어려운 도구였습니다.


✔️ Django: 2차 프로젝트를 통해 장고와 조금 더 친해질 수 있었고 덕분에
모든게 어렵고 지치기만 했던 1차와 조금 다르게 약간의 능숙해짐으로써 얻게되는 재미와 새로 알게된 문법들의 신비로움에 더 익숙해지고 싶은 욕심이 생겼습니다.


✔️ 육신: 살이 쭉쭉 빠지고 있지만 다 과정이라 생각하고 영양제라도 잘 챙겨먹었습니다.

🥕 1차 프로젝트 개발환경:
https://velog.io/@max-sum/%EC%83%9D%EC%95%A0-%EC%B2%AB-%ED%8C%80-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EB%8F%8C%EC%95%84%EB%B3%B4%EA%B8%B0#-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD





> 구현과 배움

▶︎ kakao 소셜 로그인

홈페이지 구조상 소셜로그인 하는 유저는 회원가입 의도가 있음을 착안하여
비회원의 경우 회원가입이 자동으로 되도록 로직을 설계하였습니다.

사용자로써는 별 생각없이 지나갔던 내용들이 막상 그 기능을 구현하게 되니
생각치도 않게 고려해야 할 것들이 생겨서 움찔움찔 했습니다.

처음으로 외부 API를 사용하는 경험을 하면서 좌충우돌 하기는 했지만
수시로 FE개발자분과 합을 맞추면서도 생각보다 빠르게 잘 마무리하여
하이파이브를 하며 매우 기뻐했던 그 날이 떠오릅니다.🕺

token = request.headers.get('Authorization')

if token == None:
    return JsonResponse({'messsage': 'INVALID_TOKEN'}, status=401)

kakao_account = requests.get('https://kapi.kakao.com/v2/user/me', headers = {'Authorization': f'Bearer {token}'}).json()

if not User.objects.filter(kakao_id=kakao_account['id']).exists():
   user = User.objects.create(
        kakao_id = kakao_account['id'],
        email    = kakao_account['kakao_account']['email'],
        name     = kakao_account['kakao_account']['profile']['nickname']
   )
user = User.objects.get(kakao_id=kakao_account['id'])

access_token = jwt.encode({'user_id': user.id}, SECRET_KEY, algorithm=ALGORITHMS)

return JsonResponse({'access_token': access_token}, status=201)


▶︎ 관심상품

관심상품 등록/삭제에 대한 페이지는 둘로 나누어져 있고 동일한 WishList API를
사용하도록 하였습니다.

주 기능은 관심상품 등록/삭제, 마이페이지에서 이미지 등 불러오기,
해당 상품에 대한 유저들의 관심횟수 counting입니다.

원본인 KREAM 사이트에서는 마이페이지에서도 관심상품 삭제가 가능하기도 하고
기존 API를 활용할 수 있지만 우리 FE측 프로젝트에서는 따로 구현하지 않았습니다.

등록/삭제 기능은 토글 개념을 적용하여 간단하게 구현할 수 있었습니다.

user_id      = request.user.id
wish_product = request.GET.get('product_id')

if not Product.objects.filter(id = wish_product).exists():
    return JsonResponse({'message:' : 'INVALID_PRODUCT_ID'}, status = 404)

if not Wishlist.objects.filter(user_id = user_id, product_id = wish_product).exists():
    Wishlist.objects.create(user_id = user_id, product_id = wish_product)

    wish_count = Wishlist.objects.filter(product_id = wish_product).count()

    return JsonResponse({'message' : 'WISH_CREATE_SUCCESS', 'wish_count' : wish_count}, status = 201)

Wishlist.objects.get(user_id = user_id, product_id = wish_product).delete()

wish_count = Wishlist.objects.filter(product_id = wish_product).count()

return JsonResponse({'message' : 'WISH_DELETE_SUCCESS', 'wish_count' : wish_count}, status = 200)

첫번째 고비와 배움

마이페이지에서 관심상품이 표시되는 페이지를 불러올 때 에러가 났습니다.

원인은 해당 제품에 이미지가 없었을 때 first()함수가 에러를 뿜기 때문이었고
물론 홈페이지 구조상 이미지가 없을 경우는 없지만 에러를 해결하고 싶었습니다.

'thumbnail' : wish.product.productimage_set.first().image_url

이 부분을 아래와 같이 수정하여 에러가 생기지 않게 되었습니다! 호홓!!

results = [{
    'id'    : wish.product.id,
    ...(생략)
        'image' : 
    [
        {
            'thumbnail' : img.image_url
        } for img in wish.product.productimage_set.all()[:1]]
    } for wish in wish_list]

코드가 뭔가 늘어져보여서 좀 그렇지만 원인을 찾아 에러를 해결했다는데
의미를 두었습니다!


두번째 고비와 배움

그리고 다했구나~했을때!.. 또 생각치도 못하게 다시 상품 상세페이지에 진입하니
관심상품 등록을 한 상태를 의미하는 깃발이 표시되지 않았습니다..🥲

그래서 상품 상세페이지 재 진입시 해당 상품에 대한 관심상품 등록정보가 필요하다고 하여
별도의 WishFlag API를 작성하였고 유저-상품 중간테이블 조회결과를
FE에게 True/False으로 구분하여 전달해 주었습니다.

기존 관심상품 등록/삭제 API와 코드가 중복되는 부분이 있지만
해당 기능을 위해 기존 관심상품 API를 불러오는 것은 resaurce 호출에 대한
낭비가 있다고 판단하여 별도의 WishFlag API로 작성하게 되었습니다.

wish_count = Wishlist.objects.filter(product_id = wish_product).count()

check_my_wish = True

if not Wishlist.objects.filter(product_id = wish_product, user_id = user_id):
    check_my_wish = False

results = {
    'wish_count'    : wish_count,
    'check_my_wish' : check_my_wish,
}


▶︎ Unit Test

테스트코드는 이제는 정말 중요한 요소라는 것을 체감하고 있습니다.

개발자 채용 사이트에서도 테스트코드 작성 경험을 포함하는 경우를 종종 봅니다.

처음 접할 때는 일단 익숙치 않은 코드와 개념 때문에 꽤나 애먹었지만
의도한대로 에러 없이 테스트가 완료되는 모습을 보며 미소가 살살 흘러나왔습니다.

코드가 길기 때문에 전에 작성해둔 링크로 대체하겠습니다.

🥕 Django Unit Test:
https://velog.io/@max-sum/Django-Unit-Test





> 또다른 얻은 것들

▶︎ 좋은 사람들과 프로젝트를 한다는 경험

의견에 대한 피드백을 주고받는데 장애가 없었습니다.

프로젝트 진행이 전반적으로 의도대로 잘 흘러갔기에 스트레스가 적기도 했지만
다수가 모여있기에 누군가는 불만이 있을 수도 있었을텐데 트러블이 한번도 없었습니다.

자신의 스트레스를 표출하지 않고 팀의 조화와 분위기를 먼저 생각하는 분들과
함께하여서 프로젝트 종료까지 별다른 감정소모 없이 프로젝트에 집중할 수 있었고
마무리까지 만족스럽게 할 수 있었습니다.


누군가의 독단적 성격과 고집에 의해 발생하는 불협화음이 프로젝트를 비롯하여
삶의 질에 큰 영향을 준다는 것을 알기에 저 자신도 매 순간 행동을 조심히 하였습니다.

1차 프로젝트에 연이어 한달간 극한의 피로에 쩔어 예민할 수도 있었는데도
늘 미소를 잃지 않던 우리 팀원분들께 감사의 말을 꼭 올리고 싶습니다..!!



▶︎ 아쉬움에서 자신감으로

프로젝트가 종료된 시점에서 제가 만든 코드는 일단 전체적으로 양이 적었습니다.

각자 지난 프로젝트에서 안해본 기능을 구현하는 것을 우선으로 했는데
다행히 대부분 서로 겹치지 않게 담당 API를 선택할 수 있었습니다.


당시에 게시판이라는 것을 안해봤었기 때문에 해보고싶은 욕구는 있었지만
일단 프로젝트 계획에서 우선순위 구현사항은 아니었기도 하고
저도 소셜로그인과 관심상품 두가지 모두 첫 경험이기에 무리하게 게시판까지
구현하자고 주장하지는 않았습니다.

팀 목표가 많이 구현하자가 아닌 제대로 구현하자에 적절한 결정이라 생각됩니다.

그리고 사실 프로젝트 마무리 즘 다른 BE팀원들의 길고 멋진 코드들을 보면서
다소 아쉬운 마음이 들기는 했었습니다.


그러던 중.. 멘토님께서 생각치 않게 제 코드의 깔끔함을 언급하시며
몇차례 칭찬해주셨고 리소스 반환 문제 해결에 대해서도 칭찬해 주셨습니다.

내심 기분은 정말 좋았지만 자격지심에 뭔가 위로라고 생각들기도 했고
스스로 별 것 아니라고 생각했기에 괜히 그러시지 말라고 말씀드렸는데..!

멘토님은 칭찬할 때마다 왜그러냐 하시면서 정말로 진심이고 클린코드를 언급하시며
코드를 깔끔하게 쓰는 것은 개발자에게 정말 중요하다 하셨습니다.

지금 생각해도 말씀 하나하나 정말 감사드리고 행복한 기억입니다.😃

아쉬움이 컸기 때문인지 더욱더..!! 🎉





> 갈무리

개발이라는 세상에 뛰어든지 3개월이라는 시간이 흘렀습니다.

아직은 경험하는 거의 대부분이 익숙함보다 새로운 것들이고 따라서
"잘 해낼 수 있을까?"라는 걱정이 매일같이 자연스레 따라다닙니다.

그리고 솔직히 말하자면 정말 쉽지 않은 길이라 생각합니다.

하지만 포기하는 것을 좋아하지 않기에,
전에도 어느 글에 남겼던 말이지만 되내이며 마무리하려 합니다.

"어제 배운 것은 잊었어도 지난 달 보다는 성장해 있어!! 👦🏻 ➡ 🧔🏻"

profile
sharing all the world

0개의 댓글