홈 파티 주최 및 참가 소셜 커뮤니티 서비스
증가하는 1인 가구 시대! 파티를 열어 새로운 친구를 사귀세요!
”모아바”는 파티를 즐기고 싶지만 1인 가구이거나 동네 친구가 없어 즐길 수 없을 때, 내가 호스트 또는 게스트가 되어 취향에 맞게 참여할 수 있는 소셜 네트워크 서비스입니다.
서비스 아키텍처
기술적 의사결정
사용 기술 | 기술 설명 |
Nest.js | Javascript보다 엄격한 타입 체크를 하는 typescript 기반의 웹 프레임 워크로 여러 예외 상황(에러 등)을 사전에 방지하기 용이 |
jQuery | HTML DOM을 선택자를 이용해 손쉽게 조작할 수 있고, Ajax를 이용하여 클라이언트와 서버 간 데이터 통신을 쉽게 처리할 수 있도록 도와줌 |
MySQL | 관계형 데이터베이스 관리 시스템으로, 본 프로젝트 서비스의 복잡한 관계 설정을 원활하게 처리하기 위해 TypeORM과 MySQL을 사용 |
JWT | 사용자가 웹서비스에 인증(로그인) 하였을 때, Access-token 과 Refresh-token을 발급하고, 사용자가 권한을 허가받기 위해 사용자 인가 목적으로 사용 |
Redis Cloud | 메모리 기반의 데이터 저장소. 데이터를 빠르게 읽고 쓸 수 있도록 최적화되어있는 백엔드 저장소로 빈번히 요청되는 데이터를 캐싱 처리할 목적으로 사용 |
Nodemailer | 비밀번호 찾기 기능 - 본인이 회원가입한 이메일로 인증번호를 전송하기 위해 사용
서버에서 보내준 임의의 숫자와 클라이언트(브라우저)가 입력한 숫자가 일치하면 비밀번호 재설정 |
RDS | 클라우드에서 관계형 데이터베이스의 배포 및 유지 관리를 용이하게 함 |
S3 | 프로필 및 파티 이미지 업로드 기능을 구현하기 위해 Amazons의 S3 Object Storage를 이용 |
Github actions | 효율적인 배포 - workflow script를 정의하고 main branch에 PR - merged - closed 되었을 때 action이 실행되는 CI/CD 적용 |
주요 기술 및 기능
PassportStrategy
•
사용자 인가/인증을 위한 Jwt token을 이용한 전략 구현
•
사용자가 header에 인증 정보(토큰)와 함께 요청하면, 토큰을 검증하고 payload를 반환
•
payload에 일치하는 유저가 있는지 확인 후 유저 정보 반환 및 API 액세스 허용
Nodemailer
•
비밀번호 찾기 API 적용
•
본인이 회원가입한 이메일로 인증번호를 전송하여, 일치 시 비밀번호를 재설정하는 단계에 사용
캐싱 처리
•
서버 부하 및 속도 저하 방지 목적
•
Redis Cloud(30MB 무료)를 사용하여 빈번히 요청되는 데이터를 캐싱 처리
•
인증 전략에서 반환하는 유저 정보, Refresh Token, 메인 화면에 접속했을 때 요청되는 데이터 캐싱 처리
Task Scheduling
•
ScheduleModule
•
파티 상태를 변경하는 메서드에 @Cron을 적용하여 매 00시(한국시간)에 현 시간 기준 날짜가 지난 파티 상태 변경
소셜 로그인
•
카카오톡 소셜 로그인
•
불편한 회원가입 과정을 생략하고, 간편한 소셜 계정 로그인 유도
카카오 맵
•
카카오 맵 API를 활용한 위치 표출
•
파티 상세 보기 - 파티 주소 마커 표시
•
찜한 목록들의 파티 주소를 한 맵에 마커 표시
트러블슈팅
관계 테이블 저장 / 업데이트 이슈
사실 수집
•
데이터 조회 시 관계 테이블이 조회되지 않는 문제
•
일부 새로운 데이터를 받아 생성되어 있는 인스턴스에 update 메서드를 사용하였을 때 기존 데이터가 삭제되는 문제
원인 추론
•
데이터를 저장할 때 해당 엔티티와 연결되어 있는 관계 테이블을 맵핑하지 않았을 가능성
•
즉, 인스턴스 생성 시 관계 테이블 정보를 맵핑해주지 않아 조회 시 문제 발생
•
update 메서드를 사용했을 때 기존 데이터는 삭제되는 문제 발생
조치 및 결과
•
파티를 생성 시 관계 테이블 - 썸네일, 파티 멤버, 태그, 유저의 정보를 맵핑하고 데이터를 저장
•
배열 안에(OneToMany) 기존 정보를 복사(…)하고, 새로운 정보와 함께 관계 테이블의 인스턴스를 새롭게 맵핑
•
TypeORM의 relations를 사용하여 데이터 조회 시 관계 테이블도 데이터가 같이 출력되어 해결
사용자 검증 로직의 DB 접근 횟수 문제
사실 수집
•
@UseGuards(JWTAuthGuard)를 사용하여, 권한이 필요한 API에 해당 데코레이터를 사용
•
인증 전략을 거쳐 로그인 한 유저의 정보를 반환하기 위해 매번 DB에서 해당된 유저의 정보를 찾고 반환
문제 추론
•
매번 DB에서 유저 정보를 찾아 반환하는 것은 서버에 부하를 줄 수 있으며 비효율적
조치 및 결과
•
@UseGuards(LocalAuthGuard)를 통해 반환되는 유저 정보의 id(PK)와 이메일을 키 값으로 사용하여 -
각각 RefreshToken과 유저 정보를 redis-cloud에 캐싱처리
•
Jwt 전략의 fromAuthHeaderAsBearerToken 에서 반환한 payload의 email에 해당하는 value가 있는지 -
redis에 먼저 확인하고 유저를 반환하도록 전환
•
데이터베이스의 접근 횟수가 현저히 감소하게 되어 서버 부하 방지 및 속도 개선
Github actions 자동배포_Pull request permission denied 문제
사실 수집
•
main branch에 PR merged & closed 되었을 때 workflow에 설정한 ssh action이 실행되도록 설정
•
액션이 실행되고, 업데이트된 main branch를 새로 pull 할 때 발생하는 권한 문제(git pull origin main)
문제 추론
•
기존에 sudo -s로 접속하여 권한이 필요한 명령어를 순서대로 실행
•
터미널에서 ubuntu에 접속하여 테스트 했을 당시에는 문제가 없었으나, workflow의 script에서 실행하는 sudo에서 발생하는 문제
•
프로젝트 깃헙 설정에 외부 접근을 허용하지 않아서 발생하는 문제
조치 및 결과
•
원격에 있는 git pull 및 pm2를 kill 및 restart 하기 위해서는 root 권한이 필요
•
git pull을 위해 chmod 퍼미션을 644로 변경하고, 모두 sudo로 실행