46,200원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
파일을 클릭하면 제일 1번라인 import에 빨간줄 문의드립니다
안녕하세요 강사님 궁금하게 생겨 문의 드립니다. 다음 사진처럼 항상 파일을 클릭하면 상단 import줄이 저렇게 변하는데요 파일을 다시 닫으면 빨간줄이 사라집니다. 깃허브에 있는 tsconfig.json과 .eslintrc.js는 그대로 복붙했습니다. 제가놓친게있을까요?
- 해결됨탄탄한 백엔드 NestJS, 기초부터 심화까지
cats.module.ts에서 MongooseModule.forFeature 질문 드립니다
안녕하세요 강사님 cats.module.ts 파일에서 import: [MongooseModule.forFeature([{ name: Cat.name, schema: CatSchema }]),이부분에서 빨갛게 해논부분에 왜 Cat.name , name이 붙어있는 이유가 뭔지 알고싶습니다. 저기서 name에 할당한 값으로 Service에서 생성자 주입 받을때? Cat.name 으로 @InjectModel(Cat.name) 하는걸로 보이는데 왜 ".name" 이 붙은건가요?..
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
e2e 테스트는 꼭 한 파일에 작성해야하나요?
e2e 테스트는 꼭 한 파일에 작성해야하나요? api endpoint가 몇 개 없으면 큰 문제가 없을 것 같은데요. 하나의 서버에서 제공하는 모든 API를 하나의 e2e 테스트 파일에서 테스트하면 한 파일에 엄청 많은 e2e 테스트가 생길 것 같습니다. 이는 원하는 테스트 코드를 찾기도 힘들 것 같다는 생각이 들었습니다. 그래서 저는 여러개의 파일로 나눠서 e2e test를 작성해서 실험해봤었는데요. typeorm에서 데드락 에러를 내더라구요. 여러 e2e 테스트 파일에서 아래의 이미지와 같은 app init을 여러번하면서 생긴 에러라고 저는 추측하고 있습니다. 현업에서 어떻게 사용하고 계신지 팁 좀 주실 수 있으실까요? beforeAll(async () => { const module: TestingModule = await Test.createTestingModule({ imports: [AppModule], }) app = module.createNestApplication(); bannersRepository = module.get<Repository<Banner>>( getRepositoryToken(Banner), ); await app.init();})
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
typeorm 쿼리 확인 방법
Typeorm 으로 실행시, mongoose.set 처럼 어떤 쿼리로 돌아가는지 확인 하는 방법이 있을까요?
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
싱글톤 패턴 전후 인스턴스 변화
싱글톤 패턴으로 변경하기 전이나 후나, 인스턴스는 계속 1개인거 아닌가요? 단지 class로 묶고, 함수 내부에서 인스턴스 생성하는 거로만 변경된거 같은데요...
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
인터셉터 질문
안녕하세요 개별로 적용하는 것과 전역으로 적용하는 것에 대한 질문이 있는데요, 만약 전역으로 main.ts 에서 인터셉터를 사용하게 되면 컨트롤러에 데코레이터로 개별 설정을 안 해 주는 게 맞나요? 제가 처음에 <컨트롤러에 @UseInterceptors(SuccessIntereptor) 데코레이터 적용> + <main.ts에 app.useGlobalInterceptors(new SuccessInterceptor()); 적용> 이렇게 두 개를 다 적용했었는데 아래처럼 중복으로 코드가 뜨더라고요 뭐가 잘못됐나 싶어서 컨트롤러 데코레이터에 주석처리를 하면 이렇게 하나만 제대로 뜨고요. 강사님은 잘 뜨시던데 저는 왜...ㅠ 뭐가 잘못된 건지 모르겠어요 그래서 결론은 인터셉터와 예외필터를 사용할 때 개별 or 전역 하나만 선택해서 적용하면 되는 건지 궁금합니다. 감사합니다!
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
aws ec2 사용시 로그확인은 보통 어떤식으로하나요?
안녕하세요 현재 스타트업(?)회사에서 앱개발중인 신입개발자입니다. 현재 회사에서 adonis JS 라는 처음들어본 서버를 사용중인데 Nest JS로 바꾸기위해 공부중입니다. 보통 서버개발자들이 로그를 확인한다라고 하는데 미들웨어강의를 보면서 아직 이부분에대해 해소되지가않아서 따로 질문드립니다. 현재 서버는 aws ec2에 배포되어있고 이후에 Nest 로 개발하더라도 그곳에 올려야하는데 보통 로그확인은 어떤식으로 하는건가요? aws측에서 해당서버의 터미널로그를 따로 보여주는 툴이 뭔가 따로 있는건지.. 개념자체가 잘 이해가지않네요 회사에서 기존에 있던 개발자가없고 외주맡겨서 터진걸 신입인 제가 고쳐나가는 입장이라 따로 배울곳이 없어 질문드립니다.. 혹시나 뒤쪽강의에 비슷한내용이 있다면 차근차근 진행하면서 공부해가겠습니다. 영상 잘보고있어요 감사합니다.
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
TypeOrm + Mongoose 같이 사용하는 방법
프로젝트간에 TypeOrm 과 Mongoose 를 같이 사용하는 상황이 있는데요, 커스텀 레포지터리 패턴을 어떻게 적용해서 같이 사용할 수 있는지 궁금합니다. 일단 제가 다른 레퍼런스들을 찾아보았을때 서비스를 여러개로 분리 ( cat.sql.service.ts, cat.mongo.service. ts) 로 분리하고 하나의 cat.repository.ts로 관리하는게 맞을까요?
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
자식의 요소까지 populate를 사용하려면 어떻게 해야할까요?
안녕하세요! 강사님 강의를 보고 여러가지 응용해보고 싶어서 중고장터를 클론코딩 하고 있습니다. 그러던 와중 특정 상품에 들어가면 상품에 달린 문의 글을 불러오는 로직을 작성했습니다. 하지만 문의글을 작성한 유저의 아이디만 불러올 뿐 populate를 할 수 있는 방법이 떠오르지 않아 도움 요청합니다.. DB의 구조는 상품 모델, 유저 모델, 상품문의 모델이 있다고 할 때 상품문의 모델은 문의가 작성된 상품 아이디: ObjectId(62149490b348c807b4337881) 문의를 작성한 유저 아이디: ObjectId(6224a99d95dcdc366868efe8) 문의 내용: "언제 구매한 물품인가요?" 이런식으로 설계되어 있고 특정 상품을 클릭하면 상품에 입력된 여러 정보와 상품 고유 아이디를 통해 상품문의 내용들을 populate 하여 모두 불러왔습니다. 그렇게 되니 최종적으로 { 상품아이디: ObjectId(62149490b348c807b4337881) 상품명: "사과", 설명: "택배 불가능" 문의: [ { 문의가 작성된 상품 아이디: ObjectId(62149490b348c807b4337881) 문의를 작성한 유저 아이디: ObjectId(6224a99d95dcdc366868efe8) 문의 내용: "언제 구매한 물품인가요?" }, { 문의가 작성된 상품 아이디: ObjectId(62149490b348c807b4337881) 문의를 작성한 유저 아이디: ObjectId(498dmek21v2hu3166868efe8) 문의 내용: "2차 구매자 입니까?" } ] 이런식으로 결과가 문의내용은 잘 불러옵니다. 하지만 배열에 담긴 유저 정보도 불러오기 위해 populate를 사용하러면 어떤식으로 사용을 해야할지 모르겠습니다. 모든 배열을 돌면서 해당하는 유저아이디만 찾아서 조합하는 방법을 떠올렸지만 너무 비효율적인것 같아 강사님의 솔루션을 듣고 싶습니다. 깃허브 주소 첨부합니다. https://github.com/nogoduck/Lightning-marketplace-Clone
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
filter 중 graphql 에러
[Nest] 17813 - 2022. 03. 08. 오후 1:22:35 ERROR [HttpApiExceptionFilter] Object: { "statusCode": 404, "message": "Cannot POST /graphql", "error": "Not Found" } 이런 에러 메시지가 나오는데, 현재 필터에서 graphql 부분은 추가하지 않아서, 필터시 에러가 나오는 것 같은데 graphql 관련 모듈을 설치하지 않았고, graphqlroot도 쓰지 않았는데 이러한 에러가 왜 발생하고, http-api-exception.filter.ts에서 어떻게 해결 가능할까요?
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
실행오류
db연결은 잘되는데 쿼리 날리면 아래 에러가 뜨네요. express-session 설치해봤는데 동일 메세지가 나옵니다. ERROR [ExceptionsHandler] Login sessions require session support. Did you forget to use `express-session` middleware? Error: Login sessions require session support. Did you forget to use `express-session` middleware? at SessionStrategy.authenticate (/Users/jinsyu/dev/teaching-typeorm-in-the-nest-main/node_modules/passport/lib/strategies/session.js:46:41) at attempt (/Users/jinsyu/dev/teaching-typeorm-in-the-nest-main/node_modules/passport/lib/middleware/authenticate.js:369:16) at authenticate (/Users/jinsyu/dev/teaching-typeorm-in-the-nest-main/node_modules/passport/lib/middleware/authenticate.js:370:7) at Layer.handle [as handle_request] (/Users/jinsyu/dev/teaching-typeorm-in-the-nest-main/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/Users/jinsyu/dev/teaching-typeorm-in-the-nest-main/node_modules/express/lib/router/index.js:317:13) at /Users/jinsyu/dev/teaching-typeorm-in-the-nest-main/node_modules/express/lib/router/index.js:284:7 at Function.process_params (/Users/jinsyu/dev/teaching-typeorm-in-the-nest-main/node_modules/express/lib/router/index.js:335:12) at next (/Users/jinsyu/dev/teaching-typeorm-in-the-nest-main/node_modules/express/lib/router/index.js:275:10) at initialize (/Users/jinsyu/dev/teaching-typeorm-in-the-nest-main/node_modules/passport/lib/middleware/initialize.js:89:5) at Layer.handle [as handle_request] (/Users/jinsyu/dev/teaching-typeorm-in-the-nest-main/node_modules/express/lib/router/layer.js:95:5)
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
코드 래핑
안녕하세요 실무에서 사용할 때 코드 래핑을 보통 하는데, 코드 래핑 이라는게 libary dependencies를 줄이기 위해서 기존 코드를 한 번 wrap(래핑)한다라고 알고 있습니다. 혹시 실무에서 사용하시는 래핑 기법들이 있으신지 알고 싶습니다. 이렇게 질문 드리는 이유는 만약에 보일러 플레이트를 만들어 놓고 사용하다가 나중에 libary가 업데이트 되서 버전이 올라가면 그 때, library 버전도 업데이트를 시키면 오류가 많이 나올 수 있을꺼 같아서 질문드립니다. 가령 만들어주신 boilerplate에서 래핑이 되어 있지 않는다면, 수 많은 dependencies가 있을텐데, 특정 사용하는 library가 업데이트 되서 만약 버전업을 실수로 하거나 했을 때 전체적으로 문제가 발생 할 수 있을꺼 같아서요. 사용하는 라이브러리의 버전을 바꿔주지 않는 다면 문제는 없을까요?
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
두 방법? 패턴? 의 차이가 단순히 선언 방법만의 차이라면
아직 배우는 입장이라 그런지 표면만 봐서는 어떤게 더 나은지 확 와닿진 않네요 1, provider 에 선언해서 함수를 불러와 쓰는 방법 2. export로 풀어놔서, 쓰고 싶은 곳에서 쉽게 import 해서 쓰는 방법 이라면 말이죠 .. ^^;; 아직 스노우볼이 굴러가기 전이라 그런가 단순히 패턴의 차이라면 가독성이나 유지보수 측면에서 특출나게 장단이 있다고 느껴지질 않네요 혹시 저런 캡슐화 은닉화를 해치지 않고 서로 다른 모듈에서 제품을 재사용할 수 있는 방법은 없겠죠?? 애초에 저렇게 비즈니스 로직이 설계된 자체가 문제라면 문라면 문제일지, 혹은 공통으로 불려오는 속성의 제품인 건지, 머리속에서 정리가 잘 안되어 알쏭달쏭합니다 많이 배우고 있습니다. 감사합니다!
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
catsRouter가 선언된 부분 없이 import가 가능한가요?
route.ts에서 catsRouter가 선언된 부분이 없는 것 같은데 app.ts에서는 catsRouter를 임포트 해오셔서 여쭙습니다.
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
클라이언트와 서버
클라이언트에서 만약 리액트로 서버를 실행해서, 포트가 3000번이고 서버에서 실행해서 포트가 8000번 인 상황에서 소켓 연결을 하기 위해서 클라이언트에서 socket 을 npm 으로 설치하고 나서 서버와는 어떻게 연결해서 서로 통신하게 만드나요?
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
@InjectModel의 필요성
안녕하세요 강사님 실습을 진행하는 도중에 에러를 만나 해결하는 과정에서 발생한 궁금증을 질문드립니다. 기존에 아래와 같이 repository에 접근하는 service단에서 코드가 에러가 발생했습니다. //users.service.ts async signUp(body: UsersCreateDto) { const { email, name, password, passwordConfirm, imgUrl, role } = body; //duplicated email console.log({ email, name, password, passwordConfirm, imgUrl, role }); const isUserExist = await this.usersRepository.existsByEmail(email); .... } 다른 함수인 create는 접근이 가능했는데 existByEmail만 접근이 되지 않았습니다. //users.repository.ts @Injectable() export class UsersRepository { constructor( @InjectModel(User.name) private readonly userModel: Model<User>, ) {} async existsByEmail(email: string): Promise<boolean> { const result = (await this.userModel.exists({ email })) ? true : false; const result = true; return result; } async create(user: UsersDbInsertDto): Promise<User> { try { const result = await this.userModel.create({ user }); return result; } catch (error) { throw new HttpException('db error', 400); } } } 구글링을 하며 찾아본 결과 아래 링크에서 답을 찾아서 타이포 에러는 해결했는데 원리를 모르곘습니다. https://stackoverflow.com/a/61396554 왜 @InjectModel을 삭제했을 때 repository함수에 접근할 수 없었을까요? 왜 다른 함수(create) 는 접근이 되고 existByEmail만 안되었을까요??
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
환경변수가 안 넘어 옵니다.
강의를 듣고 제 프로젝트에 적용 했는데, process.env.상수 했는데 안넘어 오네요 module에 provider :awsservice 넣고 configmodule 설정도 해줬습니다. user.moudle user.controller 아래는 제가 직접 console.log로 this.awsService를 출력 해본 결과,credentials가 null, region도 "ap-northeast-2" 로했지만 us-east로 뜨네요.
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
Cast to ObjectId failed for value라는 에러 발생합니다!
수강생분들의 질문을 기다립니다! - 에러에 해당하는 질문은 "에러가 발생한 상황에 대한 충분한 설명", "에러 메세지", "에러가 난 코드 스크린샷"을 함께 첨부해주세요. - 언어에 해당하는 질문은 구글링 및 서치 후에 구체적으로 질문해주시면 좋습니다. - 간단한 진로 및 방향성에 대한 질문은 메일로 보내주세요.- 패키지 버전 관리은 실무 환경과 트랜드에 맞추어 강의를 업데이트 하고 있습니다. 강의를 그대로 따라갔는데 에러가 발생한다면 패키지 버전을 강의에서 사용하는 버전과 동일하게 맞춰주세요!- 강의 노트, QA 목록, 공지 사항을 먼저 확인해주세요.- 논리적이고 구체적인 질문은 학습 효과를 올립니다 :) comments.service import { CatsRepository } from 'src/cats/cats.repository'; import { Comments } from './../comments.schema'; import { CommentsCreateDto } from './../dto/comments.create.dto'; import { BadRequestException, Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Model } from 'mongoose'; @Injectable() export class CommentsService { constructor( @InjectModel(Comments.name) private readonly commentsModel: Model<Comments>, private readonly catsRepository: CatsRepository, ) {} async getAllComments() { try { const comments = await this.commentsModel.find(); return comments; } catch (error) { throw new BadRequestException(error.message); } } async createComment(id: string, commentData: CommentsCreateDto) { try { const targetCat = await this.catsRepository.findCatByIdWithOutPsw(id); const { contents, author } = commentData; const validatedAuthor = await this.catsRepository.findCatByIdWithOutPsw( author, ); const newComment = new this.commentsModel({ author: validatedAuthor._id, contents, info: targetCat._id, }); return await newComment.save(); } catch (error) { throw new BadRequestException(error.message); } } async plusLike(id: string) { try { const comment = await this.commentsModel.findById(id); comment.likeCount += 1; return await comment.save(); } catch (error) {} } } { "success": false, "timestamp": "2022-02-22T10:53:22.484Z", "statusCode": 400, "message": "Cast to ObjectId failed for value \"66213fe65d99f4623dae55787\" (type string) at path \"_id\" for model \"Cat\"", "error": "Bad Request" } jwt.strategy에서는 payload에 있는 sub.id 역시 스트링으로 잘 넘어갔는데 왜 쿼리 id는 오류가나는지 궁금합니다 https://github.com/minjamie/NestJS-A-to-Z 깃허브 주소 남깁니다!
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
Auth Module의 역할
해당 프로젝트에서 jwt를 이용한 로그인을 구현하기 위해서 Auth Module을 추가하였습니다. 그리고, Auth Module 내부에 jwt에 대한 구현 및 전략 수립 후 Auth Service에서 JwtLogin을 구현하였습니다. 저는 Cats Module에서 Login기능을 구현하고 Cats에 대한 데이터 검증 후 JWT Token 발급을 Auth Service에서 제공하는 것이 Module에 역할에 맞는 기능들을 가지게 되어서 더 좋다고 생각이 들었습니다. Auth Module에 jwt토큰에 대한 발급 및 검증이라는 역할만 부여하는 것이 아니라 Login 기능을 전체(Cats에 대한 데이터 검증을 포함하는)를 구현하는 이유가 무엇인지 궁금합니다!
- 미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
existsbyemail시 에러가 납니다.
강의 따라서 하던 도중 result를 return 하는데 오류가 났습니다. 에러 메시지 repository 코드 service 코드