묻고 답해요
129만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
nestjs typeorm 에서 mariadb 고가용성 galera cluster 적용 관련
nestjs 좋은 강의 잘 들었습니다.~ 감사합니다.다만 질문이 있습니다.기존코드를 nestjs로 마이그레이션 하고 있습니다.mariadb 고가용성 적용을 해야됩니다. 구글링을 해도 해당 관련한 자료가 별로 없어서 질문드립니다.typeorm type을 보면 replication으론 mater, salves 필드로 고가용성이 지원되는데 cluster 구조로 지원이 되는게 맞는지 알고 싶습니다.아직 응용은 못하는 단계라서 질문 드립니다.만약 typeorm에서 cluster 지원이 되지 않는다면 어떤 방법으로 할 수 있나요?
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
OneToMany 관계에서 FK 데이터를 Repository를 이용하여 insert시 오류
우선 제 프로젝트에서 구성하고 있는 DB의 일부분입니다. 간단하게 p_references 와 m_references, 그리고 parts 와 models 테이블에 그림파일의 정보를 가지고 있는 images객체의 배열이 필요한데 mysql이다보니 이걸 다 One to Many로 추가시켰습니다. 여기에 images의 각각 대상 테이블에 대한 FK를 nullable : true 상태로 추가시켰습니다. 물론 이렇게 구성하면 images 테이블안에 적어도 한개의 FK를 포함한 입력값만 허용하도록 Guards 를 추가시켜야 될꺼 같습니만... 간단히 이해도를 위해 설명을 추가한거고요.여기서 문제는 p_references/m_reference 와 images table과 연결 시킬때 원래 계획된 대로 images 테이블 안에 string 이나 int 형식의 column이 추가되는것이 아닌 대상 테이블 객체가 잡히는 문제인데요.entities/images.ts@Entity("Images", { schema: "workplaces" }) export class Images { @PrimaryGeneratedColumn({ type: "int", name: "imageID" }) id: number; @Column('varchar', { name: 'images', nullable: true }) image: string; @Column('bool', { name: 'isOwn', nullable: false, default: false }) isOwn: boolean; @ManyToOne(() => Mreferences, (mreferences) => mreferences.images, { onDelete: "SET NULL", onUpdate: "CASCADE" }) @JoinColumn([{ name: 'modelNumber', referencedColumnName: 'serialNumber' }]) mreferences: Mreferences; @ManyToOne(() => Preferences, (preferences) => preferences.images, { onDelete: "SET NULL", onUpdate: "CASCADE" }) @JoinColumn([{ name: 'partsNumber', referencedColumnName: 'serialNumber' }]) preferences: Preferences; @ManyToOne(() => Parts, (parts) => parts.images, { onDelete: "SET NULL", onUpdate: "CASCADE" }) @JoinColumn([{ name: 'partsID', referencedColumnName: 'id' }]) parts: Parts; @ManyToOne(() => Models, (models) => models.images, { onDelete: "SET NULL", onUpdate: "CASCADE" }) @JoinColumn([{ name: 'modelID', referencedColumnName: 'id' }]) models: Models; }이것이 images entity에서 설정한 코드입니다. 이렇게 해서 자동으로 생성된 DB 의 ERD가 처음에 올린 스샷으로 제대로 의도된대로 생성된걸 확인할 수 있습니다.기본 설명이 너무 길어졌는데, 이제 여기 강의의 "typeorm 쿼리 빌더" 강의에 나온대로 새로운 데이터를 insert 요청이 발생하면 Images Repository를 이용해서 저장을 하려하는데 문제가 발생드려서 문의드립니다.reference-book.service.tsimport { Injectable, NotFoundException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Mreferences } from '../entities/Mreferences'; import { Repository } from 'typeorm'; import { ReferencebookModelDto } from './dto/referencebook.model.dto'; import { Videos } from '../entities/Videos'; @Injectable() export class ReferenceBookService { constructor( @InjectRepository(Mreferences) private referenceModelRepository: Repository<Mreferences>, @InjectRepository(Images) private imagesRepository: Repository<Images>, ) { } async addReferenceModel(addReferenceModel: ReferencebookModelDto) { const referenceModelBook = new Mreferences(); const referenceModelImages = new Images(); referenceModelBook.serialNumber = addReferenceModel.serialNumber; referenceModelBook.name = addReferenceModel.modelName; referenceModelBook.brands = addReferenceModel.brand; //..... 생략 await this.referenceModelRepository.save(referenceModelBook); } }이렇게 작성시, 아무런 문제 없이 FK관련 column 값들을 제외하곤 이상없이 제대로 DB에 저장이 되는데요. 문젠 FK 관련한 값에서 제대로 작동하지 않습니다.const data = new Images() 로 새로 Images객체를 생성하여, ERD에서 처럼 거기에 등록된 modelNumber 값을 입력한 dto객체의 images.image 값으로 지정해주고 저장하면 될 줄 알았는데 실제 생성된 Images객체엔 modelNumber 문자열이 존재하는 대산 mreferences 객체만이 존재합니다. 강의에서 직접 다룬 프로젝트는 아니지만 제가 강의를 보면서 직접 따라하다 발생한 문제라 강의관련 문의에 올렸습니다.어딘가에서 오류가 있던걸까요? 추가로 혹시나 필요할까 해서 dto 파일도 올립니다/dto/referencebook.model.dto.tsimport { ApiProperty } from "@nestjs/swagger"; import { Images } from "../../entities/Images"; import { Brands, Categories } from "../../common/types/enum.types"; import { Videos } from "../../entities/Videos"; export class ReferencebookModelDto { @ApiProperty({ example: 'WX532433', description: 'Uniq Serial Number', required: true, }) public serialNumber: string; @ApiProperty({ example: 'Aug-23-2023', description: 'Updated Date', required: true, }) public updateDate: Date; @ApiProperty({ example: 'Samsung Dryer', description: 'Model Name', required: true, }) public modelName: string; @ApiProperty({ example: ['afd34323', 'ty23142'], description: 'Serial number List of related parts ', required: false, }) public relatedParts: string[]; @ApiProperty({ example: ['https:/atlanticappliance.com/parts/p?pid=WX532433/image1.jpg'], description: 'Links of own images location', required: false, }) public images: Images[]; @ApiProperty({ example: ['https:/atlanticappliance.com/parts/p?pid=WX532433/video1.mp4'], description: 'Links of own videos location', required: false, }) public videos: Videos[]; @ApiProperty({ example: 'This is a parts for testing model, WX532433', description: 'Scraped description of current product from other sites', required: false, }) public description: string; @ApiProperty({ example: 'Washer', description: 'Product categories', required: true, }) public category: Categories; @ApiProperty({ example: '24Inch', description: 'Product Variant Options', required: false, }) public variant: string; @ApiProperty({ example: '27.7', description: 'Product Weight', required: false, }) public weight: number; @ApiProperty({ example: 21.49, description: 'Product height', required: false, }) public height: number; @ApiProperty({ example: 21.49, description: 'Product width', required: false, }) public width: number; @ApiProperty({ example: 21.49, description: 'Product depth', required: false, }) public depth: number; @ApiProperty({ example: 'Samsung', description: 'Brand', required: false, }) public brand: Brands; }
-
미해결탄탄한 백엔드 NestJS, 기초부터 심화까지
common entity 상속 시 컬럼 순서 문제
안녕하세요 typeorm 강의에서 쓰신 common entity를 상속하는 코드를 사용하면 위와 같이 컬럼 순서가 나오는데 이렇게 되면 가독성이 안좋아서 컬럼 순서를 바꿔보려 했습니다. 검색해보니 엔티티를 상속했을때 컬럼 순서를 바꿀수 없다고 합니다. https://www.mrlatte.net/code/2020/11/03/typeorm-entity-inheritance.html 실무에서는 어떻게 사용하시는지 궁금합니다.
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
Typeorm Module 설정 문의
안녕하세요. 제로초님. 강의를 듣다가 이해가 되지 않는 부분이 있어서 그렇습니다. 저희 회사에서는 nestjs로 코딩을 하고 있어 기초가 많이 부족한 상태에서 nestJS로 공부를 하는 중입니다. 질문드릴 부분은 강좌 내에 TypeORM 사용하기 / 회원가입 만들기 / 14:50에 App.module.ts에 Users 엔티티가 imports 되지 않아서 생긴 문제인것 같고 실제로 제로초님께서 TypeOrmModule.forFeature([Users]) 를 넣어 주시니 실행이 되더군요. 저는 여기서 생기는 의아한점이 강좌내에 ormConfig를 만들고 forFeature 바로 윗줄에 forRoot(ormConfig) 안에 entities 값에 정의 해 놓은 entity 파일들을 import해준것 같은데 왜 인식이 되지 않고 forFeature를 만들어 주어야 하나요?
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
React Nodebird때 만들었던 Follow기능(=many to many)질문 입니다 (Sequelize vs Typeorm)
안녕하세요? 제로초님 노드버드 강의를 완강하고, 어느새 sleact 강좌도 마무리 시점이 와가네요. 항상 감사합니다 이번 typeorm관계설정 강의를 듣다가 궁금한점이 생겼는데 도저히 해결이 되지않아 이렇게 질문을 드립니다. 노드버드 강좌에서 팔로워/팔로이 기능을 model에서 정의할때 Sequelize로 아래와 같이 belongsToMany에 as 와 through를 이용해서 설정했었는데요, // 관계 설정 User.associate = (db) => { ... db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followers', foreignKey: 'followingId' }); db.User.belongsToMany(db.User, { through: 'Follow', as: 'Followings', foreignKey: 'followerId' }); // 같은 테이블에서 다대다 관계일때는 foreignKey넣어주어야 됨 // WHY? : 자바스크립트 객체에서 구별하는 이름이 as이고, DB에서는 foreignKey를 이용해 구별한다. }; Typeorm에서 이와같이 user대user 관계에서 팔로우 기능을 구현해보려고 스스로 학습중인데, 검색해도 나오지를 않고 어떻게 해야할지 감이 안잡히네요... Typeorm에는 Sequelize처럼 이렇게 편리한 기능이 없는것인거겠죠? ㅠ 만약 Typeorm에서 제공하는 as 나 Through기능이 없다면, Typeorm에서는 노드버드에서와 같은 팔로워/팔로이 기능을 어떻게 구현해야할지 궁금합니다!
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
save()로 저장하고 id값을 리턴받아서 update를 하고 싶습니다.
안녕하세요 nest+typeORM으로 공부를 하고 있습니다. 특정 테이블에 save()로 저장을 하고 리턴값으로 id값을 받아와서 특정 필드에 저장을 할 수 있는 방법이 있을까요? 이렇게 할려면 따로따로 구현을 해야하는지 아니면 한번에 구현을 할 수 있는 방법이 있는지 궁금합니다.
-
미해결Slack 클론 코딩[백엔드 with NestJS + TypeORM]
질문있습니다!
typeorm에서 nullable: false로 지정하면 db에 저장될때 값이 없으면 에러를 띄울수있고 class-validator에서 @IsNotEmpty를 사용하면 PickType을 사용해 엔티티를 상속받은 Dto단에서 값이 없을때 에러를 띄울수 있는데 어떤쪽에서 에러처리하는게 더 효율적일까요?