![Typescript - TypeORM 사용해서 DB 쿼리하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx6Z9U%2FbtsBVGLlcJi%2FO2Rl7uGjybCyBuQyLSfmk1%2Fimg.png)
이전 내용 관련 참고자료
2023.12.09 - [프로젝트/Github Rest API로 프로젝트 관리하기] - Repository 정보 크롤링 및 알림 서비스 구현 요구사항 정리하기
2023.11.26 - [백엔드/Typescript] - Typescript 컴파일 설정 - tsconfig.json
Prerequisite
- Typescript 기본 엔트리 파일 컴파일 및 실행 방법
- Typescript - Postgresql 연결 사용법 - pg 라이브러리 설치하기
- PostgreSQL DB 스키마 작성 방법
1. TypeORM 및 Reflect-metadata 설치
npm install typeorm --save
npm install reflect-metadata --save
npm install [DATABASE DRIVER] --save # 예: npm install pg --save (PostgreSQL의 경우)
2. TypeORM 및 데이터베이스 연결 설정
src/database.ts 파일에 다음과 같이 정의를 한다.
import { DataSource} from "typeorm";
import { POSTGRES_HOST, POSTGRES_PORT, POSTGRES_USER, POSTGRES_DATABASE, POSTGRES_PASSWORD } from './config';
function createDataSource() {
return new DataSource({
type: "postgres",
host: POSTGRES_HOST,
port: POSTGRES_PORT,
database: POSTGRES_DATABASE,
username: POSTGRES_USER,
password: POSTGRES_PASSWORD,
entities: ["src/entity/**/*.ts"],
});
}
const AppDataSource = createDataSource();
export async function initDatabase() {
await AppDataSource.initialize();
return AppDataSource;
};
entity 파일이 src/entity/하위에 *.ts파일의 형태로 있어야함을 명시하고있다.
3. 엔티티 파일 작성
기존에 정의한 DB 스키마 대로 entity를 작성해야한다.
예제는 아래와 같다.
init.sql 파일이 다음과 같을 경우
-- base tables for the app
create table users (
name varchar(50) not null,
github_id varchar(50) not null unique,
company_id varchar(50) not null,
company_github_id varchar(50),
team_name varchar(50) not null,
primary key (name, company_id)
);
entity파일은 아래와 같이 작성되어야한다.
src/entity/user.entity.ts
import {Entity, PrimaryColumn, Column} from "typeorm";
@Entity()
export class Users {
@PrimaryColumn()
name!: string
@Column()
github_id!: string
@Column()
company_id!: string
@Column({nullable: true})
company_github_id?: string
@Column()
team_name!: string
}
주의할 점은 class명은 init.sql에서 정의한 table명과 반드시 동일해야한다는 점이다.
(create table users로 했으면 class 명도 users 혹은 Users로 해야함)
그렇게 설정하지 않으면 오류가 발생한다.
Typescript Class name Convention 상 가장 앞자리가 대문자여야하므로 class명은 Users여도 인식을 해주는것으로 보인다.
위와같이 entity를 설정하게 되면 실제로 예시 데이터를 집어넣고 출력을 해볼 수 있다.
예시 데이터를 아래와 같이 추가한다.
4.index.ts를 아래와 같이 작성한다.
import "reflect-metadata";
import { initDatabase } from './database';
import {Users} from './entity/user.entity';
async function main() {
try {
const datasource = await initDatabase();
console.log(result)
const user = await datasource
.getRepository(Users)
.createQueryBuilder("user")
.where("user.name = :name", { name: "hello" })
.getOne()
console.log(user);
} catch (error) {
console.log(error);
}
}
main();
5. 실행 및 결과
ts-node src/index.ts 를통해서 실행하면 결과는 아래와 같이 출력된다.
Users {
name: 'hello',
github_id: 'hello',
company_id: 'hello',
company_github_id: null,
team_name: 'hello'
}
Reference
'백엔드 > NodeJS | Typescript' 카테고리의 다른 글
Typescript vs Javascript 간단 비교 - Typescript를 중심으로 (0) | 2024.03.06 |
---|---|
Typescript - TypeORM 적용 (1) | 2023.12.25 |
Typescript 프로젝트의 naming convention (0) | 2023.12.07 |
Typescript 이해하기 - Async/Await 이해하기 (0) | 2023.11.28 |
Typescript 이해하기 - 제너레이터 이해하기 (0) | 2023.11.28 |
개발 및 IT 관련 포스팅을 작성 하는 블로그입니다.
IT 기술 및 개인 개발에 대한 내용을 작성하는 블로그입니다. 많은 분들과 소통하며 의견을 나누고 싶습니다.