전체 글

전체 글

    Nest.js 인터셉터 (Interceptor) 란?

    인터셉터 Nest.js 의 인터셉터 클래스는 @Injectable 데코레이터를 추가해야 한다. NestInterceptor 인터페이스를 상속해야 한다. 인터셉터는 Aspect Oriented Programming 기술에서 영감을 받았다. 메서드 실행 전 후에 추가 로직 바인딩 함수 결과를 변환 함수 예외를 변환 함수 동작을 확장 조건부 함수 완전 재정의 (ex. 캐싱 목적) 기초 인터셉터는 intercept() 메서드를 구현해야 한다. 메서드엔 두개의 인자가 있다. 1번째 인자, ExecutionContext: 요청의 타입 정보나 호출된 컨트롤러 메서드 정보 등을 가져올 수 있다. ex) http 에서 헤더, 쿠키 등의 정보 그리고 컨트롤러 메서드 정보 이는 ArgumentsHost 를 상속한다. 2번째..

    도커 컨테이너의 라이프사이클 (Docker container lifecycle)

    컨테이너의 라이프사이클 docker run 은 실제론 docker create 와 docker start 가 하나로 합쳐진 명령이다. docker create 까지는 격리된 공간만 만들어놓는다. docker start 단계에서 실제로 메모리와 CPU 를 사용하게 된다. docker pause 명령어는 컨테이너를 일시정지 시키는데, 이 때는 컨테이너의 상태를 기억해야 해서 메모리는 사용하지만 CPU 는 사용하지 않는 상태가 된다. docker stop 명령어는 컨테이너에서 실행 중이던 프로세스를 완전히 중지시킨 것이고, CPU 도 메모리도 사용하지 않는다. 다시 시작하면 컨테이너가 처음부터 다시 시작된다. docker rm 은 모든 단계에서 실행 가능하다. 단, 실행 중인 컨테이너를 삭제하려면 docker..

    2가지 파일 업로드 방식 알아보기 (feat. pre-uploading (프리 업로드, 먼저 업로드) 방식과 일반 업로드 방식)

    업로드 방식 일반적인 파일 업로드 방식 제목, 내용, 파일을 한 번에 받아 업로드한다. 업로드 버튼을 눌른 이후에 업로드가 시작되었을 때, 사용자는 앱이 약간 느리다고 느낄 수 있다. 파일이 여러개가 되거나 첨부파일의 용량이 커질수록 이러한 불편을 느낄 확률이 커진다. 먼저 업로드 하는 방식 (Pre-uploading, Background uploading) 첨부파일을 선택하는 순간에 이미 업로드는 시작된다. 업로드된 파일은 임시 폴더에 잠시 저장된다. 첨부파일 업로드 뒤에 게시글 작성 시 첨부파일 경로만 추가해준다. S3 presigned url 을 사용하면 많이 사용되는 방식이다. 장단점 비교 일반적인 파일 업로드 방식 체감 속도: 길다 서버 과부하: 한 번의 요청만 받게 되므로 상대적으로 유리하다...

    Cgroup, 씨그룹, c그룹 이란 무엇인가?

    cgroup 이란? 제어 그룹 (control group) 의 줄임말이다. 프로세스의 리소스 사용량 (CPU, 메모리, 디스크 I/O, 네트워크) 등을 제한하고 격리하는 Linux 커널 기능이다. Docker 와 같이 컨테이너화된 환경에서 필요한 격리 및 리소스 제어를 제공하는데 필수적이다. 핵심 개념 리소스 제한 프로세스의 사용자 정의 그룹 간에 CPU 시간, 시스템 메모리, 네트워크 대역폭과 같은 리소스를 할당할 수 있다. 우선순위 지정 서로 다른 리소스 그룹의 우선순위를 정의할 수 있다. 부하가 높을 때 어떤 애플리케이션이 더 많이 리소스를 확보할지 설정이 가능하다. 감사 (Audit) 여러 작업 그룹에서 사용하는 리소스에 대한 자세한 계정을 제공한다. 모니터링 및 감사 목적에 중요하다. 제어 제어..

    컨테이너 런타임 (Container Runtime) 이란 무엇인가? 그리고 runc

    컨테이너 런타임이란? 도커에서 직접 커널과 통신하며 실제로 격리된 공간을 만드는 역할을 한다. 호스트 운영체제에서 컨테이너를 실행하고 컨테이너 이미지를 관리함 실행, 일시 중지, 중지와 네임스페이스, cgroup, 네트워크 인터페이스 관리와 같은 저수준 작업을 처리 컨테이너의 수명 주기를 담당 도커는 처음에 LXC 라는 런타임을 사용했지만 나중에 libcontainer 라는 자체 런타임을 개발하고 나중에 runc 로 발전 점진적으로 가볍고 유연하고 안정적이 됨 runc 런타임이란? OCI 스펙에 따라 컨테이너를 생성하고 실행하기 위한 CLI 도구임. Docker 및 기타 컨테이너 플랫폼이 내부적으로 사용하는 런타임이고 컨테이너 실행을 위한 사실상의 표준. 단순성, 이식성, OCI 런타임 사양 준수에 중점..

    도커의 아키텍처

    도커의 역할 커널의 컨테이너 가상화 기술을 사용자가 손쉽게 활용할 수 있게 하는 것 도커 아키텍처 컨테이너 엔진: 사용자의 요청을 받아 컨테이너를 관리하는 역할 컨테이너 런타임: 직접 커널과 통신하며 실제로 격리된 공간을 만드는 역할 도커는 runc 라는 컨테이너 런타임을 사용 runc 는 OCI (Open Container Initiative) 를 준수함 무조건 runc 를 사용해야 하는 것은 아니지만 도커에서 기본으로 사용하는 컨테이너 런타임임 리눅스 커널 버전마다 사용법이 다른데, runC는 cgroup, namespace 와 같은 기술을 버전에 구애받지 않고 사용할 수 있도록 LXC 혹은 libvirt 를 사용하여 간접적으로 관리함 도커 클라이언트 서버 구조 도커는 클라이언트 서버구조로 동작한다...

    컨테이너 가상화란?

    컨테이너 가상화 하이퍼바이저 방식보다 더 가볍고 더 빠르다. 리눅스 커널이 제공하는 LXC, 리눅스 컨테이너 라는 자체 격리 기술에서 출발했다. 커널 자체의 공간만 사용하여도 격리된 공간을 만들 수 있다. 커널의 Namespace 와 Cgroups 를 이용한다. Namespace: 프로세스, 하드드라이브, 네트워크, 사용자, 호스트 네임처럼 리소스를 나누는 기준의 역할 Cgroups: 메모리, CPU, Disk, Network Bandwidth 처럼 리소스의 사용량을 배분하는 기술 LXC 라는 기술을 통해 분리된 공간 각각을 컨테이너라고 부른다. Host OS 의 커널을 공유하는데, 이게 컨테이너 가상화의 가장 큰 특징 중 하나이다. Guest OS 를 사용하는 하이퍼바이저 방식보다 오버헤드가 작다. 하..

    LXC (Linux Container, 리눅스 컨테이너) 란?

    LXC (Linux Containers) 란? LXC 는 리눅스 컨테이너 (Linux Containers) 란 뜻이다. 리눅스 커널에 내장된 경량 가상화 기술이다. 단일 호스트에서 여러 개의 격리된 Linux 시스템 (컨테이너) 을 실행할 수 있다. c그룹 및 네임스페이스 격리를 사용하여 독립적인 컨테이너가 단일 Linux 인스턴스 내에서 실행되도록 함으로써 가상머신(VM) 을 시작하고 유지 관리하는데 드는 오버헤드를 방지한다. 특징 리소스 효율성 및 속도: VM과 비교했을 때 호스트 시스템의 커널을 공유하므로 오버헤드가 적고 빨리 부팅할 수 있다. 격리: 컨테이너 내부의 프로세스는 다른 컨테이너나 호스트 시스템에서 실행중인 프로세스를 보거나 상호작용할 수 없다. 보안: AppArmor, SElinux ..

    하이퍼바이저 (Hypervisor) 란 무엇인가?

    가상화 기술 용어 Host OS: 가상화 기술을 이용하고 있는 호스트의 운영체제 Guest OS: 가상화 기술에서 실행되고 있는 운영체제 하이퍼바이저 하이퍼바이저의 동작 원리 OS 엔 하드웨어를 사용하기 위해 커널이라는 중요한 도구가 설치되어 있음 커널은 System call 이란 것을 이용하여 OS 에 리소스 사용 요청을 전달함 System call 을 통해 하드웨어 자원을 이용할 수 있음 하이퍼바이저에서 Host OS 와 Guest OS 종류가 다르면 상호 호환이 되지 않음 여기서 하이퍼바이저가 다른 커널 간의 언어를 통역하는 역할을 하게 됨 가상머신은 하드웨어 리소스 사용을 위해 Host OS 로 시스템 콜을 보냄 이 시스템 콜은 하이퍼바이저에 의해 해석되어 Host OS 에 맞는 시스템 콜로 변함..

    .bashrc 파일이란?

    .bashrc 란? Bash 가 시작될 때마다 실행되는 스크립트다. Bash 는 대화형 셸 세션이다. bash, 그리고 Shell 이란 무엇인가 [[002.bash-란-무엇인가]] Bash 에 무언가 개인화된 기능을 넣을 때 필요하다. .bashrc 의 일반적인 용도 환경변수 설정 (environment variables) 명령의 별칭 만들기 (alias) 기본 편집기 설정 Bash 프롬프트 사용자 지정 PATH 변수에 디렉터리 추가 .bashrc 는 Bash 셸에서만 동작한다. Zsh 나 Fish 와 같은 다른 셸엔 자체 구성파일이 있다. .bashrc 파일의 작성 예제 alias: 편의를 위한 별칭 설정 PATH: 사용자의 /bin 디렉터리가 있는 경우 이를 포함하도록 PATH 업데이트 등등등... ..

    Bash, 그리고 Shell 이란 무엇일까?

    개요 Shell 의 일종이다. Shell 이란 운영체제에서 커널과 이용자 사이에 끼어 이용자의 명령어를 해석하고 처리 결과를 나타내주는 시스템 프로그램을 말한다. 운영체제만 딸랑 있으면 운영체제 내부에 있는 파일 접근, 명령 수행 등이 매우 어려운데 그 사이 브로커 역할을 해주는 것이 Shell 이다. Bash 는 Bourne Again SHell 을 줄여서 표현한 것이다. Bash 외에도 csh, ksh, zsh 등 많은 셸들이 존재한다. Bash 의 기능들 CLI (Command-line Interface) 파일 관리, 프로그램 실행, 디렉터리 탐색 등의 작업 수행이 가능한 텍스트 인터페이스를 제공한다. 스크립팅 언어 (Scripting Language) 셸 스크립트를 작성할 수 있게 해준다. 파일 ..

    Nest.js 의 Class Validator 란?

    Class Validator 란? nestjs 파이프 아래에 속하는 개념이다. Class Validator 공식문서 더 상세한 Typescript Validator 공식 문서 데코레이터를 통해 주로 DTO 내부에 있는 프로퍼티들의 값을 검증하는데 사용한다. 예시 글로벌로 적용하기 위해 필요한 설정 main.ts 에 다음 코드를 반드시 설정해주어야 한다. import { NestFactory } from "@nestjs/core"; import { AppModule } from "./app.module"; import { ValidationPipe } from "@nestjs/common"; async function bootstrap() { const app = await NestFactory.creat..

반응형