상세 컨텐츠

본문 제목

[nestJS] 왜 컨트롤러 메소드는 일반이고 서비스는 async인가?

카테고리 없음

by esoesmio 2024. 5. 10. 11:34

본문

NestJS에서 컨트롤러(Controller)와 서비스(Service)는 각각의 역할이 명확하게 구분되어 있습니다. 컨트롤러는 주로 HTTP 요청을 처리하고 클라이언트에게 응답을 반환하는 역할을 합니다. 반면, 서비스는 비즈니스 로직을 수행하고 데이터베이스와의 상호작용을 처리하는 역할을 합니다. 이러한 구조는 코드의 재사용성과 유지 보수성을 향상시키고, 각 구성 요소의 책임을 명확하게 분리합니다.

### 컨트롤러에서 메소드 사용
컨트롤러에서 정의된 메소드(`signUp`, `signIn`, `test`)는 주로 라우팅과 요청 처리를 위한 엔트리 포인트 역할을 하며, 실제 비즈니스 로직을 서비스에 위임합니다. 컨트롤러 메소드들이 `async`로 명시되지 않은 이유는 다음과 같습니다:

- **비동기 로직 위임**: 컨트롤러가 서비스로부터 받은 프로미스를 직접 처리하지 않고 반환하기 때문에, 컨트롤러 메소드 자체에 `async` 키워드를 추가할 필요가 없습니다. 프로미스는 서비스 메소드에서 생성되고, NestJS의 내부 처리에 의해 비동기적으로 처리됩니다.
- **응답 처리**: 컨트롤러 메소드는 서비스로부터의 응답을 직접 클라이언트에 반환합니다. NestJS 프레임워크는 이러한 프로미스를 자동으로 해결하고, 결과를 HTTP 응답으로 변환합니다.

### 서비스에서 `async` 메소드 사용
서비스의 메소드들(`signUp`, `signIn`)이 `async`로 명시된 이유는 다음과 같습니다:

- **데이터베이스 비동기 작업**: `UserRepository`와의 상호작업(데이터 조회, 생성 등)은 데이터베이스 I/O 작업이 포함되므로 비동기적으로 처리됩니다. `async` 키워드는 이러한 비동기 작업을 `await` 키워드와 함께 사용하여, JavaScript의 이벤트 루프를 효과적으로 활용하고 코드 실행 흐름을 보다 명확하게 관리할 수 있도록 해줍니다.
- **JWT 생성 및 검증**: JWT 기반의 인증 로직(토큰 생성 및 검증) 또한 비동기적으로 처리될 수 있으며, `JwtService`를 사용하여 토큰을 생성하는 과정에서 `async`를 사용합니다.

### 결론
서비스 계층에서 `async`를 사용하는 것은 비동기 비즈니스 로직을 적절히 처리하기 위함입니다. 반면, 컨트롤러에서는 주로 이러한 비동기 결과를 관리하고 HTTP 응답을 형성하는 역할을 수행합니다. 따라서 컨트롤러에서 `async`를 사용하지 않는 것은 NestJS의 설계 철학과 프로그래밍 모델을 반영하는 것입니다. 비동기 처리는 주로 서비스 레벨에서 적극적으로 관리되며, 컨트롤러는 이러한 서비스의 결과를 단순히 라우팅하고 반환하는 역할을 합니다.

댓글 영역