nest.js 파헤치기 1일차

Zzz Ccc·2023년 8월 1일
0
post-thumbnail

출처 링크

앞서서

파트 타임 개발을 시작하게 되면서, 작업하게 될 프레임워크가 Nest.js로 개발이 되어있어서, 사전 학습이 필요할 것 같아서 공부하게 되었다.

Nest.js

  Node.js에 기반을 둔 API 프레임워크로, Express.js 또는 Fastify 프레임워크를 래핑하며 동작한다. 
  데이터베이스, ORM, 설정, 유효성 검사 등 제공하는 기능도 많으면서도 기능을 쉽게 확장할 수 있는 Node.js
  장점을 그대로 가지고 있다. 아, 그리고 기본으로 타입 스크립트도 지원한다고 함.
git clone, 모듈 설치 진행하면서 제일 먼저 본 에러 :

TypeError: this.libOptions.parse is not a function

	Jetbrains 제품을 사용하고 있으면서 이러한 에러를 직면했으면 다음과 같이 해결해보세요.
    
    1. Alt + Shift + S (설정탭)
	2. Eslint 검색
    3. Automatic ESLint configuration 선택
    4. 기존에 있던 패턴을 지우고 "**/*.(js|ts|jsx|tsx|html|vue)" 추가
출처 - 링크

시작하기 앞서, Nest.js 에 대해서 간단하게 꺼무위키에서 읽어봤다.
1. Node.js 런타임 위에서 동작하는 TypeScript용 
  오픈 소스 백엔드 웹 프레임워크.

2. 노드 생태계에서 거의 기본처럼 쓰였던 Express.js에
   비해 제어 역전성을 가지는 프레임워크적 성향이 더욱 강하며,
   NestJS가 상당한 아이디어를 차용한 자바 생태계의 Spring과도 
   자주 비교된다.

* 다만 NestJS 자체는 독립적인 프레임워크가 아니며, 내부적으로 
  기존의 웹 프레임워크들의 기능을 일관된 API로 노출해
  주는 거대한 어댑터(Adapter)에 가깝다. 
  현재까지는 공식적으로 Express.js 및 Fastify를 지원한다.
거대한 어댑터에 가깝다는 표현이 어떤 말인지 감이 잘 잡히지는 않지만, Express.js, SpringFramework, SprinBoot에 대한 사전 지식이 있으니 겁먹지 말고 학습 진행해 보겠다.

@Controller

- 개발의 시작을 Spring Framework로 시작해서 크게 어려움은 없었다. 애플리케이션에 대한 요청을 수신하는 부분. / Express.js에서는 Routes 부분

   사전에 MVC 패턴에 대한 지식이 있고 Spring 지식이 있으면 코드를 
   파악하는데 큰 어려움은 없을 것 같다. 아직은 특이한 부분은 찾지 못했다.
   기개발된 코드에서는 Service에 대한 주입이 생성자로 이루어지고 있다.

@Module

   모듈은 Nest가 애플리케이션 구조를 만들때 사용할 수 있는 메타데이터를 제공해주는 역할을 한다.
   자바의 모듈을 예상했지만 참조 문서를 읽어보니 다른 것 같다.

Nest.js @Module

  • 루트 모듈은 Nest가 애플리케이션 그래프를 구성하기 위해 사용하는 시작점
  • Nest가 모듈과 프로바이더 간의 관계 및 종속성을 연결하기 위해 사용하는 내부 데이터 구조

Java Module과 패키지

  • 여러 패키지와 이미지 등의 자원을 모아 놓은 컨테이너
  • 자바 API를 여러 모듈로 분할하여 응용프로그램의 실행에 적합한 모듈들로만 실행 환경 구축
  • 메모리 등의 작은 소형 기기에 꼭 필요한 모듈로만 구성하여 실행하기 위함
// Nest.js Module Example
import { Module } from '@nestjs/common';
import { ExampleService } from './example.service';
import { ExampleController } from './example.controller';

@Module({
  controllers: [ExampleController],
  providers: [ExampleService],
  exports: [ExampleService],
})
export class ExampleModule {}

@Decorator

데코레이터 어노테이션이 있는 것은 아니다. 소스 분석 중

  • example.controller.ts
  • example.service.ts
  • example.decorator.ts
    라는 소스 코드가 있어서 한번 무엇인지 확인해보았다.
//usr.decorator.ts
import { createParamDecorator, HttpException } from '@nestjs/common';

export const RqUsr = createParamDecorator((data, ctx) => {
  const req = ctx.switchToHttp().getRequest();

  //핵심 동작 생략 ..
  
  throw new HttpException('Unauthorized', 403);
});
//usr.controller.ts
//중략
import { Usr } from '@server/usr/entities/usr.entity';
import { RqUsr } from '@server/usr/usr.decorator';

@Controller('usr')
export class UserController {
  constructor(private readonly usrService: UsrService) {}

 
  @Get(':pathvariable')
  findOne(@RequiredUser() user: User, @Param('test') testText: string) {
    return this.usrService.getExampleInfo(user, example);
  }
  
}

2번째 코드 블럭의 -> findOne(@RequiredUser() user: User,

     데코레이터는 비즈니스와 상관없는 로직,즉 반복되는 공통 관심사가 있을 때 데코레이터를 사용함으로 코드를 모듈 단위로 관리하는 효과를 거둘 수 있다고 한다. node.js 런타임에서 적용할 수 있는 AOP.

출처


주니어 개발자에게 새로운 기술을 배우는 건 쉽지 않은 길이다.
2일차에 추가적으로 더 본격적으로 공부해 봐야겠다.
profile
백수 lv1 개발자

0개의 댓글