Skip to content

typeORM 정리

Donghyun Kim edited this page Dec 1, 2020 · 1 revision

✔️ 목표

→ typeORM의 개념을 익히며 Active Record 패턴과 Data Mapper 패턴 차이점 학습

📚 typeORM이란?

→ TypeORM이란 ORM에서 NodeJS, Browser, Cordova, PhoneGap, Ionic, React Native, NativeScript, Expo, and Electron platforms 환경에서 실행가능함

→ TypeORM은 타입스크립트 뿐만 아니라 자바스크립트(ES5, ES6, ES7)도 지원하고 있음

→ TypeORM은 MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, WebSQL 데이터베이스를 지원

( ORM(Object-relational mapping) : 데이터베이스 객체지향 언어를 맵핑하는 기법)

Active Record 패턴Data Mapper 패턴으로 개발할 수 있음

📢 Active Record 패턴 vs Data Mapper 패턴

Active Record : CRUD Based, 간단히 사용할 수 있는 규모가 작은 프로젝트에 적합

Data Mapper : Domain Based, 규모가 큰 프로젝트에 적합하고 유지보수하는데 효과적

⚙️ Active Record 패턴

→ DB 모델이 데이터에 접근 하는 방법

→ 모델의 메소드를 사용하여 객체를 저장, 제거, 불러오는 방식

BaseEntity라는 클래스를 상속하여 사용

import {BaseEntity, Entity, PrimaryGeneratedColumn, Column} from "typeorm";

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

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    isActive: boolean;

}
// 사용 예시

const user = new User();
user.firstName = "Timber";
user.lastName = "Saw";
user.age = 25;
await user.save();

const allUsers = await User.find();
const firstUser = await User.findOne(1);
const timber = await User.findOne({ firstName: "Timber", lastName: "Saw" });

await timber.remove();

🔧 Data Mapper 패턴

→ 분리된 클래스에 쿼리 메소드를 정의하는 방식이며

→ Repository를 이용하여 객체를 저장, 제거, 불러옴

→ 모델에 접근하는 방식이 아닌 Repository에서 데이터에 접근한다는 것

(모델과 DB사이에 의존성이 적어져, 서로가 독립적으로 유지 가능)

import {Entity, PrimaryGeneratedColumn, Column} from "typeorm";

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

    @Column()
    isActive: boolean;

}
// Generic 타입을 이용하여 상속

import {EntityRepository, Repository} from "typeorm";
import {User} from "../entity/User";

@EntityRepository()
export class UserRepository extends Repository<User> {

    findByName(firstName: string, lastName: string) {
        return this.createQueryBuilder("user")
            .where("user.firstName = :firstName", { firstName })
            .andWhere("user.lastName = :lastName", { lastName })
            .getMany();
    }

}
// 사용 예시

const userRepository = connection.getRepository(User);

// example how to save DM entity
const user = new User();
user.firstName = "Timber";
user.lastName = "Saw";
user.isActive = true;
await userRepository.save(user);

// example how to remove DM entity
await userRepository.remove(user);

// example how to load DM entities
const users = await userRepository.find({ skip: 2, take: 5 });
const newUsers = await userRepository.find({ isActive: true });
const timber = await userRepository.findOne({ firstName: "Timber", lastName: "Saw" });

참고자료

https://typeorm.io/#/

https://velog.io/@josworks27/typeORM-시작하기

💒 Home

Home

📆 Planning

📋 요구 사항

📑 프로젝트 설계

📓 Api 명세서

📖 제품 백로그

📺 화면 기획서

📽️ Project

📖 도움말

📷 실행 화면

⚒️ 기술 스택

⚙️ 기술 특장점

✔️ Team Rule

그라운드 룰

☑️ 깃허브 사용 규칙

코딩 컨벤션 규칙

📝 Progress

🌿 1주차 Progress
☘️ 2주차 Progress
🍀 3주차 Progress
🍁 4주차 Progress
🌲 5주차 Progress

📚 학습 정리 공유

🛠️ 기술 관련 공유

Clone this wiki locally