NestJS 프로젝트 구조에서 src
폴더 안의 각 파일은 다음과 같은 역할을 합니다. 이 파일들은 기본적인 NestJS 애플리케이션의 구성 요소로, 각 파일이 특정한 역할을 담당하며 NestJS의 계층적 구조에 따라 기능이 분리되어 있습니다.
1. app.controller.ts
- 역할: 컨트롤러(Controller)로, 클라이언트 요청을 처리하고, 적절한 응답을 반환하는 역할을 합니다.
- 기능:
- HTTP 요청(GET, POST, 등)을 수신하고, 이에 대한 응답을 결정합니다.
- 비즈니스 로직을 직접 구현하지 않고, 서비스 계층에 요청을 전달하여 결과를 반환받습니다.
- 구조:
@Controller
데코레이터를 사용하여 컨트롤러 클래스를 정의하고, 메서드마다@Get()
,@Post()
와 같은 데코레이터를 통해 HTTP 요청 메서드를 정의합니다.
2. app.controller.spec.ts
- 역할: 테스트 파일로,
app.controller.ts
파일의 컨트롤러를 테스트하기 위한 유닛 테스트 파일입니다. - 기능:
- Jest를 사용하여 컨트롤러의 각 메서드가 예상대로 동작하는지 검증합니다.
- 의존성을 모킹(Mock)하여, 컨트롤러가 특정 상황에서 예상되는 응답을 반환하는지 확인합니다.
- 구조:
describe
,it
,expect
등을 사용하여 테스트 케이스를 정의하며, 실제 서버 없이도 컨트롤러의 기능을 단위 테스트할 수 있습니다.
3. app.module.ts
- 역할: 모듈(Module)로, NestJS 애플리케이션의 루트 모듈입니다. 애플리케이션에서 사용할 컨트롤러와 서비스, 다른 모듈을 등록 및 관리합니다.
- 기능:
imports
,controllers
,providers
등 다양한 설정을 통해 애플리케이션의 주요 구성 요소를 정의합니다.@Module()
데코레이터를 사용하여, 현재 모듈에 속하는 컨트롤러와 서비스를 명시하고, 필요에 따라 다른 모듈을 임포트하여 사용할 수 있습니다.
- 구조: 모든 NestJS 애플리케이션은 최소 하나의 모듈(AppModule)을 포함하며, 이 모듈에서 애플리케이션의 초기 구성을 담당합니다.
4. app.service.ts
- 역할: 서비스(Service)로, 비즈니스 로직을 처리하는 계층입니다.
- 기능:
- 데이터를 조회하거나 가공하는 등의 비즈니스 로직을 수행합니다.
- 주로 컨트롤러에서 호출되어 요청을 처리하며, 데이터를 반환하거나 데이터베이스와 상호작용하는 로직을 포함할 수 있습니다.
- 구조:
@Injectable()
데코레이터를 사용하여 서비스 클래스가 의존성 주입(DI)에 사용할 수 있도록 만듭니다. 다른 서비스 또는 데이터베이스 접근 로직을 필요로 할 경우, 이곳에서 주입받아 사용할 수 있습니다.
5. main.ts
- 역할: 엔트리 파일(Entry File)로, NestJS 애플리케이션을 시작하는 진입점입니다.
- 기능:
NestFactory.create()
를 통해 애플리케이션 인스턴스를 생성하고, 서버를 시작합니다.- 환경 설정(예: 포트 설정)이나 미들웨어 설정을 추가할 수 있습니다.
bootstrap
함수 내에서 애플리케이션을 구성하고, 애플리케이션이 지정된 포트에서 요청을 받을 수 있게 실행합니다.
- 구조:
async function bootstrap()
함수 안에서 애플리케이션 인스턴스를 생성하고,app.listen()
을 호출하여 서버가 실행되도록 설정합니다.
요약
파일명 | 역할 | 설명 |
---|---|---|
app.controller.ts |
컨트롤러 (Controller) | 클라이언트 요청을 처리하고 서비스로부터 결과를 받아 응답을 반환합니다. |
app.controller.spec.ts |
컨트롤러 테스트 파일 (Unit Test for Controller) | app.controller.ts 의 컨트롤러 메서드를 테스트하기 위한 유닛 테스트 파일입니다. |
app.module.ts |
루트 모듈 (Root Module) | NestJS 애플리케이션의 주요 구성 요소를 정의하고 등록하는 루트 모듈입니다. |
app.service.ts |
서비스 (Service) | 비즈니스 로직을 처리하며, 컨트롤러에 의해 호출됩니다. |
main.ts |
엔트리 파일 (Entry File) | 애플리케이션을 시작하는 진입점으로, NestJS 서버를 생성하고 실행하는 역할을 합니다. |
이 기본 구조는 NestJS의 계층적 아키텍처에서 각 파일이 명확한 역할을 가지도록 돕고, 코드의 유지보수성과 확장성을 높여줍니다.
1. Middleware
- 역할: 요청(Request)이 라우터에 도달하기 전에 실행되며, 요청을 가로채 필요한 작업을 수행합니다.
- 기능 예:
- 로그 기록: 요청이 들어올 때마다 로그를 남기도록 설정하여, 요청 메서드와 URL을 기록할 수 있습니다.
- 인증 토큰 검사: 요청 헤더에 포함된 JWT 토큰을 확인하여 인증이 필요한 라우터로의 접근을 차단할 수 있습니다.
- 요청 데이터 변경: 요청 본문(body) 데이터를 가공하거나 추가 속성을 삽입하는 작업을 할 수 있습니다.
2. Guard
- 역할: 요청이 특정 라우트에 접근할 수 있는지 결정하는 보안 계층입니다. 인증과 권한 확인 작업을 담당합니다.
- 기능 예:
- 로그인 확인: 사용자가 로그인을 했는지 여부를 확인하여, 로그인이 필요한 페이지에 접근할 때만 요청을 허용할 수 있습니다.
- 권한 검사: 관리자나 특정 권한이 있는 사용자만 접근할 수 있도록 설정하여, 일반 사용자가 접근할 수 없는 기능에 대한 접근을 제한할 수 있습니다.
3. Interceptor
- 역할: 요청 전과 후의 데이터를 가로채고, 이를 변경하거나 추가 작업을 수행할 수 있습니다.
- 기능 예:
- 응답 데이터 포맷팅: 데이터베이스에서 가져온 원시 데이터를 사용자 친화적인 형태로 변환하여 응답할 수 있습니다.
- API 응답 시간 로깅: 요청을 처리하는 데 걸린 시간을 측정하여 성능 로깅에 활용할 수 있습니다.
- 캐싱: 동일한 요청이 반복될 때 DB 쿼리를 줄이기 위해 캐시된 데이터를 반환할 수 있습니다.
4. Pipe
- 역할: 요청 데이터의 유효성 검사와 변환을 담당합니다. Controller에 데이터가 도달하기 전에 이를 검증하고 필요한 형식으로 변경합니다.
- 기능 예:
- 데이터 유효성 검사: 숫자로 입력해야 하는 필드에 문자열이 들어오는 경우 이를 차단하거나 오류 메시지를 반환할 수 있습니다.
- 데이터 형식 변환: 문자열로 전달된 숫자 데이터를 실제 숫자 타입으로 변환하여 Controller가 올바른 타입으로 데이터를 다룰 수 있도록 합니다.
- 필수 필드 확인: 특정 필드가 요청 본문에 존재하지 않을 경우 에러를 발생시켜 사용자에게 필수 입력값을 안내할 수 있습니다.
5. Controller
- 역할: 클라이언트의 요청을 받아 비즈니스 로직을 수행하기 위해 Service를 호출하고, 최종 응답을 반환하는 역할을 합니다.
- 기능 예:
- 사용자 등록 API: 회원가입 요청을 받아 Service에 사용자 데이터를 넘기고, 성공 또는 실패 응답을 반환합니다.
- 상품 목록 조회 API: DB에 저장된 상품 목록을 가져와 사용자에게 전달합니다.
- 게시글 작성 API: 사용자로부터 받은 게시글 데이터를 가공한 후 저장 요청을 전달하고, 성공 메시지를 반환합니다.
6. Service
- 역할: 비즈니스 로직을 수행하는 계층입니다. 데이터를 처리하고 필요 시 데이터베이스와 상호작용을 통해 데이터를 관리합니다.
- 기능 예:
- 회원가입 처리: 입력된 비밀번호를 암호화하고, 사용자 데이터를 데이터베이스에 저장합니다.
- 상품 가격 계산: 특정 조건에 따라 상품의 가격을 할인하거나 추가 비용을 계산하여 반환할 수 있습니다.
- 로그인 처리: 사용자의 인증 정보를 확인하고, JWT 토큰을 생성하여 반환합니다.
7. Repository
- 역할: 데이터베이스와 상호작용하는 계층입니다. TypeORM 등 ORM을 통해 데이터베이스 접근과 관리를 수행합니다.
- 기능 예:
- 사용자 조회: 사용자 ID를 기반으로 해당 사용자의 데이터를 DB에서 가져옵니다.
- 상품 저장: 새로운 상품 정보를 데이터베이스에 저장하거나 기존 상품 정보를 업데이트합니다.
- 게시글 삭제: 특정 게시글 ID에 해당하는 게시글을 데이터베이스에서 삭제합니다.
8. Exception Filter
- 역할: 애플리케이션 내에서 발생하는 예외를 처리하여, 사용자에게 일관된 형식의 오류 메시지를 반환합니다.
- 기능 예:
- 404 에러 처리: 존재하지 않는 경로에 대한 요청이 들어오면 "찾을 수 없는 페이지입니다"와 같은 메시지를 반환합니다.
- 인증 실패 처리: 로그인 실패 시 "잘못된 인증 정보입니다"와 같은 사용자 친화적인 메시지를 반환합니다.
- 서버 에러 처리: 예상치 못한 오류 발생 시 "서버 오류가 발생했습니다"라는 메시지를 반환하여 사용자에게 서버 오류 상황을 알립니다.
각 요소들은 독립적으로 요청/응답 과정에서 필요한 작업을 수행하며, 요청이 들어온 후 Controller로 도달하기 전까지 다양한 전처리 작업을 거치게 됩니다.
'NestJS' 카테고리의 다른 글
NestJS 핫리로드 트러블슈팅 (1) | 2024.11.16 |
---|---|
NestJS Pipe (0) | 2024.11.15 |
회원가입로직 (2) | 2024.11.14 |
NestJS DI(Dependency Injection) (0) | 2024.11.06 |
NodeJS 기술적 소개 (2) | 2024.11.02 |