day12

Antipiebse·2022년 3월 30일
0

TIL

목록 보기
10/17
post-thumbnail

NEST.JS란?

효율적이고 확장가능한 Node.js 서버 측 애플리케이션을 구축하기 위한 프레임워크입니다. typescript로 구축되고, OOP(객체 지향프로그래밍)와 FP(함수 프로그래밍), FRP(기능 반응 프로그래밍)의 요소를 결합합니다. 또한 내부적으론 Express와 같은 HTTP 서버 프레임워크를 사용하며 선택적으로 Fastify도 사용할 수 있다.

우선 nestjs를 다운 받아보자.

$ npm i -g @nestjs/cli
$ nest new project-name

이때 npx라는 것으로도 nest를 다운 받을 수 있다.

$ npx nest new project-name

npx?

npm 5.2.0 버전부터 새로 추가된 도구로 일회성 명령으로 패키지를 사용할 수 있도록 해준다.
참조: npx관련 블로그

NEST.JS를 왜 쓸까?

express는 규칙이 없어 너무 자유롭기 때문에 협업 시 어려움을 겪을 수 있다.
이를 nestjs로 해결할 수 있다. 또한 nestjs에는 IoC와 DI를 통한 싱글톤 패턴을 사용하기에 유지보수가 좋다.

  • 유지보수하기 좋음
  • 확장성 높음
  • 안정성 높음

유명한 웹 프레임워크로는 자바는 스프링, 파이썬은 장고, 자바스크립트는 Nest가 있다.

스프링의 DI 기능을 NEST도 갖고 있다.

배포용과 개발용으로 나누어 개발하자.

공개된 서비스를 production이라고 하며 배포하기 전까지 start:dev명령어를 사용할 것이다.

배포에 필요한 패키지는 devDependencies에 설치.개발 환경에서만 필요한 패키지는 일반 dependencies에 저장

IoC(Inversion of Control / 제어의 역전)

제어의 역전(Inversion of Control)은 일반적인 디자인 패턴 중 하나로 일반적으로 개발자가 프로그램의 흐름을 제어하는 주체였다면, IoC의 개념이 나오게 되며 프레임워크가 dependency를 container화 시켜 생명주기를 관리하는 것이다.

즉, dependency의 제어권이 개발자에서 프레임워크로 넘어가게 되었으며 이를 제어권의 흐름이변경되었다고 하여 IoC(Inversion of Control)라 한다.

의존성 주입이란? (DI-Dependency Injection)

우선 의존성 주입에 대해 알기 위해선 메모리와 디스크의 차이점을 알아야한다.메모리는 전원을 끄면 저장된 데이터가 삭제, 디스크는 유지된다.대신 메모리는 빠르고, 디스크는 느리다.
그런데 이때 node에서 class를 new(인스턴스)할 때마다 많은 양의 메모리를 차지한다. 즉, 그동안 한 가지 클래스를 사용하는 곳마다 새로 만들었는데 어마어마한 메모리를 차지했다는 소리이다.

그럼 new선언을 한 번만 해서 활용하자!

의존성 주입이 가능한 프레임 워크

//DI -Framework
spring(Java), nest.js(ts)

예를 들어 요리사가 볶음밥을 요리한다고 했을 때 두 개의 클래스(요리사, 볶음밥)를 생성해서 의존 시켰다고 하면 볶음밥이 아닌 탕수육을 요리한다고 하면 그에 맞게 요리사 클래스를 수정해야 하므로 유연성이 떨어진다고 볼 수 있다. 따라서 요리사가 명령을 받으면 요리 종류에 따른 요리를 만들도록 설계하면 이러한 문제를 해결할 수 있다.

즉, 하나의 클래스가 또다른 클래스와의 결합을 강하게 해서 작동하게 하는 것 보다 그 클래스가 다양한 기능을 할 수 있도록 생성하면 메모리 사용량도 줄고, 클래스 간의 의존성도 줄일 수 있다.

NEST.JS의 보일러 플레이트

typescript

자바스크립트의 타입을 강제시키는 언어

//js
let aaa="안녕하세요"
aaa = 123 //123
//ts
let aaa:string = "안녕하세요"
aaa = 123 //type error

why Use?

다른 언어들은 이미 타입을 정하고 변수를 선정하였는데 자바스크립트는 그러지 않았었다.
ex)어떤 경매사이트에서 1인당 글쓰기 권한이 5개였었다. 그러나 어떤 한 사람이 도배를 하고 있었다. 왜 이러한 일이 일어났는지 알아보니깐 "011111111"의 형태로 저장이 되고 있었다.

//js logic
let count = "0"
count += 1
if(count < 5){
	글쓰기
}// "011111111"

정말 큰 서비스에서 이러한 일이 발생하였다면 찾아내기도 어렵고 수정하기도 어려울 것이다. 즉, 타입이 정해진 상태로 구현을 하였다면 이러한 오류는 발생하지 않았을 것이다.

typescript사용법

아래처럼 변수를 선언하면서 타입을 정해주거나

let aaa:string = "안녕"
let bbb:number = 123

객체 속 타입들은 직접 만들어주어야한다.(Interface를 통해 만들 수 있다.)

Interface IProfile {
	name: string
    age: number
}
let profile: IProfile = { name:"철수", age:13}

이외에도 다양한 속성들이 존재한다.

//데코레이터란?
//함수

// yarn add typescript --dev => dev로 저장
// yarn add ts-node => ts를 node에서 실행시키기 위해 설치
function zzz(aaaaa){
    console.log("---")
    console.log(aaaaa)
    console.log("---")
}

@zzz
class AppController {}


//public
class aaa {
    constructor(public mypower){//public은 어디서든 바꿀 수 있다
        this.mypower = mypower
    }
    ggg(){
        console.log("안녕")
    }
}

const AAA = new aaa(50)
AAA.mypower = 5
// private
class bbb {
    constructor(private mypower){//public은 어디서든 바꿀 수 있다
    }
    ggg(){
        this.mypower = 10;
        console.log("안녕")
    }
}
const BBB = new bbb(50)
BBB.mypower = 5 //private를 사용하면 객체 안에서만 사용 가능!


// readonly 안에서 읽기만 가능하고, 값 변경 X
class CCC {
    constructor(readonly mypower){//public은 어디서든 바꿀 수 있다
    }
    ggg(){
        this.mypower = 10;
        console.log("안녕")
    }
}

yarn.lock

우리는 보통 프로젝트에 사용하는 라이브러리나 프레임워크를 package.json에 명시한다. 그럼 그러한 라이브러리나 프레임워크들이 의존하는 라이브러리는 어디에 명시할까?

yarn.lock에 명시한다!!

profile
백엔드 주니어 개발자

0개의 댓글