분류 전체보기 (26) 썸네일형 리스트형 Django ORM Auto Commit 개요최근 Django 프레임워크를 사용하는 새로운 회사로 이직하게 되었습니다. 이전 회사에서는 주로 Spring Boot와 NestJS 프레임워크를 사용했지만, Django에 대해서는 깊게 공부해본 적이 없습니다. 새로운 환경에 빠르게 적응하고 회사에 기여하기 위해, Django ORM을 학습하고자 합니다. 그래서 이번 글에서는 Django ORM의 특징 중 하나인 Auto Commit에 대해 알아보겠습니다. Auto Commit이란?Auto Commit은 데이터베이스 작업(save, update, delete ...)이 호출되는 즉시 커밋되는 트랜잭션 처리 방식입니다. Spring Boot의 경우 기본적으로 Auto Commit이 false로 설정되어 있습니다. 또한 @Transactional 어노.. Spring MVC, Spring Webflux SSE 성능 비교 개요많은 사용자 트래픽이 예상되는 프로젝트에서 SSE(Server-Sent Events)를 활용해 사용자에게 데이터를 스트림으로 전송해야 하는 요구사항이 생겼습니다. 이러한 환경에서 서버 성능 이슈로 SSE를 빠르게 전달하지 못하면 UX가 심각하게 나빠지기 때문에 효율적인 요청 처리가 무엇보다 중요합니다. 그렇기에 프로젝트를 시작하기 전, Spring Boot 환경에서 어떤 방식으로 SSE를 구현할지 고민했습니다. Spring에서 SSE를 구현하려면 두 가지 방법이 있습니다.1. SseEmitter를 WebMVC에서 사용하는 방식2. WebFlux 환경에서 Flux를 사용하는 방식. 많은 사용자 요청을 효율적으로 처리해야 하기 때문에 두 가지 방법의 성능테스트 해보면서 더 나은 성능을 보이는 방법을 찾.. Redis + Spring AOP를 활용한 Rate Limiter 기능 구현 개요현재 진행중인 개인 프로젝트에선 Rate Limiter 기능이 적용되어있지 않습니다. 이 경우 만약, 악성 사용자가 서버를 다운시키기 위해 짧은 시간 내에 다량의 영상을 업로드할 경우, 서버에 심각한 부하가 발생할 수 있고, 한 영상에 매크로성 댓글이 여러 개 달리면 사용자 경험에 부정적인 영향을 줄 수 있습니다. 이러한 문제들을 예방하고자 Rate Limiter를 적용하기로 결정했습니다. Rate Limiter를 적용하기 전 고민이 있었는데요, Resilience4j, Bucket4j와 같이 기존에 존재하는 라이브러리를 사용해 구현할지, 아니면 Redis를 이용해 직접 구현할지 고민되었습니다. 라이브러리를 사용하면 구현이 간편하다는 장점이 있습니다. 하지만 스프링 애플리케이션 메모리를 직접 사용하기.. Redis AOF에서 성능 저하를 방지하는 방법 개요이번에 Redis 유실 방지를 위해 AOF를 사용해보면서 한가지 의문점이 생겼습니다. AOF는 Redis 데이터에 대한 Create, Update 작업을 Disk의 로그 파일에 기록해서 Redis 프로세스가 다운되어도 복구할 수 있게 만드는 전략입니다. 그런데 이 때, 로그 파일에 기록하는 것은 Disk I/O 작업이기 때문에 Disk에 데이터를 기록하는 RDBMS를 사용했을때와 다를게 없습니다. 그래서 Redis에서는 어떤 방식으로 성능 저하를 방지하면서 AOF를 사용할 수 있도록 구현했는지 알아보겠습니다. appendfsyncappendfsync 속성은 AOF 전략을 사용할 때, 로그 데이터를 어떤 주기로 저장할지 결정하는 속성입니다. redis.conf 파일을 보면, appendfsync .. 날짜별 조회 수 분석 기능 구현 개요티스토리 블로그관리 창에 들어가면 날짜 별 조회수를 나타내주는 아래와 같은 사진이 보입니다. 현재 진행중인 동영상 조회 플랫폼 Inugram에도 이 기능을 한번 적용해보겠습니다. 설계영상 조회수 기능을 설계하기 전, 스스로 세가지 조건을 고려하며 설계하였습니다. 1. 다중 사용자 조회 시 lost update 문제가 발생하면 안된다.2. 많은 사용자 트래픽을 수용할 수 있어야 한다.3. 사용자가 매 일자마다 조회수가 얼마나 집계되었는지 확인할 수 있어야한다. 일단 첫 번째 문제는 두 가지 방식으로 해결할 수 있습니다. 1. RDB에 락을 걸어서 lost update를 방지한다.2. 조회 수 저장소로 Redis를 사용해서 INCR 명령어로 원자적 연산을 수행한다. 만약 첫 번째 방법을 사용하게.. 성능 향상 + 메모리 절약을 충족시키며 Redis 사용하기 개요프로젝트에서는 좋아요 기능이 있습니다. 첫 설계에서 좋아요 관련 CRUD 작업은 RDB에서 수행했습니다. 하지만 lost update를 방지하기 위해 RDB에 배타락을 걸어, select for update로 이를 처리했는데 이러한 방식은 성능상에 악 영향을 미치는 작업이었습니다. 이를 해결하기 위해 인 메모리 데이터베이스인 Redis를 사용하고, 분산락을 이용해서 좋아요 관련 작업을 수행해서 성능을 향상시켰습니다. 여기서 문득 의문점이 생겼습니다. 만약 좋아요 데이터가 1억개가 된다면?? 그러면 시스템 메모리 사용량이 상당히 높아질 것이고, 값 비싼 비용을 지불해서 캐시 서버를 여러대 늘려야만 해결할 수 있을 것입니다. 그래서 이 문제를 해결하고자 아래 플로우대로 작업을 수정해보겠습니다 좋.. [Node.js] worker thread를 이용한 CPU bound 작업 병렬 처리 개요NestJS로 프로젝트를 진행하며, CPU bound 작업이 있는 상황이 있었습니다. JS는 기본적으로 싱글스레드 비동기로 동작했기 때문에 CPU 코어수가 여러개 있더라도 한개의 코어밖에 사용하지 못했습니다. 이 때문에 CPU bound 작업을 병렬처리하지 못했고, 이는 사용자가 빠르게 응답을 받지 못하는 결과로 이어졌습니다. 이를 해결하고자 Node.js의 내장 모듈인 worker thread를 이용해서 JS 코드를 병렬처리 해보겠습니다. worker thread worker thread는 Node.js에서 다중 스레드를 사용할 수 있도록 도와주는 모듈입니다. 1부터 10억까지 더하는 작업을 예시로 들어 설명드리겠습니다. 사용법은 간단합니다. worker_thread 모듈을 가져온 뒤, 사용자.. Docker-compose Watch Tower 적용 개요현재 프로젝트의 배포 환경에서는 docker-compose를 이용해 backend docker image와 frontend docker image가 한번에 배포되고 있습니다. 이 때문에, frontend 개발자가 코드 변경 사항을 실 서버에 배포하려면 직접 배포 프로세스를 모두 익히거나, 배포 담당자에게 따로 부탁을 해야했습니다. 이러한 비 효율적인 방법을 개선하기 위해, frontend 개발자가 github에 코드를 push 했을 때 자동으로 실 서버에 배포되는 환경을 구현했습니다. watchtower 란Docker Watchtower는 도커 컨테이너를 자동으로 업데이트해주는 도구입니다. Watchtower는 실행 중인 도커 컨테이너의 이미지를 주기적으로 확인하고, 새로운 버전의 이미지가 Do.. 윈도우 환경에서 slack 알림 전송 시 invalid payload 에러 해결 개요현재 진행중인 프로젝트의 배포 순서는 아래와 같습니다. 1. yarn version --prepatch를 실행해 프로젝트의 버전을 증가시킵니다.2. serverless 환경에 프로젝트를 배포합니다.3. curl 명령어를 이용해 slack 웹 훅 URL 로 프로젝트 배포 결과를 출력합니다. 문제 상황1번과 2번 과정은 문제없이 진행되었지만, 3번 과정에서 Slack에 배포 결과가 전송되지 않는 문제가 발생했습니다. 특이하게도, 팀원분의 PC에서 배포할 때는 알림이 정상적으로 전송되었지만, 제 PC에서는 Invalid payload 에러가 발생하며 알림이 전송되지 않았습니다. 이 문제의 원인은 사용한 터미널 쉘에 있었습니다. 저는 Windows OS를 사용하여 PowerShell 터미널에서 스크립트를.. Elastic Search + Kibana 도커 구동 개요APM을 이용해 NestJS 서버를 모니터링 할 생각으로 EC2에 스카우터를 띄웠습니다. 그런데 웬걸 스카우터는 node 서버는 모니터링이 안되는 것이었습니다. 그래서 node 서버를 모니터링 하기 위한 툴을 여러개 찾던 중 Elastic APM에 대해 알게되었습니다. 그동안 ELK stack에 대해서 들어만 봤지 실제로 써본적은 한번도 없었기에 일단 Elastic Search + Kibana를 도커로 띄워보면서 ELK stack과 친해져 보겠습니다. Elastic Search 1. elastic search의 도커 이미지를 다운 받습니다.docker pull docker.elastic.co/elasticsearch/elasticsearch:8.7.0 2. 도커 이미지를 컨테이너화 시킵니다.doc.. 이전 1 2 3 다음