일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 프로그래머스 레벨 2
- javascript
- HTTP 완벽 가이드
- BFS
- 그래프
- Crawling
- Node.js
- 자바스크립트
- ip
- 백준
- type challenge
- 타입스크립트
- socket
- 크롤링
- 프로그래머스
- 가천대
- Nestjs
- 타입 챌린지
- Algorithm
- 수학
- dp
- HTTP
- 레벨 1
- 소켓
- 쉬운 문제
- 문자열
- 알고리즘
- TCP
- typescript
- dfs
- Today
- Total
목록프로그래밍/NestJS (38)
kakasoo

Entity 정의 상품의 Entity 정의 /** * 상품의 Entity */ @Entity('product', { schema: 'db_name' }) export class Product { @PrimaryGeneratedColumn({ type: 'int', name: 'idx' }) idx: number; @Column('varchar', { name: 'title', length: 255 }) title: string; } 해시태그의 Entity 정의 /** * 해시태그의 Entity */ @Entity('hashtag', { schema: 'db_name' }) export class Hashtag { @PrimaryGeneratedColumn({ type: 'int', name: 'idx' ..

정적 모듈에서는 환경 변수 사용 불가 이번 글은 짧은 내용을 다룬다. 아마 dotenv를 사용하다가 Nestjs와 ConfigModule을 사용하려던 사람들은 시행착오를 많이 겪을 것이다. 사실 TypeORM을 써서 발생하는 문제는 아닌데, 이런 상황을 주로 만나는 게 아무래도 ORM일 것 같아서 제목에도 넣었다. Nestjs에는 ConfigModule이 있다. ConfigModule을 사용해서 미리 .env를 삽입해두면 그 하위 모듈에서는 모두 process.env를 통해서 값에 접근할 수 있게 된다. 하지만 아래 같은 경우를 보자. // nestjs recipe의 typeORM 문서를 보면 아래의 예제 코드가 있다. import { Module } from '@nestjs/common'; import..

서론 const router = express.router(); // express CRUD router.post('/', controller.postMethod); router.get('/', controller.getMethod); router.put('/', controller.putMethod); router.delete('/', controller.deleteMethod); Express에서는 다음과 같이 CRUD를 만든다. 사실 간편하고 빠르게 서버 어플리케이션을 확장할 수 있다는 게 장점이다. 하지만 Express는 구조적으로 짜임새가 있지는 않다. 그래서 결국에는 차세대 프레임워크에게 자리를 물려줄 것으로 보인다. 이제부터 직접 두 프레임워크를 다루면서 느꼈던 차이점, 그리고 Express..

서비스를 구현하다보면 당연히 여러 사용자가 존재하게 된다. 이 사용자라는 표현은, 그냥 내 임의로 부르는 호칭인데, 말하자면 유저의 성격이다. 예컨대 커머스라고 한다면 구매자와 판매자, 관리자가 있을 수 있고, 예약 서비스를 만든다면 식당 주인과 손님이라는 관계가 생길 것이다. 대개 서비스라고 함은 하나의 사용자만 존재할 리 없고, 하다 못해 관리자를 포함해 둘 이상의 사용자가 반드시 존재할 수 밖에 없다. 문제는 여기서 발생한다. "서로 다른 사용자를 어떻게 한 서버 내에서 인증하는가?" PassportStrategy에 이름 설정하기 우리가 사용하는 Gaurd들에 대해서 다시 고찰해볼 필요가 있다. Guard들은 어떻게 자신에게 할당된 전략을, 알아서 찾아가는 걸까? import { Injectable..

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { InjectRepository } from '@nestjs/typeorm'; import { User} from 'src/entities/user.entity'; import { Role } from 'src/common/common.enum'; import { Repository } from 'typeorm'; import { ROLES_KEY } from '../roles/back-office-roles.decorator'; @Injectable() export class Ad..
여러 가지 엔티티의 칼럼이나 프로퍼티를 통일시켜, 하나의 함수를 여러 엔티티가 공유할 수 있게 작성하고 싶다. 그렇지만, 파라미터로 오는 타입들이 다른 경우, 이렇게 만드는 게 쉽지 않다. 이런 경우에는 직접 커스텀한 함수로 타입을 보호해줄 수 있는 방법이 필요하다. public format(value: Foo[] | Bar[]) { const isFooArray = isArrayOf(isInstanceOf(Foo)); if (isFooArray(value)) { // true block for (const foo of value) { const f: Foo = foo; // okay } } else { // false block for (const bar of value) { const b: Bar =..
300-399: 리다이렉션 상태 코드 리다이렉션 상태 코드는 클라이언트가 관심있어 하는 리소스에 대한 다른 위치를 사용하라고 말해주거나, 리소스 대신 다른 대안 응답을 제공한다. 리소스가 옮겨졌다면 어디서 찾을 수 있는지 알려주기 위해 리다이렉션 상태 코드와 Location 헤더를 보낼 수 있다. 이는 브라우저가 사용자를 귀찮게 하지 않고, 알아서 새 위치로 가게 해준다. 이런 특성으로, 리다이렉션 상태 코드 중 일부는 로컬의 복사본이 원래 서버와 비교했을 때 유효한지, 또는 최신의 파일이 맞는지 비교하는 데에 쓰인다. 이 때에는 If-Modified-Since 헤더에 특정 날짜를 보내 그 날짜를 기준으로 파일의 수정이 생겼는지 체크할 수 있다. 이 경우 304의 상태 코드가 돌아온다. 일반적으로, HE..
I agree with you. There is a problem here. LoadRelationCountAndMap is mapped, but does not work properly when sorted, and addSelect is not mapped, but can be sorted. Eventually, there is a problem of having to use both. query .loadRelationCountAndMap('user.itemCount', 'user.items', 'itemCount') // mapped, but can't be sorted. .addSelect((qb) => { return qb.select('COUNT(item.id)', 'count').from(..
typeorm shychronize 시 발생하는 CannotExecuteNotConnectedError는 한 entity로부터 연결되어 있는 다른 entity를 발견하지 못한 경우, 즉, Relation을 발견하지 못한 경우에 발생하는 것으로 보인다. 이 상태에서 서버를 실행할 경우, metadata A was not found. 라는 error message가 나오는데, 이 error message의 경우, 어떤 칼럼이 아니라 relation을 찾지 못한다고 나온다. 이 에러들의 경우, ormConfig, 또는 typeorm 설정에서 특정 entity를 찾지 못한 경우 발생한다. ( 만약 전부 다 찾지 못하는 상황이면 다른 message 가 나온다. ) 따라서, 경로를 와일드카드를 사용해서 작성한 경우..
// NOTE: 예시로 작성한 코드 async searchUser(search: string, orderName: string, order: 'DESC' | 'ASC') { let query = this.userRepository .createQueryBuilder('user') .leftJoinAndSelect('user.department', 'user') .where('user.isBot = false'); if (search) { query = query.andWhere('user.name ILIKE :search OR department.name ILIKE :search', { search: `%${search}%`, }); } if (orderName && order) { return awai..
대학교 세미나를 진행하면서, 뒤풀이에서 질문을 받았다. "카카수님은 변수 명이라던가, 컨벤션은 어떻게 정하나요?" 당연히 팀끼리 정하면 될 일이지만, 그런 답을 듣고 싶어서 질문한 것은 아닐 것이다. 나도 팀끼리, 그리고 회사에서도, 컨벤션을 정하고 작업한 적은 있지만 그게 잘 지켜진 적은 그다지 없었다. 사실 100번은 지켜도 1번 지켜지지 않은 게 있으면, 나중 가서 고치기도 심란하니 놔두게 되는 게 컨벤션 아닌가. 또 처음에는 열심히 하더라도, 점차 코드가 길어지면 컨벤션의 양도 늘어나게 되고, 그러다보면 컨벤션이 작업을 따라가는 게 아니라, 작업을 하기 위해 컨벤션을 봐야 하는 문제가 생긴다. ex. "이것과 관련된 컨벤션이 어디 있더라?" 이미 만들어진 코드를 따라 하기 라이브러리와 프레임워크의..
Node.js heap out of memory Today I ran my script for filesystem indexing to refresh RAID files index and after 4h it crashed with following error: [md5:] 241613/241627 97.5% [md5:] 241614/241627 97.5% [md5:] 241625/2... stackoverflow.com 오늘 갑자기 내 dev server가 터졌다고 프론트 개발자 분께서 말씀해주셨다. 프론트 개발자와의 협업을 위해 dev server를 열고 swagger 문서를 제공해준 건데, 정말로 터져있었다. 서버를 재실행하고 error message를 확인한 결과 Node.js 메모리가 부족해서 ..