Web 57

TroubleShooting - Socket Transports 설정

서버 부하를 효율적으로 관리하기 위해 로드밸런서를 도입하고 Redis 어댑터를 설정했지만, 지속적으로 요청이 전송되면서도 연결은 이루어지지 않는 문제가 발생했습니다.Socket.IO의 기본 전송 방식은 polling으로 설정되어 있습니다. polling은 주기적으로 HTTP 요청을 보내어 연결을 유지하지만, 분산된 환경에서는 요청이 다른 서버로 전달될 경우 소켓 연결이 끊어질 수 있습니다. Polling해당 문제를 해결하기 위해서 처음 요청이 이루어지는 서버와 지속적인 연결을 유지시켜야만 했습니다.공식 문서를 통해 전송 방식을 WebSocket 방식으로 바꿀 수 있음을 알게 되었습니다.  해결 방법 1 : Polling -> WebSocket WebSocket웹소켓 방식은 클라이언트와 서버 간에 지속적..

Web 2024.09.03

로드밸런서 환경에서의 Socket 연결 (Redis Adapter, Redis Pub/Sub)

서버 부하를 효율적으로 관리하기 위해 로드밸런서를 도입한 후, 일부 유저가 Socket 연결에 실패하거나 연결이 불안정해지는 문제가 발생했습니다. 원인로드밸런서 도입으로 인해 소켓 연결이 분산된 서버들로 나누어졌고, 이로 인해 서버 간의 소켓 연결 정보가 공유되지 않아 일부 유저가 연결 오류를 겪었습니다. Redis Pub/Sub 및 Redis Adapter를 도입하여 분산된 서버 간의 소켓 연결 정보를 통합적으로 관리했습니다. 이를 통해 각 서버가 동일한 소켓 연결 상태를 공유하게 되어, 모든 유저에게 안정적인 실시간 연결을 제공할 수 있게 되었습니다. RedisAdapter 설정 기존에 사용하고 있는 Redis 클라이언트의 환경변수를 사용하고 있습니다.main.ts Socket.IO 공식문서에서 제공..

Web 2024.09.02

NestJS : 순환 참조

현재 진행하고 있는 프로젝트에서 소켓을 이용한 실시간 채팅을 구현하였습니다. 구현 과정에서 여러가지 문제들을 겪었고 그 중 하나로 순환 참조에 대해 작성해보겠습니다.  순환참조순환 종속성은 두 클래스가 서로 종속될 때 발생합니다. 예를 들어 클래스 A에는 클래스 B가 필요하고 클래스 B에도 클래스 A가 필요합니다. 모듈 간 및 공급자 간에 중첩에서 순환 종속성이 발생할 수 있습니다.가능한 경우 순환 종속성을 피해야 하지만 항상 그렇게 할 수는 없습니다. 이러한 경우 Nest는 두 가지 방법으로 공급자 간의 순환 종속성을 해결할 수 있습니다. 이 장에서는 정방향 참조를 하나의 기술로 사용하고 ModuleRef 클래스를 사용하여 DI 컨테이너에서 제공자 인스턴스를 검색하는 다른 기술을 설명합니다.또한 모듈 ..

Web 2024.08.12

재귀함수와 반복문

오늘은 알고리즘 문제 예상 대진표를 풀며 알게된 재귀 함수와 반복문의 차이점에 대해 작성해보겠습니다.  문제를 풀며 제가 사용한 재귀 함수입니다.function solution(n, a, b) { let round = 0; const recursion = (a, b, round) => { if (a !== b) { return recursion(Math.ceil(a / 2), Math.ceil(b / 2), round + 1); } return round; }; const answer = recursion(a, b, round); return answer;} a와 b가 동일한 값을 가질때까지 나눠진 뒤 올림 처리 되는 것을 볼 수 있습니다. 이를 반복문으로 표현한다면..

Web 2024.08.06

자료구조 : Linked List

오늘은프로젝트에서 사용하기 위해 자료구조를 공부하며 링크드리스트에 대해 공부한 내용을 간단히 적어보겠습니다.  링크드 리스트(Linked List)는 데이터 구조의 한 유형으로, 각 요소(노드)가 데이터와 다음 요소를 가리키는 포인터를 포함하는 방식으로 구성됩니다. 이는 배열과 달리 요소들이 물리적으로 연속되어 있지 않으며, 논리적으로 연결된 구조를 갖습니다. 링크드 리스트는 데이터의 동적 할당 및 삽입, 삭제가 빈번히 일어나는 상황에서 유용합니다. 1. 링크드 리스트의 구성 요소1.1. 노드(Node): 링크드 리스트의 기본 구성 요소. 각 노드는 다음과 같은 두 부분으로 이루어져 있습니다.   - 데이터(Data): 노드가 저장하는 값   - 포인터(Next): 다음 노드를 가리키는 참조(주소)1.2..

Web 2024.07.19

자료 구조 : 해시 테이블

오늘은 자료구조 해시 테이블에 대해 공부한 내용을 요약합니다. 해시 테이블 Key & Value로 저장되는 자료구조입니다. 빠르게 데이터를 검색할 수 있으며 이는 해시 테이블 내부에 버킷으로 데이터를 저장하기 때문입니다. 해시 테이블은 각각의 Key 값에 해시 함수를 적용하여 index를 생성하고, 이 index에 해당하는 버킷에 값을 저장하거나 검색하는 데 사용하게 됩니다.  시간 복잡도 해시 테이블은 Key값으로 Value를 한 번에 불러올 수 있기 때문에 평균적으로 0(1)에 시간 복잡도를 가집니다.  해시 충돌 해시 함수가 index를 생성할 때 전부 Unique 한 값을 가지는 건 아닙니다. 글자 수를 환산해서 index를 반환하는 해시 함수가 있다면, Key 값의 글자 수가 같을 때 같은 in..

Web 2024.07.17

Trello - member 테이블을 통하는 인증, 인가

오늘은이번 프로젝트에서는 Board에 관한 접근 권한을 인증하기 위해 Member라는 테이블을 추가로 구성했고유저 인증, 인가 외에 Member 인증, 인가를 구현하기로 했습니다. 프로젝트 ERD입니다.기본적으로 보드, 리스트, 카드와 관련된 API 호출 → 해당 유저가 멤버에 등록 되어있는지 조회 → true일 경우 API 호출을 진행합니다.이를 위한 인증과 인가를 구현하기 위해 몇 가지 방법을 생각했습니다.Guard를 통한 구현Interceptor + Guard를 통한 구현Middleware + Guard를 통한 구현Method를 통한 구현다른 방법들1. Guard를 통한 구현첫 번째로 Guard를 통한 구현을 계획했습니다.URL을 통해 매 호출마다 boardId를 전달받는다.JWT 인증에서 넘어온 ..

Web 2024.07.16

공연 예매 프로젝트 - 후기

오늘은 프로젝트를 마감한 뒤, 이번 프로젝트 후기를 작성해보겠습니다.  고려했던 부분이번 개인 프로젝트를 시작하기 전, 가장 비중을 둔 것은 설계였습니다.API 명세서와 ERD를 작성하며 어떤 식으로 서비스가 동작할지, 어떤 API가 필요할지 고민을 했습니다. 매번 다른 튜터님들께 찾아가며 명세서와 ERD 피드백을 받았고 튜터님들마다 개발 스타일에 차이가 있으시기 때문에 다양한 시각에서 의견을 받아볼 수 있었습니다.가장 적합하게 구현할 방법은 무엇일까? 생각을 많이 했던 것 같습니다. 배운 점매번 프로젝트를 할 때마다 느끼지만 '이게 되나' 싶다가도, 차근차근 태스크를 밟아가며 진행이 될 때마다 많이 배워가는 중입니다.  1. 초기 설계는 중요하기 때문에 잘 만들어야 한다. - 이번 프로젝트에서 초기 설..

Web 2024.07.11

공연 예매 프로젝트 - TroubleShooting : 기준 시간, 버전 이슈

오늘은 공연 예매 프로젝트를 진행하며 발생한 트러블 슈팅 내용을 첨부합니다. 3. UTC, KST 기준 시간 더보기1. 개요프로젝트 기간이 끝나 배포를 마쳤습니다. 배포된 서버에서 API 테스트를 해보기로 하였습니다.이번 프로젝트에서는 공연 예매와 관련된 티켓팅 웹서비스를 만들었습니다.해당 서비스를 테스트 중 발생한 에러에 관해 다뤄보겠습니다.2. Trouble Shooting2.1 배경배포된 서비스를 Insomnia로 테스트 중이였습니다.각각의 API를 호출하며 정상 작동하는지 확인했습니다.2.2 발단특정 API들만 작동이 안되는 경우를 발견합니다.데이터베이스와의 연동에 문제는 없었고 해당 API가 로컬에서는 정상 작동하였습니다.터미널을 확인하니 값이 NULL로 반환되고 있었습니다.2.3 전개같은 코드..

Web 2024.07.10

공연 예매 프로젝트 - TroubleShooting : 검색 기능, 연간 관계

오늘은 공연 예매 프로젝트를 진행하며 발생한 트러블 슈팅 내용을 첨부합니다. 1. 검색 기능 구현 중 Join된 데이터를 바탕으로 검색하려면 ?더보기1. 개요공연 테이블을 구현했습니다.구현될 기능으로 검색 기능 중 카테고리 기반으로 검색을 추가하고자 하였습니다.그 과정에서 문법적인 에러가 발생하였고 해결한 방법을 다뤄보겠습니다.2. Trouble Shooting2.1 배경이번 프로젝트에서 ERD입니다. category 테이블과 shows 테이블은 1:N 관계로서, shows 테이블이 category 테이블로 그룹화 되고 있습니다.공연 검색 API의 명세서입니다.검색 기준은 Query Param을 사용하여 전달받고,전체 목록 검색제목 기반 검색카테고리 기반 검색제목 + 카테고리 기반 검색4가지 조건으로 공..

Web 2024.07.08