728x90
반응형

_Async/Await_

 

자바스크립트에서 async/await는 뭘까?

 

async/await는?

Promise 기반으로 동작하지만, then/catch/finally 와 같은 프로미스 후속 처리 메서드에 콜백 함수를 전달하여

비동기 처리 결과를 후속 처리할 필요 없이 마치 동기 처리처럼 프로미스를 사용할 수 있다.

결과적으로 Promise를 더 쉽게 다룰 수 있게 해 준다.

async/await을 사용하면 비동기 함수들을 마치 동기 함수처럼 작성하여 동작할 수 있게 해 준다.

 

function getData(){

/*

 비동기 함수

 */

}

// 프로미스

new Promise((resolve, reject) => {

const result = getData();

if ( /* 비동기 작업 수행 성공 */) {

resolve(result);

} else {

reject(result);

}

})


// async/await

async function getData() {

await /* 비동기 함수 */

}

 

Async

async 함수는 async 키워드를 사용해 정의하고, 언제나 프로미스를 반환한다.

 

Await

await 키워드는 프로미스가 settled 상태가 될 때까지 대기하다가 settled 상태가 되면 프로미스가 resolve 한 처리 결과를 반환한다.

 

참고 링크

- async/await (https://learnjs.vlpt.us/async/02-async-await.html)

728x90
반응형

'백엔드 Backend > Nodejs' 카테고리의 다른 글

[NODEJS] Promise란?  (0) 2024.10.22
[NODEJS] 이벤트 루프란?  (0) 2024.10.01
Nodejs 란?  (1) 2024.09.30
728x90
반응형

자바스크립트에서 사용되는 Promise는 무엇일까?

 

콜백

콜백 함수는 다른 함수에 인자로 전달되는 함수로

어떤 함수의 동작에서 이벤트가 발생하였을 때, 혹은 특정 시점에 도달했을 때 호출하는 함수이다.

아래 예시는 정말 러프하게 이해할 수 있게끔만 적어놓은 함수이다. 단순한 구조라면 콜백 구조가 깊지 않지만, 복잡도가 높아짐에 따라 콜백 함수가 중첩되고 그 깊이가 엄청나게 깊어지는 것을 콜백 지옥이라 한다.

 

function getData(){

  /*

  비동기 함수

  */

}


getData().then(

  // 완료 되었을 때

).then().then().catch().finally()

 

Promise

Promise 객체는 ES6에서 추가된 개념으로, 비동기 작업이 작업 완료 후 미래의 완료 혹은 실패 결과를 나타낸다.

기존의 방식으로는 작성하게 된다면 콜백 지옥에 빠지게 된다.

또한 Promise 객체는는 비동기 함수들을 병렬로 수행할 수 있도록 하며 .all() 메서드와 .allSettled() 메서드를 프로퍼티로 가진다.

 

_출처: https://adrianalonso.es/desarrollo-web/apis/trabajando-con-promises-pagination-promise-chain/_

 

Promise는 비동기 작업을 수행하고 그 작업의 성공 혹은 실패 함수를 호출할 수 있다.

function getData(){

  /*

  비동기 함수

  */

}


new Promise((resolve, reject) => {

  const result = getData();


  if ( /* 비동기 작업 수행 성공 */) {

    resolve(result);

  } else {

    reject(result);

  }

})

 

Promise의 상태(State)

Promise 객체의 상태 정보는 세가지가 있다.

  • pending: 비동기 처리가 아직 수행되지 않은 상태 - Promise 객체가 생성된 직후 기본 상태
  • fulfilled: 비동기 처리가 수행된 상태 (성공) -> resolve 함수 호출
  • rejected: 비동기 처리가 수행된 상태 (실패) -> reject 함수 호출

 

정리

  • Promise는 콜백 지옥에 빠지는 비동기 처리를 간결하게 처리할 수 있게 표현
  • 상태에는 pending, fulfilled, rejected 가 있다.
  • 실행 결과에 따라 실패 시 reject, 성공 시 resolve 함수를 호출할 수 있다.

참고 링크

- Promise (https://learnjs.vlpt.us/async/01-promise.html)

728x90
반응형

'백엔드 Backend > Nodejs' 카테고리의 다른 글

[NODEJS] Async/Await 란?  (0) 2024.10.23
[NODEJS] 이벤트 루프란?  (0) 2024.10.01
Nodejs 란?  (1) 2024.09.30
728x90
반응형

도커 EXPOSE

  • Expose는 컨테이너에 오픈할 포트를 의미한다.
  • 즉 컨테이너에서만 열려있는 포트로, 동일한 도커 네트워크에 속해있지 않은 호스트나 외부에서 접근할 수 없다.

도커 PORT

  • Port는 EXPOSE 된 컨테이너의 포트를 호스트에 열어주는 것을 의미한다.
  • 앞의 포트는 호스트의 포트, 뒤의 포트는 컨테이너의 노출된 포트를 의미한다.
  • 즉 동일한 도커 네트워크에 속해있지 않더라도, hostIP와 해당 포트를 알고 있다면 컨테이너에 접근이 가능해 진다.
  • 컨테이너의 포트를 호스트와 연결시켜주는 것이므로, 컨테이너 포트와 동일할 필요가 없다
    • 이 말은 다시 말하면, 특정 포트(3306 / 5504 / 6379등) 만을 사용해야하는 어플리케이션에 대해 다양한 포트 번호를 호스트가 사용할 수 있게 되는 것이다.
    • 왜냐하면 특정 포트를 반드시 사용해야 한다는 제약은 컨테이너의 포트에만 적용될 수 있기 때문이다.
      • 3306만을 사용해야하는 mysql을 구동할 때, PORTS를 5587:3306으로 설정한다면 외부에서는 5587로 접근하지만 어플리케이션은 3306 포트를 사용하는 효과를 거둘 수 있는 것이다.
728x90
반응형
728x90
반응형

도커 네트워크

  • 도커 네트워크는 일종의 내부망 이다.
    • 각 컨테이너들은 독립적인 네트워크 망을 가진다.
    • 정확히는 분리된 네트워크를 가진다 -> IP를 나눈다는 의미
    • 때문에 각 컨테이너별로 호스트와는 다른 가상의 IP 주소를 가진다.
  • 도커 네트워크는 컨테이너가 끼리의 통신을 할 수 있는 범위라 말할 수 있을 것 같다.
  • 기본적으로 컨테이너가 구동되게 되면 해당 컨테이너에 대한 default_network가 생성된다.
    • 이렇게 되면 다른 네트워크의 컨테이너와 소통할 수 없기 때문에 도커 외부로 우회하여 소통해야한다.
    • 컨테이너끼리 소통하기 위해 외부로 나갔다 들어와야 하기 때문에 성능적으로 저하가 발생하고, 보안적으로도 문제가 생길 수 있다.
  • 그러나 동일한 네트워크에 속한 컨테이너들 끼리는, 컨테이너의 이름과 포트만으로 서로 통신이 가능하다.

컨테이너 구동 시 도커 네트워크 구성에 대해

  • 컨테이너 구동 시, 순차적으로 도커 내부 IP 부여
    • 일반적으로 172.~~ 으로 시작하더라
    • 순차적으로 IP를 부여하기 때문에, 컨테이너를 내렸다 다시 올리면 컨테이너 IP가 변동 될 수 있음
  • 도커 네트워크는 내부망이기에, 외부와 연결시켜야 함
    • 컨테이너 구동 시, 자동적으로 컨테이너 마다 호스트에 veth(Virtual Ethernet)라는 가상 네트워크 인터페이스를 생성함
    • 네트워크 관련 설정을 하지 않는다면 default0 브릿지를 사용함

Docker Bridge

  • 도커 브릿지는 호스트와 컨테이너를 잇는 라우팅 경로
    • 즉 쉽게 말하면, 각 컨테이너에 가상의 IP를 부여하는 공유기 역할

도커 네트워크 전체 조회

  • 현재 사용중인 도커 네트워크 리스트 조회
docker network ls
  • 도커 네트워크 세부사항 조회
docker network inspect 

도커 네트워크 설정

  • 도커 네트워크 설정
  • docker network create <네트워크 이름>

컨테이너 네트워크 설정

  • 같은 도커 네트워크에 해당하는 모든 컨테이너들은 서로 내부 통신이 가능함
    • 이미 db_mariadb 라는 컨테이너가 proxy라는 도커 네트워크 안에 구동되어 있다면
    • 지금 올리는 어플리케이션 컨테이너를 proxy라는 네트워크에 포함시킴으로 인해서, db_mariadb:3306 을 url로 잡으면 통신이 가능해짐
    • 같은 네트워크가 아니라면, 'HostIP:컨테이너 포트' 를 통해 접근할 수 있음
      • 문제는 컨테이너가 호스트에 포트를 열어둔게 아닌, 컨테이너 포트만 노출 시킨 상태라면 접근할 수 있는 방법이 없어짐
  • 컨테이너 네트워크 설정 - docker compose
    • external: 컨테이너 구동 시 새로운 네트워크를 사용할지에 대한 여부를 설정하는 것
      • true: 기존 도커 네트워크를 할당함
      • false: 새로운 도커 네트워크를 생성함
    services:
        app:
            // 컨테이너 설정
            networks:
                - proxy
    
    networks:
        proxy:
          # proxy라는 새로운 네트워크를 생성하는게 아닌, 기존의 proxy라는 네트워크를 사용한다는 의미
            external: true
  • 컨테이너 네트워크 설정 - Dockerfile
    docker run app_name --net proxy
728x90
반응형
728x90
반응형

프로메테우스란?

  • 프로메테우스는 사운드 클라우드에서 처음 제작한 모니터링 & 알람에 초점이 맞춰진 모니터링 오픈소스 툴이다.
  • 요청 발생 수, DB 연결 수 등의 숫자로 치환될 수 있는 시계열 데이터를 메트릭스(Metrics) 라 하는데, 이를 시계열 데이터로 저장 및 수집하는 툴이다.

특징

  • 다차원 시계열 데이터를 메트릭스 명과 key-value 쌍으로 관리한다.
  • PromQL 이라는 쿼리 언어로 차원들을 관리한다.
  • 다른 저장소에 종속되지 않는다.

데이터 수집 방법

  • 엔드포인트에 HTTP 요청을 통해 데이터를 스크레이핑 한다.
  • exporter를 배포해 해당 exporter의 엔드포인트를 통해 데이터를 스크레이핑한다.

시스템 메트릭 수집

  • 프로메테우스가 서버의 시스템 메트릭스(Load Average, CPU Usage 등)을 수집하는 방법은 node-exporter를 사용하는 것이다.
    • node-exporter는 시스템 정보를 수집하는 툴이라고 생각하면 편하다.

Node Exporter 실행

  • 컨테이너로 이를 시행시킬 수 있다.
  • 아래처럼 설정한다. 이렇게 했을 때, exporter의 엔드포인트로 접근해 데이터를 수집할 수 있다.
services:
    exporter:
        image: prom/node-exporter:v1.8.2
        container_name: exporter
        expose: 9100
        command:
          - '--path.procfs=/host/proc'
          - '--path.rootfs=/rootfs'
          - '--path.sysfs=/host/sys'
          - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
        volumes:
            - /proc:/host/proc:ro
            - /sys:/host/sys:ro
            - /:/rootfs:ro
        networks:
            - proxy
  • path.roofts 설정
    • 호스트 전체 모니터링을 위한 설정
    • 루트 디렉토리에 대해 바인딩 시켜, Exporter가 호스트 FileSystem에 접근하게 해 주는 옵션
    • 이후 루트 디렉토리를 볼륨으로 넣음
    • 일반 디렉토리면 그냥 넣어주면 된다.

프로메테우스 실행

설정

  • 프로메테우스 설정
    • prometheus.yml 파일로 해야 인식한다. 물론 볼륨으로 넣을 때, 명칭을 바꿔주는 것도 가능하다.
    • 수집할 대상의 엔드포인트를 정의한다.
    • 이는 scrape_configs 에 그 타겟 대상과 라벨링이 가능하다.
global:
    scrape_interval: 15s
    evaluation_interval: 15s

# Set the scrape interval to every 15 seconds. Default is every 1 minute.

rule_files:
    - alert.rules.yml
      alerting:
        alertmanagers:
            - static_configs:
            - targets: ["host.docker.internal:9093"]

scrape_configs:
    - job_name: 'System Server'
      static_configs:
        - targets: ['node:9100']

    - job_name: 'cAdvisor'
      static_configs:
        - targets: ['cadvisor:8080']
  • 설정 옵션 관련 내용
    • global: 전체적인 데이터 수집에 대한 전역 설정
    • scrape_configs: 수집 작업에 대한 정의
    • remote_write: 수집된 메트릭을 원격 엔드포인트로 전달하기 위한 설정

컨테이너 설정

  • prometheus.yml 파일 이외에도 alert.rules (장애 알람 규칙) 등 다른 설정들도 먹일 수 있다.
  • 해당 설정들은 /etc/prometheus 경로에 넣어주면 된다.
services:
    prometheus:
        image: prometheus:v2.54.1
        volumes:
            - ./prom-config/prometheus.yml:/etc/prometheus/prometheus.yml
            - ./prom-config/alert.rules.yml:/etc/prometheus/alert.rules.ym
            - prometheus_data:/prometheus
        command:
            - '--config.file=/etc/prometheus/prometheus.yml'
            - '--storage.tsdb.path=/prometheus'
            - '--web.console.libraries=/etc/prometheus/console_libraries'
            - '--web.console.templates=/etc/prometheus/consoles'
            - '--web.enable-lifecycle'
        networks:
            - proxy
        restart: unless-stopped
        ports:
            - 9090:9090

GUI

  • 이제 http://localhost:9090으로 접근해 보면 아래와 같이 확인할 수 있다.
  • 아래 랜딩페이지 화면에서 PromQL을 통해 데이터를 쿼리해 볼 수 있다.

'

  • 또한 현재 데이터를 수집하고 있는 대상을 확인하는 방법은 Status - Target으로 확인할 수 있다.
    • 여기서 현재 정상적으로 데이터가 수집되고 있는지도 확인할 수 있다.

728x90
반응형

'데브옵스 devOps > Monitoring' 카테고리의 다른 글

[CNCF] OpenTelemetry(OTel)란?  (0) 2024.11.22
728x90
반응형

WORM

  • 감염 방식 중 하나로, 여러 단말기에 분산되어 해당 단말기들에 연결된 네트워크 전체를 감염
  • 트로이 목마의 위장 기능과 바이러스의 증식 기능을 탑재

Trojan horse

  • 정상적인 프로그램으로 위장한 악성코드
  • 시작부터 끝까지 메모리에 상주하여, 시스템 내부 정보를 공격자의 컴퓨터로 빼돌리는 프로그램
  • 직접적 전파능력은 없음

Root Kit

  • 공격자의 존재를 숨기면서 시스템에 대한 무제한 접근 권한 부여
  • 펌웨어, 가상화 계층 등의 시스템 영역에서 작동
  • 운영체제 시스템콜을 해킹하여 안티바이러스 탐지 우회 가능

Ransomware

  • 피해자의 데이터나 디바이스를 점유해 데이터를 암호화 한 후, 암호키를 대가로 금품을 요구하는 악성 코드
728x90
반응형

'백엔드 Backend' 카테고리의 다른 글

[테스팅] 어플리케이션 테스팅  (2) 2024.11.01
[결합도/응집도] 결합도와 응집도란  (0) 2024.10.24
SOLID 원칙  (0) 2024.10.08
비동기 Asynchronous 란?  (0) 2024.10.04
[백엔드] REST API 란?  (0) 2024.09.27
728x90
반응형

페이지 교체 알고리즘

  • 메모리를 관리하는 운영체제에서 페이지 부재가 발생하여 새로운 페이지를 할당하기 위해 현재 할당된 페이지 중 어느 것을 교체할지 결정하는 방법

FIFO

  • 선입선출법. 페이지 주기억장치에 적재된 시간 기준으로 교체된 페이지 산정하는 기법
    • 중요한 페이지가 오래 있었다는 이유만으로 교체되는 문제.
    • 가장 오래 있었던 페이지는 앞으로도 계속 사용될 가능성이 있으므로.

LFU

  • 가장 적은 횟수를 참조하는 페이지 교체
    • 참조될 가능성이 많음에도 불구하고 횟수에 의한 방법으로, 최근에 사용된 프로그램을 교체할 가능성 존재
    • 해당 횟수를 증가시키므로 오버헤드 발생

LRU

  • 가장 오랫동안 참조되지 않은 페이지 교체
    • 프로세스가 주기억장치에 접근할 때마다 참조된 페이지에 대한 시간을 기록해야함. 큰 오버해드 발생
728x90
반응형
728x90
반응형

세타조인 (Theta Join)

  • 조인에 참여하는 두 릴레이션의 속성 값을 비교하여 조건을 만족하는 튜플만 반환
  • 조건은 (=, !=, >=, <=, >, <) 중 하나
  • 조인에서 ON 키워드로 사용함

동등조인 (Inner Join)

  • 세타조인의 하나. 세타조인 중 = 연산자를 사용하는 조인
  • 동등조인의 결과 릴레이션의 차수는 첫번째 릴레이션과 두번째 릴레이션의 차수를 합한 것
    • 3 + 2 = 5 차수

자연조인

  • 동등조인에서 조인에 참여한 속성이 두 번 나오지 않도록, 중복된 속성 제거 결과 반환
  • 차수는 (두 릴레이션의 차수의 합) - (중복된 속성 수)

외부조인

왼쪽 외부 조인 (left outer join)

  • 왼쪽 투플 기준으로, 자연조인 시 실패한 튜플을 모두 보여주되 값이 없는 대응 속성에는 NULL 값으로 채워 반환

오른쪽 외부 조인 (right outer join)

  • 오른쪽 튜플 기준으로, 자연조인 시 실패한 튜플을 보여주되 값이 없는 대응 속성에는 NULL 값을 반환

완전 외부 조인 (full outer join)

  • 양쪽 튜플 기준으로 자연조인 시 실패한 튜플을 모두 보여주되 값이 없는 대응 속성에는 NULL 값을 채워서 반환
728x90
반응형
728x90
반응형

역정규화

  • 비정규화: 시스템 성능 향상을 위해 의도적으로 중복을 허용하는 과정
  • 쿼리 성능 최적화를 위한 의도적 중복

장점

  • 대용량 데이터 처리 시스템 / 읽기 연산이 많은 시스템에서 유리
  • 데이터 접근 시간 단축

단점

  • 그러나 데이터 중복으로 인해, 일관성을 위지하기 위한 방법이 필요
728x90
반응형
728x90
반응형

DataBase 설계 시 고려해야 하는 것 중엔 정규화와 비정규화(역정규화)가 있다.

정규화

  • 데이터 중복을 최소화하고 무결성을 유지하는 과정

장점

    • 데이터 모델을 여러 작은 테이블로 분해
  • 각 테이블이 하나의 주제에 집중하도록 설계
  • 데이터 중복 줄이고, 업데이트 이상 현상 방지
    • 저장 공간 효율적, 데이터 무결성 보장
    • 데이터베이스 구조의 단순화
    • 데이터 간의 관계가 명확해짐

단점

  • 그러나 과도한 정규화는 쿼리 복잡도 증가시킴 (JOIN)
  • 성능 저하도 가능

정규화 과정

제 1 정규화 (1NF)

  • 테이블의 칼럼이 원자값(Atomic Value: 하나의 값)을 갖도록 테이블 분해
    • 각 칼럼이 하나의 속성만을 가져야 함
    • 하나의 칼럼은 같은 종류나 타입의 값을 가져야 함
    • 각 칼럼이 유일한 이름을 가져야 함
    • 칼럼의 순서가 상관없어야 함
이름 나이 수강과목
홍길동 20 C,C++
이순신 21 Java
이도 34 DB, 운영체제

에서

이름 나이 수강과목
홍길동 20 C
홍길동 20 C++
이순신 21 Java
이도 34 DB
이도 34 운영체제

제 2정규화(2NF)

  • 1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 분해하는 것
  • 부분적 종속: 기본키 중에 특정 칼럼에 종속되는 것
  • 완전 함수 종속: 기본키의 부분집합이 결정자가 되어선 안됨을 의미
  • 조건
    • 제 1 정규화를 만족해야함
    • 모든 칼럼이 부분적 종속이 없어야 함.
    • 모든 칼럼이 완전 함수 종속을 만족해야 함
이름 수강과목 강사명 성적
홍길동 C 광해군 95
홍길동 C++ 선조 100
이순신 Java 선조 70
이도 DB 세종 80
이도 운영체제 태종 85
  • 특정 학생의 성적을 알기 위해선 이름과 수강과목을 알아야 함
  • 특정 과목의 강사는 과목명만 알면 알 수 있다.
  • 위 테이블의 기본키는 이름과 과목으로, 복합키이다.
  • 반면 지도교수 칼럼은 과목에만 종속되므로, 제 2정규화를 만족하지 않음
이름 수강과목 성적
홍길동 C 95
홍길동 C++ 100
이순신 Java 70
이도 DB 80
이도 운영체제 85
강사명 수강과목
광해군 C
선조 C++
선조 Java
세종 DB
태종 운영체제

으로 테이블을 나눈다는 의미


제 3정규화

  • 이행적 종속(Transitive Dependencies) 을 없애도록 테이블을 분해함
  • 이행적 종속: A -> B, B -> C이 성립할 때, A -> C이 성립함을 의미함
  • 조건
    • 제 2 정규화를 만족해야 함
    • 기본키를 제외한 속성들 간의 이행 종속성이 없어야 한다.
ID 등급 할인율
101 VIP 70%
102 Gold 40%
103 Bronze 20%
  • 이렇게 데이터가 있으면, ID 를 통해 할인율을 알 수 있다
    • 따라서 제 3정규형을 만족하지 않는다.
ID 등급
101 VIP
102 Gold
103 Bronze
등급 할인율
VIP 70%
Gold 40%
Bronze 20%

BCNF (Boyce-Codd Normal Form)

  • 제 3정규형을 좀 더 강화한 버전
  • 조건
    • 제 3정규형을 만족해야 함
    • 모든 결정자가 후보키 집합에 속해야 함
      • 후보키 집합에 없는 칼럼이 결정자가 되어선 안된다는 의미
이름 수강과목 지도교수
홍길동 C 광해군
홍길동 C++ 선조
이순신 Java 선조
이도 DB 세종
이도 운영체제 태종
* 강사의 이름을 이름과 과목으로 조회할 수 있다.
* 그러나 같은 과목을 다른 강사가 가르칠 수 있기 때문에, 수강과목 -> 지도교수 이란 종속은 성립하지 않음
* 하지만 지도교수 -> 수강과목이라는 종속은 성립
이름 지도교수
홍길동 광해군
홍길동 선조
이순신 선조
이도 세종
이도 태종
지도교수 수강과목
광해군 C
선조 C++
선조 Java
세종 DB
태종 운영체제
으로 나눌 수 있다.

제 4정규화

  • 일반적으로 BCNF 정규화까지만 함
728x90
반응형

+ Recent posts