728x90

분류 전체보기 176

서버 네트워크 구성 요소와 흐름 (feat. AWS)

사용자 요청이 서버에 도달하고, 처리된 후 응답이 돌아오는 과정에는 다양한 네트워크 구성 요소들이 유기적으로 작동한다.서버 네트워크 구성 요소를 중심으로 요청의 흐름을 단계별로 살펴보고, 주요 구성 요소들에 대해 알아보자. 1. 클라이언트에서 요청 보내기 모든 과정은 사용자의 브라우저나 애플리케이션에서 시작된다.사용자가 웹사이트에 접속하거나 API 요청을 보낼 때, 해당 요청은 인터넷을 통해 서버 네트워크로 전달된다. 2. 로드 밸런서 (Load Balancer) 로드 밸런서는 들어오는 트래픽을 여러 서버 인스턴스에 효율적으로 분산시켜준다.이를 통해 서버 과부하를 방지하고, 고가용성을 유지할 수 있다. 대상 그룹 (Target Group) 로드 밸런서는 대상 그룹을 통해 요청을 처리할 서버 인스턴스를 정..

[MySQL] 인덱스의 기본, B-Tree 인덱스 사용법

DBMS에서 쿼리를 효율적으로 사용하기 위해인덱스는 매우 중요하다. 그 중 가장 대표적인 B-Tree 인덱스에 대해 알아보자.인덱스란우선 인덱스가 무엇인지부터 살펴보자.인덱스는 컬럼의 값과 해당 레코드가 저장된 주소를키와 값의 쌍으로 만들어두는 것이다. 그리고 컬럼의 값을 주어진 순서로 미리 정렬하여 보관한다. 인덱스는 Sorted List의 구조를 가지고 있는데,Sorted List 자료 구조는 데이터가 변경/추가될 때마다 항상 값을 다시 정렬해야 하므로 저장하는 과정이 느리고 복잡하지만이미 정렬 되어 있기 때문에 원하는 값을 매우 빠르게 찾을 수 있다는 특징을 갖는다. 즉, 인덱스는 데이터의 저장(INSERT, UPDATE, DELETE) 성능을 희생하고읽기 성능을 높이는 기능이다. 그렇기에 마냥 인..

DataBase/MySQL 2024.11.24

선착순 이벤트 구현하기 - RDBMS만 사용하기

운영 중인 서비스에 약 7천 명을 대상으로 하여선착순으로 상품을 지급하는 이벤트를 진행하기로 했다. 선착순 이벤트 구현의 중요한 부분은순서에 따라서 정확히 제한 인원 내에 들어온 요청에만성공 응답을 내려주고, 그 이후에 들어온 요청은 선착순 마감 응답을 내려줘야 한다는 점이다.1. Redis의 싱글 스레드 이용하기?처음에는 Redis의 싱글 스레드 특성을 이용하여선착순 이벤트를 구현하려고 했다.[이벤트 신청 API]1. 선착순 키값 조회2. 키 값이 정해진 인원보다 크거나 같으면 에러 응답3. 키 값이 정해진 인원보다 작으면 redis increment 실행 그러나 Redis의 값이 유실되거나,Redis 서버가 다운되는 상황을 항상 대비하는 것이서비스의 그라운드 룰이었기 때문에그러한 상황에 어떻게 대응할..

트러블 슈팅 2024.10.27

pg_trgm, Postgresql trgm으로 한글 LIKE 검색 시 Index 사용하기

postgresql로 만들어진 테이블에서음식의 이름을 검색하는 기능을 구현해야 했다. 유저가 특정 키워드를 입력하면 그 키워드가 포함된 음식을 반환하는 방식이다. SQL의 LIKE 문법과 와일드 카드(%)를  사용하면 문자열을 포함한 결과를 조회할 수 있지만, SELECT *FROM foodsWHERE name LIKE '%키워드%';키워드 앞에 와일드 카드(%)를 붙이면name 필드의 인덱스를 사용할 수 없다. 검색에서 인덱스를 타지 않으면 full table scan을 하게되고,테이블의 크기가 클 수록 조회 쿼리의 부하가 커진다. LIKE 검색 시 인덱스를 사용하기 위해 찾은 방법은pg_trgm 트라이그램(trigram)이라는 postgresql 확장 기능을 사용하는 것이다. Postgresql 공식..

DataBase/PostgreSQL 2024.10.13

PM2, node.js 상용 배포를 위한 프로세스 매니저

PM2란PM2(Process Manager 2)는 node.js 애플리케이션의 상용 프로세스를 관리하는 도구이다.빌트인 로드 밸런서를 가지고 있다.애플리케이션이 종료되지 않도록 유지해주며, 다운타임 없이 재시작 할 수 있게 해준다. 설치npm install pm2 -g npm으로 pm2를 설치할 수 있다. 사용 방법1. 애플리케이션 시작pm2 start app.js 터미널에서 pm2 start 명령어로 애플리케이션을 실행시키면 앱이 데몬 모드로 실행되고, 모니터링되고, 종료되지 않는다. 2. 실행되는 애플리케이션 관리pm2 list pm2 list 명령어를 실행하면 실행되고 있는 애플리케이션의 상태를 볼 수 있다.3. 애플리케이션 중지, 재시작, 삭제(종료)pm2 stop pm2 restart pm2 d..

Node.js 2024.09.29

[회고] 인스턴스 용량 부족에서 서버 다운까지

최근 업무 중 테스트(QA) 서버가 다운되는 일이 발생했다.긴박하게 복구해야만 하는 상황이었는데, 팀원들끼리 빠르게 해결하지 못해, 결국 CTO님이 나서주셔서 복구되었다.그 과정에 아쉬움이 남아, 다음에는 어떻게 더 잘 할 수 있을지 회고해보자. 사건의 발단시작은 AWS Elastic Beanstalk의 인스턴스 상태가 Warning으로 표시되면서 90% of root file system is in use. 800 MB free. 라는 경고문을 보여주면서였다.경고라고 해도 서버에는 아무 이상이 없었기에 별다른 조치를 취하지 않았다. 이 상태로 계속 거의 매일 배포하면서 작업을 이어나가고 있었는데,어느날 갑자기 배포 중 코드 파이프라인 배포 단계가 실패하며,빈스톡에서는 인스턴스 상태가 No Data로 표..

소감 & 회고록 2024.09.12

비전공 백엔드 개발자 1년 생존기

지난주를 기점으로 IT회사에 입사하여 백엔드 개발자로 일한지 1년이 되었다.작년 3월 다니던 회사를 뛰쳐나와 개발 공부를 시작하던 때가 생각난다. 1년 6개월 밖에 지나지 않았는데,새 삶을 살고 있는 것 같다. 입사 1주년 기념으로 새로운 시작을 한 나의 인생을 종합적으로 돌아보며 지극히 개인적인 감상들을 적어보고자 한다.개발자가 된 이유경영학과 출신에 이전에 다른 직무 경력이 있다고 이야기하면 어떻게 개발자가 되었느냐 묻곤 한다.그런 질문을 받으며 계속 생각해보았을 때,나는 갑자기 개발자가 된 것이 아니라,원래 개발자가 될 운명이었는데 멀리 돌아왔다는 생각이 들었다. 아주 과거로 돌아가서, 고등학생 때 즈음 '정보' 수업에서 html을 배웠던 기억이 난다.친구들은 그 수업을 싫어하고 어렵다며 우는 소리..

소감 & 회고록 2024.08.31

node.js 환경에서 java 코드를 사용하는 방법 (npm java)

Node.js에서 Java를 실행해야 하는 상황 발생node.js 서버를 운영하다 보면자바 코드를 사용하고 싶은 (혹은 사용해야만 하는) 경우가 생기기도 한다.(특히 자바 공화국이라고도 불리는 이 나라에서는 더더욱...) 최근 업무 중 KISA 한국 인터넷 진흥원에서 제공하는 암호화 방식을 사용해야 했는데,KISA에서 제공하는 소스 코드와 매뉴얼이 자바로만 작성되어 있었다. 자바 코드를 모두 node.js 코드로 변환하는 것도 옵션이었다. 하지만 함께 사용해야 했던 또 다른 암호화 방식은사기업이 제공하여 소스 코드를 제공하지 않은 채jar 파일만(여러개의 자바클래스 파일과 메타데이터, 리소스(텍스트, 이미지 등)를 하나의 파일로 모아서 배포하기 위한 패키지 파일)제공되었기 때문에node.js 코드로 변환..

Node.js 2024.08.17

NestJS API 응답에서 불필요한 프로퍼티를 제외하는 방법

0. 응답에서 일부 프로퍼티를 제외해야 하는 이유서버에서 클라이언트로 응답을 보낼 때,불필요한 프로퍼티를 제외하고 보내거나,민감한 정보를 반드시 제외하고 보내야 하는 상황들이 발생한다. 예를 들어, 유저 정보를 응답할 때비밀번호는 반드시 제외되어야 하는 경우 등이다. 혹은 클라이언트에서는 유저의 닉네임만 필요한데,유저 객체의 프로퍼티가 15개나 된다면나머지를 모두 제외하고 보내고 싶은 상황 등이 있다.1. @Exclude(), @Expose() 데코레이터class-transformer 패키지에서 제공하는@Exclude(), @Expose() 데코레이터를 응답 Dto에서 사용하면응답으로 내보낼 혹은 제외할 프로퍼티를 편리하게 지정할 수 있다. 응답이 직렬화될 때 dto에서 설정한 Exclude, Expos..

Node.js/NestJS 2024.08.03

[회고] 1.4TB로 커져 버린 DB 테이블 교체하기

0. Intro재직 중인 회사에서 담당한 서비스의 숙원사업이었던 포인트 테이블 개선 작업을 18주 동안 진행하여 RDS 사용량을 크게 줄인 후 남기는 회고입니다.1. 문제의 시작 - 포인트 로그 테이블담당 서비스 DB에 포인트 획득/사용의 기반이 되는 테이블이 있었습니다. 일명 포인트 디테일 로그 테이블은 모든 포인특 획득/사용 기록을 건당 저장합니다. 현재 유저가 보유한 포인트 계산은 포인트 디테일 로그 테이블을 기반으로 획득 내역은 더하고, 사용 내역은 감하여 계산됩니다.서비스 초기에는 이 포인트 기록, 조회 방식이 문제가 되지 않았습니다. 그러나 시간이 지날수록 쌓이는 데이터가 너무 많아졌고, 현재 포인트 디테일 로그 테이블의 크기는 1.4TB로 성장했으며, 레코드 개수는 96억개를 넘었습니다.(과..

소감 & 회고록 2024.07.21
728x90