44,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
트랜잭션 질문드립니다!
안녕하세요. 지난 번에 @TransactionRepository 데코레이터를 이용하여 두 가지 방법으로 트랜잭션을 구현했으나, 뜻대로 잘 동작하지 않는 것 같아서 질문을 드렸었습니다. 그래서 이번에는 아래와 같은 조건으로 다시 구현해봤습니다. 1. 트랜잭션을 디테일하게 컨트롤할 수 있는 Connection/QueryRunner 사용 (공식문서에서는 데코레이터를 이용한 트랜잭션을 권장하지 않는다고 기재) 2. Custom Repository를 만들어, 직접 쿼리 수행하는 로직을 분리(?) 위와 같이 구현함으로써 트랜잭션 동작이 정상적으로 동작하는 것을 확인할 수 있었고, 트랜잭션의 범위도 디테일하게 조정할 수 있다는 것도 확인할 수 있었습니다. 그런데, 위와 같은 방식으로 구현하는 것이 과연 좋은 방법일까?라는 의문이 들었습니다. 서비스 계층에서의 코드가 더욱 복잡해지는 거 같고, 특히 커스텀 레포지터리를 메소드 내부에서 불러오는게 옳은 건지도 잘 모르겠습니다ㅠㅜ 이로 인해 나중에 테스트코드 작성이 어려워지는 건 아닐까 싶고... 제로초님의 의견이 궁금하기도 하고, 조언도 부탁드리겠습니다!
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
JoinColumn은 queryBuilder로 수정이나 참조가 불가능한가요?
원래 JoinColumn 값은 꼭 join으로 불러와서 사용해야하나요? 직접 건드리는건 불가능하나요
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
typeorm에서 검색을 했을때 값이 undefined가 될 때 어떻게 처리를 해 줘야 할까요?
typeorm으로 게시판 목록을 만들 때 검색어에 검색어를 입력하지 않았을 경우에 찍힌 쿼리를 보면 undefined로 찍혀서 검색이 제대로 안되는데.. undefined로 값이 넘어왔을 때(검색어를 입력하지 않았을 경우)에 처리를 어떻게 해 줘야할까요? console.log(typeof searchValue) 로 찍어보면 undefined로 찍힙니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
타입스크립트
안녕하세요 선생님. 강의를 듣는데 있어 타입스크립트를 어느 정도 공부하는게 좋을지 조언을 받고 싶습니다. 정말 기본적인 문법을 익힌 정도로 들어도 무방할 지 아니면 선생님의 강의인 node + typescript 강의를 듣고 이 강의를 다시 들을지 고민입니다. 감사합니다
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
DB 연결 부분
안녕하세요 제로초님 DB 연결하는 부분에서 공식문서마다 다른 부분이 있어서 여쭤봅니다. https://orkhan.gitbook.io/typeorm/#creating-a-connection-to-the-database 에 의하면 import "reflect-metadata"; import { createConnection } from "typeorm"; import { Photo } from "./entity/Photo"; createConnection({ type: "mysql", host: "localhost", port: 3306, username: "root", password: "admin", database: "test", entities: [ Photo ], synchronize: true, logging: false }).then(connection => { // here you can start to work with your entities }).catch(error => console.log(error)); 이런 형태로 접속을 하고 https://docs.nestjs.com/techniques/database#typeorm-integration 에 의하면 app.module.ts JS import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; @Module({ imports: [ TypeOrmModule.forRoot({ type: 'mysql', host: 'localhost', port: 3306, username: 'root', password: 'root', database: 'test', entities: [], synchronize: true, }), ], }) export class AppModule {} 이런식으로 연결하고 제로초님 강의에서는 dotenv.config(); const config: TypeOrmModuleOptions = { type: 'mysql', host: 'localhost', port: 3306, username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_DATABASE, entities: [ ChannelChats, ChannelMembers, Channels, DMs, Mentions, Users, WorkspaceMembers, Workspaces, ], migrations: [__dirname + '/src/migrations/*.ts'], cli: { migrationsDir: 'src/migrations' }, autoLoadEntities: true, charset: 'utf8mb4', synchronize: false, logging: true, keepConnectionAlive: true, }; export = config; 이런식으로 연결을 하던데 혹시 어떠한 차이가 있는건지 궁금합니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
common
현재 git 에 있는 SLEACT 를 내려받고 보면서 따라하고있는데영common 폴더가 어디에 있을까영 ??
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
트랜잭션 데코레이터 방식으로 했을 때!
영상에서 말했듯이 트랜잭션 코드를 아래(데코레이터 사용)처럼 작성했는데, users.controller.ts에서 users.service.ts의 join으로 로직을 넘기는 파라미터에서 에러가 뜹니다. 넘기는 파라미터에는 body.email, body.nickname, body.password 세 개이지만 레포지토리의 인수가 제공되지 않았다는 에러입니다. 혼자 해결해보는 데 시간이 소요되어 여쭤봅니다. 어떻게 하면 될까요?? @Transaction() async join( email: string, nickname: string, password: string, @TransactionRepository(Users) usersRepository: Repository<Users>, @TransactionRepository(Users) workspaceMembersRepository: Repository<WorkspaceMembers>, @TransactionRepository(Users) channelMembersRepository: Repository<ChannelMembers>, ) { const user = await usersRepository.findOne({ where: { email } }); if (user) { throw new UnauthorizedException('이미 존재하는 사용자입니다.'); } const hashedPassword = await bcrypt.hash(password, 12); const returned = await usersRepository.save({ email, nickname, password: hashedPassword, }); await workspaceMembersRepository.save({ userId: returned.id, workspaceId: 1, }); await channelMembersRepository.save({ userId: returned.id, channelId: 1, }); return true; } }
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
이건.. 강의대한 질문은 아니지만...
혹시 타입스크립트에 대한 강의는 앞으로 생각 있으신가영??
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
모듈을 분리했는데 undefined오류가 납니다.
모듈을 분리해서 export const UserUpdate = async function (selectionDto,info) { .... } 이런식으로 분리를 했는데 아래와 같은 오류가 납니다. TypeError: Cannot read property 'createQueryBuilder' of undefined createQueryBuilder 에 Ctrl+마우스 클릭을 하면 해당 메소드로 이동이 되어야 하는데 이동이 안되고 Cannot find declaration to go to 이런 오류가 뜹니다. 혹시 모듈을 따로 만들어서 사용할 때 별도로 임포트를 해야하는 부분이 있을까요? 아니면 어느 부분을 놓치고 있는건지 감이 잡히질 않습니다. 좀도 명확한 오류가 나면 확인을 해 보겠는데..ㅠㅠ
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
fs import 관련 질문입니다.
안녕하세요 제로초님 강의 잘 듣고 있습니다. multer 부분 강의를 듣고 있는데 처음 컨트롤러 시작 부분에 upload폴더 생성 로직이 있는데 폴더 read, create 해주는 module인 fs를 import 하는 부분에서 아래와 같이 import를 해주어야 동작을 하는데.. import * as fs from 'fs'; nest 초기 셋팅에서 저기 import * as 없이 아래와 같이 선언해도 되는 셋팅 방법을 알수 있을까요?? import fs from 'fs'; 제로초님 강의중에 있었던 것 같은데 ... 다시 복기하면서 봐도 찾기가 쉽지 않네요 ㅜㅜ 알려주시면 정말 감사드리겠습니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
트랜잭션 관련 질문드립니다.
안녕하세요. @TransactionRepository 사용법에 대한 질문을 드리고자 합니다. join(회원가입) 메서드 내에서 세 개의 레포지토리에 대해 트랜잭션을 걸어주고자 할 때 아래 두 가지 방법 중 어느 것이 옳은지 궁금합니다. 방법1> 트랜잭션이 필요한 메서드에서 해당 엔티티를 트랜잭션 레포지토리로 가져오고 메서드 내에서 사용하기. 그리고 이때 constructor로 가져온 레포지토리는 그대로 유지하기. (즉, 각각의 엔티티에 대하여 일반 레포지토리와 트랜잭션 레포지토리를 따로 구분하여 사용?) 방법 2> constructor를 통해 각각의 레포지토리를 트랜잭션 레포지토리로 가져오고, 메서드 내에서 this 사용하기.
- 해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
테이블명 작명에 대한 질문입니다
제로초님 컨벤션을 따라서 복수형으로 짓고 있는데, 품사(part of speech)에 대한 테이블을 만드는 중에 고민이 되서 질문드립니다. 복수형으로 짓는다면 parts of speech 이 맞는 것 같은데, s로 안끝나니까 뭔가 안맞는 느낌이 들어서요. 제로초님이시라면 partsOfSpeech 랑 partOfSpeeches 중에 뭘로 지으실 것 같나요? 항상 강의 잘 보고 있습니다 ㅎㅎ
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
save()로 저장하고 id값을 리턴받아서 update를 하고 싶습니다.
안녕하세요 nest+typeORM으로 공부를 하고 있습니다. 특정 테이블에 save()로 저장을 하고 리턴값으로 id값을 받아와서 특정 필드에 저장을 할 수 있는 방법이 있을까요? 이렇게 할려면 따로따로 구현을 해야하는지 아니면 한번에 구현을 할 수 있는 방법이 있는지 궁금합니다.
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
질문있습니다!
typeorm에서 nullable: false로 지정하면 db에 저장될때 값이 없으면 에러를 띄울수있고 class-validator에서 @IsNotEmpty를 사용하면 PickType을 사용해 엔티티를 상속받은 Dto단에서 값이 없을때 에러를 띄울수 있는데 어떤쪽에서 에러처리하는게 더 효율적일까요?
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
@TransactionRepository 사용시 expected 1 arguments, but got 0. (TS2554 에러)
안녕하세요. 제로초님. 유익한 강의 잘 보고 있습니다!! TransactionRepository 데코레이터 관련 질문 입니다. @Transaction() async getAll(@TransactionRepository(Users) usersRepository: Repository<Users>) { ... } 만약 위처럼 Transaction 데코레이터를 쓴다고 할 때 Controller에서는 @Get() async getUsers() { return await this.usersService.getAll() // 여기서 `Expected 1 arguments, but got 0.` 에러 발생. } 작성하면, 요청은 잘가는데 Typescript 에러 메세지가 뜨는데 또다른 작업을 해줘야 하나요??
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
TypeORM 반환 데이터 구조
아래와 같이 조인했을 시에 조인 결과가 배열안에 객체로 나오는데 sequelize처럼 여러 객체로 결과 반환할 수 있는 방법이 있을까요? 혹시 몰라서 OneToOne으로 관계 설정 맺었는데 맞는 방법일까요: [ { "id": 30, "equipmentName": "수도(용수) 유량계", "locationMainId": 1, "locationSubId": 3, "importance": null, "energyId": 30, "installDtm": null, "serialNum": null, "energyPurposeName": "급탕", "name": "여자화장실 온수기수도계량기", "remark": null, "created": "2021-05-20T00:52:11.000Z", "updated": "2021-06-15T00:44:36.000Z", "x": 100, "y": 100, "webaccessTags": [ { "tagname": "T3_PT1_Freq*01M", "equipmentMgmtId": 30, "tagDescription": "temperature", "unit": null, "unitConversion": { "type": "Buffer", "data": [0] }, "isTrend": { "type": "Buffer", "data": [0] }, "loggingTime": 300, "energyType": null } ] }, { "id": 54, "equipmentName": "습도 계측기", "locationMainId": 1, "locationSubId": 2, "importance": null, "energyId": null, "installDtm": null, "serialNum": null, "energyPurposeName": null, "name": "복도습도", "remark": null, "created": "2021-05-20T01:12:12.000Z", "updated": "2021-06-14T09:02:02.000Z", "x": 0, "y": 0, "webaccessTags": [ { "tagname": "T3_PT1_Humidity*01M", "equipmentMgmtId": 54, "tagDescription": "123", "unit": null, "unitConversion": { "type": "Buffer", "data": [0] }, "isTrend": { "type": "Buffer", "data": [0] }, "loggingTime": 60, "energyType": "습도계" } ] }, { "id": 53, "equipmentName": "온도 계측기", "locationMainId": 1, "locationSubId": 2, "importance": null, "energyId": null, "installDtm": null, "serialNum": null, "energyPurposeName": null, "name": "복도온도", "remark": null, "created": "2021-05-20T01:11:58.000Z", "updated": "2021-06-14T09:02:03.000Z", "x": 0, "y": 0, "webaccessTags": [ { "tagname": "T3_PT1_Temp*01M", "equipmentMgmtId": 53, "tagDescription": "123", "unit": null, "unitConversion": { "type": "Buffer", "data": [0] }, "isTrend": { "type": "Buffer", "data": [0] }, "loggingTime": 60, "energyType": "온도계" } ] }]
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
express + sequelize 기반 프로젝트에서 nest + typeorm 으로 넘어갈 때의 경험담을 듣고 싶습니다.
안녕하세요 제로초님, 먼저, 좋은 네스트 강의를 만들어주셔서 너무나 감사드립니다. nest.js가 아무래도 신생 프레임워크다보니 레퍼런스를 찾기가 어려웠는데 노드 교과서를 쓰신 제로초님이 직접 회사에서 쓰신 nest + typeorm 인사이트를 공유해주신다니, 그것도 express + sequelize 기반 프로젝트를 nest + typeorm으로 넘어가는 단계의 강의를 내신다니 당장 구매하지 않을 수 없었습니다. 또한 강의가 너무 재미있어 3일만에 2배속으로 완강했습니다. [Background] - 저희 회사에서는 express + sequelize를 쓰고 있는데, 이를 nest + typeorm으로 넘어갈 계획을 하고 있습니다. 현재 라우터에 모든 비즈니스 로직이 다 들어가있어 로직을 파악하기 어렵고, 주언어로 typescript를 쓰고 있는데 sequelize는 attribute를 가져올 때 자동완성 기능도 잘 제공해주지 않는 문제점이 있고, 현재 서비스의 문서화가 잘 되어있지 않아 swagger 등 API 명세 툴이 필요한데 express 기반 프로젝트에 swagger를 붙이는 일이 워크로드가 많이 드는 문제점이 있기 때문입니다. - nest.js는 swagger 자동화에 매우 특화되어 있고, controller - service로 로직을 명확히 구분할 수 있어 위의 문제를 해결할 수 있다고 판단했습니다. - 저희 회사는 라우트 개수로 총 277개의 API가 있는데, 이것을 어떤 식으로 nest + typeorm 으로 변경할 지 고민이 있습니다. 아무래도 nest와 typeorm을 배우는데 러닝커브가 있을 것이고, 모든 API를 전부 전환하는데 많은 시간이 들어갈 것이기 때문입니다. [Request] - 제로초님은 express + sequelize 기반 프로젝트를 어떻게 nest + typeorm으로 변경하셨는지 그 경험담과 조언을 듣고 싶습니다. 버저닝을 하셨는지, 신규 기능에 대해서만 nest + typeorm으로 API를 설계를 하다가 전부 넘어가셨는지, nest 로 넘어갈 때 어떻게 하는 것이 좋으셨는지 팁을 알고 싶습니다. 좋은 강의 개설해주셔서 정말 감사드립니다. 감사합니다. 권중훈 드림
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
코드 경로를 못찾겠습니다.
코드 실제로 보면서 하고 싶은데, Github 주소가 어디있는지 알 수가 없네요ㅠㅠ
- 해결됨Slack 클론 코딩[백엔드 with NestJS + TypeORM]
mongoose로 셋업할 때
삭제된 글입니다
- 미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
precess.env의 자동완성은 IDE에서 제공되는 건가요?
제가 vscode에서 확장을 찾아보는데, env 내부에 사용자가 지정한 키 값 (ex. SECRET) 까지 자동완성 해주는 건 없는 거 같아서요. 혹시 사용하시는 IDE에서 제공되는 건지 여쭤보고 싶습니다.