커리큘럼
home
React
home

[모아바] 홈 파티를 주최하여 새로운 친구를 사귀는 소셜 네트워킹 플랫폼

Specialty
Node.js
FE Github
Specialty
날짜

홈 파티 주최 및 참가 소셜 커뮤니티 서비스

증가하는 1인 가구 시대! 파티를 열어 새로운 친구를 사귀세요!
모아바”는 파티를 즐기고 싶지만 1인 가구이거나 동네 친구가 없어 즐길 수 없을 때, 내가 호스트 또는 게스트가 되어 취향에 맞게 참여할 수 있는 소셜 네트워크 서비스입니다.

  서비스 아키텍처

기술적 의사결정

사용 기술
기술 설명
Nest.js
Javascript보다 엄격한 타입 체크를 하는 typescript 기반의 웹 프레임 워크로 여러 예외 상황(에러 등)을 사전에 방지하기 용이
jQuery
HTML DOM을 선택자를 이용해 손쉽게 조작할 수 있고, Ajax를 이용하여 클라이언트와 서버 간 데이터 통신을 쉽게 처리할 수 있도록 도와줌
MySQL
관계형 데이터베이스 관리 시스템으로, 본 프로젝트 서비스의 복잡한 관계 설정을 원활하게 처리하기 위해 TypeORM과 MySQL을 사용
JWT
사용자가 웹서비스에 인증(로그인) 하였을 때, Access-tokenRefresh-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로 실행