- 향후 지식이 쌓여 감에 따라 수정 및 보완 할 예정입니다 잘못된 점이 있다면 댓글로 알려주시면 감사하겠습니다
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 |