Projects

Projects

pm2로 알림서버 배포하기 - 무중단배포

FCM 알림 서버를 만드는 프로젝트에 참여하게 되었다. 맡게 될 서버는 FCM 알림만 담당하게 되고, 저사양 서버에서(프리티어) 작동해야되어서 가벼워야해서 노드로 구축하기로 했다. 그리고 나서 찾아보니 firebase는 Node.js를 가장 잘 지원하고 있었다. https://firebase.google.com/docs/admin/setup?hl=ko Docs에서 찾아보니 Node에서 지원하는 기능이 가장 많다! 서버를 노드로 구성하기로 하고 배포 방법을 결정해야했다. 전에 참여했던 프로젝트에서는 Nginx, Docker, Github Action으로 Blue-Green 무중단 배포를 구현했었다. 이번에는 새로운 방법을 구현해보고 싶기도 했고 도커로 서버를 띄우는 것보다 pm2로 서버를 띄우는 게 더 가..

Projects

Swap 메모리의 힘은 대단했다

백엔드 서버를 t2.micro 프리티어에서 운영하고 있습니다. t2.micro의 스펙은 1 vCPU, 1GiB RAM이고 서버에서는 nginx 도커 컨테이너 1개, spring 애플리케이션 컨테이너 1개를 운영하고 있습니다 개발하면서 서버가 불규칙적으로 다운되는 현상이 있었는데요, nginx, docker를 이용한 블루그린 배포를 하고 있는데 그 과정도 버티지 못하고 응답없는 상태가 되는 일이 아주 많았습니다. Swap 적용하기 이 문제를 해결해보기 위해 swap 메모리가 떠올랐습니다. 조금 찾아보니 ec2 상에 swap 메모리를 추가하는 것은 매우 쉬웠습니다. AWS의 문서를 그대로 따라하면 가능했습니다. 스왑 파일을 사용하여 Amazon EC2 인스턴스의 스왑 공간으로 메모리 할당 Amazon Ela..

Projects

게시글 추천 시스템 도입을 고려하며 조사한 내용

단순히 추천수, 최신순으로 보여주는 것 → 정렬로 해결 가능 그 이외 개인화 추천 시스템 도입 : ML 도입이 필요하다 추천 시스템 종류 Contents-based Recommender System(컨텐츠 기반 추천시스템) 사용자가 과거에 좋아했던 아이템 파악 후 그 아이템과 비슷한 아이템 추천 코사인 유사도를 이용하여 유사도를 계산 데이터 획득 후 비정형 데이터로부터 관련 정보를 얻는 작업이 필요함. 즉 콘텐츠의 내용을 분석해야 함. Collaborative Filtering(협업 필터링) 비슷한 성향, 취향을 가진 다른 유저가 좋아한 아이템을 현재 유저에게 추천하는 것 memory based, model based 방법이 있다. 한계 콜드 스타트 : 앞의 결과를 이용하여 동작하는 특성상 신규 사용자에..

Projects

게시판 전체 글 랭킹 점수 데이터 업데이트 속도 77.72% 개선 (bulk update vs batch update)

커뮤니티 서비스를 구축하고 있다. 커뮤니티에 작성한 글을 최신순으로도 보여주지만, 인기순으로도 정렬하는 것도 필요했고, 이 방식을 구현하는 과정을 정리하였다. 선택한 랭킹 알고리즘 해커스 뉴스 알고리즘을 사용하여 각 게시글에 대한 점수를 계산하고 점수가 높은 순서대로 정렬하는 방법을 선택했다. 레딧 랭킹 알고리즘도 고려했으나, 레딧 시스템과 달리 '싫어요' 기능이 없고, 해커스 뉴스 알고리즘이 더 직관적이어서 선택하게 되었다. How Hacker News ranking algorithm works In this post I’ll try to explain how the Hacker News ranking algorithm works and how you can reuse it in your own app..

Projects

Querydsl을 이용한 커서 기반 페이지네이션 구현기

새로운 프로젝트에 들어가면서 게시판을 구현하게 되었다. 게시판의 글을 찾아 사용자에게 글을 어떻게 보여줄 수 있을까? 가장 쉬운 방법은 모든 글을 찾아 보내주는 것이다. 하지만 이 방법은 최악이라고 생각이 드는데 1. DB에 모든 데이터를 탐색해야하고 2. 사용자가 필요한 양 이상의 & 필요하지도 않을 정보를 보내는 낭비와 3. 한 번에 많은 데이터를 보내야해 네트워크 부하가 발생할 수 있다. 이를 보통 페이징을 통해 해결하는데, 페이징을 통해 한 번에 보여줄 게시글의 개수만큼만 데이터를 보낸다. 그 다음 요청에는 그 다음 데이터를 보내준다. 여러 웹사이트에서 위와 같은 형태로 찾아볼 수 있다. 페이징 또는 페이지네이션을 구현하는 방법은 두가지가 있다. 오프셋 기반 페이지네이션과 커서 기반 페이지 네이션..

Projects

[코드실행기능 개발기 #3] 코드 실행 서버 부하테스트

저희의 아키텍처는 api 서버와 running 서버가 나뉘어있습니다. api 서버에서 클라이언트의 코드 실행 요청을 받고 running 서버에서 실제로 코드를 실행하게 됩니다. 코드 실행 요청 발전 과정 클라이언트 → api 서버 api서버 → running 서버 running 서버 → api 서버 V1 http 요청 http 요청 http 응답 V2 http 요청 Redis Message Queue Redis Key-Value, 주기적 탐색 V3 소켓 연결 후 소켓 메세지 Redis Message Queue Redis Pub-Sub 초기에는 코드 실행요청을 단순 http로 보냈습니다. 하지만 코드 실행이 오래걸린다면 http 요청을 보낸 후 계속 대기해야한다는 것이 문제가 있다고 생각했고 개선 방법을 ..

Projects

NestJS에 winston으로 로그 남기기

Winston Logger Winston의 Logging 레벨은 RFC5424 표준을 따르고 있다고 한다. RFC 5424: The Syslog Protocol Numerical Severity Code 0 Emergency: system is unusable 1 Alert: action must be taken immediately 2 Critical: critical conditions 3 Error: error conditions 4 Warning: warning conditions 5 Notice: normal but significant condition 6 Informational: informational messages 7 Debug: debug-level messages winston l..

Projects

refresh token 도입기

로그인시 JWT 토큰을 발행하기로 했다. JWT는 세션방식으로 로그인을 유지할 때보다 서버가 저장하고 있어야할 데이터가 줄어드는 장점이 있지만 탈취되었을 경우 더 위험하다. 서비스의 성격을 고려했을 때 개인정보를 거의 저장하고 있지 않았다. 개인정보를 많이 저장하고 있는 서비스 보다 보안의 위협이 덜하였기 때문에 JWT가 더 적절하다고 생각했다. 그럼에도 보안은 항상 중요하기 때문에 JWT Access Token를 보완하기위한 Refresh Token을 도입하기로 했다. JWT 토큰을 어디에 저장할 것인가? 발급한 토큰들을 어떻게 저장해야할지 정해야했다. 아래 두 이유로 토큰을 쿠키에 저장하기로 했다. 쿠키는 Http Only 옵션이 있어서 XSS 공격을 예방할 수 있다. 클라이언트가 저장 중이다가 필요..

Heaea
'Projects' 카테고리의 글 목록