[NestJS] DTO, DI, loC개념
2024. 6. 28. 22:29ㆍNestJs
728x90
반응형
DTO (Data Transfer Object)
DTO(Data Transfer Object)는 데이터의 유효성을 검증하기 위해 사용합니다. 본인이 설정하지 않은 값이 들어오거나, 설정하지 않은 타입의 값이 들어올 경우, 에러를 발생 시킵니다.
유효성 검증을 위해 class-validator 와 class-transformer 를 설치 합니다.
$ npm install class-validator class-transformer
그 후 main.ts를 아래와 같이 수정합니다.
// main.ts
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes( new ValidationPipe({
transform: true, // 요청 데이터를 DTO클래스의 타입에 맞게 자동변환
}),
);
await app.listen(3000);
}
bootstrap();
동작 설명
- app.useGlobalPipes : NestJS에서 제공하는 메서드로, 전역 파이프를 설정하는 역할을 합니다. NestJS 애플리케이션 객체(app)를 통해 이 메서드를 호출하여 전역적으로 적용할 파이프를 설정할 수 있습니다.
- ValidationPipe: NestJS에서 제공하는 내장 파이프로, 주로 데이터의 유효성을 검사하는 데 사용됩니다.
- transform: true 옵션을 설정하면 요청의 데이터를 DTO 클래스의 타입에 맞게 자동으로 변환합니다.
DTO 예제
// signUp-dto.ts
import { IsEmail, IsNotEmpty, IsString } from 'class-validator';
export class SignUpDto {
@IsEmail()
@IsNotEmpty({ message: '이메일을 입력해주세요.' })
email: string;
@IsString()
@IsNotEmpty({ message: '비밀번호를 입력해주세요' })
password: string;
@IsString()
@IsNotEmpty({ message: '이름을 입력해주세요.' })
nickname: string;
}
// user.controller.ts
import { Body, Controller, Post } from '@nestjs/common';
import { SignUpDto } from './dto/sign-up.dto';
import { UserService } from './user.service';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
@Post('sign-up')
signUp(@Body() signUpDto: SignUpDto) {
const { nickname, email, password } = signUpDto;
return this.userService.signUp(email, nickname, password);
}
}
DTO클래스에서 @IsString() , @IsNotEmpty() 와 같은 데코레이터를 사용하여 유효성 검사를 할 수 있습니다.
자주 사용하는 검증 데코레이터
@IsString() | 문자열 검증 |
@IsInt() | Int값 검증 |
@IsBoolean() | Boolean값 검증 |
@IsEmail() | 이메일 형식 검증 |
@IsArray() | 배열 값 검증 |
@IsEnum() | Enum값 검증 |
@IsNumber() | 숫자값 검증 |
@IsDate() | 날짜 값 검증 |
@IsOptional() | 해당 값을 옵션으로 할당 |
@MaxLength() | 최대 길이 제한 |
@MinLength() | 최소 길이 제한 |
@Length() | 길이 제한 |
@Matches() | 정규표현식 검증 |
@Min() | 최솟값 |
@Max() | 최댓값 |
참고사항
많은 데코레이터가 궁금하시면 공식홈페이지 GitHub를 확인해주세요
의존성 주입(Dependency Injection)
클래스 외부에서 객체를 생성하여 해당 객체를 클래스 내부에 주입하는 것이다.
의존성 주입은 클래스간의 결합도를 느슨하게 만들어 준다. 결합도가 느슨하다는 것은 하
의 클래스가 변경 되었을 때 연결되어 있는 다른 클래스를 변경할 필요성이 적어진다는 뜻이다.
의존성 주입의 장점
- 코드의 재사용성, 유연성이 높아진다.
- 객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다
- 유지보수가 쉬우며 테스트가 용이해진다
- 확장성을 가진다
의존성 주입의 단점
- 책임이 분리되어 있기 때문에 클래스 수를 늘림으로써 복잡성이 증가한다.
- 주입된 객체들에 관한 코드 추적이 어렵다.
- 초기 개발 노력이 필요하다.
- 의존성 주입 프레임워크를 사용하면 빌드 시간이 늘어날 수 있으며, 프레임워크에 대한 의존도를 높인다.
Ioc(Inversion of control)란 무엇인가?
제어의 역전(IOC: Inversion of Control)이란 객체의 생성부터 소멸까지 어플리케이션이 제어권을 갖는 것이 아니라 이런 것들을 대신 관리해주는 컨테이너에게 넘기는 것을 말합니다. 즉, 개발자가 열심히 new 연산자를 사용해서 객체를 생성하고, 객체 간 의존성 맺어주는 등의 귀찮았던 작업들을 컨테이너가 대신해주는 것입니다.
728x90
반응형
'NestJs' 카테고리의 다른 글
[NestJS] TypeORM QueryBuilder (0) | 2024.07.02 |
---|---|
[NestJS] 커스텀 데코레이터 (Custom decorator) (0) | 2024.07.01 |
[NestJs] NodeJs에선 nodemon이 있다면 NestJS에서는 Hot reload (0) | 2024.06.28 |
[NestJS] 모듈 구성 요소 (0) | 2024.06.27 |
[NestJs] Express와 NestJS차이 (0) | 2024.06.26 |