CLIEN

본문 바로가기 메뉴 바로가기 보기설정 테마설정
톺아보기 공감글
커뮤니티 커뮤니티전체 C 모두의광장 F 모두의공원 I 사진게시판 Q 아무거나질문 D 정보와자료 N 새로운소식 T 유용한사이트 P 자료실 E 강좌/사용기 L 팁과강좌 U 사용기 · 체험단사용기 W 사고팔고 J 알뜰구매 S 회원중고장터 B 직접홍보 · 보험상담실 H 클리앙홈
소모임 소모임전체 ·굴러간당 ·아이포니앙 ·주식한당 ·MaClien ·일본산당 ·방탄소년당 ·개발한당 ·자전거당 ·안드로메당 ·나스당 ·육아당 ·노젓는당 ·골프당 ·영화본당 ·이륜차당 ·리눅서당 ·X세대당 ·디아블로당 ·뚝딱뚝당 ·퐁당퐁당 ·콘솔한당 ·총쏜당 ·보드게임당 ·덕질한당 ·IoT당 ·냐옹이당 ·여행을떠난당 ·클다방 ·날아간당 ·가상화폐당 ·소시당 ·키보드당 ·창업한당 ·AI그림당 ·달린당 ·소셜게임한당 ·물고기당 ·바다건너당 ·3D메이킹 ·ADHD당 ·AI당 ·사과시계당 ·배드민턴당 ·야구당 ·농구당 ·블랙베리당 ·곰돌이당 ·비어있당 ·FM당구당 ·블록체인당 ·활자중독당 ·볼링친당 ·캠핑간당 ·문명하셨당 ·클래시앙 ·요리한당 ·쿠키런당 ·대구당 ·DANGER당 ·개판이당 ·동숲한당 ·날아올랑 ·전기자전거당 ·e북본당 ·갖고다닌당 ·이브한당 ·패셔니앙 ·도시어부당 ·FM한당 ·맛있겠당 ·포뮬러당 ·젬워한당 ·걸그룹당 ·안경쓴당 ·차턴당 ·땀흘린당 ·하스스톤한당 ·히어로즈한당 ·인스타한당 ·KARA당 ·꼬들한당 ·어학당 ·가죽당 ·레고당 ·LOLien ·Mabinogien ·임시소모임 ·미드당 ·밀리터리당 ·땅판당 ·헌팅한당 ·오른당 ·MTG한당 ·소리당 ·노키앙 ·적는당 ·방송한당 ·PC튜닝한당 ·찰칵찍당 ·그림그린당 ·소풍간당 ·심는당 ·패스오브엑자일당 ·라즈베리파이당 ·품앱이당 ·리듬탄당 ·Sea마당 ·SimSim하당 ·심야식당 ·윈태블릿당 ·미끄러진당 ·축구당 ·나혼자산당 ·스타한당 ·스팀한당 ·파도탄당 ·테니스친당 ·테스트당 ·빨콩이당 ·공대시계당 ·터치패드당 ·트윗당 ·VR당 ·시계찬당 ·WebOs당 ·위스키당 ·와인마신당 ·WOW당 ·윈폰이당
임시소모임
고객지원
  • 게시물 삭제 요청
  • 불법촬영물등 신고
  • 쪽지 신고
  • 닉네임 신고
  • 제보 및 기타 제안
© CLIEN.NET
공지[점검] 잠시후 서비스 점검을 위해 약 30분간 접속이 차단됩니다. (금일 18:15 ~ 18:45)

개발한당

질문 NestJS에서 Base CRUD 모듈을 만들고 싶습니다. 3

2021-10-21 16:51:29 175.♡.185.186
독행소년

최근 NestJS 기반의 API 서버를 개발하기 위해 스터디 중입니다.

기존에는 node.js로 개발해서 운영중이고요. node만 하면서 이런건 어떻게 좀 안될까 싶었던 많은 부분들이 Nest에서 해결되어 있네요.

체계적으로 개발할 수 있다는 느낌이 들어 좋아보입니다.


스터디를 하던중에 공통의 컨트롤러와 서비스를 이용해서 다양한 모델에 적용하는 공통 모듈을 개발해보려고 이것 저것 시도해보고 있습니다.

그러다 구글링 중에 base crud란 검색어 결과에 저와 비슷한 고민을 한 사람들이 꽤 있고 구현물도 좀 있더군요.


개념은 별거 아닙니다. 기본적인 CRUD를 수행하는 공통의 컨트롤러와 서비스를 만들고 새로운 DB 컬랙션이 필요할 때마다 이 공통모듈을 확장해서 이용하는거죠.

최근 참고 하고 있는 자료가 https://github.com/xavism/nestjs-generic-crud 입니다.


잘 되네요...^^


근데 문제가 있습니다.

베이스 컨트롤러에서 ValidationPipe가 동작을 안하는 문제가 있어 조언을 구힙니다.

구현한 베이스 컨트롤러의 내용은 아래와 같습니다. 


@Controller()

export class BaseController<T extends BaseEntity>{

    constructor(private readonly baseService: BaseService<T>) { }

    @Post()

    @UsePipes(new ValidationPipe({

        whitelist: true, // decorator(@)가 없는 속성이 들어오면 해당 속성은 제거하고 받아들입니다.

        forbidNonWhitelisted: false, // DTO에 정의되지 않은 값이 넘어오면 request 자체를 막습니다.

        transform: true,

    }))

    async create(@Body() doc: T) {

        console.log(typeof User);

        console.log(typeof doc);

        console.log(doc);

        // return this.baseService.create(doc);

    }

}


UserController에서 BaseController를 상속하면 기본 CRUD를 바로 이용하겠다는 개념인데 Post 데이터를 전송하면 파이프를 타지않고 create()가 바로 호출되어 버립니다.

혹시나 해서 doc의 타입을 임의로 User로 변경해보니 바로 파이프를 타더군요.

async create(@Body() doc: User) <-이런식으로요.


결국 데코레이터에 정확한 클래스 타입을 적어줘야 파이프를 탄다는 것 같습니다.

이런 경우 어떻게 수정을 해줘야 할까요?


전문가분들의 조언 부탁드립니다. 꾸벅


독행소년 님의 게시글 댓글
  • 주소복사
  • Facebook
  • X(Twitter)
댓글 • [3]
음성사서함
IP 210.♡.112.116
10-21 2021-10-21 17:47:08
·
NestJS에서 TypeScript의 reflection을 어떻게 사용하나 정확하게 이해하신다면 원인을 찾으실 수 있으실텐데요, TypeScript 컴파일 과정에서 Generic은 아무 metadata도 안나오기 때문에 reflect할 수가 없습니다. TypeScript Reflection 자체의 한계로, 저런식으로 구현이 불가능합니다.

저라면 @UsePipes(new ValidationPipe({...})) 부분을 base에서 제거한 뒤 custom decorator로 빼서 child class에서 재사용할 거 같네요.

하나 조심하셔야될게 자바스크립트의 class 개념이 다른 프로그래밍 언어랑 많이 달라서, 여러 edge case들이 발생할 수 있습니다. 특히 NestJS 같은 프레임워크를 사용할 때요. Dependency Injection이 제대로 안되는 것부터 시작해서 별의별 문제를 다 겪어봤네요. 그런 케이스의 경우 완전 엉뚱한 에러메시지 뿜는 경우가 많아서 디버깅이 좀 까다롭습니다.
독행소년
IP 125.♡.69.183
10-21 2021-10-21 19:51:39
·
@음성사서함님 답변 감사드립니다.
답변주신 방법으로 한번 해보겠습니다.
독행소년
IP 175.♡.185.186
10-22 2021-10-22 11:35:22
·
@음성사서함님 custom decorator까지 살펴보고 있는 중입니다.
말씀하셨던 내용 중 child class에서 재사용하신다는 내용에 대해 조금 설명해 주실 수 있으실까요?
좋은 하루 되시길 바랍니다.
새로운 댓글이 없습니다.
이미지 최대 업로드 용량 15 MB / 업로드 가능 확장자 jpg,gif,png,jpeg,webp
지나치게 큰 이미지의 크기는 조정될 수 있습니다.
목록으로
글쓰기
글쓰기
목록으로 댓글보기 이전글 다음글
아이디  ·  비밀번호 찾기 회원가입
이용규칙 운영알림판 운영소통 재검토요청 도움말 버그신고
개인정보처리방침 이용약관 책임의 한계와 법적고지 청소년 보호정책
©   •  CLIEN.NET
보안 강화를 위한 이메일 인증
안전한 서비스 이용을 위해 이메일 인증을 완료해 주세요. 현재 회원님은 이메일 인증이 완료되지 않은 상태입니다.
최근 급증하는 해킹 및 도용 시도로부터 계정을 보호하기 위해 인증 절차가 강화되었습니다.

  • 이메일 미인증 시 글쓰기, 댓글 작성 등 게시판 활동이 제한됩니다.
  • 이후 새로운 기기에서 로그인할 때마다 반드시 이메일 인증을 거쳐야 합니다.
  • 2단계 인증 사용 회원도 최초 1회는 반드시 인증하여야 합니다.
  • 개인정보에서도 이메일 인증을 할 수 있습니다.
지금 이메일 인증하기
등록된 이메일 주소를 확인하고 인증번호를 입력하여
인증을 완료해 주세요.