Wecode -기업협업 인턴 (부트캠프)/기업협업 독학, 공부

쿼리 빌더(Query Builder) : 데코레이터 @Getone(반환), TypeORM에서 사용하는 주요 데코레이터

JBS 12 2023. 11. 1. 22:13

쿼리빌더의 @Getone와 같은 함수 알려줘 

함수 @Getone -> 하나만 가져와 @GetAll -> 모든 목록을 가져와(배열로) @withDelete -> 삭제한 거도 가져와

 

TypeORM에서 쿼리 빌더(Query Builder)를 사용하여 데이터베이스 쿼리를 작성할 때, 

 

getOne() 메서드는

 쿼리를 실행하고 단일 엔터티 레코드를 반환하는 메서드입니다. 

 

getOne() 메서드는 일반적으로 특정 조건을 만족하는 레코드를 검색하고 해당 레코드가 하나인 경우에 사용됩니다. 

그런데 주의할 점은, 만약 해당 조건을 만족하는 레코드가 없거나 여러 개인 경우, 예외가 발생할 수 있습니다.

여기에 간단한 예제를 제시하겠습니다. 이 예제에서는 TypeORM을 사용하여 getOne() 메서드로 데이터를 조회하는 방법을 보여줍니다.

 

typescript]

 

import { Entity, PrimaryGeneratedColumn, Column, createConnection } from 'typeorm';

@Entity()
class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  username: string;
}

async function main() {
  const connection = await createConnection({
    type: 'sqlite',
    database: 'example.db',
    synchronize: true,
    entities: [User],
  });

  const userRepository = connection.getRepository(User);

  try {
    // 단일 레코드를 username이 'john'인 경우 조회
    const user = await userRepository.createQueryBuilder('user')
      .where('user.username = :username', { username: 'john' })
      .getOne();

    if (user) {
      console.log('Found user:', user);
    } else {
      console.log('User not found');
    }
  } catch (error) {
    console.error('Error:', error);
  }

  await connection.close();
}

main();

 


이 예제에서 getOne() 메서드는 username이 'john'인 사용자를 조회하고, 해당 사용자를 출력합니다. 만약 이 사용자가 없거나, 여러 사용자가 조건을 만족한다면 예외가 발생할 수 있습니다.

참고로, getOne() 대신 getOneOrFail() 메서드를 사용하면, 레코드가 없는 경우 예외가 발생하며, 여러 레코드가 있는 경우에도 예외가 발생합니다. 이 메서드를 사용하여 레코드가 하나임을 확실히 하려는 경우에 유용합니다.


@GetAll @withDelete 등등 종류를 다 알려줘

TypeORM에서 @GetAll, @withDelete와 같은 데코레이터는 

TypeORM의 기본 데코레이터가 아닙니다.

 

 

 일반적으로 TypeORM에서 사용하는 주요 데코레이터는 @Entity, @PrimaryGeneratedColumn, @Column, @ManyToOne, @OneToMany, @ManyToMany 등과 같은 것들입니다. TypeORM에서 사용하는 데코레이터는 데이터베이스 스키마를 정의하거나 쿼리를 실행하기 위한 것들입니다.

그러나 다른 JavaScript/TypeScript 라이브러리나 프레임워크에서 커스텀 데코레이터를 정의할 수 있습니다. 따라서 @GetAll, @withDelete 등이 실제로 어떤 목적으로 사용되는지는 해당 프로젝트나 코드베이스의 커스텀 데코레이터로 의존합니다. 이러한 커스텀 데코레이터는 프로젝트의 요구 사항에 따라 다양하게 정의될 수 있습니다.

예를 들어, NestJS 프레임워크에서는 커스텀 데코레이터를 사용하여 컨트롤러나 라우팅을 정의할 수 있습니다. 또한, 다른 프로젝트에서도 커스텀 데코레이터를 정의하거나 사용할 수 있습니다. 때문에 @GetAll, @withDelete 등의 데코레이터는 프로젝트나 라이브러리에 따라 다를 수 있으며, 해당 데코레이터가 어떤 목적으로 사용되는지는 해당 프로젝트의 문서나 코드를 확인해야 합니다.

만약 어떤 특정 데코레이터에 대한 정보가 필요하다면, 해당 프로젝트의 문서나 소스 코드를 참고하여 해당 데코레이터의 동작과 목적을 파악할 수 있을 것입니다.


TypeORM에서 사용되는 주요 데코레이터 

1. @Entity: 엔터티를 정의하는 데 사용되며, 클래스 위에 위치합니다. 엔터티 클래스로서 동작하도록 표시합니다.

 

typescript]


@Entity()
class User {
  // ...
}

 

2. @PrimaryGeneratedColumn: 엔터티의 기본 키(Primary Key)를 정의하는 데 사용됩니다. 일반적으로 숫자 형식의 자동 증가 ID를 나타냅니다.


typescript]


@PrimaryGeneratedColumn()
id: number;

 

3. @Column: 엔터티의 속성(필드)을 정의하는 데 사용됩니다. 컬럼의 데이터베이스 형식과 제약 조건을 정의할 수 있습니다.

 

typescript]


@Column()

name: string;

 

4. @CreateDateColumn 및 @UpdateDateColumn: 엔터티의 생성 일자 및 수정 일자를 자동으로 기록하는 데 사용됩니다.
 

typescript]


@CreateDateColumn()
createdAt: Date;

@UpdateDateColumn()
updatedAt: Date;

 

 

5. @OneToOne, @OneToMany, @ManyToOne, @ManyToMany: 엔터티 간의 관계를 정의하는 데 사용됩니다. 이러한 관계 데코레이터를 사용하여 엔터티 간의 관계를 설정합니다.

typescript]


@OneToOne(type => Profile, profile => profile.user)
profile: Profile;

@ManyToOne(type => User, user => user.posts)
user: User;

 

6. @JoinTable: ManyToMany 관계에서 연결 테이블을 정의하는 데 사용됩니다.

 

typescript]


@ManyToMany(type => Role)
@JoinTable()
roles: Role[];

 

7. @Index: 데이터베이스 인덱스를 정의하는 데 사용됩니다. 색인을 생성하여 데이터 검색 및 성능을 최적화할 수 있습니다.
 

typescript]

 

@Index()
name: string;

 

8. @Unique: 고유한(unique) 제약 조건을 정의하는 데 사용됩니다. 컬럼 값이 고유해야 함을 나타냅니다.
 

typescript]


@Column({ unique: true })
email: string;
이러한 데코레이터는 TypeORM을 사용하여 엔터티와 데이터베이스 스키마를 정의하고, 데이터베이스 쿼리를 수행하는 데 사용됩니다. 이 데코레이터들을 적절히 사용하여 데이터베이스 모델을 정의하고 데이터베이스 조작을 수행할 수 있습니다.


데코레이터 설명해줘

데코레이터(Decorator)는 TypeScript와 JavaScript의 기능 중 하나로, 클래스, 메서드, 속성, 매개변수 등의 선언에 메타데이터를 추가하거나 기능을 주입하는 데 사용됩니다. 데코레이터는 주로 클래스 기반 프레임워크 및 라이브러리에서 사용되며, 코드를 더 간결하고 가독성 있게 만들고 기능을 확장할 수 있게 해줍니다.

데코레이터는 @ 기호를 사용하여 선언하며, 함수로 구현됩니다. 다음은 데코레이터의 기본 개념과 사용 사례에 대한 설명입니다:

1. 클래스 데코레이터(Class Decorator):

클래스 데코레이터는 클래스 정의를 수정하거나 확장하는 데 사용됩니다. 클래스 데코레이터는 클래스 정의 전체를 대상으로 적용됩니다. 예를 들어, NestJS에서 @Controller 데코레이터는 컨트롤러 클래스를 정의합니다.
 

typescript]
@Controller('example')
class ExampleController {
  // ...
}

 

2. 메서드 데코레이터(Method Decorator):

메서드 데코레이터는 클래스의 메서드에 적용됩니다. 예를 들어, Express.js에서 @Get, @Post 데코레이터는 라우팅 경로와 HTTP 메서드를 정의합니다.


typescript]
@Get('/endpoint')
handleGetRequest(req, res) {
  // ...
}

 

3. 속성 데코레이터(Property Decorator):

속성 데코레이터는 클래스의 속성(멤버 변수)에 적용됩니다. 이를 사용하여 데이터 유효성 검사나 기타 속성의 동작을 변경할 수 있습니다.
typescript]
@ValidateInput
userInput: string;

 


4, 매개변수 데코레이터(Parameter Decorator):

 매개변수 데코레이터는 메서드의 매개변수에 적용됩니다. 이를 사용하여 메서드에 전달되는 인자를 가로채거나 변경할 수 있습니다.
typescript]
function logParameter(target: any, key: string, index: number) {
  console.log(`Parameter ${index} of ${key} is logged.`);
}
class Example {
  greet(@logParameter name: string) {
    console.log(`Hello, ${name}`);
  }
}


데코레이터는 주로 TypeScript와 함께 클래스 기반의 프레임워크 및 라이브러리에서 사용되며, 코드의 가독성을 높이고 관심사를 분리하는 데 도움이 됩니다. 예를 들어, NestJS, Angular, Express.js, TypeORM 등이 데코레이터를 사용하여 코드를 구성하고 확장하는 데 잘 활용하고 있습니다.


타입스크립트랑 쿼리빌더는 항상 같이 쓰이니?

타입스크립트와 쿼리 빌더(TypeORM 등)는 항상 함께 사용할 필요는 없지만, 많은 프로젝트에서 함께 사용되는 경우가 많습니다. 각각의 도구와 기술은 다른 목적과 강점을 갖고 있으며, 프로젝트의 요구 사항과 개발자의 선호도에 따라 선택됩니다.

1. 타입스크립트: 타입스크립트는 JavaScript의 상위 언어로, 정적 타입 시스템을 가지고 있어 코드의 안정성과 가독성을 향상시킵니다. 주로 프로젝트의 전체 구조와 비즈니스 로직을 작성하는 데 사용됩니다. 타입스크립트는 데이터 모델 및 비즈니스 로직을 정의하고 컴파일된 JavaScript 코드를 생성합니다.

2. 쿼리 빌더(TypeORM): 쿼리 빌더는 데이터베이스와 상호 작용하는 도구로, 데이터를 저장, 검색, 수정, 삭제하는 데 사용됩니다. TypeORM은 TypeScript에서 사용할 수 있는 ORM(Object-Relational Mapping) 라이브러리 중 하나로, TypeScript와 데이터베이스 간의 상호 작용을 용이하게 만들어줍니다. TypeORM은 데이터 모델과 데이터베이스 테이블을 매핑하고 쿼리를 TypeScript로 작성할 수 있도록 도와줍니다.

타입스크립트와 쿼리 빌더를 함께 사용하는 경우, 데이터베이스와 상호 작용하는 코드를 타입 안전하게 작성할 수 있으며, 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다. 또한 TypeORM과 같은 쿼리 빌더는 TypeScript와의 통합을 지원하므로 데이터베이스 스키마와 TypeScript 클래스 간의 일관성을 유지하도록 도와줍니다.

그러나 모든 프로젝트가 쿼리 빌더를 필요로 하는 것은 아닙니다. 작은 규모의 프로젝트나 데이터베이스 상호 작용이 제한적인 경우에는 직접 SQL 쿼리나 다른 데이터베이스 라이브러리를 사용할 수도 있습니다. 선택은 프로젝트의 복잡성, 요구 사항 및 개발자의 선호도에 따라 달라집니다.