백엔드 개발 포트폴리오 | 소모임 커뮤니티 with 캘린더

내일배움캠프 4기 웹 개발 과정 Node.js 트랙 수료생 최종 프로젝트 'LOUNGE'를 소개합니다.
Aug 16, 2023
백엔드 개발 포트폴리오 | 소모임 커뮤니티 with 캘린더

소모임 커뮤니티 with 캘린더

💡
소모임 With 캘린더 소모임에 가입하여 함께 이야기를 나누고 새로운 사람들을 만나보세요 그룹 모임에 참여하고 취미를 공유하며 즐거운 시간을 보내세요 LounGe에서 좋은 인연을 만들어 연인이나 친구를 만들어보세요 언제든지 LounGe를 방문하여 새로운 경험과 추억을 만들어보세요

아키텍처

notion image

주요 기술

  • TypeScript
  • Nest JS
  • MySQL
  • TypeORM
  • Redis
  • ElasticSearch
 

 기술적 의사결정

TypeScript
  • 우려 사항
    • JavaScript 사용 시 사소한 실수로도 치명적인 런타임 에러가 발생
    • 디버깅에 많은 시간을 투자해야 함
  • 해결 방안
    • TypeScript 사용
  • 의견 조율
    • TypeScript는 강타입 언어로 타입에러를 컴파일 단계에서 캐치할 수 있다
  • 의견 결정
    • 코드 어시스트 등 장점이 많은 TypeScript 사용
Nest.JS
  • 우려 사항
    • Express.js를 사용하게 될 경우 자유도가 높아 전체적인 코드를 관리하기 힘들다
  • 해결 방안
    • Nest.js 사용
  • 의견 조율
    • 모듈 사이의 의존성을 보다 명확하게 정의할 수 있다
    • 유지보수가 용이할 것이라고 판단된다
  • 의견 결정
    • Express.js보다 Nest.js가 개발하기에 적합하다고 판단하여 Nest.js로 결정
Redis
  • 우려 사항
    • 모든 것을 데이터베이스에 저장했을 때 데이터베이스 과부화 상황 및 성능 저하 우려
  • 해결 방안
    • 인메모리 데이터베이스 Redis 사용
  • 의견 조율
    • 메모리에 데이터를 저장하기 때문에 데이터 조회 속도를 향상시킨다
  • 의견 결정
    • 데이터베이스 과부화 상황을 피하기 위해 Redis 사용
ElasticSearch
  • 우려 사항
    • LIKE 연산자 사용 시 DB의 테이블 전체를 조회해야 하기 때문에 테이블에 데이터가 많아지면 심각한 성능 저하가 발생할 수 있다
  • 해결 방안
    • 1) MySQL FullText Search
    • 2) Elastic Search
  • 의견 조율
    • MySQL FullText Search는 단순한 텍스트 검색 기능만을 제공하며 대용량 데이터 처리 및 수평적 확장성이 제한적이다
    • Elastic Search는 다양한 검색 기능과 빠른 검색 속도, 대용량 데이터 처리 및 수평적 확장성을 제공한다
  • 의견 결정
    • Elastic Search 사용
 
 

트러블슈팅

Redis
  • 개선하게 된 이유
    • 튜터 피드백에서 그룹 별 데이터가 많아지게 되면 한번에 조회해야하는 캘린더 특성 상 성능 저하가 일어날 수 있다고 피드백 해 주셨음
❓1) 캘린더 조회 시 여러 그룹의 정보들을 조회해야 하기 때문에 트래픽에 따라 성능이 하락하는 문제가 생김
❓2) refreshToken은 유효기간이 있기 때문에 DB에 저장하면 주기적으로 삭제를 해줘야 하는 번거로움이 생김
❗️ 1) Redis를 이용하여 조건에 충족된 그룹들에 한해서 모든 일정을 캐싱 처리하여 DB와 서버의 통신 횟수를 줄여 개선
❗️ 2) Redis를 이용하여 refreshToken 생성 시 유효기간을 정해 만료된 토큰을 삭제하여 번거로움을 없앰
OverFetching
  • 개선하게 된 이유
    • 사용자 피드백에서 데이터가 많아지게 되면 조회 기능에 대한 성능을 우려하는 피드백이 있었음
❓기존에 불필요한 데이터도 가져오는 OverFetching 문제가 있었음
❗️ 해당 문제를 기존의 find에서 select를 변경하여 가져올 수 있었지만 typeORM의 find 메서드보다 조금 더 세밀하게 쿼리를 조정할 수 있다고 생각되어서 QueryBuilder를 사용하여 select 해야 할 컬럼들을 정의함으로써 필요하지 않은 컬럼의 데이터를 조회하지 않게 되어 성능 개선
ElasticSearch
  • 개선하게 된 이유
    • DB에 데이터를 많이 생성하고 검색을 해보니 검색 기능이 심각하게 느려짐
❓ LIKE는 와일드 카드 문자(%, _)를 사용하는 경우에는 전체 테이블 스캔을 수행해야 하므로 성능이 저하됨
❗️ ElasticSearch를 이용하여 별도의 인덱싱된 문서에서 빠른 검색을 통해 성능 개선
 

성능개선 그래프

notion image
Share article
Subscribe to our newsletter

내일배움캠프 블로그