3. Backend/NestJS / / 2024. 3. 8. 17:10

[코드팩토리 NestJS 강의] Intro

728x90

백엔드 구분

  • API Server : 프론트엔드와 백엔드 또는 벡엔드끼리의 연결을 가능하게 해주는 영역
    NestJS / Django / Spring / GraphQL / REST API / gRPC
  • Database : 데이터 저장소
    Postgresql / MySQL / Oracle / MongoDB / DynamoDB
  • Infrastructure : 백엔드를 실행하는 하드웨어를 관리하는 영역
    Cloud / K8s / DevOps

Node JS 란? (간단한 소개)

  • 오픈소스 : 누구나 볼 수 있도록 소스코드가 공개되어있다
  • 크로스 플랫폼 : 여러 OS에서 사용/실행 할 수 있다.
    여러 OS : MaxOS, Windows, Linux (*웬만한 서버는 Linux로 이루어져 있다)
  • 자바스크립트 런타임 : 자바스크립트를 실행할 수 있다.

  • Express : Nest가 작성된 기반
  • SoketIO : 채팅 관련된 기능에 사용예정

Node JS 란? (기술적 소개)

다양한 Jabascript 엔진

  • V8 : Chrome에서 사용, Google에서 제작함 / 속도가 빠름 / NodeJS에서 채택, MS Edge브라우저에서 사용
  • SpiderMonkey : firefox에서 사용
  • Safari : MacOS

Compiled 언어와 Interpreted언어

  • Compiled : 프로그램을 실행하기 전에 작성된 코드를 기계어로 한번에 모두 변환한 후 실행한다
  • Interpreted : 프로그램을 실행하면서 동시에 코드를 한줄 한줄씩 변환해서 실행한다.

Compiled Interpreted

프로그램을 실행하기 전에 기계어(Machine Code)로 전부 변환을 한 다음 실행한다 프로그램을 실행하는 도중에 각 코드를 줄별로 변환해서 실행한다.
기계어로 모두 변환이 된 상태에서 실행되기 때문에 실행과정은 빠르다 모든 코드가 변환이 된 상태로 실행되지 않기 때문에, 실행이 비교적 느리다.
작성한 코드가 변경될때마다 오랜시간 컴파일을 해야하는 문제가 있다. 한번에 컴파일을 할 필요가 없기때문에 코드 변경이 있을때마다 매번 전체컴파일을 할 필요가 없다
타겟 플랫폼에서 직접 컴파일을 진행한다. 코드를 실행하는 또 다른 프로그램(Interpreter)가 존재한다.
번역기로 한번에 돌리는것 통역사가 번역해주는것

Just In Time Compilation (JIT)

  • JIT은 Compile방식과 Interpret방식의 장점을 모아둔 형태이다
  • Ignition을 이용해서 Interpretation을해서 Javascript의 Dynamically Typed 특성을 살리며 컴파일 시간을 짧게 가져간다
  • Turbofan을 이용해서 자주 사용되는 코드를 Machine Code로 최적화해서 컴파일 해둔다 해당코드는 최적화 된 상태에서 반복저으로 사용할 수 있다.
  • 만약에 최적화가 잘못되었거나 더이상 필요없어지면 다시 Byte Code로 변환한다
  • V8또한 JIT Compilation을 사용하고 있다

  1. 코드실행환경 준비하기
  2. 컴파일하기
  3. 바이트코드(Byte Code) 생성
  4. Interpret + Ignition 실행하기(Byte Code)
  5. Compile + Turbofan 실행하기 (Machine Code) : 자주쓰는 코드를 Machine Code로 Optimization(최적화)해서 효율을 올린다.

Byte Code vs Machine Code

Byte Code Machine Code Machine Code
CPU가 바로 읽고 사용할 수 있는 바이너리로 구성된 코드이다. 바이트코드는 CPU가 바로 읽을 수 있는 코드가 아니다. 중간에 가상환경이나 또 다른 프로그램(Interpreter)이 실행을 중재한다.
바이트코드보다 컴퓨터에 더 가까운(Low Level)코드 머신코드보단 사람과 가까운 (High Level)코드다
실행이 매우 빠르다 실행이 상대적으로 느리다
컴파일이 느리다 컴파일이 빠르다
플랫폼에 종속성이 있다 플랫폼 종속성이 없다
하나의 운영체제에서 실행할 수 있는 기계어는 다른 운영체제에서 실행할 수 없다.

ex) 한번 windows에서 컴파일하면, macOS에선 또다시 컴파일 해야한다.
interpreter만 있으면 실행가능하다.

interpreter가 코드를 읽고 변환을 해주기 때문에, 어떤 플랫폼이든 interpreter만 설치되어있으면 실행에 문제 없다. 

 

왜 Javascript는 ByteCode를 사용하는가?

 

nodeJS 싱글스레드모델 (non-blocking)

  • 쓰레드 : CPU에서 가용할 수 있는 인력의 개념 /
    • 쓰레드의 갯수 = 동시에 작업을 할 수 있는 작업의 갯수를 의미 / 각각의 쓰레드 별로 작업을 돌릴 수 있다
  • Event Loop은 무조건 싱글스레드이다.
  • blocking 요청 : 시간이 오래걸리는 요청 / non- blocking요청 : 단순한 요청
  • 요청이 들어가면 Event Queue에 쌓임
    • → non-blocking요청의 경우 EventLoop에서 빠르게 처리하여 끝냄 (CPU가 막힐정도로 오래걸리지않음)
    • → blocking요청의 경우 Worker Thread에 보냄

 

HTTP

HTTP란?

  • HTTP는 클라이언트와 서버가 통신하는 방법 중 하나이다
  • 클라이언트가 요청을 보내면 서버가 응답을 반환한다
  • 요청과 응답의 구조화된 데이터를 보낼때 일반적으로 JSON 구조를 사용한다

JSON

  • JS객체 또는 여타 언어의 Map과 구조가 매우 비슷하다
  • 요청과 응답의 body에 사용되는 구조이다
  • 보낼때 String으로 변환하고 받으면 다시 JSON 으로 변환한다
  • Kety/Value 짝으로 이루어져있고 콜론을 기준으로 왼쪽이 Key, 오른쪽이 Value가 된다
  • Key는 String만 허용된다
  • Value는 숫자 String, 중첩된 JSON그리고 List등이 허용된다
{
	'name' : 'hyunJeong',
	'age' : '26',
	'occupation' : 'sofrware engineer',
	'company' : [
								{
									'name' : 'Moai',
									'address' : '@@@@@@@@@@'
								}
							]
}

HTTP 요청의 구성요소

  • URL : 요청을 보내는 주소
  • Method : 요청의 종류/타입 (GET, POST, PUT, PATCH, DELETE)
  • Header : 요청의 메타데이터
  • Body : 요청에 관련된 데이터 / JSON구조로 형성되어있다

URL의 구성요소

Method

  • 같은URL에 여러개의 Method가 존재할 수 있다
  • GET요청은 데이터를 조회할때 사용한다
  • POST요청은 데이터를 생성할때 사용한다
  • PUT요청은 데이터를 업데이트 또는 생성할때 사용한다
  • PATCH요청은 데이터를 업데이트 할때 사용한다
  • DELETE요청은 데이터를 삭제할때 사용한다
  • 이외에도많은 Method가 존재하지만 잘 사용하지 않는다
    • HEAD / CONNECT / OPTION 등
  • Method는 정해진 목적대로 사용해야하지만 개발자가 마음대로 기능을 정의할 수 있기 때문에 강제되는 부분은 아니다
    • DELETE매소드를 실행하면 데이터가 생성되도록 코드를 정의할 수 있다.
    • 굉장히 큰 혼란을 야기 할 수 있으니 절대 금지

 

Header란 무엇인가?

  • Header는 메타데이터를 정의한다
  • 메타데이터는 데이터에 대한 데이터 즉, 요청에 대한 정보를 정의한다
  • 흔히 예제로 Cookie, 인증토큰, 요청의 바이트 길이, 요청/응담을 보낸 Host, 요청할때 사용된 클라이언트 타입과 버전 등을 정의한다
  • Key/Value 형태로 정의되고 Key와 Value 모두 String형태다
  • 라이브러리 / 프레임워크 / 환경에 의해 자동 생성되는 값들이 많고 직접 값을 변경하는 경우는 Body보단 상대적으로 적다
    • 요청에 대한 데이터이기 때문에, 실제로 요청에 보낼때는 Header가 아닌 Body에는 실제 정보를 넣게되고, Header에는 Body를 포함한 전체에 대한 정보를 넣기때문에 직접 변경하는 경우는 적다

Host : blog.codefactory.ai 
Cookie : zzz;yyy;zzz
User-Agent : Mozilla/5.0 AppleWebKit/537.35
Accept : application/json

Body란 무엇인가?

  • Body는 요청에 대한 로직수행에 직접적으로 필요한 정보를 정의한다
  • 만약에 새로운 블로그 글을 생성하는 POST요청을 한다면 이 글을 생성할때 필요한 제목, 내용등의 모든 데이터를 Body에 입력하게 된다
  • 일반적으로 JSON구조를 사용한다
  • Header와 가장 큰 차이점은 Header는 요청 자체에 대한 정보를 담고 있고, Body는 요청을 수행하는데 필요한 데이터를 담고 있다는 것이다
{
	'name' : 'hyunJeong',
	'age' : '26',
	'occupation' : 'software engineer'
}

HTTP 응답의 구성요소

Method와 URL이 없는 형태이다

  • Status Code : 응답의 종류
  • Header : 응답의 메타데이터
  • Body : 응답에 관련된 데이터

Status Code

  • Status Code는 응답의 상태를 분류해준다
  • 100-599까지의 숫자를 사용한다
  • 100-199 : 정보응답 (Informational Response)
  • 200-299 : 성공응답 (Successful Response)
  • 300-399 : 리다이렉션 메세지 (Redirection Message)
    • 요청을 했는데, 해당요청이 다른 주소로 변경이 되었을때 나타나는 응답
  • 400-499 : 클라이언트 에러 응답 (Client Error Response)
  • 500-599 : 서버 에러 응답 (Sever Error Response)

주요 Status Code 정리

  • 200(OK) - 문제없이 요청이 잘 실행됨
  • 201(Created) - 문제없이 데이터 생성이 잘 됨 (POST, PUT 요청에서 많이 사용)
  • 301(Moved Permanently) - 리소스가 영구적으로 이동됨
  • 400(Bad Request) - 요청이 잘못됨(필수값 부족 등)
  • 401(Unauthorized) - 인증토큰/키가 잘못됨
  • 403(Forbidden) - 접근 불가능한 리소스. 401과 달리 인증은 된 상태
  • 404(Not Found) - 존재하지 않는 리소스
  • 405(Method Not Allowed) - 허가되지 않은 요청 Method
  • 500(Internal Server Error) - 알수없는 서버 에러

 

NestJS 소개

  • NestJS는 효율적이고 스케일링이 쉬운 NestJS서버를 만드는데 사용하는 프레임워크이다
  • 차세대 Javascript를 사용하며 Typescrip로 만들어졌으며 Typescript를 완전 지원한다
  • NestJS는 Express같은 견고한 HTTP서버 프레임워크를 사용하고 있으며 원한다면 Fastify를 대신 사용할 수도 있다
    • NestJS는 Express로 설계를 함
  • 상당히 많은 NodeJS라이브러리, 헬퍼, 툴들이 있음에도 불구하고 아키텍처 설계에 대한 문제를 해결해주는 해결책은 존재하지 않는다
    • 아키텍처 문제를 해결하기 위해서 나온것이 NestJS이다
  • NestJS는 자체적으로 서버 아키텍처를 제공해준다. 그래서 테스트하기 쉽고, 디커플링이 잘 돼있고, 유지보수가 편한 서버를 제작하게 해준다

NestJS 로드맵

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유