본문 바로가기
nest.js

constructor, @InjectRepository

by momomoo 2024. 7. 10.

`constructor`보다 `@InjectRepository(User) private readonly userRepository: Repository<User>;`와 같은 방식으로 의존성을 주입하는 것이 좋은지에 대한 질문은 주로 코드의 가독성, 테스트 용이성, 유지보수성 등 다양한 측면에서 고려될 수 있습니다. 각 방법의 장단점을 살펴보겠습니다.

### `constructor`를 통한 의존성 주입

**장점:**
1. **명확한 의존성 선언**: 생성자 주입은 클래스가 의존하는 모든 의존성을 명확히 선언합니다. 이는 클래스의 의존성을 쉽게 이해할 수 있게 합니다.
   ```typescript
   constructor(
     @InjectRepository(User) private readonly userRepository: Repository<User>
   ) {}
   ```
2. **테스트 용이성**: 생성자 주입을 사용하면 의존성을 쉽게 모킹(mocking)할 수 있어 테스트 작성이 용이합니다.
3. **불변성**: 의존성이 생성자에서 주입되면 이후에 변경할 수 없어 불변성을 보장합니다.

**단점:**
1. **코드 길이 증가**: 의존성이 많아질 경우 생성자가 길어질 수 있습니다.
2. **Decorator 중복**: 많은 데코레이터가 사용될 경우 가독성이 떨어질 수 있습니다.

### `@InjectRepository`를 통한 필드 주입

**장점:**
1. **간결성**: 필드 주입은 코드가 더 간결해집니다. 클래스 정의 부분에서 모든 의존성을 한 눈에 볼 수 있습니다.
   ```typescript
   @InjectRepository(User)
   private readonly userRepository: Repository<User>;
   ```
2. **가독성**: 의존성이 클래스 필드로 직접 주입되기 때문에 가독성이 높아질 수 있습니다.

**단점:**
1. **테스트 어려움**: 필드 주입을 사용할 경우 의존성을 모킹하기 어려워질 수 있습니다. 의존성 주입이 런타임에 이루어지기 때문에 테스트 시 의존성을 설정하기가 더 복잡해질 수 있습니다.
2. **불변성 문제**: 필드 주입은 의존성이 런타임에 설정되므로, 불변성이 보장되지 않습니다.

### 결론

두 방법 모두 사용될 수 있으며, 상황에 따라 적절한 방법을 선택하는 것이 중요합니다. 일반적으로, 생성자 주입이 더 명시적이고 테스트가 용이하기 때문에 선호되지만, 필드 주입이 더 간결하고 코드가 짧아질 수 있습니다. 팀의 코딩 표준이나 프로젝트의 특성에 따라 적절한 방법을 선택하는 것이 좋습니다.

### 예시

**생성자 주입 예시:**
```typescript
@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User) private readonly userRepository: Repository<User>
  ) {}
  
  // 메소드들
}
```

**필드 주입 예시:**
```typescript
@Injectable()
export class UserService {
  @InjectRepository(User)
  private readonly userRepository: Repository<User>;
  
  // 메소드들
}
```

NestJS 공식 문서에서도 이러한 두 가지 주입 방법에 대한 자세한 설명과 예제를 확인할 수 있습니다. [NestJS - Dependency Injection](https://docs.nestjs.com/providers#dependency-injection)에서 더 많은 정보를 얻을 수 있습니다.

'nest.js' 카테고리의 다른 글

Bootstrapping 이란  (0) 2024.07.03
NestFactory의 역할  (0) 2024.07.03
eslint, prettiet는 CLI설치시 사전 설치 + 터미널  (0) 2024.06.29
main.ts  (0) 2024.06.29