Skip to content

chanyoungit/tradeham-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

거래함📮


설명

거래함"은 카카오테크 부트캠프 내에서 사물함을 이용한 중고거래 플랫폼입니다. 사용자들은 판매할 물건을 사물함에 보관하고, 구매자는 해당 사물함에서 물건을 찾아가는 방식으로 거래가 이루어집니다. 비대면으로 안전하고 효율적으로 거래할 수 있으며, 커뮤니티 안에서 활발한 물품 교환을 할 수 있는 것이 특징입니다. ‘사물함 거래’ 기능을 통해 거래자는 서로의 시간을 맞출 필요 없이 비대면으로 편리하게 거래를 진행할 수 있습니다.”


진행 방식

  • 다 같이 페어 프로그래밍으로 프로젝트를 진행하고 하루에 한시간씩 강제적으로 코드리뷰를 진행합니다.

대면 모임

  • 일정: 매주 월요일 20시, 토요일 14시, 일요일 14시
    • 월요일은 3시간, 주말은 다 할 때까지.
  • 장소: KTB 회의실

스터디 방식

  • 월요일 20시에는 코드 리뷰가 끝난 기능을 통합하여 main 브랜치에 올립니다.
    • 5주차 부터는 각각이 구현한 기능의 성능을 테스트하고 비교합니다.
    • 성능 테스트 결과는 코드 통합 시간에 공유합니다.
  • 화, 수, 목, 금은 1시간 씩 각각 다른 팀원의 코드를 반드시 리뷰합니다.
  • 토요일과 일요일 모각코와 관련 세션 영상을 함께 시청합니다.

프로젝트 기획 의도

  • 카카오 부트캠프 내의 남는 사물함이 많다.
  • 과정 별로 책을 받는데 자신의 기술 스택과 맞지않는 책이 있다.
  • 카카오 부트캠프 내에서 편리하게 중고 거래를 도와준다.
  • 1기인 만큼 사물함 거래 문화를 직접 만들어보고 싶었습니다.

프로젝트 소개

  • 판매자는 물건을 올리면 사물함과 비밀번호를 배정받는다.
  • 관리자는 사물함의 물건을 검수한다.
  • 물건의 상태는 검수 중 -> 판매 중(검수 완료) -> 판매 완료로 나눠진다.
  • 구매자가 대금을 결제하면 판매자에게 대금이 전달되고, 사물함과 비밀번호를 알려준다.

🔨 Back-end


OAuth2, JWT 기반 로그인 시스템 구현

해당 프로젝트는 보안성과 사용자 편의성을 강화하기 위해 OAuth2를 기반으로 소셜 로그인 시스템을 설계했습니다. 이 과정에서 무상태성을 유지하며 인증을 처리하기 위해 JWT(JSON Web Token)를 사용하였고, Redis와 쿠키에 Refresh 토큰을 저장하는 방식을 도입하였습니다.

Redis는 빠른 데이터 처리 속도와 중앙 집중식 관리가 가능하며, TTL 기능을 활용해 토큰 만료 및 삭제를 자동화할 수 있어 보안과 성능을 동시세 강화하는 데 유리합니다. 이를 기반으로 Refresh 토큰 로테이션 방식을 적용하여 보안성을 더욱 강화했습니다. 이를 통해 보안 위협을 최소화하고, 사용자 인증 정보를 안전하게 관리할 수 있었습니다.


MySQL Replication을 통한 애플리케이션 성능 개선

데이터베이스의 병목 현상을 해결하기 위해 Replication 기술을 도입하였습니다.

마스터 DB는 모든 쓰기 작업을 담당하며 데이터의 일관성을 유지하도록 설계하였고 슬레이브 DB는 마스터로부터 복제된 데이터를 기반으로 읽기 작업을 처리하여, 마스터 DB의 부하를 분산시키는 역할을 하였습니다. 이 구조를 통해 마스터 DB는 쓰기 작업에 집중할 수 있었고, 슬레이브 DB는 대규모 읽기 요청을 효율적으로 처리할 수 있었습니다.

전체 코드에 트랜잭션 기능을 적용하고 단순 읽기 작업만 있는 메소드에 readOnly 옵션을 활성화하여 해당 메소드는 Slave 서버에서 요청을 처리하도록 했습니다.

Replication의 데이터 복제 방식으로 세미 동기 복제를 채택하였습니다. 이 방식에서는 마스터 DB에서 슬레이브 DB로 데이터를 전송할 때, 최소 한 개 이상의 슬레이브가 변경 사항을 확인한 후 마스터가 트랜잭션을 완료하도록 보장하여 데이터 정합성을 강화했습니다. 이를 통해 완전한 동기 복제보다 성능 부담을 줄이면서도, 비동기 복제보다 더 높은 데이터 일관성을 유지할 수 있었습니다. 또한, 복제 로그를 활용하여 마스터 DB의 변경 사항이 슬레이브 DB에 안정적으로 반영되도록 설계하였습니다.


검색 성능 최적화 - ElasticSearch & Index

초기에 상품 검색 성능을 향상시키기 위해 상품 제목에 인덱스를 설정하려 했습니다. 그러나 검색 시 %LIKE% 조건을 사용하게 되면 결국 전체 테이블을 스캔해야 하므로 비효율적이라는 문제를 인식하게 되었습니다.

이를 해결하기 위해 ElasticSearch를 도입했습니다. ElasticSearch에서는 상품 제목과 상태를 인덱싱하여, 사용자가 검색 시 상태가 "sell"인 상품 중에서 제목에 검색어가 포함된 상품만 빠르게 반환하도록 구현했습니다. 또한, status 컬럼에 별도의 인덱스를 설정하여 판매 중인 상품 페이지나 판매 완료된 상품 페이지에서 빠른 조회가 가능하도록 최적화했습니다.

이로 인해 상태를 기준으로 상품을 조회하는 페이지는 인덱스를 활용해 빠르게 처리하고, 유저가 검색하는 기능은 ElasticSearch를 활용하여 더욱 효율적인 검색을 구현할 수 있었습니다.


결제시스템 도입

본 프로젝트의 주요 서비스는 물품의 판매와 구매입니다. 물품 구매를 위한 결제 기능이 필요했으며, 이를 구현하는 가장 쉬운 방법은 '다날'과 같은 결제 API를 도입하는 것이었으나, 사업자 등록이 필요하다는 점에서 다른 방법을 탐색하였습니다. 그 결과, '아임포트' API를 사용하여 카카오페이를 통해 포인트 충전 기능을 구현하였습니다.


본인 인증 시스템

사이트를 운영할 때 가장 중요한 부분 중 하나는 실제 회원과 유령 회원을 구분하는 것이라고 생각합니다. 특히 결제 기능이 포함된 애플리케이션에서는 본인 인증을 도입하여 무분별한 회원가입을 방지해야 합니다. 본 프로젝트에서는 휴대폰 인증 기능을 구현하기 위해 'coolSMS'라는 API를 사용하였으며 랜덤 난수를 생성하여 사용자가 입력한 번호와 생성된 인증번호를 비교하여 본인인증 절차를 구현하였습니다.


Swagger를 활용한 API 문서화

API 문서를 수동으로 관리하게 된다면 애플리케이션을 수정해야 하는 상황이 발생했을 때 API 문서도 수동으로 변경하는 작업을 거쳐야 합니다. 또한, 이러한 작업은 자동화 작업이 아니기 떄문에 실수할 가능성이 존재합니다. 이러한 문제를 사전에 방지하기 위해 Swagger를 활용한 API 문서의 자동화를 적용하게 되었습니다.

About

사물함을 이용한 중고거래 플랫폼

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published