본문 바로가기

728x90
반응형

View All

(80)
[알고리즘] 이진 탐색 (Binary Search) 우리가 흔히 알고있는 Netflix나 YouTube 같은 서비스에서 "2025년 10월 21일의 사용자 로그"를 찾는다고 상상해보자. 로그가 날짜순으로 정렬되어 있다면, 처음부터 하나씩 찾아볼까요? 아니면 중간부터 시작해서 "이게 1월이면 앞으로, 3월이면 뒤로" 이런식으로 범위를 좁혀갈까요?이것이 바로 이진 탐색입니다.데이터베이스의 인덱스, Git의 bisect, 배포 버전 찾기 등 실무 곳곳에서 사용되는 핵심 알고리즘입니다. 여러 코딩 테스트에서도 단골손님이죠. 이러한 중요한 알고리즘, 탐색 알고리즘에서 가장 기초가 되는 "이진 탐색"에 대해 학습한 내용을 정리하려고 합니다.이진 탐색이란?이진 탐색은 정렬된 배열에서 특정 값을 찾는 탐색 알고리즘입니다. 배열의 중간 값과 찾으려는 값을 비교하여, 탐색..
[알고리즘] 정렬 알고리즘(선택, 삽입, 버블, 합병, 퀵, 힙) 정렬은 데이터를 특정 순서로 배열하는 알고리즘으로, CS에서 가장 기본적이면서도 중요한 개념입니다. 이번 포스팅에서는 대표적인 정렬 알고리즘 6가지를 시간 복잡도와 함께 자세히 알아보겠습니다. 정렬 알고리즘 분류정렬 알고리즘은 성능에 따라 크게 Slow, Fast 정렬 두가지로 나뉩니다.Slow 정렬 - O(n²)선택 정렬 (Selection Sort)삽입 정렬 (Insertion Sort)버블 정렬 (Bubble Sort)Fast 정렬 - O(n log n)합병 정렬 (Merge Sort)퀵 정렬 (Quick Sort)힙 정렬 (Heap Sort)성능 비교표여기서 말하는 안정성은 같은 값을 가진 요소들의 상대적 순서가 정렬 후에도 유지되는지 여부에 대한 내용입니다.알고리즘최선평균최악공간 복잡도안정성선택..
[알고리즘] 시간 복잡도와 빅오 표기법 완벽 이해하기 알고리즘을 공부하다 보면 가장 먼저 만나게 되는 개념이 바로 '빅오 표기법'입니다. "이 알고리즘의 시간 복잡도는 O(n)입니다", "O(log n)이 더 효율적입니다"와 같은 표현을 들어보셨을 텐데요. 이번 포스팅에서는 빅오 표기법이 무엇이고, 왜 중요한지, 그리고 실제로 어떻게 활용하는지 알아보겠습니다.알고리즘 복잡도란?알고리즘의 효율성을 평가하는 데는 공간 복잡도와 시간 복잡도 두 가지 기준이 있습니다.공간 복잡도 (Space Complexity)공간 복잡도는 알고리즘이 실행되는 동안 사용하는 메모리 공간을 나타내는 개념입니다.주요 특징데이터 관리에 필요한 메모리 공간을 분석합니다.입력 데이터의 크기에 따라 메모리 사용량이 어떻게 변하는지 측정합니다.변수, 배열, 재귀 호출 스택 등이 차지하는 공간..
[운영체제] 프로그램 메모리 구조 가이드 프로그램이 실행될 때 운영체제는 메모리를 어떻게 관리할까요? 이번 포스팅에서는 프로그램 실행 시 메모리가 어떻게 구성되고 동작하는지 깊이 있게 알아보겠습니다.메모리 구조의 4가지 영역프로그램이 실행되면 운영체제는 메모리를 크게 4개의 영역으로 나누어 관리합니다.1. Text 영역 (Code 영역)Text 영역은 실행 가능한 코드가 저장되는 공간입니다.1.1. 특징프로그램의 실제 명령어(기계어)가 저장됩니다.함수, 제어문(if, for, while 등), 상수 리터럴이 포함됩니다.읽기 전용(Read-Only) 영역으로 설정되어 코드 변조를 방지합니다.프로그램 실행 중 크기가 변하지 않는 정적 영역입니다.여러 프로세스가 같은 프로그램을 실행할 경우 Text 영역을 공유할 수 있습니다. 2. Data 영역Da..
k6 부하 테스트 가이드 신규 프로젝트 운영 반영 전, 예상 트래픽을 기준으로 성능과 병목을 미리 점검했습니다. 사전에 구성한 Grafana 대시보드와 k6 부하 테스트를 이용해 실제 트래픽 수준을 재현했고, 그 과정에서 헷갈리기 쉬운 용어들을 정리했습니다. 아래에 k6 핵심 개념과 지표 해석 기준을 설명합니다.k6자바스크립트로 시나리오를 작성하는 CLI 기반 부하테스트 도구VU(가상 사용자) 모델과 도착률(RPS) 모델 모두 지원influxDB/Prometheus/JSON 등으로 메트릭을 보내 Grafana 시각화 가능용어트래픽·사용자 관련VU (Virtual User): 가상 사용자. 동시 접속자 수에 해당. 각 VU는 JS 스크립트의 default 함수를 반복 실행Iteration: VU가 default 루프를 한 번 수행..
단일 폴링 스케줄러를 전용 ThreadPool로 고도화하기 레디스 큐에서 작업을 하나씩 처리하던 구조를 전용 실행 풀(ThreadPool) 기반 병렬 파이프라인으로 바꿔 처리량과 지연을 동시에 개선한 사례를 정리해보려고 합니다.배경 / 문제기존 구조@Scheduled로 1개 스레드가 주기적으로 Redis 큐에서 한 건씩 꺼내 처리문제점트래픽 상승 시 큐 적체 증가 → 응답/완료 지연스케줄러 스레드가 오래 점유되면 다음 틱 지연 (fixedDelay라도 실질 주기 늘어남)처리량, 동시성, 백프레셔(backpressure) 제어가 어려움위와 같은 배경과 문제로 저는 아래와 같이 목표를 정했습니다.처리량 확장(Throughput↑)과 대기시간 감소(Queue wait↓)안전한 백프레셔(과부하 시 자연 감속 or 재큐잉)장애 시 at-least-once 보장(손실 없이..
Spring Boot + Redis Queue 비동기 작업을 FIFO로 처리하기 예를 들어 대량의 이미지 합성(썸네일 생성, 포스터 합성 등) 작업을 요청-응답 동기 처리로 묶으면 API 지연, 타임아웃, 서버 부하가 한꺼번에 터집니다. 이런 이미지 합성은 단지 하나의 사례일 뿐이고, 메일 발송, 영상 인코딩, 알림톡 전송, 데이터 가공 같은 다양한 작업에도 동일한 문제가 발생합니다.이럴 때 작업을 큐에 적재하고 워커가 비동기로 꺼내 처리하면, 처리량(Throughput)과 안정성을 모두 챙길 수 있습니다. 본 글에서는 이미지 합성을 예시로 들면서, Redis List 기반 큐를 활용해 FIFO(선입선출) 방식으로 비동기 작업을 처리하는 패턴을 설명해보겠습니다.왜 Redis Queue인가?빠름: 메모리 기반이라 초당 수만 건 수준으로 push/pop이 가볍습니다.간단함: List 연..
PM2 restart vs reload pm2 restart모든 프로세스를 중단 후 다시 시작프로세스가 죽고 새로 뜨기 때문에 다운타임(downtime) 발생클러스터 모드(instances > 1)에서도 프로세스 전체가 동시에 종료 → 요청이 잠시 끊김개발 환경에서 코드 변경을 빠르게 반영할 때 많이 사용운영 환경에서는 트래픽이 잠깐이라도 끊기기 때문에 가급적 지양pm2 restart ecosystem.config.jspm2 reload무중단(Zero-downtime) 재시작 방식클러스터 모드에서 워크 프로세스를 하나씩 교체한다.ex) 4개 instance → 1번부터 순서대로 교체 → 서비스 중단 없이 업데이트이 방식으로 서비스 중단 없이 배포 가능싱글 인스턴스(instances = 1)일 경우, 교체할 프로세스가 하나뿐이라 결국 resta..

728x90
반응형