쿠버네티스 CPU request vs limit 차이와 CPU limit 미적용 베스트 프랙티스

컨테이너에 CPU와 메모리를 얼마나 줄지 정하는 설정은 크게 두 가지입니다. request는 최소 보장을 위한 값이고 limit은 최대 상한선입니다. 이 둘을 어떻게 설정하느냐에 따라 스케줄링과 런타임 동작이 달라집니다 Request는 최소 이만큼은 보장해줘 스케줄러는 pod를 노드에 배치할 때 request를 기준으로 자원을 예약합니다. 즉 이 컨테이너는 최소 이만큼 필요하다는 의미이며, 노드에 request만큼의 여유가 없으면 해당 노드에는 올라가지 못합니다. 또한 request만큼의 자원은 다른 pod가 아무리 바빠도 최소한으로는 확보된다고 이해하면 됩니다 Limit은 최대 이만큼까지만 써라 limit은 컨테이너가 넘을 수 없는 상한입니다. limit을 초과하려고 하면 ...

May 18, 2026

JavaScript 이터러블과 유사 배열 객체 변환: Spread Syntax vs. Array.from

배경 ES6 이후 이터러블(iterable)이나 유사 배열 객체(array-like object)를 실제 배열로 변환하는 상황은 매우 흔합니다. 대표적으로 [...iterable](전개 구문, Spread Syntax)과 Array.from() 메서드를 사용합니다. 두 방식은 대부분의 경우 동일하게 동작하는 것처럼 보이지만, 동작 원리와 지원 범위에 명확한 차이가 있어 상황에 맞게 선택해야 합니다. 핵심 차이점 두 방식의 가장 큰 차이는 변환할 수 있는 소스 객체의 타입입니다. 전개 구문 ([...iterable]) 오직 이터러블 프로토콜을 따르는, 즉 Symbol.iterator 속성을 가진 객체에만 사용할 수 있습니다. NodeList가 이터러블인 최신 브라우저 환경에서는 문제없이 동작하지만, 그렇지 않은 환경에서는 TypeError가 발생합니다. ...

May 9, 2026

Cron과 Crontab 표현식 핵심 가이드

Cron, Crontab, Cronjob 유닉스 계열 운영체제에서 특정 작업을 정해진 시간에 자동으로 실행하려면 Cron을 사용합니다. Cron은 백그라운드에서 동작하는 데몬(daemon)이며, 스케줄링 설정을 바탕으로 명령어나 스크립트를 실행합니다 Cron: 시간 기반 잡 스케줄러(Job Scheduler)로, 특정 시간에 작업을 실행하는 시스템 데몬 Crontab: ‘Cron Table’의 약자로, Cron 작업의 목록과 실행 시간을 정의하는 설정 파일 또는 해당 파일을 다루는 명령어 Cronjob: Crontab에 등록되어 주기적으로 실행되는 개별 작업 이 글에서는 Cronjob을 정의하는 Cron 표현식(Cron Expression)의 구조와 문법을 정리합니다 ...

April 24, 2026

복잡한 서브시스템을 감추는 외벽, 퍼사드 패턴(Facade Pattern) 이해하기

퍼사드 패턴이란 퍼사드(Façade)는 프랑스어로 ‘건물의 정면’을 의미함. 소프트웨어 공학에서 퍼사드 패턴은 이 개념을 차용해 복잡한 서브시스템의 내부 구현을 숨기고, 클라이언트가 사용하기 쉬운 단일 인터페이스를 제공하는 역할을 함. GoF(Gang of Four)의 디자인 패턴 중 구조 패턴(Structural Pattern)으로 분류됨. 클라이언트는 복잡하게 얽힌 서브시스템에 직접 접근할 필요 없이, 퍼사드 객체가 제공하는 간결한 API를 통해 필요한 기능을 호출할 수 있음. 이를 통해 서브시스템과 클라이언트 간의 결합도(coupling)를 효과적으로 낮출 수 있음. 사용 목적과 장점 퍼사드 패턴의 주요 목적과 장점은 다음과 같음. ...

April 17, 2026

HTML 요소(Element)와 태그(Tag), 정확히 무엇이 다른가

개념 구분: 요소는 태그가 아니다 HTML을 다룰 때 ‘요소(Element)‘와 ‘태그(Tag)‘를 혼용하는 경우가 많다 흔히 “p 태그"처럼 부르지만 두 개념은 엄연히 다르다 이 차이는 HTML 4.01 명세부터 명확히 강조되었다 요소는 태그가 아니다. 어떤 이들은 요소를 태그라 부르기도 한다(예: “the P tag”). 하지만 요소와 태그(시작 태그든 종료 태그든)는 별개임을 기억해야 한다. 예를 들어, HEAD 요소는 마크업에 시작 태그와 종료 태그가 모두 생략되더라도 항상 존재한다. 즉, 요소는 문서의 구조적 구성원을 의미하며, 태그는 이 요소의 시작과 끝을 마크업에 표기하는 구문일 뿐이다 ...

April 15, 2026

서버 부하 분산을 위한 로드 밸런싱 알고리즘 비교: 라운드 로빈부터 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