[공유] DTO optional 필드가 undefined로 잡혀 TypeORM 조건이 깨지는 현상
92
3 asked
Postman 테스트 중 데이터를 받아오지 못하는 문제가 생겨 원인을 찾아보았습니다.
같은 문제를 겪는 분이 계시면 참고하세요.
이하 AI로 작성되었습니다.
현상:
/posts?order__createdAt=ASC처럼 where 파라미터 없이 호출했는데,findOptions.where.id가MoreThan(undefined)로 만들어져repository.find()결과가 0건으로 나옵니다.
원인:
ValidationPipe({ transform: true })로 DTO가 “클래스 인스턴스”가 되고main.ts), TStarget이ES2022+(예:ES2023,tsconfig.json)이면 초기값 없는 DTO 필드도 JS에field;로 emit되어 인스턴스에undefined프로퍼티가 “존재”합니다base-pagination.dto.js). 이 상태에서Object.entries(dto)로 필터를 만들면undefined도 같이 파싱되어MoreThan(undefined)가 됩니다.
참고: 이 동작은 TS
3.7의useDefineForClassFields도입 이후(4.3에서 esnext 기본 true, 4.6에서 es2022 타겟 추가) 현대 타겟에서 흔히 발생할 수 있습니다. NestJS/class-validator 변경이라기보다 TS 타겟/클래스 필드 emit 차이입니다.
해결: 필터 조합 시
undefined/null은 스킵하도록 방어코드 추가(예:if (value === undefined || value === null) continue;) —common.service.ts.
이 케이스를 막는 옵션은
필터 조합 로직에서
undefined/null을 스킵(가장 단순/안전)(파이프 레벨로 하고 싶으면) 커스텀 파이프로
undefined키 삭제/또는class-transformer의instanceToPlain(dto, { exposeUnsetFields: false })같은 방식으로 “undefined 없는 plain”으로 만든 뒤 사용
등이 있습니다.
Answer 2
0
안녕하세요, 인프런 AI 인턴입니다.
목화님이 문의하신 내용은 TypeScript 환경에서 DTO 필드가 초기화되지 않은 경우, undefined 값이 의도치 않게 동작하는 현상에 대한 것입니다. 이와 관련된 문제는 현대 TypeScript 환경에서 종종 발생할 수 있는 이슈로, 특히 target 설정이 ES2022 이후 버전으로 설정된 경우에서 나타납니다.
문제의 원인 및 해결 방법에 대한 요약:
- 문제 원인: TypeScript에서는 DTO 필드가 초기화되지 않는 경우에도 클래스 인스턴스를 만들 때 undefined 값으로 필드가 존재합니다. 이 때문에 Object.entries(dto) 등으로 필터를 만들 경우 undefined 값이 포함되면서 불필요한 조건이 생성될 수 있습니다.
- 해결 방법: 필터 조합 시
undefined및null값을 명시적으로 제거하는 로직을 추가해야 합니다. 예를 들면,common.service.ts에서undefined/null검사를 추가하여 필터 조합 로직에서 이러한 값을 스킵하도록 해야 합니다.
또한, 이와 유사한 문제를 해결하기 위해 커스텀 파이프를 작성하여 undefined 값을 제거하는 방법이나, class-transformer 패키지를 사용하여 DTO 객체를 “undefined 없는 형태”로 변환하는 방법도 고려해 볼 수 있습니다.
유사한 상황에 대한 기존 답변을 찾기 위해 다음과 같은 관련 질문 URL을 추천드립니다:
- Paginate에서 overrideFindOptions 문제
- 정렬에 대한 질문
이 답변이 도움이 되셨으면 좋겠습니다. 저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
cascade 질문
0
35
1
@types/bcrypt 설치과정이 누락된것같습니다.
0
41
1
process.env port key 에러
0
43
1
추상화
0
45
1
where 키워드가 들어가는 메서드와 아닌 메서드
0
53
1
BearerTokenGuard에서 db를 조회해서 유저 정보를 불러오는 이유?
0
66
1
app.controller app.service 는 지워도되나요?
0
67
1
@JoinColumn을 쓰는 경우와 안쓰는 경우의 차이
0
75
1
포트 3000에서 listen하는 곳까지 넘어가지 않습니다.
0
62
1
PickType 사용 시 `as const`를 꼭 사용해야 하나요?
0
99
2
socket connect 오류
0
95
2
강의를 들으면서 궁금한 점
0
95
2
DELETE 요청의 반환값은 어떤 기준으로 결정하는 게 좋을까요?
0
55
2
커리큘럼 질문
0
95
2
put 요청은 언제
0
88
3
typeorm VS prisma
0
339
2
142 강의 > 4:00 > 포스트멘 활용 관련 질문 드립니다.
0
74
2
User 데코레이터 버그 수정 전달드립니다.
0
64
1
git 주소 부탁드립니다.
0
109
2
nest g resource 명령어 에러
0
97
2
로그인 엔드포인트 관련 질문
0
81
2
yarn으로 express 다운 후 node 2_server.js 실행 안되는 경우
0
143
3
"흔히 사용되는 메서드" 강의 관련 질문입니다~
0
93
2
@nestjs/serve-static
0
105
2

