NestJS는 프레임워크 기반의 Node.js 웹 애플리케이션 개발을 도와주는 기능을 제공합니다. NestJS를 사용하면 자바스크립트 애플리케이션의 구조와 디자인 패턴을 쉽게 구현할 수 있습니다. 이번 게시물에서는 NestJS 기반 자바스크립트 애플리케이션에서 일반적으로 사용되는 몇 가지 디자인 패턴을 소개하고, 각 패턴을 구현하는 방법에 대해 알아보겠습니다.
목차
1. MVC (Model-View-Controller)
MVC는 가장 일반적으로 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 애플리케이션을 세 가지 기능으로 나눕니다.
- Model: 데이터와 비즈니스 로직을 처리합니다.
- View: 사용자에게 데이터를 표시하고 사용자 입력을 수신합니다.
- Controller: 사용자 입력을 처리하고 모델과 뷰를 관리합니다.
NestJS에서는 MVC 패턴을 쉽게 구현할 수 있습니다. 서비스 프로바이더를 이용해 모델과 비즈니스 로직을 처리하고, 컨트롤러를 이용해 사용자 입력을 처리하고 뷰를 제공합니다.
// service.provider.ts
@Injectable()
export class Service {
private data: any[];
constructor() {
this.data = [];
}
getData(): any[] {
return this.data;
}
addData(item: any) {
this.data.push(item);
}
}
// controller.ts
@Controller()
export class Controller {
constructor(private readonly service: Service) {}
@Get()
getData(): any[] {
return this.service.getData();
}
@Post()
addData(@Body() item: any) {
this.service.addData(item);
}
}
2. Dependency Injection
의존성 주입(Dependency Injection)은 클래스 사이의 의존관계를 정의할 때 사용하는 패턴입니다. 의존성 주입을 사용하면 클래스 간의 결합도를 낮출 수 있으며, 코드의 재사용성과 테스트 용이성을 높일 수 있습니다. NestJS는 의존성 주입을 위한 내장된 모듈과 데코레이터를 제공합니다.
// service.provider.ts
@Injectable()
export class Service {
constructor() {}
fetchData() {
// 데이터를 가져오는 로직
}
}
// controller.ts
@Controller()
export class Controller {
constructor(private readonly service: Service) {}
@Get()
getData() {
const data = this.service.fetchData();
// 데이터를 활용하는 로직
}
}
3. Repository Pattern
리포지토리 패턴은 데이터 저장소에 대한 추상화를 제공하여 데이터 조작 로직을 캡슐화하는 패턴입니다. 이 패턴을 사용하면 데이터 저장소의 변경에 대응하기 쉽고, 비즈니스 로직과 데이터 액세스 로직을 분리할 수 있습니다.
// repository.provider.ts
@Injectable()
export class Repository {
private data: any[];
constructor() {
this.data = [];
}
getData(): any[] {
return this.data;
}
saveData(item: any) {
this.data.push(item);
}
}
// service.provider.ts
@Injectable()
export class Service {
constructor(private readonly repository: Repository) {}
getAllData() {
return this.repository.getData();
}
addData(item: any) {
this.repository.saveData(item);
}
}
4. Singleton Pattern
싱글턴 패턴은 애플리케이션 전체에서 단일 인스턴스를 유지하기 위해 사용되는 패턴입니다. 이를 통해 객체 인스턴스의 생성 및 사용을 제어할 수 있습니다. NestJS에서 싱글턴 인스턴스를 생성하기 위해 프로바이더를 사용할 수 있습니다.
// service.provider.ts
@Injectable()
export class SingletonService {
constructor() {
// 인스턴스 생성 시 초기화 로직
}
// 싱글턴 인스턴스 메소드
}
// module.ts
@Module({
providers: [SingletonService],
exports: [SingletonService],
})
export class AppModule {}
요약
NestJS는 자바스크립트 애플리케이션의 구조와 디자인 패턴을 지원하는 강력한 프레임워크입니다. MVC, 의존성 주입, 리포지토리 패턴, 싱글턴 패턴과 같은 일반적인 디자인 패턴을 사용하여 애플리케이션을 구현할 수 있습니다. 이러한 디자인 패턴을 사용하면 애플리케이션의 유지보수성과 확장성을 향상시킬 수 있습니다.
참고 자료:
#NestJS #JavaScript