DEV/Backend

TypeORM 다루기

Beomsu Koh 2023. 1. 14.
  • 향후 지식이 쌓여 감에 따라 수정 및 보완 할 예정입니다 잘못된 점이 있다면 댓글로 알려주시면 감사하겠습니다

TypeORM

TypeORM은 javascript 진영에서 사용할 수 있는 ORM이다.
TypeORM의 장점은 현재 존재하는 다른 모든 Javascript ORM과 달리 Active Record 및 Data Mapper 패턴을 모두 지원한다는 점에 있다

ORM이라 함은 Object Relational Mapping 즉 객체 관계 맵핑 객체와 관계형 데이터베이스를 맵핑해준다
개발자 입장에서 프로그래밍 언어를 통해 간접적으로 데이터베이스를 다룰 수 있고, 재사용 유지보수에 용이하다

프로젝트에 typeorm은 추가하는 명령어는 아래와 같다

yarn add typeorm 

특징

어노테이션 기능

import { Entity, PrimaryGeneratedColumn, Column, BaseEntity } from "typeorm"  @Entity()  export class User extends BaseEntity {  	@PrimaryGeneratedColumn()  	id: number  	@Column()  	firstName: string  	@Column()  	lastName: string  	@Column()  	age: number  } 

Entity를 만들며 java의 롬복이 생각났다. 어노테이션으로 해당 컬럼의 특징과 옵션을 줄 수 있다.
그리고 아래에 만들 컬럼의 이름과 타입을 적으면 Entity 선언 끝!

실습

Entity 선언


나의 경우 User table을 위한 Entity를 선언하였다
TypeORM은 active record와 Data mapper 방식으로 entity를 선언 할 수 있는데, Data mapper 방식을 사용한다

Data mapper는 entity를 선언해두고, 레퍼지터리라는 별도의 클래스를 통해 데이터베이스를 다룬다
이 경우에 entity가 분리되어 있어 추후 마이그레이션이나 유지 보수에 용이함을 가진다

쿼리문 생성

앞서 말했다시피, Data mapper 방식이기 때문에 쿼리문을 따로 생성해야 한다.
쿼리문을 생성할 때는 TypeORM의 BaseEntity에서 지원하는 메소드를 사용 할 것이다

  • 모든 User 조회 쿼리
export async function getuserList(){ 	return await User.find({relations: {campus: true, login: true, config: true}}); } 

메인 entity인 user와 관련 join 된 entity인 campus,login를 명시하고, 모든 User를 조회한다
find는 해당하는 모든 튜플을 반환한다

  • 특정 User 조회 쿼리
export async function getUserInfo(userid: number) { 	return await User.findOne({where: {userid}, relations: {campus: true, login: true, config: true}}); } 

모든 User 조회 쿼리와 흐름은 비슷한다. findOne() 메소드를 주고, option으로 where에 조건을 주면 된다

Api 작성

User를 조회하는 쿼리를 만들었으니 api를 만들어보자. "/"로 접근하면 유저를 조회하도록 하였다

fastify.get("/", async (req: FastifyRequest, reply: FastifyReply) => { 	const users = await getUserList(); 	console.log(users); 	reply.send(users);  }); 

브라우저에서 확인하면 아래와 같이 잘 출력 됨을 알 수 있다.

여담으로 domain 단위로 view랑 api를 분리해서 개발 중이기에 url이 /api/v1/ ~ 형식이다
즉 그냥 127.0.0.1:4000/ 으로 접근하면 root 페이지가 나온다

'DEV > Backend' 카테고리의 다른 글

Token 방식으로 로그인 구현하기  (0) 2023.01.27
JWT 다루기  (0) 2023.01.26
TypeORM Releation 다루기  (0) 2023.01.26
Mac에서 MySQL 설치  (0) 2023.01.16
Typescript - 모듈 또는 해당 형식 선언을 찾을 수 없습니다  (0) 2023.01.14

댓글