Post

기술리뷰 TypeORM/query&queryOne의 차이

기술리뷰 TypeORM/query&queryOne의 차이

NestJS,TypeScript로 프로젝트를 진행하면서 Spring의 JPA와 비슷한(?) 기술로 NestJS의 프레임워크에서 제공해주는 TypeORM에 대해서 알아보려고 한다.

📌 TypeORM의 개념

  • TypeORM은 TypeScript와 Javascript에서 사용할 수 있는 데이터베이스 ORM 라이브러리이다.
  • ORM은 객체지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터를 변환하고 연결하는 기술을 말하는데, TypeORM은 이러한 변환 및 연결 작업을 편리하게 수행하도록 도와주는 도구 중 하나이다.

📌 TypeORM의 특징과 기능

1) 객체 지향적인 데이터베이스 조작: TypeORM은 데이터베이스 테이블을 JavaScript 또는 TypeScript 클래스로 매핑하여 객체 지향적인 코드를 사용할 수 있도록 합니다.

2) 쿼리 언어의 대안: SQL 쿼리 대신 JavaScript나 TypeScript로 작성된 메소드를 사용하여 데이터베이스를 조작할 수 있습니다. 이는 개발자에게 더 친숙하고 읽기 쉬운 코드를 작성할 수 있도록 도와줍니다.

3) 자동 마이그레이션: TypeORM은 데이터베이스 스키마를 자동으로 생성하고 유지하며, 모델의 변경 사항을 데이터베이스에 적용하는 기능을 제공합니다.

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
32
33
**자동 마이그레이션이란?
- 자동 마이그레이션(Automatic Migration)은 TypeORM에서 제공하는 기능으로,애플리케이션의 엔티티 모델(Entity model)이 변경될 때, 해당 변경 사항을 데이터베이스 스키마(Database schema)에 자동으로 적용하는 기능입니다.

여기서 엔티티 모델은 데이터베이스 테이블 구조를 코드로 정의한 것입니다. 예를 들어, User라는 테이블을 만들 때, 이 테이블의 컬럼과 구조를 TypeORM의 엔티티 클래스로 정의할 수 있습니다.

그리고 데이터베이스 스키마는 실제 데이터베이스 내에서 테이블, 컬럼, 관계 등이 어떻게 구성되어 있는지를 정의한 구조입니다.

**자동 마이그레이션을 활성화하는 방법
- TypeORM에서 자동 마이그레이션을 활성화하려면, `synchronize`라는 옵션을 사용합니다. 이 옵션을 true로 설정하면, 애플리케이션 실행 시 TypeORM이 자동으로 데이터베이스 구조를 엔티티와 맞게 업데이트합니다.

예시:
// typescript

const dataSource = new DataSource({
  type: 'mysql',
  host: 'localhost',
  port: 3306,
  username: 'root',
  password: 'password',
  database: 'test_db',
  entities: [User, Post],  // 사용될 엔티티들
  synchronize: true,        // 자동 마이그레이션 활성화
});
위 설정에서 synchronize: true로 설정하면, 애플리케이션을 실행할 때마다 TypeORM이 엔티티의 변경 사항을 데이터베이스에 자동으로 적용합니다.

** 주의사항
- 프로덕션 환경에서 synchronize: true는 위험할 수 있습니다.
- 자동 마이그레이션은 개발 환경에서는 편리하지만, 프로덕션 환경에서는 데이터가 손실될 위험이 있기 때문입니다. 
예를 들어, 테이블이나 컬럼을 삭제할 때 실수로 중요한 데이터가 삭제될 수 있습니다.
프로덕션 환경에서는 마이그레이션 파일을 수동으로 작성하고 관리하는 것이 좋습니다.

**마이그레이션 파일이란?
- 마이그레이션 파일은 데이터베이스의 스키마 변경 사항을 추적하고 적용하는 데 사용되는 코드입니다. 예를 들어, 새 테이블을 추가하거나 기존 테이블의 구조를 변경할 때, 그 변경 사항을 마이그레이션 파일에 정의하고, 이 파일을 통해 데이터베이스에 변경을 반영합니다.

4) 트랜잭션 관리: 트랜잭션을 사용하여 여러 데이터베이스 작업을 원자적으로 실행하고 롤백할 수 있습니다.

5) 액티브 레코드 패턴 지원: TypeORM은 액티브 레코드(Active Record) 패턴을 지원하여 데이터베이스 레코드를 객체처럼 쉽게 다룰 수 있게 합니다.

NestJS 공식문서 TypeORM 사용방법

📌 query&queyOne

1) query

  • query는 여러 행의 결과를 반환하는 쿼리를 실행할 때 사용된다.
  • 보통 SELECT쿼리(조회)여 개의 결과를 반환하거나 생성,수정,삭제와 같은 데이터베이스 수정 쿼리에서 영향을 받은 행의 수를 반환할 때 사용된다.
  • query는 항상 배열 형태로 사용되고, 반환된 배열이 여러 행이 있을 수도 있다.

2) queryOne

  • queryOne은 하나의 행만 반환하는 쿼리를 실행할 때 사용됩니다. 예를 들어, SELECT 쿼리에서 하나의 레코드를 조회할 때 사용된다.
  • queryOne은 첫 번째 결과만 반환하며 단일 객체 형태로 데이터를 제공한다. 만약 쿼리 결과가 없다면 null이나 undefined가 반환될 수도 있다.
This post is licensed under CC BY 4.0 by the author.