SQL -> TypeORM 적용해보기

정재헌·2023년 2월 25일
0

Database

목록 보기
2/6

프로젝트 때는 쌩쿼리문으로만 데이터베이스의 데이터를 CRUD 했다. 프로젝트 리팩토링을 해보면서, TypeORM을 사용하여 쿼리문을 작성해보았다.

왜 SQL?

SQL은 Structured-Query-Language로 관계형 데이터베이스의 데이터를 관리하기 위해 설계된 프로그래밍 언어이다.

관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 만들어졌으며, 많은 수의 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택하고 있다고 한다.

그렇다면 ORM은 무엇인가?

ORM은 Object-relational-mapping으로 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법이다. 객체 지향 언어에서 사용할 수 있는 '가상' 객체 데이터베이스를 구축하는 방법이라고 한다.

즉, 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용하기 때문에 불일치가 존재하는데, ORM을 통해서 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치 문제를 해결함으로 호환되지 않는 문제를 해결해준다고 한다.

ORM에는 어떤 종류들이 있는지?

어떤 종류의 런타임 환경을 사용하느냐에 따라 다르다고 한다. 여기서는 Node.js를 기반으로 한 ORM의 종류들에 대해서 알아보고자 한다. 정말 다양한 ORM이 있다고 하는데, 대표적으로는 TypeORM / Sequelize / Prisma가 있다고 한다. 공식문서를 기준으로 이 3가지에 대해서만 간략하게나마 나눠보겠다.

  1. TypeORM

TypeORM은 NodeJS, Browser, Cordova, PhoneGap, Ionic, React Native, NativeScript, Expo 및 Electron 플랫폼에서 실행할 수 있고 TypeScript 및 JavaScript(ES5, ES6, ES7, ES8)와 함께 사용할 수 있는 ORM이다.

TypeORM의 목표는 항상 최신 JavaScript 기능을 지원하고 몇 개의 테이블이 있는 소규모 응용 프로그램에서 여러 데이터베이스가 있는 대규모 엔터프라이즈 응용 프로그램에 이르기까지 데이터베이스를 사용하는 모든 종류의 응용 프로그램을 개발하는 데 도움이 되는 추가 기능을 제공하는 것이라고 한다.

TypeORM은 현재 존재하는 다른 모든 JavaScript ORM과 달리 Active Record 및 Data Mapper 패턴을 모두 지원하며, 이는 고품질의 느슨하게 결합된 확장 가능하고 유지 관리 가능한 응용 프로그램을 가장 생산적인 방식으로 작성할 수 있다는 것을 의미한다.

TypeORM은 Hibernate, Doctrine 및 Entity Framework와 같은 다른 ORM의 영향을 많이 받았다고 한다.

  1. Sequelize

Sequelize는 Oracle, Postgres, MySQL, MariaDB, SQLite 및 SQL Server 등을 위한 최신 TypeScript 및 Node.js ORM이다. 견고한 트랜잭션 지원, 관계, 열망 및 지연 로딩, 읽기 복제 등을 제공한다.

  1. Prisma

Prisma는 직관적인 데이터 모델, 자동화된 마이그레이션, 유형 안전성 및 자동 완성 덕분에 데이터베이스 작업 시 새로운 수준의 개발자 경험을 제공한다.

ORM 사용의 장점과 단점

이에 대해서는 정말 다양한 의견들이 있을 것 같다는 생각이 들었다. 여기서는 개인적으로 코드로 적용해보면서 느낀 점들에 대해서 나눠보고자 한다.

장점

  1. 코드가 간결해지면서 생산성이 향상된다.
  2. 객체 지향적인 코드 작성이 이뤄진다. (Object에 더 집중..?)

단점

  1. 복잡한 로직을 처리해야 하는 경우에는 오히려 raw query가 더 좋을 때가 있다.
  2. 사용법에 대한 숙지도 필요하며, 어떤 부분에서는 디버깅 하기가 더 어려웠다.

코드 적용해보기

실습 환경

리팩토링 전 : Javascript / MySQL / dbmate(migration tool) / TypeORM(+raw query)
리팩토링 후 : TypeScript / MySQL / TypeORM

<리팩토링 전 코드-userDao.js>

<리팩토링 후 코드-userRepository.ts>

<리팩토링 전 코드-postDao.js>

<리팩토링 후 코드-postRepository.ts>

profile
백엔드 개발자

0개의 댓글