개발일지 (엔티티)
엔티티는 무엇인가?
엔티티는 핵심 로직이나 모델 구조를 기술한다고 혼자 나름대로 정리해 봤다.
User, 유저 정보를 담고 User와 연결된 Profile, 플랫폼 상에서 판매되는 Product 등 모두 엔티티로 정의할 수 있다.
사실 Django를 하다 왔다 보니 그냥 속으로는 model이랑 똑같은 거! 정도로 정리하고 있다. 물론 Django는 별도의 ORM 없이 behind-the-scene에서 CharField, TextField, BooleanField 등으로 선언한 필드들을 table 상의 column으로 바꿔준다. Node.js는 높은 자유도를 대가로 번거로움은 수반되는 듯하다.
개인적인 엔티티 파일 네이밍 컨벤션
src/data/entities/{name}.entity.ts 형태로 지금 네이밍 컨벤션을 잡은 상태다.
ORM과의 연관성
필자는 TypeORM을 쓰고 있다. TypeORM은 엔티티를 정의한 파일들을 파싱해서 DB schema를 구성할 수 있게 도와준다.
How to ORM
사실 TypeORM에는 자동으로 마이그레이션을 짜주는 좋은 기능이 있다.
Django로 치면 python manage.py makemigrations 정도 되는 기능이다. 다만, 매우 별로다...
npm run typeorm -- migration:generate src/data/migrations/initial 지금 이런 형태의 커맨드를 사용하고 있는데, 뒤에 오는 argument는 마이그레이션을 어디에 생성하고 싶은지 기술하는 용도이다.
실제로 생성되는 팡리 이름은 initial이 아니라, 타임스탬프가 앞에 붙어서 나온다. 실제로 TypeORM 단에서 마이그레이션을 실행할 때 타임스탬프를 읽어서 순서를 정렬한다고 한다.
generate는 스키마를 읽어들여서 자동으로 마이그레이션을 생성해주는 고마운 기능이다.
아주 큰 맹점을 하나 가지고 있는데, ALTER를 못한다. DROP하고 나서 ADD 하는 식으로 무식하게 스키마를 수정하는데 기존에 존재하던 column의 정보가 날아간다.
(varchar 10에서 20으로 바꾼다고 해당 칼럼 내용이 다 날아가버리는 그런 상황)
그래서 이제는 번거롭더라도 create 커맨드를 써서 수동으로 마이그레이션을 생성하려고 한다. 이에 관해선 좀 더 알아보고 글을 적겠다. 사실 임시방편으로는 generate로 생성한 마이그레이션을 수작업으로 검수해서 쓰고 있다.
python manage.py migrate에 준하는 커맨드도 있다.
npm run typeorm -- migration:run를 실행하면 마이그레이션을 일괄로 다 돌려준다.
아직까진 Django처럼 마이그레이션 단위로 fine-grained control을 하게 해주는 방법은 못 찾았다...
롤백하려면 npm run typeorm -- migration:revert 커맨드를 사용하면 된다. 가장 최근 마이그레이션을 롤백한다.
댓글
로그인 후 댓글을 남길 수 있습니다.
아직 댓글이 없습니다.