write by backend 이재후
1. 프로젝트 개요 및 사용 기술스택
2. Flow chart & ERD
3. Data pipeline
4. api 개발 및 배포
- Artipul은 미대생들을 위한 온라인 작품 경매 플랫폼입니다.
멀고 험한 예술의 길을 걷고 있는 미대생들에게 작품을 사고 팔 수 있는 플랫폼을 제공함으로써, 학업과 작품활동에 활력을 불어넣어 주는 온라인 공간을 컨셉으로 개발되었습니다. 미대생(작가)들은 작품 장르와 등록 기간 등을 선택해 작품을 판매할 수 있으며, 구매자들은 작품 장르로 원하는 작품들을 검색해 실시간 경매에 참여하거나, 즉시 구매가를 지불하여 작품을 즉시 구매할 수 있습니다. 즉시구매가 이루어지지 않았을 경우, 작가가 설정한 등록 기간이 마감되었을 때 가장 높은 금액으로 입찰한 구매자가 낙찰받게 됩니다. - 사용 기술스택
- Flow chart
권한분기에 따른 서비스흐름도 입니다.
오픈 api를 사용하는 소셜로그인의 경우, 최초 1회 핸드폰 번호와 닉네임 등 추가 기입 정보를 입력해 회원가입을 거친 뒤 해당 과정을 거친 계정에 한하여 소셜로그인이 이루어지게 됩니다. - ERD
회원은 작가와 일반 사용자로 나눠지지만 서로 중복되는 요소가 많기 때문에 작가 테이블과 일반 사용자 테이블로 분리시키지 않고 미대생 여부 칼럼으로 둘을 구별하는 방식으로 진행하였습니다.
- 휴대폰 번호 인증
NHN Cloude Service를 이용하였습니다. 입력 받은 핸드폰 번호로 6자리 난수 토큰이 발송되며, redis에 저장된 토큰 값과 비교하여 인증을 진행합니다. 인증을 마친 토큰은 ttl이 남아있더라도 삭제됩니다. - 비밀번호 해시
유저가 입력한 비밀번호는 bcrypt를 사용하여 해시된 형태로 DB에 저장되고, 검증됩니다.
유저가 입력한 값과 DB에 저장되어 있던 유저의 정보가 일치할 경우, JWT형태의 accessToken과 refreshToken을 발급합니다. 보안을 위해 accessToken은 짧은 만료기간을 가지고 로컬 변수에 저장되며, refreshToken은 http Only Secure 쿠키에 저장됩니다. 이후 각 토큰에 대한 strategy와 guard를 통해 권한을 분기하고, payload 유저 정보를 사용할 수 있습니다.
Client의 로그아웃 요청 시 요청 헤더에 포함된 accessToken과 refreshToken을 받아 verify함수를 통해 검증한 뒤, redis에 blacklist로 저장합니다. 이 때 저장되는 TTL값은 토큰의 남은 만료기간으로 설정됩니다.
작품 등록 시 설정한 마감 시간이 지나면 작품에 따라 낙찰 또는 유찰 처리되며, 이는 nestJS의 Task Scheduling 기능을 통해 특정 시간마다 DB를 확인하는 방식으로 구현되었습니다.
RDB와 비관계형 In-memory DB의 특성에 따라, Client의 첫 입찰 요청 시 사용자 별 경매 참여 중인 작품 정보는 MySQL에 저장되며 이후 실시간으로 빠르게 변동되는 작품 별 최고입찰가의 경우 redis에 저장되고 갱신 값이 Client에게 실시간으로 노출됩니다.