본문 바로가기
nest.js

MVC,DOC/IoC (2024.05.28)

by goblin- 2024. 5. 28.

1. MVC 패턴

MVC 패턴은 Model-View-Controller 패턴으로, 애플리케이션의 로직을 세 가지 주요 부분으로 나누어 구조화하는 디자인 패턴입니다.

  • Model: 애플리케이션의 데이터와 비즈니스 로직을 관리합니다.
  • View: 사용자 인터페이스 요소를 표시하고 사용자 입력을 받습니다.
  • Controller: 사용자 입력을 처리하고, 모델과 뷰를 업데이트합니다.

 

2. Node.js에서의 구조

Node.js에서는 다음과 같은 구조로 MVC 패턴을 구현할 수 있습니다.

  • index.js: 애플리케이션의 진입점으로, 서버를 설정하고 필요한 모듈을 로드합니다.
  • Controller: 사용자 요청을 처리하고, 모델과 뷰를 업데이트합니다.
  • Service: 비즈니스 로직을 처리합니다.

3. 의존성 주입(DI)와 제어의 역전(IoC)

  • DI (Dependency Injection): 객체가 직접 자신의 의존성을 생성하지 않고 외부에서 주입받는 방법입니다. 이를 통해 강한 결합을 느슨한 결합으로 변경할 수 있습니다.
  • IoC (Inversion of Control): 프로그램의 제어 흐름을 외부에서 관리하는 것을 말합니다. DI는 IoC의 구현 방법 중 하나입니다.

 

4. 싱글톤 패턴

  • 싱글톤 패턴: 특정 클래스의 인스턴스가 오직 하나만 생성되도록 보장하는 디자인 패턴입니다.
  • DI를 사용하면, 필요한 인스턴스를 한 번만 생성하고 이를 재사용할 수 있어 싱글톤 패턴을 구현할 수 있습니다.

 

 

5. 강한 결합 vs. 느슨한 결합

  • 강한 결합 (Tight Coupling): 클래스가 다른 클래스의 구체적인 구현에 강하게 의존하고 있는 상태.
  • 느슨한 결합 (Loose Coupling): 클래스가 다른 클래스의 구체적인 구현이 아닌 인터페이스나 추상 클래스에 의존하는 상태.

 

index(moduel) -> controller -> service  

controller에서 new로 service에 있는 로직을 쓸때마다 불러왔는데 이걸 index(module)에서 service new로 생성한 후 controller에 클래스에 constructor를 사용해 service를 받아옴(이걸 의존성 주입이라고한다) 이역할을 nest.js의 기능을통해 알아서 DI해주는데 Ioc(제어역전)라고 한다.

 

6. Nest.js에서의 DI와 IoC

Nest.js는 DI와 IoC를 기본으로 지원하여 코드의 유지보수성과 테스트 용이성을 높입니다.

  • 모듈 (Module): 애플리케이션의 각 부분을 그룹화하는 데 사용됩니다.
  • 서비스 (Service): 비즈니스 로직을 처리합니다.
  • 컨트롤러 (Controller): 요청을 처리하고 응답을 반환합니다.

예시

// app.module.ts
import { Module } from '@nestjs/common';
import { ProductService } from './product.service';
import { ProductController } from './product.controller';

@Module({
  controllers: [ProductController],
  providers: [ProductService],
})
export class AppModule {}
// product.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class ProductService {
  getAllProducts() {
    return [{ id: 1, name: 'Product 1' }];
  }
}
// product.controller.ts
import { Controller, Get } from '@nestjs/common';
import { ProductService } from './product.service';

@Controller('products')
export class ProductController {
  constructor(private readonly productService: ProductService) {}

  @Get()
  getAllProducts() {
    return this.productService.getAllProducts();
  }
}

 

 

6요약

  • MVC 패턴: Node.js와 Nest.js에서의 구현 방법을 이해하고, 각각의 역할을 명확히 구분하여 작성.
  • DI와 IoC: 의존성 주입을 통해 강한 결합을 느슨한 결합으로 변경하고, 제어의 역전을 통해 코드를 더욱 유연하게 관리.
  • 싱글톤 패턴: DI 활용하여 객체를 재사용하고, 자원의 낭비를 줄이며 성능을 향상.