TIL | ORM (Prisma 입문)

Wook·2021년 12월 23일
0

TIL | Backend

목록 보기
11/19

ORM

ORMObject-relational-mapping의 약어로, 데이터 하나를 하나의 객체로 생각하겠다는 패러다임에서 출발한 개념입니다. 여기서 객체 라고 하면, 언어마다 다를 수 있겠죠? 자바스크립트의 객체와 파이썬의 객체는 의미가 조금 다르니까요. 그러나 각 언어에 맞는 ORM을 사용하면 해당 언어에 적합한 객체의 형태로 데이터를 반환해줍니다. 설명만 읽고는 데이터가 객체라는 문장이 와닿지 않으니, 예시로 알아보겠습니다.

  • users 테이블에는 id , name 컬럼이 있습니다.
  • pets 테이블에는 id, name, age, user_id 라는 컬럼이 있습니다.

데이터베이스의 테이블 하나를 클래스 하나라고 생각해보겠습니다.

테이블에서 column 이란, 그 테이블에 저장되는 데이터들이 가지는 속성이라고 할 수 있습니다. user 이라는 데이터에게는 id 라는 특징과 name 이라는 특징이 있다고 이해하시면 쉽습니다. 이것을 클래스 로 한 번 옮겨보겠습니다. 그 뜻은 User 이라는 객체에 id, nameattributes 가 있는 것과 일맥상통한다고 할 수 있습니다.

class User {
  constructor(id, name) {
    this.id = id;
    this.name = name;
  }
}

Pet 에 대해서도 생각해볼까요? pets 테이블에는 id, name, owner, age 라는 속성이 있습니다.

class Pet {
  constructor(name, owner, age){
    this.name = name;
    this.owner = owner;
    this.age = age;
  }
}

이를 클래스로 변형해보면, Pet 이라는 클래스가 있고, 대부에 name, owner, age 라는 attributes 가 속해있다고 이해할 수 있습니다. 그렇다면, '동산이' 라는 강아지 데이터는 어떻게 표현할 수 있을까요?

const dongsan = new Pet('동산이', '유개발', 12)

console.log(dongsan.name) // '동산이'
console.log(dongsan.owner) // '유개발'
console.log(dongsan.age) // 12

동산이 데이터가 클래스의 instance 하나로 표현되게 됩니다. 결국

테이블 하나 하나는 클래스로 표현되고, 테이블의 컬럼은 클래스의 속성으로 표현되고, 테이블에 입력되어 있는 데이터 하나하나는 각 클래스의 인스턴스로 관리할 수 있습니다.

이렇게 테이블과 컬럼, 그리고 데이터를 클래스(객체)의 특성과 연관지어 사고하는 패러다임을 Object-Relational Mapping, ORM 이라고 합니다.


ORM의 활용

사용하는 ORM 마다 문법은 조금씩 다르지만, 아래에서 예시를 한 번 살펴보겠습니다.

class User extends Model {}
User.init({
  username: DataTypes.STRING,
  birthday: DataTypes.DATE
}, { sequelize, modelName: 'user' });

...

이는 MySQL 내부에 user 이라는 이름의 테이블이 있으며, username, birthday 라는 이름의 컬럼이 있고, 각 컬럼에는 STRING 타입과 DATE 타입의 데이터가 저장될 것이라는 말과 동일합니다.

CREATE TABLE user (
  username VARCHAR(50),
  birthday DATE
)

위 쿼리문을 대체하는 코드가 됩니다. 우리는 이렇게 ORM을 상용하여, 더이상 MySQL에 직접 접속하여 테이블을 생성하고, 저장될 데이터의 타입을 지정하지 않게된 것입니다.


Migrations

코드로 작성한 클래스를 실제 데이터베이스에 테이블로 옮기는 과정migration 이라고 합니다. 모델을 생성하면 ORM이 migration 파일을 생성하고, migration 파일이 데이터베이스에 적용됩니다. ORM에서는 데이터베이스의 구조를 migration file들을 통해 주로 관리합니다.

git으로 코드를 관리하듯, migration file로 데이터베이스의 변경 과정을 관리합니다.


⭐️ 요약

  1. ORMObejct-Relational Mapping의 줄임말로, 데이터베이스의 체계를 객체와 연결지어 생각하는 사고 패러다임입니다.
  2. 데이터베이스는 그대로 유지되고, 데이터베이스의 테이블 하나를 클래스 하나라고 생각하여, 하나씩 대응시켜 데이터를 코드로 관리할 수 있는 시스템입니다.
  3. ORM을 사용하면, 데이터베이스에 쿼리를 직접 날리지는 않고, ORM이 javascript 혹은 다른 언어로 작성된 코드를 MySQL등의 쿼리문으로 번역하여 데이터베이스에 명령을 내리게 됩니다.
  4. 코드로 작성한 모델을 데이터베이스에 적용하는 과정을 migration 혹은 migrate 라고 합니다.
profile
지속적으로 성장하고 발전하는 진취적인 태도를 가진 개발자의 삶을 추구합니다.

0개의 댓글