본문으로 바로가기

프로젝트 소개 : Shoe-auction

category 프로젝트 : shoe-auction 2021. 6. 10. 18:07

Shoe-auction

안녕하세요. 이번 포스팅에서는 취업을 준비하면서 약 5개월간 진행했던 프로젝트를 소개하려고 합니다. 사실 기능 구현 자체는 1달 정도면 충분했지만 이론 공부에 가중치를 더 두면서 진행하느라 생각보다 오랜 시간이 걸린 것 같습니다.

 

Shoe-auction 프로젝트는 스니커즈 리셀이라는 주제로 진행한 프로젝트입니다. 이미 국내에서는 KREAMSOLDOUT 이라는 플랫폼이 존재하며, 해외에서는 StockX라는 플랫폼이 존재합니다. 이번 프로젝트는 앞서 언급한 플랫폼들의 시스템을 참고하면서 진행하였습니다.

 

프로젝트 코드 구현에 직접 참여한 인원은 저를 포함해서 총 2명이고, 코드리뷰를 담당해주셨던 멘토 1분과 함께 진행하였습니다. (코드리뷰와 관련된 내용들은해당 프로젝트 Github의 PR을 참고해주세요!)

프로젝트 개요

최근 패션 업계에서 한정판 스니커즈 리셀(resell · 재판매)이 화두로 떠오르고 있습니다. 코로나로 인해 의류 매출은 전반적으로 주춤한 가운데 운동화는 꾸준히 매출이 상승하고 있을 뿐만 아니라 제한된 수량으로 발매되는 신발의 경우 웃돈을 얹은 거래가 활발하게 이루어지고 있습니다. 하지만 이러한 개인간의 신발 거래는 대부분 중고거래 카페 또는 모바일 어플리케이션에서 행해지고 있고, 개인과 개인간의 거래이기 때문에 가품 문제 및 사기의 온상지가 될 수 있다고 생각합니다. 이러한 점을 고려하여 shoe-Auction은 개인과 개인 사이에 중개자가 끼어들어 거래를 형성하고, 입찰 시스템을 도입하여 합리적인 거래를 유도하는 신발 거래 전문 플랫폼 API 서버입니다.

 

1. 사용 기술 소개

Shoe-auction 프로젝트는 Spring / Java / JPA를 베이스로 두고 진행하였습니다. 사용된 기술은 아래와 같습니다.

1. JAVA 11

프로젝트 세팅 당시 Java 11로 전환해야 하는 이유라는 글을 읽고 Java11을 선택했습니다.

(플젝 진행하는 동안 Java11에 새로 추가된 기능은 사용하지 않아서.. 사실상 Java8을 사용했다고 하는게 맞을 것 같습니다...ㅎㅎ)

2. Jenkins

CI/CD 자동화를 위해 사용한 기술입니다. 협업 과정에서 테스트 자동화와 자동 배포를 통해 개발의 생산성 증진에 큰 도움을 줄 수 있습니다. CI/CD에 대한 개념은 구글링을 통해 쉽게 접할 수 있기 때문에 자세히 언급하지는 않겠습니다

3. Spring Data JPA / Query DSL

JPA를 사용하면서 Spring Data JPA와 Query DSL을 사용하였습니다. Query DSL의 경우 IDE의 적극적인 서포팅을 받을 수 있기 때문에 복잡한 쿼리는 JPQL대신 Query DSL로 처리하였습니다.

4. Redis

이번 프로젝트에서 Redis를 다양한 용도로 활용하였습니다. 가장 먼저 분산 서버 환경에서 발생할 수 있는 로그인 정보를 담은 세션의 정합성 문제를 해결하기 위한 세션 스토리지 서버로 활용하였고, 성능 향상을 위한 캐시 서버 및 FCM 토큰 저장소로 활용하였습니다.

5. FCM

등록한 상품에 대한 판매/구매 알림을 Push 메시지로 전송할 수 있도록 FCM을 사용하였습니다.

6. AWS S3 / Lambda

해당 플랫폼 이용에 필요한 신발의 이미지를 저장하기 위해 AWS S3와 썸네일 등 다양한 이미지 해상도 조절을 위해 AWS Lambda를 사용하였습니다.

7. Spring Rest Docs

API 문서화를 위해 Spring Rest Docs를 사용했습니다. 저희는 Swagger와 Spring Rest Docs중 고민하다가 프로덕션 코드에 Swagger 관련 어노테이션이 추가되는것을 원치 않아서 Spring Rest Docs를 적용하였습니다.

추후 두 개의 장점만 모아서 사용할 수 있는 방법을 찾게되었습니다. 기회가 된다면 적용해볼 생각입니다.

(참고자료 : Swagger와 Spring Rest Docs의 조합)

8. ngrinder

프로젝트 완성 후 성능 테스트 진행을 위해 사용한 기술입니다.

9. Naver Cloud Platform

인프라 구성에는 모두 네이버 클라우드 플랫폼을 사용했습니다. 대부분 기업들의 채용공고를 보면 AWS 경험자 우대라는 문구가 있는데 NCP 또한 AWS와 기본적인 사용 방법은 비슷하기 때문에 학습용 토이프로젝트를 진행한다면 NCP도 충분히 좋은 선택지라고 생각합니다. (회원가입시 10만 크레딧 지원)

 

2. 핵심 비즈니스 로직

✏️ 1. 판매/구매 입찰 등록

✏️ 2. 판매 과정

✏️ 3. 구매 과정

이번 프로젝트의 핵심 비즈니스 로직입니다.

  • 관리자가 사전에 등록해놓은 상품에 대해서만 판매/구매 입찰이 가능한 시스템 입니다.
  • 판매/구매 방법에는 즉시 판매/즉시 구매판매 입찰 등록/구매 입찰 등록이 존재합니다.
  • 판매/구매와 관련된 모든 과정에는 검수 과정이 포함됩니다.

3. 소스코드

✏️ 젠킨스 파이프라인

: develop 브랜치와 feature 브랜치 등 모든 브랜치에 push 또는 PR이 발생할 경우 작성해놓은 테스트코드가 자동으로 실행됩니다. 또한 develop 브랜치에 이벤트가 발생할 경우 배포 서버에 미리 작성해놓은 배포 스크립트를 실행합니다. (WAS1과 WAS2에 차례대로 배포되며 무중단으로 진행됩니다.)

✏️ 주요 비즈니스 로직 1 : TradeService , ProductService

: 상품의 즉시 판매/구매, 입찰등록, 상품 CRUD 등 해당 프로젝트의 핵심 비즈니스 로직 코드입니다. Redis를 통한 캐싱을 적용하였으며 MySQL Replication (Master/Slave)을 구성하였습니다. 적용 과정 및 방법은 관련 포스팅을 참고해주세요.

✏️ 주요 비즈니스 로직 2 : UserService

: 회원가입시 휴대폰 인증을 진행합니다. SMS 문자 전송은 coolSMS라는 API를 사용했습니다. 또한 회원가입시 사용한 ID(Email)로 랜덤 UUID가 포함된 URL을 전송해서 추가 인증을 진행합니다. 모든 인증번호는 Redis에서 관리합니다.

 

이 외 모든 소스코드는 여기에서 확인하실 수 있습니다.

4. 아쉬운 점

1. 결제 시스템

이번 프로젝트의 클론 대상이 된 플랫폼들(KREAM / SOLDOUT / StockX) 모두 사전에 신용카드 또는 체크카드를 등록해놓고 거래가 성사되면 자동으로 출금되는 시스템이었습니다. 하지만 학습용 토이 프로젝트의 특성상 위 플랫폼들과 동일한 결제 시스템을 적용하는 것은 사실상 불가능했습니다. 아쉬운 대로 아임포트라는 API를 이용해서 포인트 충전 후 충전된 포인트를 증가/차감 시키는 방식으로 진행하였습니다.

2. Test code

Controller Layer와 Service Layer에 대한 단위 테스트를 작성하였습니다. 아쉬운 점은 통합 테스트와 Domain / Dto / Repository 관련 단위 테스트의 부재입니다. 당시에는 테스트 코드의 중요성에 대해 크게 공감하지 못했었고, 프로젝트의 진행 속도가 너무 느려진다고 생각해서 두 개의 주요 Layer에 단위 테스트를 작성하였습니다. 하지만 어떤 프로젝트를 진행하더라도 추후 유지/보수 또는 확장성을 고려해야 합니다. 결국 꼼꼼한 테스트 코드의 작성은 추후 개발의 생산성을 증진시켜주며, 견고한 애플리케이션을 만드는데 가장 중요한 역할을 한다고 생각합니다. 따라서 추가적인 테스트 코드 작성과 가독성이 떨어지는 테스트 코드에 대한 리팩토링을 진행할 예정입니다.

3. Clean code

프로젝트를 진행하면서 공부하다 보니 초기에 작성했던 일부 코드들에서 리팩토링할 부분들이 많이 보이는 것 같습니다. 당시에는 최대한 깨끗하게 구현했다고 생각했던 코드들도 지금 보면 개선할 부분이 보이는 것처럼, 지금 개선한 코드도 나중에 보면 또 개선할 부분이 생길 수 있다고 생각합니다. 따라서 리팩토링은 지속적으로 진행할 예정입니다.

후기

누군가에게 자랑할만한 코드는 아니지만 나름대로 긴 시간 동안 공부하면서 진행했던 프로젝트였고, 그만큼 실력 향상에 큰 도움을 준 프로젝트입니다. 이번 프로젝트를 진행하면서 느낀 점은 기능 구현만을 위한 코딩이 아닌 사용 기술에 대한 이해와 타당한 이유가 뒷받침되어야 한다는 점입니다.

 

해당 프로젝트를 진행하면서 겪었던 이슈 및 프로젝트와 관련된 정보들은 WIKI에서 확인하실 수 있습니다.

 

f-lab-edu/shoe-auction

개인 간 신발 거래 서비스. Contribute to f-lab-edu/shoe-auction development by creating an account on GitHub.

github.com

 

 

 

마지막으로, 감히 누군가에게 조언을 드릴만 한 수준은 아니지만 혹시나 Shoe-auction 프로젝트를 참고하시면서 공부하실 때 궁금한 부분이 있다면 언제든지 댓글로 남겨주세요!

 

감사합니다.