상세 컨텐츠

본문 제목

[nestJS] nestJS의 OOP DI singleton이란

카테고리 없음

by esoesmio 2024. 5. 10. 15:24

본문

Nest.js는 기존 Node.js 환경에 더해져 Typescript를 사용하여 더욱 체계적이고 확장 가능한 방식으로 API를 제작할 수 있게 해주는 프레임워크입니다. 이 프레임워크는 특히 객체 지향 프로그래밍(OOP), 의존성 주입(DI), 싱글턴 패턴(Singleton)과 같은 소프트웨어 설계 원칙과 패턴들을 적극적으로 활용합니다. 이러한 개념들이 Nest.js에서 어떻게 적용되는지 구체적인 예시를 통해 설명드리겠습니다.

### 객체 지향 프로그래밍 (OOP)

객체 지향 프로그래밍은 클래스와 인스턴스라는 개념을 중심으로 데이터와 그 데이터를 처리하는 함수(메서드)를 하나의 단위(객체)로 묶어 관리합니다. 이 접근 방식은 코드의 재사용성을 높이고, 유지보수를 쉽게 만들며, 대규모 소프트웨어 개발에 적합합니다.

**예시:**
Nest.js에서는 서비스나 컨트롤러 같은 요소들을 클래스로 정의합니다. 예를 들어, 사용자 데이터를 처리하는 서비스가 필요하다고 가정해 봅시다.

```typescript

@Injectable()
export class UserService {
  constructor(private userRepository: UserRepository) {}

  findAllUsers() {
    return this.userRepository.findAll();
  }
}


```
위 코드에서 `UserService` 클래스는 사용자 데이터를 관리하는 메서드인 `findAllUsers`를 포함하고 있으며, `userRepository`라는 다른 객체에 의존하고 있습니다. 이런 식으로 Nest.js는 데이터와 기능을 캡슐화하여 관리할 수 있게 해줍니다.

### 의존성 주입 (DI)

의존성 주입은 컴포넌트 간의 의존성을 외부에서 주입하는 방식으로, 각 컴포넌트의 결합도를 낮춰 유연성을 높이고 테스트가 용이하도록 합니다.

**예시:**
위의 `UserService` 클래스에서, `userRepository` 객체는 생성자를 통해 주입됩니다. 이 객체는 `UserService`가 필요로 하는 의존성을 제공하며, Nest.js는 이 의존성을 자동으로 관리하고 주입하는 역할을 합니다.

```typescript

@Module({
  providers: [UserService, UserRepository],
  controllers: [UserController]
})
export class AppModule {}


```
위 `AppModule`은 `UserService`와 `UserRepository`를 응용 프로그램의 의존성으로 등록하고 있습니다. Nest.js의 DI 컨테이너는 이들을 인스턴스화하고 필요할 때 적절히 주입합니다.

### 싱글턴 패턴 (Singleton)

싱글턴 패턴은 특정 클래스의 인스턴스가 하나만 생성되어 전역적으로 접근 가능하도록 보장하는 디자인 패턴입니다. Nest.js에서는 기본적으로 서비스를 싱글턴으로 관리하여, 애플리케이션 전체에서 하나의 인스턴스만을 사용합니다.

**예시:**
`UserService`가 싱글턴으로 구현되어 있으면, 애플리케이션 어디서든 동일한 인스턴스를 참조하여 사용자 정보에 대한 일관된 접근을 보장받을 수 있습니다. 이는 리소스를 효율적으로 사용하면서 상태 정보의 일관성을 유지하는 데 도움을 줍니다.

```typescript

@Injectable()
export class UserService {
  private users = [];  // 내부 상태

  addUser(user) {


    this.users.push(user);
  }

  findAllUsers() {
    return this.users;
  }
}


```
위의 서비스는 애플리케이션의 생명주기 동안 유지되는 내부 상태(`users` 배열)를 가지고 있습니다. 이 배열은 `UserService` 인스턴스에 추가되거나 조회되는 사용자 정보를 전역적으로 관리합니다.

Nest.js의 이러한 패턴과 원칙들은 코드의 모듈성과 재사용성을 크게 향상시키며, 대규모 애플리케이션 개발을 위한 강력한 기반을 제공합니다.

 

 

nestJS는 왜 싱글톤을 지향하는가

 

NestJS가 싱글턴 패턴을 지향하는 주된 이유는 여러 가지 장점을 제공하기 때문입니다. 싱글턴 패턴은 특정 클래스의 인스턴스가 애플리케이션의 생명주기 동안 단 하나만 생성되도록 보장하는 디자인 패턴입니다. NestJS에서 싱글턴 패턴을 사용하는 것은 다음과 같은 몇 가지 이점을 가져다 줍니다:

1. **메모리 효율성**: 동일한 인스턴스를 여러 곳에서 재사용함으로써, 메모리 사용량을 줄일 수 있습니다. 이는 특히 대규모 애플리케이션에서 중요한 요소가 될 수 있으며, 각 요청이나 작업에 대해 새로운 객체 인스턴스를 생성할 필요가 없습니다.

2. **애플리케이션 상태 관리**: 싱글턴을 통해 애플리케이션의 전역 상태를 공유하는 것이 더욱 용이해집니다. 예를 들어, 애플리케이션에서 공유되어야 하는 구성 설정이나 캐시 데이터 같은 자원을 관리할 때 유용합니다.

3. **서비스 간 일관성**: 싱글턴 패턴을 사용하면, 서비스 간에 데이터와 로직을 일관되게 유지할 수 있습니다. 여러 컴포넌트에서 동일한 서비스 인스턴스에 접근함으로써 얻는 결과의 일관성을 보장할 수 있습니다.

4. **코드의 복잡성 감소**: 싱글턴 패턴을 사용하면 개발자가 객체 생성과 생명주기를 관리하는 복잡성에서 벗어날 수 있습니다. NestJS 프레임워크가 자동으로 서비스의 인스턴스를 관리해 주기 때문에 개발자는 비즈니스 로직 구현에 더 집중할 수 있습니다.

5. **테스트와 유지보수의 용이성**: 싱글턴 패턴을 사용하면 테스트가 용이해집니다. 애플리케이션 전체에서 동일한 인스턴스를 사용하기 때문에, 의존성 주입을 통해 모의 객체(mock)로 쉽게 대체할 수 있으며, 이는 테스트 중인 코드가 예상하는 상태와 일치하는지 확인하는 데 도움을 줍니다.

이와 같이, NestJS에서 싱글턴 패턴을 사용하는 것은 애플리케이션의 효율성을 높이고, 코드의 일관성을 유지하며, 복잡성을 관리하는 데 큰 이점을 제공합니다. 이는 NestJS가 대규모, 고성능 애플리케이션 개발에 적합하도록 설계된 것을 반영합니다.

댓글 영역