[ 백엔드 공부하기 : Nest.js ] NestJS의 특징과 아키텍쳐 구조.
∇ BackEnd_NestJS : NestJS 특징 & 아키텍쳐.
목 차
1. NestJS의 주요 특징.
2. 다른 NodeJS 프레임워크와의 비교.
3. NestJS 아키텍쳐 핵심 요소.
4. 프로그래밍 패러다임의 통합.
5. 의존성 주입(DI)
6. 모듈 시스템
7. Best Practices와 주의사항.
Ⅰ. NestJS의 주요 특징.
1. 강력한 타입 시스템 : TypeScript를 기본으로 사용하여 개발 시 타입 안전성을 제공합니다.
2. 모듈화 아키텍처 : 애플리케이션을 기능별로 모듈화하여 구조화할 수 있습니다.
3. 의존성 주입 : 내장된 IOC(Inversion of COntrol) 컨테이너를 통해 의존성을 쉽게 관리합니다.
4. 데코레이터 기반 메타프로그래밍 : 클래스와 함수에 메타데이터를 추가하여 선언적 프로그래밍을 가능하게 합니다.
5. 확장성 : Express와 같은 기존 라이브러리와 쉽게 통합될 수 있습니다.
6. 테스트 용이성 : Jest를 기본으로 내장하여, 단위 테스트와 e2e 테스트를 쉽게 작성 가능합니다.
∴ jest는 js*ts 앱을 위한 테스트 프레임워크
1.간편한 설정: 기본적으로 설정이 간단하여 빠르게 테스트를 시작할 수 있습니다.
2.스냅샷 테스트: UI 컴포넌트의 출력 결과를 스냅샷으로 저장하고 비교할 수 있는 기능을 제공합니다.
3.모의 함수(mock functions): 테스트 중에 함수의 호출을 추적하고, 반환 값을 설정할 수 있는 기능을 제공합니다.
4.비동기 테스트 지원: 비동기 코드에 대한 테스트를 쉽게 작성할 수 있습니다.
5.코드 커버리지: 테스트의 코드 커버리지를 쉽게 확인할 수 있는 기능이 내장되어 있습니다.
Ⅱ. 다른 NodeJS 프레임워크와의 비교.
◆ 구조하된 아키텍쳐 : 모듈 * 컨트롤러 * 서비스 등의 명확한 구조를 제공합니다.
◆ TypeScript 지원 : 기본적으로 TypeScript를 사용하여 개발합니다.
◆ 의존성 주입 : 내장된 DI 시스템으로 테스트와 유지보수가 용이합니다.
◆ 풍부한 생태계
Ⅲ. NestJS 아키텍처의 핵심 요소.
◎ NestJS의 모듈 기반의 아키텍처는 다음과 같은 핵심 요소로 구성됩니다.
1. 모듈 (Modules) : 애플리케이션의 구조를 조직화합니다.
- 관련된 기능들을 그룹화하고 캡슐화합니다.
√ 코드 구조화 : 관련 기능들을 논리적으로 그룹화하여 코드를 더 잘 구조화 가능.
√ 재사용성 : 모듈을 다른 애플리케이션에서 쉽게 재사용 가능합니다.
√ 확장성 : 새로운 기능을 추가할 때 기존 코드를 크게 변경하지 않고도
새로운 모듈을 추가 가능합니다.
2. 컨트롤러(Controllers) : 들어오는 요청을 처리하고 클라이언트에게 응답을 반환합니다.
3. 서비스(Services) : 비즈니스 로직을 포함하며, 컨트롤러에 의해 사용됩니다.
4. 프로바이더(Providers) : 의존성으로 주입될 수 있는 서비스, 리포지토리 등.
Ⅳ. 프로그래밍 패러다임의 통합.
◎ NestJS는 여러 프로그래밍 패러다임을 효과적으로 통합합니다.
1. 객체지향 프로그래밍 ( OOP ) : 클래스와 인터페이스를 사용하여 구조화된 코드를 작성합니다.
@Injectable()
class UserService {
findAll(): User[] {
// 사용자 찾기 로직
}
}
2. 함수형 프로그래밍(FP) : 순수 함수와 불변성을 활용하여 부작용을 최소화합니다.
const addUser = (users: User[], newUser: User) => [...users, newUser];
3. 반응형 프로그래밍(RP) : RxJS를 활용하여 비동기 데이터 스트림을 처리합니다.
@Get()
findAll(): Observable<User[]> {
return from(this.userService.findAll()).pipe(
map(users => users.filter(user => user.isActive))
);
}
Ⅳ. 의존성 주입 ( DI )
◎ NestJS의 의존성 주입 시스템은 애플리케이션의 결합도를 낮추고 테스트 용이성을 높입니다.
- Spring 프레임워크의 DI 시스템과 유사합니다.
√ 느슨한 결합 : 컴포넌트 간의 의존성을 줄여 유지보수성을 향상시킵니다.
√ 테스트 용이성 : 의존성을 쉽게 모킹할 수 있어서 단위-테스트가 용이합니다.
√ 코드 재사용 : 의존성을 쉽게 교체할 수 있어서 재사용성이 향상됩니다.
@Controller('users')
export class UsersController {
constructor(private userService: UserService) {}
@Get()
findAll() {
return this.userService.findAll();
}
}
==>> "UserService" 는 "UsersController" 에 자동으로 주입됩니다.
Ⅴ. 데코레이터 사용.
◎ NestJS는 TS의 데코레이터를 광범위하게 사용합니다.
=> 이는 메타데이터를 클래스, 메서드, 속성에 추가하는 선언적 방식을 제공합니다.
√ 간결한 문법 : 복잡한 설저을 간단한 데코레이터로 표현할 수 있습니다.
√ 가독성 향상 : 코드의 의도를 명확하게 표현 가능합니다.
√ 기능 확장 : 사용자 정의 데코레이터를 통해 프레임워크의 기능을 쉽게 확장 가능합니다.
Ⅵ. 모듈 시스템.
◎ NestJS의 모듈 시스템은 애플리케이션을 기능별로 구조화하고 확장성을 제공합니다.
@Module({
imports: [DatabaseModule],
controllers: [UsersController],
providers: [UserService],
exports: [UserService],
})
export class UsersModule {}
=>> 이 구조는 "UsersModule" 이 "DatabaseModule" 에 의존하고, "UsersController" 와 "UserService"를 포함하며,
"UserService" 를 다른 모듈에서 사용할 수 있도록 내보내고 있습니다.
Ⅶ. Best Practices와 주의사항.
1. 단일 책임 원칙 준수 : 각 클래스와 모듈이 하나의 책임만을 가지도록 설계합니다.
2. 의존성 주입 활용 : 직접적인 인스턴스 생성 대신 의존성 주입을 사용합니다.
3. 비동기 처리 : 가능한 한 비동기 메서드를 사용하여 성능을 최적화합니다.
4. 예외 처리 : 내장 예외 필터를 활용하여 일관된 에러 응답을 제공합니다.
5. 환경 설정 분리 : 환경별 설정을 적절히 분리하여 관리합니다.
6. 테스트 작성 : 단위 테스트와 e2e 테스트를 꾸준히 작성하여 품질을 유지합니다.
7. 문서화 : Swagger 등을 활용하여 API 문서를 자동으로 생성합니다.
8. 보안 고려 : CORS, CSRF 등의 보안 설정을 적절히 구성합니다.
◆ 주의사항.
● 순환 의존성을 피해야합니다.
● 모듈이나 서비스가 너무 커지지 않도록 주의합니다
● 과도한 추상화는 피하고, 필요한 만큼만 구조화합니다.
'Back_End > NestJS' 카테고리의 다른 글
[ 백엔드 공부하기 : Nest.js ] NestJS를 본격적으로 공부하기 전에 (1) | 2024.12.12 |
---|---|
[ 백엔드 공부하기 : Nest.js ] NestJS란 무엇이고, 왜 사용하는 것일까? (0) | 2024.11.24 |