서버 부하 분산을 위한 로드 밸런싱 알고리즘 비교: 라운드 로빈부터 PEWMA까지

배경 웹 서비스 트래픽이 증가해 단일 서버로 모든 요청을 처리하기 어려워지면, 여러 서버에 부하를 분산해야 합니다. 로드 밸런서는 다수 서버에 트래픽을 분배해 시스템 전체의 가용성과 확장성을 확보하는 핵심 요소입니다. 이 글에서는 대표적인 로드 밸런싱 알고리즘들의 특징과 장단점을 비교해봅니다. 주요 로드 밸런싱 알고리즘 라운드 로빈 (Round Robin) 가장 단순하고 보편적인 방식으로, 요청을 서버 목록에 따라 순서대로 분배합니다. 장점: 구현이 간단하며, 모든 서버의 사양이 동일하고 각 요청을 처리하는 비용이 균일한 환경에서 효과적입니다. 단점: 서버 간 성능 차이가 있거나 특정 요청의 처리 시간이 길어지면 일부 서버에 부하가 집중될 수 있습니다. 가중치 기반 라운드 로빈 (Weighted Round Robin) 각 서버의 처리 능력에 따라 가중치를 다르게 설정하고, 가중치가 높은 서버에 더 많은 요청을 보내는 방식입니다. ...

April 10, 2026

SQL Server 동적 쿼리 실행: EXEC와 sp_executesql 비교와 사용법

배경 T-SQL에서 동적 쿼리를 실행하는 방법은 크게 두 가지가 있음 EXEC(@sql)로 문자열 그대로 실행 sp_executesql로 파라미터화된 쿼리 실행 핵심 차이는 실행 계획 재사용성과 파라미터 처리 방식에 있음 sp_executesql 기본 @stmt는 NVARCHAR 계열 입력 요구, N 접두 사용 권장 긴 문장은 nvarchar(max) 사용 권장, nvarchar(4000) 사용 시 4000자 제한 발생 VARCHAR로도 암시적 변환은 되지만 유니코드 손실 및 길이 이슈 가능, N’’ 사용 권장 예시 DECLARE @sql nvarchar(max) = N'SELECT 1' EXEC sp_executesql @sql파라미터 바인딩 예시 ...

March 25, 2026

FastAPI 비동기 처리와 이벤트 루프 이해 — uvicorn, uvloop, asyncio, libuv

개요 FastAPI의 비동기 처리 흐름을 이벤트 루프 관점에서 정리 Node.js의 libuv 기반 모델을 기준선으로, Python의 asyncio와 uvloop, 그리고 Uvicorn이 FastAPI 요청을 어떻게 비동기로 처리하는지 비교 I/O 바운드 중심의 동작 원리와 GIL 제약, 실무에서의 주의점을 함께 정리 Node.js 이벤트 루프 요약 싱글 스레드 논블로킹 모델의 핵심은 이벤트 루프와 비동기 I/O 위임 Node.js는 C로 구현된 libuv를 통해 커널 비동기 I/O를 활용하거나, 미지원 경우 스레드풀로 오프로드 기본 스레드풀 크기는 4로 시작, 환경변수로 조정 가능 libuv가 커널 비동기 I/O를 직접 쓰는 경우와 아닌 경우의 차이 참고 ...

March 24, 2026

Dockerizing의 의미와 기본 워크플로우

개요 Dockerizing은 Docker 컨테이너를 사용해 애플리케이션을 패키징하고 배포하고 실행하는 일련의 과정 코드와 런타임, 의존성, 설정을 이미지로 고정하여 환경 차이와 배포 리스크를 낮추는 것이 목적 핵심 개념 Image: 애플리케이션과 런타임, 의존성, 설정을 포함한 불변 아티팩트 Container: 이미지를 실행한 격리된 프로세스 단위 Dockerfile: 이미지를 만들기 위한 선언형 스펙 Registry: 이미지를 저장하고 배포하는 원격 저장소 동작 흐름 빌드 단계 Dockerfile 작성 후 docker build 실행해 이미지 생성 태그 전략 수립 필요 ex) app:1.2.3, app:stable, app:commit-hash 배포 단계 레지스트리에 docker push 환경별 레지스트리 또는 네임스페이스 구분으로 충돌 방지 실행 단계 docker run으로 컨테이너 기동, 포트 매핑과 환경 변수 주입 로그는 표준 출력으로 수집, 상태 점검을 위해 헬스체크 설정 권장 업데이트와 롤백 불변 이미지와 태그 기반 배포로 롤백 단순화 레지스트리 보존 정책으로 이력 관리 간단 예시 최소 Dockerfile 스니펫 FROM alpine:3.19 WORKDIR /app COPY . . CMD ["sh", "-c", "echo hello"] 로컬 빌드와 실행 docker build -t app:local . docker run --rm -p 8080:8080 app:local주의와 베스트프랙티스 최소 베이스 이미지 선택으로 공격면과 이미지 크기 축소 레이어 캐시 고려해 변경 빈도 낮은 명령을 상단에 배치 멀티스테이지 빌드로 빌드 타임 도구를 런타임 이미지에서 제거 비밀정보는 이미지에 포함하지 않고 시크릿 관리 도구 또는 런타임 주입 사용 컨테이너 리소스 제한 설정으로 노이즈 네이버 이슈 완화 개발과 운영 환경 간 설정 차이는 환경 변수와 명시적 구성으로 관리 보안 스캔과 베이스 이미지 업데이트 자동화로 취약점 대응 마무리 Dockerizing은 애플리케이션을 이미지로 표준화해 이식성과 재현성을 확보하고 배포 파이프라인 단순화에 기여함 핵심은 선언적 스펙으로 빌드하고 불변 이미지를 레지스트리로 배포한 뒤 태그와 자동화를 통해 일관되게 실행하는 것 작게 빠르게 안전하게의 원칙을 적용하면 운영 효율과 신뢰도 상승 ...

March 23, 2026

JavaScript에서 NaN 정확히 판별하기 Number.isNaN vs isNaN와 자기비교 트릭

개념/배경 NaN은 JavaScript 숫자 타입의 특별한 값으로 계산 불능을 의미함 NaN은 어떤 값과도 같지 않으며 자기 자신과도 같지 않음 동등 비교 연산으로는 판별 불가 올바른 판별 방법 Number.isNaN 값이 실제 NaN인지만 검사, 타입 강제 변환 수행 안 함 isNaN 전달된 값을 숫자로 변환한 뒤 검사, 문자열 등에서 오탐 가능 x !== x는 오로지 NaN에서만 참이 되는 성질 활용 가능 주의할 점 외부 입력이 문자열인 경우 숫자로 명시 변환 후 Number.isNaN으로 확인 권장 빈 문자열 Number(’’)는 0, parseInt(’’)는 NaN 반환 차이 주의 0/0, Math.sqrt(-1) 같은 계산에서 NaN 발생 가능 동등 비교나 switch 키로 NaN을 식별하려 하지 말 것 ...

March 22, 2026

SQL Server에서 현재 DB에 걸린 트랜잭션 락 확인 방법

개념/배경 운영 중 특정 데이터베이스에서 대기나 블로킹이 의심될 때, 현재 걸린 트랜잭션 락을 직접 확인하는 것이 우선임 SQL Server의 동적 관리 뷰 sys.dm_tran_locks는 활성 잠금 정보를 제공하며 데이터베이스 단위로 필터링 가능 사용법/예시 아래 쿼리로 대상 DB에 설정된 잠금 목록 조회 SELECT * FROM sys.dm_tran_locks WHERE resource_database_id = DB_ID('MY_DB')요점 컬럼 참고 request_session_id: 잠금 보유 또는 대기 세션 ID resource_type, resource_associated_entity_id: 잠금 대상 리소스 식별 request_mode: 잠금 모드 (S, X 등) request_status: GRANT 또는 WAIT 상태 추가 확인 포인트 블로킹 체인 파악 필요 시 sys.dm_exec_requests, sys.dm_os_waiting_tasks와 조합하여 대기 중인 세션과 차단 세션 상관분석 권장 식별된 차단 세션은 영향 분석 후 종료 여부 판단 ...

March 21, 2026

CSS 사용자 지정 속성(CSS Variables) 기본 개념과 다크 모드 적용 패턴

개요 CSS 사용자 지정 속성(CSS Variables, Custom Properties)은 재사용 가능한 값을 선언하고 문서 전반에서 참조하기 위한 메커니즘 반복되는 색상, 간격, Z-index 같은 값을 의미 있는 이름으로 관리해 전역 치환 리스크를 줄이고 테마 전환 같은 요구에 유연하게 대응 가능 사용자 지정 속성은 일반 CSS 규칙에 포함되어 캐스케이딩과 상속의 영향을 받음 핵심 개념 표기 규칙: 이름은 두 개의 대시로 시작, 예) –main-color 대소문자 구분: –my-color와 –My-color는 서로 다른 속성 참조 방식: var(–name) 형태로 값 참조 기본값 지원: var(–name, fallback) 형태로 값이 없을 때 대체값 지정 가능 속성 값 위치에서만 사용 가능, 선택자나 미디어 쿼리 조건, 속성 이름에는 사용 불가 동작 원리와 스코프 사용자 지정 속성은 선언된 규칙의 선택자 범위에만 유효 상속 특성 보유, 상위에서 선언하면 하위에서 참조 가능 :root에 선언하면 문서 전역 범위의 기본값으로 동작 동일한 변수 이름을 더 구체적인 선택자나 조건에서 재정의하면 캐스케이드에 따라 해당 범위에서 우선 적용 사용법과 짧은 예시 전역 선언과 기본 참조 ...

March 20, 2026

Python의 Call by Object Reference 정확히 이해하기

개요 파이썬 변수와 함수 인수 전달 방식을 정리함 주요 키워드 세 가지 정리 call by value call by reference call by object reference (aka call by sharing) 헷갈리는 포인트는 call by reference와 call by object reference의 차이임 파이썬에서 실제로 일어나는 바인딩과 가변성의 조합으로 이해 필요 호출 방식 개념 정리 Call by Value 인수 전달 시 값의 복사 전달 함수 내부에서 인자를 변경해도 호출자 쪽 원본에는 영향 없음 Call by Reference 인수 전달 시 변수 자체를 참조로 전달하는 모델 함수 내부 변경이 호출자 변수에 그대로 반영됨 특정 언어에서만 엄밀히 지원되는 개념이며, C는 포인터를 값으로 전달해 유사 동작을 만들 수 있으나 언어 차원의 call by reference와는 구분 필요 Java는 참조 자체를 값으로 전달하므로 call by reference가 아님에 주의 ...

March 19, 2026

CORS 제대로 이해하고 해결하기: SOP, 프리플라이트, 인증 요청

개요 브라우저에서 API 호출이 분명 성공한 것 같은데, 콘솔에는 CORS 에러가 뜨는 상황 자주 마주함 문제의 본질은 서버가 망가진 게 아니라 브라우저의 보안 정책에 의해 응답 사용이 차단된 것임 CORS는 차단을 풀기 위한 협상 절차이자 규칙 세트이며, 정확히 이해하면 재현과 해결이 쉬워짐 핵심 개념 Origin 정의 Origin = scheme + host + port 조합 세 요소 중 하나라도 다르면 서로 다른 출처로 판단 SOP(Same-Origin Policy) 동일 출처 간 상호작용 허용, 교차 출처는 기본 차단하는 브라우저 보안 정책 XSS, CSRF 등 교차 사이트 공격 리스크 완화 목적 출처 비교와 차단 판단 주체는 서버가 아니라 브라우저 예외적으로 허용되는 리소스 ...

March 18, 2026

서버 타임존 확인과 Intl.DateTimeFormat 활용 가이드

개요 Intl.DateTimeFormat은 JavaScript 국제화 API의 일부로, 추가 라이브러리 없이 날짜와 시간을 지역화된 형식으로 포맷하는 기능 제공 브라우저와 Node.js에서 동작하며, 호스트의 기본 타임존 정보를 IANA 식별자 형태로 노출 가능 서버가 어떤 타임존으로 실행 중인지 확인할 때 resolvedOptions().timeZone 사용 핵심 개념과 정의 국제화 API: 로케일과 캘린더, 숫자 체계, 타임존 등을 기준으로 표기 형식을 결정하는 표준 인터페이스 IANA 타임존 식별자: Asia/Seoul, UTC, America/New_York 같은 표준 명칭 호스트 기본 타임존: 런타임이 인식한 시스템 타임존으로, resolvedOptions().timeZone에서 확인 오프셋과 타임존의 차이: 오프셋은 시점별 UTC와의 분 단위 차이, 타임존은 DST 등 규칙을 포함하는 영역 개념 ...

March 17, 2026