44,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
typeorm migration 관련 질문입니다.
안녕하세요 보통 시퀄라이즈만 사용하다가 nestjs에 오면서 Typeorm을 사용중이게 되었는데 제가 기존에 시퀄라이즈의 마이그레이션에서 해주는 작업처럼 queryRunner.changeColumn 등 typeorm 내부 함수를 통해 변경을 해주려 하였는데요 https://github.com/typeorm/typeorm/issues/3357 제가 해당 이슈를 발견해서 migration generator 뿐만이 아니라 내장 제공 메소드인 queryRunner.changeColumn을 통해 변경을해도 해당 이슈가 발생되는것 같은데 해당 방법의 경우에는 역시 말씀하신대로 create를 통해 만들고 이를 통해 query 문을 진행하는 방법만 있을까요? 아니면 하단에 나온 typeorm의 mysqlQueryRunner에 정의된 내용에 따라 changeColumn을 사용해도 될까요? 실제 개발하실 때에는 어떠한 방식으로 개발하시는지 또 저는 어찌 개발해야할지 방향성을 잡고싶어 질문드립니다ㅎㅎㅎ 감사합니다. https://github.com/typeorm/typeorm/blob/fbd1ef74e84b59ef0b8d99e311f0aced902190e6/src/driver/mysql/MysqlQueryRunner.ts (722번라인) 해당 부분에 changeColumn 관련 메서드가 작성되어있습니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
swagger로 하나의 status code에 여러 개 response를 보여주는 방법
안녕하세요, swagger를 이용해 문서화를 진행하던 중 질문을 드립니다. 특정 엔드포인트에서 발생할 수 있는 에러를 swagger ui에서 보여주기 위해 아래와 같이 작성하였습니다. 그런데 실제로는 아래와 같이 하나의 예시만 보입니다. 찾아보니 nestjs/swagger가 아닌 일반 openapi 3.0 yaml을 이용하면 아래와 같이 작성할 수 있는 것 같은데, nestjs에서는 아래처럼 어떻게 작성할 수 있을 지 여쭙고 싶습니다. nestjs/common 8.0 버전과 nestjs/swagger 5.0.9버전을 사용하고 있습니다. 감사합니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
start:dev 관련 질문입니다
안녕하세요 npm단에서 npm run start:dev 와 npm run start:dev-backup 에 대한 차이가 있을까요? 둘다 사용하는데에는 저장 후 재 로딩이 진행되는것 같아 문의드립니다~
- 해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
질문입니다.
안녕하세요. 배포와 관련해서 질문있습니다. 1. 노드버드 강좌에서 백엔드에 express로 할때는 빌드를 따로 안해줬던것 같은데 express는 빌드를 왜 안하고 nest는 왜 빌드를 해주어야 하는지 궁금합니다! 2. aws 에서 만약 모바일 앱 용 백앤드를 배포한다고 가정할시 백앤드 서버(ec2)를 퍼블릭 서브넷에 두시는지 프라이빗 서브넷에 두시는지 궁금합니다!
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
async await 질문 있습니다.
강의 잘 보고 있습니다! 보다가 궁금한 점이 생겼는 데 async 함수에서 return 할 때 await 을 안붙이시던데 이유가 있을까요?
- 해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
질문입니다.
안녕하세요. 제로초님 1. @ApiOperation({ summary: '워크스페이스 특정 채널 가져오기' }) @Get(':url/channels/:name') async getWorkspaceChannel(@Param('url') url, @Param('name') name) { return this.channelsService.getWorkspaceChannel(url, name); } async getWorkspaceChannel(url: string, channelId: number) { Logger.log('---------------------------------------'); console.log('channelId:::', channelId); return this.channelsRepository.findOne({ where: { // workspaceId: id, id: channelId, }, }); } 특정워크스페이스 채널 가져오기에서 url과 name을 넘겨주잖아요? getworkspaceChannel에서 url은 안쓰여지고 channelId는 channel name ("일반")형태로 넘어오더라구요? 그래서 결과값을 보면 undefiend가 나옵니다. channelId면 숫자형태로 와야하는거 아닌가요? 컨트롤러와 서비스에서 받는 인자 값이 다르게 설정되어 있는데 이건 왜 그런지 궁금합니다! 2. @SubscribeMessage('login') handleLogin( @MessageBody() data: { id: number; channels: number[] }, @ConnectedSocket() socket: Socket, ) { const newNamespace = socket.nsp; onlineMap[socket.nsp.name][socket.id] = data.id; newNamespace.emit('onlineList', Object.values(onlineMap[socket.nsp.name])); data.channels.forEach((channel) => { socket.join(`${socket.nsp.name}-${channel}`); }); } 슬랙 강의 프론트랑 백엔드 다 수강하고 있는데요! socket.join(`${socket.nsp.name}-${channel}`); 이부분을 잘 모르겠습니다 이것을 콘솔로 찍으면 /ws-sleact 1 /ws-sleact 17 이러한 형태로 나오는데 이코드로 join한다고 해서 자동으로 조인되는건 아닌것 같고 프론트나 어디서 연결을 해줘야 조인이 되잖아요?. 프론트의 hooks폴더의 userSoket에서 연결이되어 조인 되는것인가요?... if (!sockets[workspace]) { sockets[workspace] = io.connect(`${backUrl}/ws-${workspace}`, { transports: ['websocket'], }); } 어떤 설정을 해주어서 socket.join(`${socket.nsp.name}-${channel}`); 이부분이 join이 되는지 궁금합니다... 3. handleConnection(@ConnectedSocket() socket: Socket) { if (!onlineMap[socket.nsp.name]) { onlineMap[socket.nsp.name] = {}; } // broadcast to all clients in the given sub-namespace socket.emit('hello', socket.nsp.name); } 여기서 emit할때 hello 이벤트가 있는데 프론트에서 hello로 이벤트를 받는 곳은 없더라구요? 어디에 쓰이는지 궁금합니다. 4. createWorkspaceDMChats 에서 const receiverSocketId = getKeyByValue( onlineMap[`/ws-${workspace.url}`], Number(id), ); receiverSocketId 을 콘솔로 찍어봐도 undefined라고 뜨는데 이건 무슨 값일까요 왜 undefined가 뜨는지 궁금합니다!
- 해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
질문있습니당
안녕하세요 강사님 1. 강의 10분 56초 즈음에 강사님께서 async getWorkspaceMembers(url: string) { this.usersRepository .createQueryBuilder('user') .innerJoin('user.WorkspaceMembers', 'members') .innerJoin('members.Workspace', 'workspace', 'workspace.url = :url', { url, }) .getMany(); } 이렇게 해 놓으면 가입되어 있는 워크스페이스들 전부 가져올 수 있다고 하셨는데 실제로 값을 어떻게 가져오려고 확인해봤습니다 async getWorkspaceMembers(url: string) { const hello = await this.usersRepository .createQueryBuilder('user') .innerJoin('user.WorkspaceMembers', 'members') .innerJoin('members.Workspace', 'workspace', 'workspace.url = :url', { url, }) .getMany(); Logger.log('hello:', JSON.stringify(hello)); } 그런데 출력값이 이렇게 나오더라구요 즉 user정보를 가지고 오더라구요 제 디비에는 이렇게 데이터가 들어가있구요 User Workspace Workspacemembers 그래서 궁금한게 왜 workspace모든 정보가 아닌 User정보만 가지고 오는지 궁금합니다! 2. 제가 이해한 순서가 맞는지 헷갈리는데요. async getWorkspaceMembers(url: string) { return this.usersRepository .createQueryBuilder('user') .innerJoin('user.WorkspaceMembers', 'members') .innerJoin('members.Workspace', 'workspace', 'workspace.url = :url', { url, }) .getMany(); } 이 코드에서 순서가 첫째 .innerJoin('members.Workspace', 'workspace', 'workspace.url = :url', { url, }) url로 workspace테이블의 url에 일치하는 workspace로우를 찾은다음 worspaceId로 인해 이것과 관계되어있는 workspacemembers로우를 찾습니다. 둘째 .innerJoin('user.WorkspaceMembers', 'members') workspacemembers의 관계되어있는 uerId를 통해서 유저 정보를 전부 불러옵니다. 즉 순서가 밑에서 위로 찾는게 맞는 순서인지 궁금합니다! 3. 위의 코드를 바탕으로 sql 에서는 inner join을 할때 관계되고 일치되는 테이블의 값들을 전체 불러왔는데 왜 typeorm에서는 마지막 user정보만 불러오는지 궁금합니다 4. .innerJoin('user.WorkspaceMembers', 'members') 이 코드에서 별명이 members잖아요? 그럼 user.WorkspaceMembers전체를 가리키는 것인가요 아니면 WorkspaceMembers만 가리키는 것인가요?ㅎㅎ
- 해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
1분 18초 자바스크립트 어떤건 힙에 저장되고 어떤건 스택에 저장되고...
1분 18초 자바스크립트 어떤건 힙에 저장되고 어떤건 스택에 저장되고... 에 대해 말씀하셨는데, 혹시 그런거에 관해 좀 더 알기 위해 공부해보고 싶은데, 공부 자료 추천해주실 수 있나요? (신기... 제로초님은 어떤 자료를 통해 그러한 내용들을 알게되셨나요?
- 해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
질문입니다!
1. post /api/workspaces' 이 api로 요청될 경우 워크스페이스를 만드는 api잖아요? 이때 workspace controller을 보면 createworkspace에서 body.workspace와 url, id가 보이는데요 @Post() async createWorkspace(@User() user: Users, @Body() body: CreateWorkspaceDto) { return this.workspacesService.createWorkspace( body.workspace, body.url, user.id, ); } 이값은 프론트에서 받아서 async createWorkspace(name: string, url: string, myId: number) { ..... } workspace.service의 createWorkspace로 넘겨주는 것인가요 아니면 workspace.service의 createworksapce에서 리턴된 값을 workspace controller에서 받아오는 것인가요?.. 2. 강사님 강의중 intercepter를 쓰는게 나오는데요 깃헙에 있는 소스코드에는 인터셉터가 없더라구요? 이것은 사용안해도 되는 선택적인 것이어서 소스코드에 없는것인지 궁금합니다 3. const channelMember = new ChannelMembers(); channelMember.ChannelId = workspace.Channels.find( (v) => v.name === '일반', ).id; workspace에는 chnnels라는 컬럼이 없는데 어떻게 적용이 되는거죠? channels 테이블에 name컬럼이 일반인 데이터에 속해있는 workspaceId를 보고 workspaceId에 관계되어 있는 workspace테이블의 workspaceId를 channleMember의 channelid에 넣는것인가요? 제가 제대로 이해했는지 모르겠네요...
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
interceptor
제로초님 인터셉트 사용하기 강의를 듣던중 제로초님은 intercept부분이 자동완성이 되는데 저는 아무리 해도 안돼서 그냥 직접 입력했습니다. 제가 놓치고 있는 게 있을까요??그리고 궁금한건 제가 강의를 들으면서 내가 이걸 알고 있나?? 이런 의문이 드는데 한 번은 그냥 다 보고 다시 깊이 하는 게 맞을 까요 아님 한 편 한 편 충분한 이해를 하고 가야 할까요? 아직 완전한 백엔드 부분 강의를 안들어서 제가 이렇게 생각 할 수도 있습니다..
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
비밀번호 초기화 구현
안녕하세요, 강의 잘 듣고 있습니다. NestJS 에서 유저가 암호를 잊어버렸을때 이메일을 보내 비밀번호를 초기화하는 기능은 어떻게 구현하는지 부탁드립니다. 감사합니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
typeorm config 관련 질문
안녕하세요 제로초님 typeorm config 설정할때 배포환경에서는 synchronize: false로 설정하신다고 하셨는데 최초 배포환경 rds설정할때 true로 설정하고 그 이후에는 false로 설정하고 마이그레이션(migration generate)으로 컬럼이나 추가 테이블 추가 하는게 좋을까요? 제로초님은 최초에 배포환경 디비 테이블이나 컬럼 만들때는 어떤식으로 설정하는지 궁금합니다. 그리고 이후에 컬럼 수정이나 테이블 추가할때는 어떤방식으로 하는지...... 감사합니다. synchronize: false,
- 해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
질문있습니다.
안녕하세요 1. type orm model generator을 사용하지 않고 (기존의 디비 설정이 되어있지 않고 네스트 강좌만 수강할 시) sleact 강좌를 안 들으셔서 기존 DB가 없으신 분들은 entities 파일들만 만드시고 코드만 따라 치세요 3~4강에서 테이블을 다시만든다고 하셨는데 그러면 테이블을 다시 만들 때는 entities 파일이 필요 없는것인가요? 2. typeorm은 sequelize처럼 npx sequelized db:create처럼 데이터베이스를 자동 생성해주는게 없나요?.. 따로 워크벤치에 데이터베이스를 만들어줘야 하는건가요?... 3. nest강좌만 들었다고 가정할 시, 데이터베이스가 셋팅되어 있지 않으니까 강사님께서 typeorm seed:config seed:run schema:drop 명령어를 친 후 npm run schema:sync를 치라고 하셨습니다. npm run typeorm, npm run seed:config , npm run seed:run, npm run schema-drop,npm run schema:sync 을 하라는 말씀이시잖아요?.. 근데 npm run seed:run을 실행하니 이런 에러가 발생하였습니다. 그래서 .env 파일을 만들고 이렇게 해줬더니 이번엔 이렇게 에러가 발생합니다. 어떻게 설정해줘야 하는지 헷갈리네요 ㅜ
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
typeorm eager lazy loading의 차이점 및 용도가 궁금합니다.
안녕하세요 제로초님 typeorm eager lazy loading의 차이점 및 용도가 궁금합니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
apt, apt-get
삭제된 글입니다
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
데코레이터 타이핑
삭제된 글입니다
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
hot reloading
안녕하세요 ! hot reloading 적용하게 될때 , 이런식으로 정상적으로 동작은 하지만 , 코드를 수정해도 아무런 변화가 없어서, "@nestjs/cli": "^8.0.0", 부분을 강의에서 말씀하신대로 "@nestjs/cli": "^7.5.1", 로 바꿔서 해도 해봐도 아무런 변화가 없네여 . 물론 ctrl+c 하고나서 다시 키는것은 정상적으로 동작합니다 ! 이유가 뭘까요 ?
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
예전부터 궁금했던 보안관련 질문있습니다.
안녕하세요. 예전부터 궁금사항이 있었는데, 실제로 결제 관련된 한 서비스를 운영하시는 걸로 알고 있습니다. 실제 은행과 같은 정말 보안적으로 최고로 중요한 서비스는 아니더라고, 실제 돈이 오가는 결제 서비스이기에 보안관련 예민하게 작용을 할텐데, 일반적인 passport 나 쿠키 관리, 또는 APP과 통신을 하면서 JWT 토큰을 오가는 정도로는 보안을 강화하기는 힘들 것 같은데, 실제 결제 서비스가 운영되는 정도의 프로젝트에서는 어느정도까지, 어떻게 보안을 강화하여 사용하고 있는지가 정말 너무 궁금했습니다. 예전부터.. 디테일하게 과정까지 말씀해주시면 좋겠지만, 이정도까지 처리하고있다 정도라도 말씀해주시면 너무 감사할것 같습니다 ㅠㅠ
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
camel & snake case 질문드립니다!
일반적(?)으로,코드상에서 존재하는 변수들이나 코드들은카멜케이스로 작성, 외부 요청 (API 통신)을 때에는snake case 형식으로 통신을 하는 것으로 알고 있습니다.물론 상관없다라는 이야기가 나올 수 있지만,협업관계에서는 되도록 일반적인, 익숙한 약속을 서로맞춰 사용하는 것이 낫고 최대한사소한 부분이나 스타일 관련해서는충돌을 피하는 것이 낫다고 생각하기에,응답할때에는 snake case 로 보내고 싶습니다.tpyeorm 을 작성하면서 find나,dto 작성이나,엔티티 작성때에서 camel case 형식으로변수가 작성되는 것 같은데,혹시 이들을 응답할때 snake 로 자동변환해주는어떤 방법이나,또는 어떤방식으로 사용하고 계신지 궁금해서 질문드립니다!
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
강의 마지막에 nest-morgan 사용에 대해서.
강의 마지막에 nest-morgan 사용하시면 좋다고 하셔서,nest-morgan 을 적용하였으나.. 시간이 [09/Aug/2021:12:03:46 +0000] 이런식으로 시간 포맷 변경에 대해 알아봐도 자료가 안나오네요 ㅠㅠ 뿐만 아니라, 모양새는 같아보이는데, 추후에, 추가 정보를 삽입하거나, 활요하면 좋을 것 같아서 다시 강의 내용으로 입맛대로 구현한 moran 을 쓰려고 하는데, 이것을 그대로 사용했을때 우려되는 부분이 따로 있나요~~??