Nest 진짜 겉햝기 개념과 용어정리

nGyu·2023년 8월 20일
1

NestJS 햝쨕

목록 보기
1/2
post-thumbnail

NestJS

Express의 단점을 보완하기 위해 나온 Framework 라고 볼 수 있다.

왜 Express의 단점을 보완한다는 말이 나왔을까?

ExpressJS

Express를 사용해본 사람들은 알 것이라 생각한다.
이를 사용하다보면 아키텍처를 자유롭게 설계할 수 있다.

애플리케이션 아키텍처
애플리케이션 아키텍처란, 애플리케이션을 설계하고 구축하는 데 사용하는 패턴과 기술을 설명한다.
-RedHat

이는 장점이라고 볼 수 있지만, 반대로 단점이라고 볼 수 있다.

왜냐하면 혼자서 작업을 한다면 문제가 없지만, 팀 단위 작업을 할 때 너무나도 다양하게 설계가 되고, 코드의 구조마저 달라지기 때문이다.
예를들자면 아래와 같다.

// CASE - 1
app.get('/todo', (req,res) => {})
app.post('/todo', (req,res) => {})
app.patch('/todo', (req,res) => {})
app.delete('/todo', (req,res) => {})

// CASE - 2
app.router('/todo')
		.get((req, res) => {})
		.post((req, res) => {})
		.patch((req, res) => {})
		.delete((req, res) => {})

정확한 예제라고 할 수 없지만 필자가 생각한 예제는 위와 같다.
이 외에도 폴더의 구조도 비슷하지만 다르다.

src → route → domain.controller
src → application → domain → domain.controller
src → apps → route → domain → controller

이렇게 된다면, 팀단위 작업 시 구조를 파악하기 위한 커뮤니케이션으로 비용을 허비할 수 있다.
대표적으로 NestJS를 사용하는 이유는 이 커뮤니케이션 비용을 절약하기 위해 사용할 수 있다고 할 수 있다.

NestJS의 구조

NestJS는 Module 단위로 나뉘어 진다.

Module단위로 나뉘어진다는 말이 생소하게 들릴 수 있지만, 간단하게 설명하면 아래와 같다.

Provider와 Controller 를 관리하는 각각의 Module들로 나뉘어지게 되고, 이러한 Module 들은 app.module.ts로 모이게 된다.

SpringBoot 혹은, Express등은 Controller를 Main Controller에 연결해서 사용하는 방식이었다면, Nest는 Domain을 Module로 묶어서 Main Module에 연결해서 사용하는 방식이다. (아마도)

Controller

클라이언트에서 요청이 들어오면 그 요청을 처리하고, 처리된 요청을 응답해주는 역할을 하는 것이다.
딱, 요청과 응답만 해주는 역할을 한다.

// https://docs.nestjs.com/controllers
// cats.controller.ts
@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

위 코드처럼 데코레이터(@)를 이용하여 라우팅을 해 준다.

Controller는 요청/응답만 처리 해 준다면, 비즈니스 로직은 어디서 처리를 해 주어야 할까?

바로 다음에 설명할 Provider에서 한다.

Provider

Controller에서 받은 요청을 Provider에서 비즈니스 로직을 처리해준다.

// https://docs.nestjs.com/providers
// cats.service.ts
@Injectable()
export class CatsService {
  private readonly cats: Cat[] = [];

  create(cat: Cat) {
    this.cats.push(cat);
  }

  findAll(): Cat[] {
    return this.cats;
  }
}
// https://docs.nestjs.com/providers
// cats.controller.ts
@Controller('cats')
export class CatsController {
	contructor( private catsService: CatsService ){}

  @Get()
  findAll(): string {
    return this.catsService.findAll();
  }
}

위 코드를 보면, DI(Dependency Injection, 의존성 주입)을 이용하여 Controller에서 사용할 수 있게 한다.

이 후 Provider(Service) 에서 요청에 대한 로직을 처리 후 클라이언트에게 응답 해 준다.

데코레이터

constructor(
    @InjectRepository(UserEntity)
    private readonly userRepository: Repository<UserEntity>,
  ) {}

@InjectRepository() 라는게 보이는데 SpringBoot를 했던 사람들이면 어노테이션이 생각날 것이다.

이는, NestJS에서 데코레이터라고 부르며, 자바의 어노테이션과 같은 기능을 한다.

정리

용어 정리 정도만 했는데, 너무 많은 개념들이 튀어나온다.

우선 용어만 정리 했음에도, 이 용어 하나하나에 대한 개념이 엄청나게 깊다.

구조, Module, Controller, Provider, 데코레이터, DI 등등.. 이 용어 하나하나의 개념을 정리해보아야 겠다.

Reference

https://docs.nestjs.com/

https://www.redhat.com/ko/topics/cloud-native-apps/what-is-an-application-architecture

profile
지금보다 내일을, 모레를 준비하자

0개의 댓글