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을 사용하고 있다
- 코드실행환경 준비하기
- 컴파일하기
- 바이트코드(Byte Code) 생성
- Interpret + Ignition 실행하기(Byte Code)
- 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가 존재할 수 있다
- 둘은 같은 URL에 요청하지만 완전 다른 요청이다
- GET요청은 데이터를 조회할때 사용한다
- GET : https://blog.codefactory.ai/javascript
- javascript관련 데이터를 가져오는 요청이라고 유추할 수 있다
- POST요청은 데이터를 생성할때 사용한다
- POST : https://blog.codefactory.ai/javascript
- javascript관련 데이터를 생성하는 요청이라고 유추할 수 있다
- PUT요청은 데이터를 업데이트 또는 생성할때 사용한다
- PUT : https://blog.codefactory.ai/javascript
- javascript관련 데이터를 업데이트 또는 생성하는 요청이라고 유추할 수 있다
- PATCH요청은 데이터를 업데이트 할때 사용한다
- PUT : https://blog.codefactory.ai/javascript
- javascript관련 데이터를 업데이트하는 요청이라고 유추할 수 있다
- DELETE요청은 데이터를 삭제할때 사용한다
- DELETE : https://blog.codefactory.ai/javascript
- javascript관련 데이터를 삭제하는 요청이라고 유추할 수 있다
- 이외에도많은 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 로드맵
'3. Backend > NestJS' 카테고리의 다른 글
[코드팩토리 NestJS 강의] Module, Provider and Inversion of Control (제어의 역전) (2) | 2024.03.12 |
---|---|
[코드팩토리 NestJS 강의] Service (서비스) (0) | 2024.03.12 |
[코드팩토리 NestJS 강의] Query and Parameters (쿼리와 파라미터) (0) | 2024.03.12 |
[코드팩토리 NestJS 강의] Controller (컨트롤러) (0) | 2024.03.12 |
[코드팩토리 NestJS 강의] nodeJS와 Express를 사용해서 기본적인 서버 만들기 (3) | 2024.03.08 |