본문 바로가기
NestJs

[NestJS] Spring 사용하는 사람의 NestJS 체험기

by 코딩하는경준 2022. 6. 18.

안녕하세요. 오랜만에 Spring 사용하는 사람의 NestJS 체험기 라는 제목의 포스트를 작성해 보려합니다.

 

갑자기 NestJS ?

학교에서 서버(백엔드)개발을 할때 사용하는 프레임워크,언어 는 주로

'Spring Boot(Java)', 'NestJS(TypeScript)', 'Django(Python)' 으로 개발을 하는데요.

친구들 마다 다른 프레임워크,언어 로 개발을 했습니다.

 

제가 Spring Boot 를 선택하게 된 이유는 대한민국 업계의 대부분의 서버는 Java로 이루어져있다는 글을 보았었고,
Java 가 객체지향 언어의 끝판왕이라고 불려서 기왕 할거면 멋진 기술사용해보고 싶어서 시작하게 되었습니다.

( 다른 친구들 또한 저와 같은 이유로 많이 Spring Boot 를 공부했습니다. )


하지만 Spring Boot 를 공부를 하다보니 Spring Boot 는 오랫동안 개발되어오고, 많이 사용된 프레임워크로
레퍼런스가 많고, Spring Boot 에서 지원하는 멀티쓰레드 환경, 싱글톤 컨테이너 등이 대용량 서비스에 적합한 프레임워크 였다는 걸 깨닳으며 Spring Boot 를 사용하는 이유의 본질을 조금 알게되었습니다.

 

다시 본론으로 돌아와 NestJS 를 공부(사용)하게 된 계기는 

위와 같은 고민을할때, 제 친구중에 남들과는 다른 길을 걷고싶다는이유로 TypeScript 언어로 서버를 만들고 싶다는 친구가 있습니다.

현재 그 친구는 NestJS 로 서버를 개발 하고 있습니다.

 

그 친구랑 같이 코딩을 하면서 친구의 노트북을 봐보면, 코드 스타일부터 어노테이션(데코레이터)를 사용하는 것 까지 Spring Boot 와 별 차이가 없어보였습니다.

그래서 친구에게 "야 NestJS 스프링하고 비슷해보이는데?" 라고 했었고,

친구도 "어 맞아, 나도 스프링 코드 봐봤는데 비슷하더라 그리고 NestJS 는 레퍼런스가 별로 없어서 스프링 코드나 레퍼런스 보면서 공부해" 라고 했습니다.

 

스프링을 경험한 저는 NestJS 를 공부할때 비교적 쉽게 공부할 수 있을거라 생각했고 해보고 싶었습니다. 

그래서 이번기회에 NestJS 를 공부하면서 간단한 게시판 까지 구현해보는게 목표이며 가능하다면 프로젝트까지 해보고 싶습니다.

 

이미 예전에 Javascript + node.js + express 로 게시판 서버를 구현해 보았었고, 심심할때 찾아보거나 친구가 가끔씩 알려준 TypeScript 문법의 지식을 가지고 있었기에 쉽게 NestJS 를 시작할 수 있었습니다.

 

스프링과 비슷했던점

NestJS 를 공부하면서 비슷했던점 몇가지를 적어보겠습니다.

 

- 데코레이터 ( 어노테이션 )

@(골뱅이) 를 사용하여 특정 함수를 실행시키기 위하여 데코레이터 안에 특정행동을 하는 함수를 선언하고 

사용하기 위한 메소드 위에 붙이면 적용이 되는 것 처럼 NestJs 에도 어노테이션의 개념이 있었습니다.

( 그냥 이름만 다른 어노테이션 이었습니다. )

 

데코레이터 자료

https://medium.com/google-developers/exploring-es7-decorators-76ecb65fb841

 

Exploring EcmaScript Decorators

Iterators, generators and array comprehensions; The similarities between JavaScript and Python continue to increase over time and I for one…

medium.com

 

- DI(Dependency Injection) , IoC(Inversion of Control)

클래스간의 관계를 결정하는 의존성 주입(DI)이 NestJS 에도 있었습니다.
그리고 스프링에서는 의존성을 알아서 관리를 해주는 IoC 컨테이너가 있지만 Module 이라는 클래스에서 @Moudle 이라는 데코레이터를 사용하여 의존성 주입을 할 클래스를 등록하여 의존성을 관리합니다.

( 각 레이어 마다 @Controller, @Injectable 등의 데코레이터를 붙여주는 것을 보아 스프링에서는 컴포넌트,빈 등록과 같은 개념을 가지고 있는 것 같습니다. )

Module

 

- layer 

NestJs의 웹 레이어 아키텍쳐는 Controllers - Service - Data Access Layer 였습니다.

아마도 Data Access Layer 가 데이터베이스와 연결되어 데이터를 관리하는 계층으로 보입니다. (Repository 계층)

 

위 3개 말고도 다른 요소들은 스프링과 매우 흡사했으며, 이번에 공부한것 이외에도 이미 친구를 통해 들은것이 많아서,

그냥 스프링하는 기분이였습니다.

 

NestJs 를 사용하면서 신기했던 것

공식문서에서 nest 는 nest cli 라는 툴을 제공하고 nest cli 는 다양한것을 지원한다는 문장을 보았습니다.

더 읽다보니 nest-cli를 사용하는 부분이 있었고 nest-cli 는 프로젝트를 세팅할 수 있게 도와주었습니다.

nest new [Project 명]

위 명령어를 터미널에 입력하면 해당 디렉토리에 프로젝트가 생성되며 nest 에서 자주 사용하는 라이브러리들이 자동으로 세팅됩니다.

(https://start.spring.io/ 에서 프로젝트를 세팅하는 파일을 다운하는 것처럼 명령어로 할 수 있었습니다. )

 

nest g controller cats

이 명령어는 cats 라는 이름을 가진 컨트롤러를 만들어주고 자동으로 테스트 코드까지 작성되어 만들어진 디렉토리가 나왔습니다

이런 기능이 있는게 정말 신기했습니다. 

 

NestJs 를 사용하면서 느꼈던점

우선 스프링과 매우 흡사했다는 점에서, 처음 입문을 하는데에는 어렵지 않았습니다.

공식문서를 읽었을때, 이해하기 좋게 예제 코드도 있었고, 핵심만 정리된거같아서 정말 좋았습니다.

( 물론, 좀 더 심화로 들어가서 공부하다보면 친구가 레퍼런스가 부족하다고 했기에 어려울 수 도 있을것같습니다. )

 

예전에 express 를 사용했을때와 비교를 해보자면, express 는 Javascript 기반의 프레임워크로 다양한 라이브러리들이 존재하고 레퍼런스도 많아서, 자기 입 맛에 맞게 서버를 만들 수 있지만 뼈대가 잡혀있지않아서 라이브러리를 사용하려면 일일이 install 해서 사용을 해야하고 특정한 디자인 패턴이 존재하지 않아서 여러명의 개발자가 express 로 협업을 한다면 제대된 협업이 힘듭니다.

 

하지만 이러한 부분의 반대되는 이점을 가지는 NestJs 는 갖추어진 디자인 패턴과 자주사용되는 라이브러리들이 세팅되어 있으며 IoC, DI, AOP 등의 객체지향 개념이 도입되어 있어 여러명의 개발자들과 협업하기에는 아주 좋은 프레임워크 같습니다.

 

그리고 TypeScript 가 적용되어있어서 Javascript의 기능들을 모두 지원하며 정적타입을 제공하여 코드의 가독성을 높힐 수 있고,

컴파일 시점에서 에러를 잡을 수 있는 장점이 있습니다. 

이 외에도 TypeScript 가 지원하는 기능들은 많으며, 개발을 할때 좋은 점을 갖춘 강력한 언어입니다.

 

마지막으로 아직 공부를 많이 해보진 못했지만 벌써 NestJs 의 매력을 느낀것 같으며 Spring을 경험해보신분이라면

NestJs를 더욱 빠르게 이해하실 수 있을거라 생각하며 한번씩 공부해보시는걸 추천합니다!!

 

앞으로 NestJs와 관련된 TIL 작성과 포스팅 올려보겠습니다.

긴 글 읽어주셔서 감사합니다.

 

참고한 자료

https://docs.nestjs.com/

 

Documentation | NestJS - A progressive Node.js framework

Nest is a framework for building efficient, scalable Node.js server-side applications. It uses progressive JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Progamming), FP (Functional Programming), and FRP (Functional Reac

docs.nestjs.com

 

댓글