Migration으로 똑똑하게 DB 관리하기

김지현·2021년 6월 23일
2

backend

목록 보기
1/3
post-thumbnail

이 글을 이해하기 위해서는 우선, database에 대한 전반적인 기초 지식이 필요하다.

부족한 내용은 차차 추가할 예정.

데이터 베이스 (DB)란?

  • 데이터 베이스란, 통합되어 관리되는 데이터 집합체이다. 즉, 우리가 사용하는 정보의 총 집합이라고 할 수 있다.
  • 데이터 베이스를 통해 중복된 데이터를 없애고, 자료를 구조화하여 효율적으로 관리될 수 있도록 한다.
  • 데이터 베이스는 응용 프로그램과는 다른 별도의 미들웨어에 의해 관리된다.
  • 데이터 베이스 관리 시스템 (DBMS, Database Management System) 으로 관리된다.

데이터 베이스 (DB)를 왜 사용할까?

📚 오랜 기간 동안 데이터를 저장하고 보존하기 위해 사용한다. 컴퓨터를 껐다 키면 바로 사라져 버리는 휘발성의 메모리와는 다르게, 데이터 베이스는 필요한 자료를 지속적으로 보관한다. 따라서 데이터 베이스를 통해 다시 필요한 데이터들을 읽어들일 수 있는 것이다.

📚 데이터를 체계적으로 보존하고 관리하기 위해 사용한다. 데이터를 가득 쌓아두기만 한다고 해서 좋은 것은 아니다. 필요한 정보만 내가 필요할 때, 찾아서 사용할 수 있는 것이 '의미 있는' 정보라고 칭할 수 있다. 원하는 정보가 체계적으로 보기 쉽게 정리되어 있다면 사용자의 입장에서 아주 편리할 것이다. 따라서 데이터 베이스를 통해 데이터들을 체계적으로 정리하여 보관한다.


Migration

Migration이란 영어 뜻 그대로, 이동하는 것을 말한다.

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

Models -> Migrations -> Database

위 순서로 진행된다.

이제 그럼, 실제로 migration 과정을 진행해보도록 하자.


✔️ mysql, prisma, VSCODE를 사용해서 구현해볼 것이다.

📚 우선 mysql에서 데이터 베이스를 하나 만들어보자.

위 명령어를 통해 'data'라는 이름을 가진 데이터 베이스를 하나 생성한 것이다.
이후 show database를 통해서 잘 생성되었는지 확인 가능하다.

이후 VSCODE에서 원하는 디렉토리 이동 후
prisma 패키지 설치를 한 뒤,
'schema_prisma' 파일로 들어가자.
이곳에서 우리가 원하는 데이터 베이스의 테이블과 컬럼들을 생성해줄 것이다.

mysql과 prisma의 문법은 비슷한 듯 꽤나 다른 점이 많으므로, 유의해서 작성해야 한다. 예를 들면 참조를 하는 방법이나, default key를 지정하는 등에서 처음에는 혼동이 올 수 있지만, 익숙해지면 꽤 쉽다.


📚 'data'라는 데이터 베이스 내에 'users'라는 테이블을 추가해보자.

users라는 모델 내에 id값, users_name, users_english_name, users_favorite_food라는 칼럼들을 추가해주었다.

mysql과 다른 점은, 객체 형식을 따른다. Primary key가 되는 id값을 지정할 시, @id @default(autoincrement()) 구문은 필수적이다. 또한 not null, null을 지정할 때 '?' 기호를 붙이면 null을 허용, 붙이지 않으면 허용하지 않는다.


📚 그런데 만약, users 테이블이 'users_category' 라는 테이블을 참조한다면?
우선 참조를 받는 'users_category'를 users 테이블 위에 새로 생성해보도록 하자.

위와 같이 users_category 테이블을 추가해주었다.
둘은 서로 '참조' 관계이다. users 테이블의 category_id가 users_category의 id를 참조한다. 따라서, category_id는 foreign key가 된다.

이 때, prisma에서는 참조를 하는, 그리고 받는 부분 모두에서 그 사실을 엄격히 표현해주어야 하는데, 참조하는 부분에서는 @relation으로, 참조를 받는 부분에서는 []으로 그 연결 고리를 표현해준다.

이 부분은 mysql과 다소 다른 부분이라고 할 수 있다.


📚 이제 현 상황에서 migration을 진행해보도록 하자.
migration, 즉 database에 현재 상황을 반영해볼 것이다.

✔️ migration은 두 가지 방법이 있다. 한꺼번에 migration 하는 것, 두 가지 과정으로 쪼개서 migration 하는 것.

한꺼번에 한다는 것은 생성한 모델 클래스를 바로 database에 반영한다. 쪼개서 한다는 것은 migration 직전에, 데이터 베이스로 적용되기 전에 우선 'create'만 (without applying) 해둔다는 의미이다. 즉 중간 단계라고 생각하면 되는데, 우선 생성만 해둔 뒤에 데이터 베이스에 반영해야겠다! 라는 상황에서 migration을 해주면 된다.

이 두 가지 방법을 위한 명령어가 존재한다.

npx prisma migrate dev --name create_(이름)_and ...(추가)

npx prisma migrate dev --name create_(이름) --create-only

첫 번째 방법은 한 꺼번에 migration, 두 번째 방법은 쪼개서 migration 한다.

위 방법 중 하나를 선택해서 진행하게 되면, migration.sql 파일이 생성된다. 첫 번째 방법을 통해 migration 하게 된 경우, 데이터 베이스에서 'show tables' 명령어로 확인해보면 잘 migration 된 것을 확인할 수 있다. 만약 두 번째 방법을 택했다면, migration이 필요한 시점에

npx prisma migrate dev

명령어를 통해서 migration을 진행해준 뒤, 데이터 베이스에서 확인해볼 수 있다.

✨ 위 과정을 모두 마쳤다면, 성공적인 migration을 실행한 것이다!


개인적으로 git에서 commit을 남기듯, migration 또한 --create-only를 사용하여 필요한 상황에 그때 그때 migration 해주는 것이 데이터 관리에 더 편리하다고 생각한다.

참고 문헌 (prisma 공식 문서) https://www.prisma.io/docs/concepts/components/prisma-migrate

profile
나만의 세상을 개척하고 싶은 사람

0개의 댓글