NestJS 프레임워크 사용을 위한 기본 개념에 대해 간략하게 정리해 보고자 한다.
본 포스팅에서는 NestJS에서의 Modules 와 캡슐화(Encapsulation)에 대해 알아보도록 하겠다.
< 목차 >
- 캡슐화
- Modules
1. 캡슐화 (Encapsulation)
캡슐화(encapsulation)는 객체(object)의 속성과 행위(method)를 하나로 묶고 구현된 일부를 감추어 은닉하는 것을 일컫는다. 다시 말해, 클래스의 내부 변수와 메소드를 하나로 패키징하는 특징이다. 캡슐화와 비슷한 개념으로 정보 은닉(information hiding)이라는 개념이 있는데, 이는 객체의 내부 구현을 숨김으로써 객체가 반드시 정해진 메소드를 통해 상호작용 하도록 유도한다.
이 두 개념은 객체의 응집도와 독립성을 높임으로써 객체의 모듈화를 지향한다. 객체의 모듈화가 잘 이루어질 경우 모듈 단위의 재사용성이 증가하게 된다. 또한 여러 비즈니스 로직에서 중복되는 코드를 모듈로 대체하면 모듈 내부의 소스 코드만 수정하는 것으로 수정사항을 반영할 수 있게 되므로 이는 곧 간편한 유지보수와 직결된다고 볼 수 있다.
2. Modules
// app.module.ts 파일
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
@Module({
imports: [CatsModule],
controllers: [AppController],
providers: [AppService, CatsService],
})
export class AppModule {}
NestJS에서 모듈은 기본적으로 공급자(provider)를 캡슐화(encapsulation) 한다. 즉, providers는 캡슐화가 되어 있기 때문에 기본적으로 providers에 등록된 공급자들은 다른 모듈에서 접근이 불가능하다. 위와 같이 AppModule 클래스에서 CatsModule을 import 해 왔을지라도 AppController에서 CatsService를 주입 받기 위해서는 providers에 CatsService를 등록해 성공적으로 의존성 주입을 완료해 주어야만 한다. 하지만 이와 같은 방식은 애플리케이션의 복잡도가 증가할수록 관리가 힘들어질 뿐만 아니라 객체 지향 설계의 단일책임원칙 또한 깨뜨린다고 볼 수 있다.
외부 모듈의 서비스를 providers에 등록해 직접적으로 주입하는 것 대신 다음과 같은 방식을 사용하도록 하자.
// cats/cats.module.ts 파일
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
@Module({
controllers: [CatsController],
providers: [CatsService],
exports: [CatsService],
})
export class CatsModule {}
위와 같이 CatsModule 안에서 providers로 등록된 CatsService는 기본적으로 캡슐화 되어 있기 때문에 다른 모듈에서는 접근이 불가하다. 다른 모듈에서 접근 가능하게끔 해주기 위해서는 exports: [ ] 안에 CatsService를 넣어주면 된다. exports 안에 CatsService를 넣어줌으로써 은닉화 되어 있는 것을 풀어 public 상태로 바꿔주는 것이다.
AppModule의 providers에는 AppModule에서 자체적으로 만든 공급자들을 넣어주는 것이 좋고 다른 모듈에서 만든 공급자들은 위와 같이 exports를 통해 public으로 만들어서 사용하는 것이 좋다.
Reference)
본 포스팅은 NestJS 공식문서를 참고하여 작성되었습니다.
'Node > NestJS' 카테고리의 다른 글
NestJS - Pipes & Interceptors (0) | 2023.03.26 |
---|---|
NestJS - Exception filter 설정 (0) | 2023.03.16 |
NestJS - LoggerMiddleware 설정 (0) | 2023.03.13 |
NestJS - 의존성 주입(DI) & Providers (0) | 2023.03.10 |
NestJS - 기본 구조 & Controllers (0) | 2023.03.09 |