inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

where과 order가 적용안되는

해결됨

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

내림차순을 확인하려고 param에 DESC를 넣었는데 내림차순 적용 되지 않길래 디버깅하다 문제에 직면했습니다. * eslint-disable prettier/prettier */ /* eslint-disable @typescript-eslint/no-unused-vars */ import { BadRequestException, Injectable } from '@nestjs/common'; import { BasePaginationDto } from './dto/base-pagination.dto'; import { FindManyOptions, FindOptionsOrder, FindOptionsWhere, Repository, } from 'typeorm'; import { BaseModel } from './entity/base.entity'; import { FILTER_MAPPER } from './const/filter-mapper.const'; import { HOST, PROTOCOL } from './const/env.const'; @Injectable() export class CommonService { paginate<T extends BaseModel>( dto: BasePaginationDto, repository: Repository<T>, overrideFindOptions: FindManyOptions<T> = {}, path: string, // api path의 일반화를 위해 ) { if (dto.page) { return this.pagePaginate(dto, repository, overrideFindOptions); } else { return this.cursorPaginate(dto, repository, overrideFindOptions, path); } } // page기반과 cursor기반 페이지네이션 2가지 만들기 /**page기반 CommonService paginate*/ private async pagePaginate<T extends BaseModel>( dto: BasePaginationDto, repository: Repository<T>, overrideFindOptions: FindManyOptions<T> = {}, ) {} /**cursor기반 CommonService paginate*/ private async cursorPaginate<T extends BaseModel>( dto: BasePaginationDto, repository: Repository<T>, overrideFindOptions: FindManyOptions<T> = {}, path: string, ) { /** * where__likeCount__more_than * * where__title__ilike */ const findOptions = this.composeFindOptions<T>(dto); const results = await repository.find({ ...findOptions, ...overrideFindOptions, }); const lastItem = results.length > 0 && results.length === dto.take ? results[results.length - 1] : null; // 새로운 URL을 생성할 때 새로운 쿼리값을 추가하는 방법 const nextUrl = lastItem && new URL(`${PROTOCOL}://${HOST}/posts`); if (nextUrl) { // dto의 키값들을 loop /** * dto의 키값들을 루핑하면서 * 키값에 해당되는 밸류가 존재하면 * param에 그대로 붙여넣는다. * * 단, where__id_more_than 값만 lastItem의 마지막 값으로 넣어준다. */ for (const key of Object.keys(dto)) { if (dto[key]) { if ( key !== 'where__id__more_than' && key !== 'where__id__less_than' ) { nextUrl.searchParams.append(key, dto[key]); // 나머지는 변경되지 마지막 아이템과 연관없이 동일하니까 } } } // 오름차순인지 내림차순인지 체크 let key = null; if (dto.order__createdAt === 'ASC') { key = 'where__id__more_than'; } else { key = 'where__id__less_than'; } // URL에 추가하니까 string으로 nextUrl.searchParams.append(key, lastItem.id.toString()); } return { data: results, cursor: { after: lastItem?.id ?? null, }, count: results.length, next: nextUrl?.toString() ?? null, }; } private composeFindOptions<T extends BaseModel>( dto: BasePaginationDto, ): FindManyOptions<T> { /** * where, * order, * take, * skip -> page 일때만 */ /** * DTO의 현재 생긴 구조는 아래와 같다 * { * where__id__more_than: 1, * order__createdAt: 'ASC' * } * * 현재는 where__id에 해당되는 where 필터만 사용중이지만 * 나중에 likeCount에 해당되는 추가 필터를 넣고싶으면 * 모든 where 필터들을 자동으로 파싱할 수 있을만한 기능을 제작 * * 1) where로 시작한다면 필터 로직을 적용한다. * 2) order로 시작한다면 정렬 로직을 적용한다. * 3) 필터 로직을 적용한다면 '__' 기준으로 split 했을 때 * 3개의 값으로 나뉘는지 2개의 값으로 나뉘는지 확인한다. * 3-1) 3개의 값으로 나뉜다면 FILTER_MAPPER에서 해당되는 operator 함수를 찾아서 적용한다. * 3-2) 2개의 값으로 나뉜다면 정확한 값을 필터하는 것이기 때문에 operator 없이 적용한다. * 4) order의 경우 3-2와 같이 적용한다. */ let where: FindOptionsWhere<T> = {}; let order: FindOptionsOrder<T> = {}; for (const [key, value] of Object.entries(dto)) { if (key.startsWith('where__')) { where = { ...where, ...this.parseWhereFilter(key, value), }; } else if (key.startsWith('order__')) { order = { ...order, ...this.parseWhereFilter(key, value), }; } } return { where, order, take: dto.take, skip: dto.page ? dto.take * (dto.page - 1) : null, }; } private parseWhereFilter<T extends BaseModel>( key: string, value: any, ): FindOptionsWhere<T> | FindOptionsOrder<T> { const options: FindOptionsWhere<T> | FindOptionsOrder<T> = {}; /** * 예를들어 where__id__more_than * __를 기준으로 나눴을때 * * ['where', 'id', 'more_than']으로 나눌 수 있다. */ const split = key.split('__'); if (split.length !== 2 && split.length !== 3) { throw new BadRequestException( `where 필터는 '__'로 split 했을때 길이가 2 또는 3이어야합니다 - 문제되는 키값 ${key}`, ); } /** * 길이가 2일 경우는 * where__id = 3 * * FindOptionsWhere로 풀어보면 * 아래와 같다 * * { * where: { * id: 3, * } * } */ if (split.length === 2) { // [where, id] const [_, field] = split; // field => id // value => 3 /** * { * id: 3 * } */ options[field] = value; } else { /** * 길이가 3일 경우에는 Typeorm 유틸리티 적용이 필요한 경우 * * where__id_more_than의 경우 * where는 버려도 되고 두번째 값은 필터할 키값이 되고 * 세번째 값은 typeorm 유틸리티가 된다. * * FILTER_MAPPER에 미리 정의해둔 값들로 * field 값에 FILTER_MAPPER에서 해당되는 utility를 가져온 후 * 값에 적용 해준다. * */ // ['where', 'id', 'more_than'] const [_, field, operator] = split; // where__id__between = 3, 4 // 만약에 split대상 문자가 존재하지 않으면 길이가 무조건 1이다. // const values = value.toString().split(','); // field -> id // operator -> more_than // FILTER_MAPPER -> MoreThan 함수 // if (operator === 'between') { // options[field] = FILTER_MAPPER[operator](values[0], values[1]); // } else { // options[field] = FILTER_MAPPER[operator](value); // } options[field] = FILTER_MAPPER[operator](value); return options; } } } 디버깅으로 중단점 눌러가며 확인해봤는데 parseWhereFilter 메서드에서 options은 올바르게 key, value를 생성하고 반환하는데 composeFindOptions 메서드에서 밑의 코드를 중단점 확인했을 때 let where: FindOptionsWhere<T> = {}; let order: FindOptionsOrder<T> = {}; for (const [key, value] of Object.entries(dto)) { if (key.startsWith('where__')) { where = { ...where, ...this.parseWhereFilter(key, value), }; } else if (key.startsWith('order__')) { order = { ...order, ...this.parseWhereFilter(key, value), }; } } return { where, order, take: dto.take, skip: dto.page ? dto.take * (dto.page - 1) : null, }; order와 where가 빈 객체로 반환되는 것을 확인했는데 어떻게 고쳐야 할까요

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
둘리콩콩 댓글 1 좋아요 0 조회수 348

모든 Route 기본 Private로 만들고 IsPublic Annotation 작업하기 강의부분 질문드립니다

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요 너무 잘듣고있습니다 '모든 Route 기본 Private로 만들고 IsPublic Annotation 작업하기' 수업듣는 중 질문이있어 글남깁니다. POSTMAN에서 DELETE기능을 눌렀을때 에러가 발생합니다 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ [터미널에 나온 에러 내용] [REQ] GET /posts?order__createdAt=DESC&take=5 2024. 3. 6. 오후 7:44:07 [REQ] DELETE /posts/122 2024. 3. 6. 오후 7:44:32 [Nest] 9576 - 2024. 03. 06. 오후 7:44:32 ERROR [ExceptionsHandler] update or delete on table "posts_model" violates foreign key constraint "FK_40cd89c6655ec7b102842feacab" on table "image_model" QueryFailedError: update or delete on table "posts_model" violates foreign key constraint "FK_40cd89c6655ec7b102842feacab" on table "image_model" at PostgresQueryRunner.query (C:\Users\manjin han\OneDrive\바탕 화면\flutter 폴더 및 파일\cf_sns\src\driver\postgres\PostgresQueryRunner.ts:331:19) at processTicksAndRejections (node:internal/process/task_queues:95:5) at DeleteQueryBuilder.execute (C:\Users\manjin han\OneDrive\바탕 화면\flutter 폴더 및 파일\cf_sns\src\query-builder\DeleteQueryBuilder.ts:77:33) at PostsService.deletePost (C:\Users\manjin han\OneDrive\바탕 화면\flutter 폴더 및 파일\cf_sns\src\posts\posts.service.ts:332:7) [postman 에러 내용] { "statusCode": 500, "message": "Internal server error" } ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ 강의상 terminal창에, 이렇게 화면이 나와야하는데 해당화면처럼 에러가 나오네요 몇일 고민해도 안되서 질문 드립니다

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
MJ90 댓글 1 좋아요 1 조회수 383

영상 음성이 끊겨서 진짜 듣기 힘드네요 ㅠㅠ

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

여러분들은 음성이 안끊기나요??ㅠㅠ 섹션25 process 객체를 이용해서 환경변수 불러오기 12~20초 사이 한 3번은 끊기네요 ㅜㅜ 그런데 저런 일이 전체 영상의 거의 배부분 저래요 ㅜㅜ (브라우져 하드웨어가속 기능 꺼져있어요 ㅠ) 강의 내용은 참 좋은데 말이 끊기니까 진짜 듣기 힘드네요 ㅠㅠ

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
오르골 댓글 1 좋아요 -1 조회수 385

@Column update 프로퍼티

해결됨

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 코드팩토리 통합 링크 https://links.codefactory.ai Flutter 강의를 구매하시면 코드팩토리 디스코드 서버 플러터 프리미엄 채널에 들어오실 수 있습니다! 디스코드 서버에 들어오시고 저에게 메세지로 강의를 구매하신 이메일을 보내주시면 프리미엄 채널에 등록해드려요! 프리미엄 채널에 들어오시면 모든 질의응답 최우선으로 답변해드립니다! -- 질문 강사님은 update 프로퍼티를 false로 설정하고 patch 요청을 보내면 500 에러가 발생하였는데 저는 다시 해봐도 업데이트는 실제로 안되었지만.. 500에러는 발생이 안되네요. 설정을 잘못한것일까요?.

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
이종문 댓글 1 좋아요 0 조회수 307

debug toolbar가 거슬리시는 분 주목

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

debug toolbar는 위치 설정 값은 commandCenter, docked, floating, hidden 인데요. 이 설정값의 기본 값은 floating 입니다. 이 위치 상태 기본 값을 변경하기 위해서 다양한 선택지가 있지만 기본적으로 세팅할 수 있는 방법을 알려드립니다. 프로젝트 내 .vscode/settings.json이 있으신 분 { ..., "debug.toolBarLocation": "commandCenter" } 작업영역 세팅을 바꾸는 방법 command + shift + p 입력 후 Preferences: Open Workspace Settings 입력 Debug: Tool Bar Location 입력 드롭다운 메뉴에서 원하는 위치 설정

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
최대범 댓글 2 좋아요 1 조회수 597

TypeOrm 1:N을 설정하는데 before initialization 에러가 발생합니다.

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요. 강의 잘 듣고 있습니다! TypeOrm으로 OneToMany relation을 추가하려고 하는데 before initialization 에러가 발생하고 있는데 해결이 안되고 있습니다ㅠ 확인 부탁드려요! @Entity('new_users') export class UserModel { @PrimaryColumn() id: string; @Column() name: string; @DeleteDateColumn({ name: 'deleted_at' }) deletedAt: Date; @CreateDateColumn({ name: 'created_at' }) createdAt: Date; @UpdateDateColumn({ name: 'updated_at' }) updatedAt: Date; @OneToMany(() => UserSocialModel, (userSocial) => userSocial.user) userSocials: UserSocialModel[]; } @Entity('new_user_socials') export class UserSocialModel { @PrimaryColumn() id: string; @Index() @ManyToOne(() => UserModel, (user) => user.userSocials) user: UserModel; }

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
max 댓글 2 좋아요 0 조회수 550

PUT, PATCH method 관련 질문

미해결

모든 개발자를 위한 HTTP 웹 기본 지식

HTTP method 중 put과 patch에 대해서 공부하고 아 그렇구나~ 하는 와중 갑자기 뜬금없는 질문이 떠올라서 질문드립니다. put은 내용 전체를 덮어쓰는 method이고 patch는 일부만 수정이 가능한 method 라고 배웠는데, 이것도 결국 http request를 backend상에서 어떻게 처리를 하느냐에 따라 달라지는 것 아닌가요? patch request를 받았다고 한들 backend단에서 데이터를 지우고 덮어쓰는 로직을 작성하면 put method와 같은 동작이 되는 것 아닌가요..? 그냥 backend 로직 구현은 염두하지 않고 그냥 그렇게 사용하기로 약속을 한 것인지 궁금합니다. 이상한 질문일수도 있지만 갑자기 문득 생각나서 질문 올려봅니다. 감사합니다.

  • put
  • patch
  • http
  • backend
parkm2ngyu00 댓글 2 좋아요 0 조회수 746

마지막 followee 감소 강의 누락

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요. 코드팩토리님 강의 너무나 잘 들었습니다. 허나 마지막 강의 followee 부분이 누락되었습니다. 이 부분 추가 해주시면 감사하겠습니다. 이전에 질문이 된 기록을 확인해봤는데 11월 달에 같은 질문을 받으시고 바쁘셔서 잊어버리신것 같아요.

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
송재근 댓글 1 좋아요 0 조회수 366

typeorm primary key 커스텀 질문드립니다!

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

import { nanoid } from 'nanoid'; import { PrimaryColumn, CreateDateColumn, UpdateDateColumn, DeleteDateColumn, } from 'typeorm'; export abstract class BaseModel { @PrimaryColumn({ length: 21 }) id: string = nanoid(10); @CreateDateColumn({ name: 'created_at', type: 'timestamp' }) createdAt: Date; @UpdateDateColumn({ name: 'updated_at', type: 'timestamp', nullable: true }) updatedAt: Date | null; @DeleteDateColumn({ name: 'deleted_at', type: 'timestamp', nullable: true }) deletedAt: Date | null; } 기존 express 플젝이 pk가 nanoid라서 nest에서 똑같이 적용하려고 했지만 유저 생성 (save)까지는 nanoid가 잘 들어가지만 외래키로 연결된 role 테이블에 user id를 주입시키는 순간 Field 'id' doesn't have a default value 에러가 발생합니다. user 테이블 role 테이블 둘다 baseModel을 상속받아 구성했고 @PrimaryGeneratedColumn() 으로 변경하면 해결이 되긴 하는데... nanoid를 저렇게 주입시켜서 생기는 문제일까요?

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
호프런 댓글 1 좋아요 0 조회수 436

yarn install이 안 되는 문제가 있어 남겨봅니다.

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

Node.js v20.11.1 NestJS 10.3.2 npm 10.4.0 Yarn 4.1.0 강의와 같이 폴더 생성 후 nest new . 로 생성했을 때 yarn install --silent 가 실패했습니다. 모두 삭제 후 프로젝트를 만들 폴더에서 nest n cf_sns 로 시도했으나 동일하게 yarn install --silent 가 실패했습니다. nest 로 새 application을 생성 후 해당 폴더 내 yarn.lock 을 만들고 yarn install 을 실행한 후 yarn start:dev 를 실행할 수 있었습니다. 저만 그런 건지 모르겠지만 혹시 몰라 기록을 남겨봅니다. --- 폴더 구성은 이렇게 되던데 최근 뭔가 달라진 걸까요? yarn을 처음 써봐서 잘 모르겠습니다. 🤔 --- https://yarnpkg.com/features/pnp PnP 때문인가 봅니다. --- https://yarnpkg.com/getting-started/editor-sdks PnP 사용 시 VSCode에서 TypeScript가 제대로 작동하지 않는 문제는 이 문서를 통해 해결했습니다.

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
목화 댓글 1 좋아요 0 조회수 654

로그인 인증 관련하여 질문이 있습니다.

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요 Basic 토큰을 통해 로그인 인증을 하는 강의를 듣고 나서 생긴 의문점이 있어 질문 남깁니다. 현재 강의 내용 중 사용자의 이메일과 비밀번호 그리고 Basic 토큰을 입력 받아서 login 함수를 실행하는 로직이 있는데, 제가 강의를 제대로 들은 것이 맞다면 해당 로그인 로직 상 이메일과 비밀번호를 Basic 토큰으로 변환하는 로직이 없는 것 같습니다. 그렇다면 이 경우 로그인 로직을 검증하면서 Basic 토큰으로 변환을 해야하는 것인지, 아니면 이러한 경우에는 이메일과 비밀번호만 입력받아 데이터베이스에서 검증을 해야하는 것인지 이도 아니라면, 따로 특정 기능이나 로직을 통해 자동으로 검증하는 방법이 있는지 궁금합니다!

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
info 댓글 2 좋아요 0 조회수 278

두가지 질문이있습니다.

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

게시글이 20개 배수로존재할때(ex 총 게시글수가 60개일때) 3페이지에서 다음페이지 정보가 url에 같이 올것같은데 이 부분은 어떻게 보완이 가능할까요? if (dto.where__id_more_than) { where.id = MoreThan(dto.where__id_more_than); } else if (dto.where__id_less_than) { where.id = LessThan(dto.where__id_less_than); } const posts = await this.postsRepository.find({ where, order: { createdAt: dto.order__createdAt, }, take: dto.take, }); 위 코드에서 where의 조건을 dtd의 order__createdAt 이 'ASC'인지 'DESC'인지를 체크하는것도 괜찮으까요?

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
ChipmunkDev 댓글 1 좋아요 0 조회수 326

NodeJS 의 single thread 와 event loop 에 대해 자세하게 알아 봤는데 제가 이해한 것이 맞는지 확인하고 싶어서 질문드렸어요!

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

동작하는 원리와 각 키워드의 역할에 대해 제가 알고 있는 점을 정리해 봤습니다. 어디가 틀리고 맞는지 확인하기 어려워서 질문드렸습니다! 원리 모든 task는 Call Stack(Execution Context Stack) 에 쌓인다. main thread는 Call Stack에 있는 작업을 순차적으로 진행한다. 그런데 오래 걸리는 요청이 들어오면 main thread가 blocking 된다. 그래서 nonblocking 이 되도록 event loop 와 background, event queue, micro task queue 등 막히는 작업을 해결 해줄 공간이 존재한다. 사용자가 요청을 보내면 오래 걸리든 아니든 우선은 Call Stack 에 쌓이게 된다. main thread 가 요청을 하나씩 해결 하는데 오래 걸리는 task를 해결할때 blocking 되지 않도록 CPU의 가용 가능한 main thread 이외의 다른 Thread(background)에 Task를 던진다. 그 후 다음 동작을 진행한다. main thread 와 background 는 동시에 task 를 동작하기에 nodejs 는 그 자체로 single thread 는 아니다. 사용자의 요청과 응답을 하는 task를 실행하는 thread가 1개라는 의미이다. 이 background thread에서 작업이 완료된 task는 event queue와 micro task queue 에 순차적으로 들어가게 된다. promise, nextTick 등 우선순위가 높은 작업들은 micro task queue에 쌓인다. Event Loop는 Call Stack에 모든 요청이 실행 완료되면 micro task queue, event queue에 있는 작업을 순서대로 Call Stack에 하나씩 담는다. micro task queue 에 task 가 있으면 event queue 보다 우선순위가 높아서 먼저 Call Stack 으로 이동한다. event loop는 non-blocking을 위해서 task를 background에 던지고 반환되면 event queue, micro task queue에 던지고, call stack을 observing 하다가 비어 있게되면 task를 순서대로 하나씩 넣는다. main thread는 call stack에 있는 task를 실행한다. 역할 main thread는 call stack에 있는 task를 실행한다. (얘는 이것만 하는 놈이다.) background는 event loop에서 오래 걸리는 작업을 던짐 당한 곳이고 작업이 완료되면 event loop 에게 알리는 작업을 한다. 여기서 Stack과 Queue는 모두 작업이 저장되는 공간인 메모리이다.(call stack, event queue, microtask queue) 이 메모리의 작업을 수행하고 던지고 받고 등의 작업을 하는 thread는 main thread와 background 이다. background 는 CPU 에서 가용 가능한 모든 thread 를 말하고 1개일 필요는 없다.

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
jyy0223 댓글 1 좋아요 0 조회수 385

followers and followees 프로퍼티 생성하기 질문

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요 코드 팩토리님! 너무 기본적은 질문이 많아 죄송합니다. 혹시나... 제가 이해를 못하고 있는건지 모르겠는데... 여기에서 followers, followees 의 property 정의가 주석에 바뀌지 않았는지 여쭤 봅니다. followers 가 나를 follow 하는 사람이 아닌지요?

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
정윤근 댓글 1 좋아요 1 조회수 329

이미지 s3 업로드 관련 질문드립니다!

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요 코팩님! 다름이 아니라 현재 제가 프로젝트에서 presigned url 방식으로 프론트단에서 이미지를 s3로 업로드하고 람다가 트리거 돼서 이미지 리사이징을 해주고 있습니다. 현재 업로드 방식은 s3 잉여 데이터들이 쌓이는게 걱정돼서 매번 s3로 바로 올려놓는게 아닌 최종 업로드 버튼시에 모든 이미지가 한번에 업로드 되는 구조입니다. 그런데 용량이 좀 큰 이미지는 람다 리사이징이 좀 걸려서 딜레이 때문에 프론트단에서 로딩을 걸어놓긴 하는데 사용자 경험이 좋지 못합니다. 그리고 게시물 작성 중 임시저장 기능을 새롭게 추가하려고 하니깐 이미지 처리를 어떻게 가져가야하나 싶더라고요. 혹시 강의에 나오는 temp 폴더에서 post 폴더로 옮겨가는 로직을 이용해서 s3에 적용을 한다면 좋을까요? 아님 더 좋은 해결방안이 있을까요? 그리고 리사이징 부분이 람다로 작동되다 보니 사용자가 게시물을 업로드 하지도 않고 계속 이미지를 수정하는 상황이 발생하면 람다 비용 문제도 고민되기도 합니다... 고민이 많다보니 횡설수설 질문드렸는데 현업에서는 기획에 따라 다르겠지만 이런 상황에선 어떻게 하는지가 좀 궁금합니다! 항상 감사드립니다.

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
호프런 댓글 1 좋아요 0 조회수 314

post에서 타입

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

authorId의 타입은 number인데, 포스트맨에서 return받는 newPost의 id의값은 스트링으로 들어오는 이유는 궁금합니다.

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
이진호 댓글 1 좋아요 0 조회수 303

강의 질문입니다.

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요. typeOrm 에 관한 질문입니다. 댓글과 포스트에 관한 ManyToOne의 관계에서 commentRepository에 save할때 포스트와 연결하고 싶을때 포스트 모델 객체를 넣어도 되고 post : {id:postid} 값만 넣어줘도 되는지 궁금합니다. comment post 요청 작성시 author은 모델로 save 하고 post는 id로 save 해서 궁금해서 여쭤 봅니다. 미리 감사합니다

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
정윤근 댓글 2 좋아요 0 조회수 284

다음 강의는 언제쯤...

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요 코드 팩토리님.. 강의 너무 잘듣고 있습니다. 혹시 nestjs part2 강의는 언제 계획되어 있으신지 궁금합니다. 빨리 보고 싶어서요^^;;

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
정윤근 댓글 3 좋아요 1 조회수 590

환경변수 설정 시 Error: SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string 라는 에러가 납니다.

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요. 환경변수 설정 간 TypeOrmModule.forRoot()를 설정하는 구간에서 강의대로 process.env로 .env에 있는 키들을 받아오려 하니 제목과 같은 에러가 납니다. 구글링을 해보았는데, forRootAsync를 활용하라는 말 등은 있지만 저 에러가 동일하게 구현된 사례는 없었습니다. 혹시 제가 어떤 잘못을 했는지 궁금하여 질문을 남깁니다. 강의 정말 잘 보고 있습니다. 감사합니다. @Module({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: process.env[ENV_DB_HOST], port: parseInt(process.env[ENV_DB_PORT]), username: process.env[ENV_DB_USERNAME], password: process.env[ENV_DB_PASSWORD], database: process.env[ENV_DB_DATABASE], synchronize: true, }), CommonModule, ConfigModule.forRoot({ envFilePath: process.env.NODE_ENV === 'production' ? '.env.production.local' : '.env.development.local', isGlobal: true, }), AuthModule, UsersModule, ], controllers: [AppController], providers: [AppService], }) export class AppModule {} // .env.development.local DB_TYPE=postgres DB_HOST=localhost DB_PORT=5430 DB_USERNAME=123123 DB_PASSWORD=123123 DB_DATABASE=123123 // constants.ts export const ENV_DB_HOST = 'DB_HOST'; export const ENV_DB_PORT = 'DB_PORT'; export const ENV_DB_USERNAME = 'DB_USERNAME'; export const ENV_DB_PASSWORD = 'DB_PASSWORD'; export const ENV_DB_DATABASE = 'DB_DATABASE'; // 에러 메세지 Error: SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
김태수 댓글 2 좋아요 0 조회수 1429

db 컬럼 camel or snake

미해결

[코드팩토리] [초급] NestJS REST API 백엔드 완전 정복 마스터 클래스 - NestJS Core

안녕하세요! 강의 너무 잘 듣고 있습니다. 별건 아니고 혹시 db 컬럼을 평소에도 camel로 쓰시는건가요?? 보통 db컬럼은 스네이크로 많이들 쓰는걸로 알고 있어서 여쭤봅니다!

  • javascript
  • typescript
  • rest-api
  • nestjs
  • backend
호프런 댓글 1 좋아요 0 조회수 475

인기 태그

인프런 TOP Writers

주간 인기글