인프런 커뮤니티 질문&답변

jhkim님의 프로필 이미지
jhkim

작성한 질문수

Slack 클론 코딩[백엔드 with NestJS + TypeORM]

class-validator

typeorm createQueryBuilder Boolean type 관련

작성

·

1.1K

0

안녕하십니까. 강의 정말 잘 듣고 있습니다.

다름이 아니라 강사님의 강의를 듣고 연습을 하고 있습니다.

maria db를 사용하고 있으며

nestjs에서 entity에 @Column type은 bool로 선언했고 해당 db 컬럼도 tinyint(1)로 선언했습니다.

하지만 createQueryBuilder로 select해보니 False는 0 True는 1이 나오던데 혹시 true 또는 False로 나오는 방법이 따로 있을까요?

답변 2

1

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

@Column에 transformer 메서드 옵션이 있어서 값을 수정할 수 있습니다

0

jhkim님의 프로필 이미지
jhkim
질문자

답변 정말 감사합니다. 관련 힌트를 주셔서 작성을 해보았는데도 작동이 잘 되지 않고 구글링에도 쉽지가 않네요.. 혹시 이유를 알 수 있을까요? findBy로 사용하면 쉽게 true로 나오는데 queryBuilder는 0 또는 1만 계속 나오네요..

 

//--- transformer
import { ValueTransformer } from 'typeorm';

function isNullOrUndefined<T>(
  obj: T | null | undefined,
): obj is null | undefined {
  return typeof obj === 'undefined' || obj === null;
}

export class BooleanTransformer implements ValueTransformer {
  public from(value?: number | null): boolean | undefined {
    if (isNullOrUndefined(value)) {
      return;
    }
    return value ? true : false;
  }

  public to(value?: boolean | null): number | undefined {
    if (isNullOrUndefined(value)) {
      return;
    }
    return value ? 1 : 0;
  }
}

//--- entity
 @Column('tinyint', {
    name: 'is_use',
    nullable: true,
    comment: '사용 여부',
    width: 1,
    transformer: new BooleanTransformer(),
  })
  isUse: boolean | null;

// ---service
async selectUserForTest(): Promise<
    Pick<TbUserEntity, 'username' | 'isUse'>[]
  > {
    const user = await this.userRepository
      .createQueryBuilder()
      .select('username')
      .addSelect('is_use')
      .getRawMany();

    return user;
  }
제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

아.. getRawMany 하셔서 그런 것 같습니다. 그냥 getMany 하셔야 변환이 돌아갑니다.

jhkim님의 프로필 이미지
jhkim
질문자

강사님 정말 답변해주셔서 감사합니다.

getRawMany와 getMany를 찾아보니 data를 불러올 때는 getMany를 사용할 수 없는 것으로 검색되었습니다. (getMany 사용시 user에는 빈배열이 나오네요)

그렇다면 getRawMany로 사용해야 된다고 보면 되는데 json 주고 받을때 boolean 형식을 일반적으로 0 또는 1로 처리하는게 맞을까요?

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

데이터 불러올 때 getMany 당연히 됩니다.

this.userRepository.createQueryBuilder('user').select(['username, 'isUse']).getMany() 해보세요.

jhkim님의 프로필 이미지
jhkim

작성한 질문수

질문하기