시작하며
NodeJS에서 사용되는 ORM 종류 알아보기 (MySQL & MongoDB)
- NodeJS에서는 다양한 데이터베이스를 지원하는 여러 ORM 라이브러리가 사용됨.
- MySQL과 MongoDB는 가장 대표적으로 많이 사용되는 DBMS이다. 따라서 이 둘에 관한 ORM들을 알아보겠음.
- ORM은 그 종류가 엄청나게 많으므로 Javascript 내에서 활용되는 ORM만 비교하여 다루어 보겠음.
ORM이란?
ORM(Object-Relational Mapping)이란 객체 지향 코드를 통해 DBMS에 연결할 때 사용되는 프로그래밍 기법임. 이는 코드 내에 선언된 모델과 DBMS를 직접 매핑하는 방식으로, 개발자가 객체 지향 코드만으로 데이터베이스를 조작할 수 있게 해주는 역할을 함. 이를 통해 복잡한 SQL 쿼리를 작성할 필요 없이, 객체를 통해 데이터베이스의 데이터를 쉽게 조회, 수정, 삭제할 수 있게 도와줌.
ORM(Object-Relational Mapping) 의 종류 및 특성
For MySQL (in Javascript Only)
Sequelize | JavaScript와 TypeScript 모두 지원하며, NodeJS 개발자들 사이에서 널리 사용됨. RDBMS 모델링에 강점이 있음, 여러 DBMS를 지원함. (MySQL 뿐만이 아닌 다른 데이터베이스까지) |
Bookshelf.js | KnexJS 기반으로 만들어진 ORM임. 전체적인 특색은 KnexJS를 따라감. SQL쿼리를 편하게 작성할수 있음. |
Objection.js | KnexJS 기반으로 만들어진 ORM임. RDBMS 설계 및 모델링에 강점을 가짐. 복잡한 쿼리문을 작성하는데 보다 수월하고, 다양한 옵션이 제공됨. 데이터를 많이 다루는 복잡한 프로젝트에 유리함. |
TypeORM | NestJS에서 기본적으로 사용됨, TypeScript 위주로 설계된 ORM임. Decorator를 사용하여 모델링하며, 높은 수준의 추상화와 유연성을 가져 현업에서 많이 사용됨. |
Waterline | SailsJS 프레임워크에서 기본적으로 제공되는 ORM임. 보다 복잡한 구조를 가지는 SailsJS 내에서 쿼리를 편하게 작성할 수 있도록 도와줌. |
For MongoDB (in Javascript Only)
Mongoose | MongoDB 전용으로 만들어진 ORM이다. MongoDB 전용 ORM으로, 스키마 기반의 모델링을 가능하게 하며, 데이터 검증, 쿼리 빌딩, 비즈니스 로직 레이어 등을 제공합니다. |
ORM의 종류별 장/단점
종류 | 장점 | 단점 |
Sequelize | JavaScript와 TypeScript 모두 지원됨. 관계형 데이터베이스 모델링에 적합함. 다양한 데이터베이스 지원. (PostgreSQL, MySQL, SQLite 등) |
복잡한 쿼리 작성에 있어서 타 ORM보다 어려움. 복잡한 데이터를 다룰수록 진입 장벽이 높은 편. |
Bookshelf.js | SQL 쿼리를 유연하게 작성 가능함. 다양한 플러그인과 인터페이스가 제공됨. |
타 ORM에 비해 상대적으로 인지도가 낮음. 복잡한 고급 기능들이 없는경우가 많음. |
Objection.js | 복잡한 쿼리와 모델링에 강점을 가짐. RDBMS 작업에 상대적으로 매우 유연함. |
다른 ORM보다 덜 직관적일 수 있음. 사용사례가 많지 않아 커뮤니티 생태계가 크지 않음. |
TypeORM | TypeScript 프로젝트에서의 높은 호환성을 자랑함. Decorator를 통해 간편하고 빠른 모델 정의가 가능함. 높은 수준의 추상화와 유연성을 지원함. |
초기 설정과 그 외 여러 준비과정이 복잡함. 기존 DBMS에서 마이그레이션하는 과정이 복잡함. 따라서 새로운 신규 프로젝트에서 주로 사용됨. |
Waterline | SailsJS에서 기본 포함되어 코드 통합에 유리함. 어떤 DBMS와 연결해도 동일한 인터페이스 제공됨. |
통합에 유리한 만큼 기능적으로 제한이 큼. 초기 설정이 복잡하고 배우기 어려움. |
Mongoose | MongoDB와 1대1 대응되어 사용성이 견고함. 데이터 구조화 및 검증에 있어서 매우 유리함. |
RDBMS보다는 쿼리 최적화에 있어 현저히 떨어짐. MongoDB 외에 다른 DBMS와는 아예 호환되지 않음. |
ORM은 코드와 DBMS 사이에서 작동되고, 코드만을 가지고 SQL 쿼리를 작성하여 원활하게 DBMS를 컨트롤 할 수 있도록 해줌.
그에 따른 ORM의 기본적인 작동 과정 및 원리에 대해 알아보겠음.
ORM의 작동 원리와 이해
ORM의 작동 원리
- 객체 모델 생성: 애플리케이션의 데이터 구조를 코드 내에서 객체로 표현함.
- 스키마 매핑: 생성한 모델을 DBMS Schema에 매핑. 이 과정에서 Table, Column, Constraints 등이 정의됨.
- 쿼리 변환: 개발자가 작성한 코드를 이용해 ORM에서 SQL 쿼리로 변환함.
- 결과 매핑: 만들어진 쿼리를 실행하고, 그 결과를 다시 객체화하여 반환하면 코드에서 그 결과를 사용할 수 있게 됨.
위와 같은 방법으로 ORM이 SQL 쿼리 작성과 실행, 결과 수집을 도와주게 됨.
ORM 기법 사용에 대한 장/단점
ORM의 장점
- 코드의 간결성 및 가독성 향상: 코드를 통해 객체 지향적으로 접근하여 유지보수하기 쉽고 빠른 개발이 가능해짐.
- 개발 생산성 향상: 업데이트에 따른 스키마의 변경사항을 적용하기 쉬워지고 반복적으로 실행되는 CRUD 작업이 없어짐.
- DBMS 마이그레이션 용이: 여러 DBMS를 오락가락하면서도 코드를 좀 바꿔주는것만으로도 기본적인 로직자체는 둔 채로 코드만으로도 여러 DBMS에 대응할 수 있음.
ORM의 단점
- 성능 저하: ORM은 쿼리 작성부터 그 실행 결과의 수집과 객체화를 담당하는데, 이 과정에서 약간의 성능 저하가 발생될 수 있음. 경우에 따라서는 이 성능 저하가 극대화되게되면 서비스에 큰 영향을 주는 경우도 있기 때문에, 고도화된 로직과 복잡한 SQL 쿼리는 직접 쿼리를 작성하여 실행하는것이 유리할 수 있음.
- 복잡한 쿼리 작성의 어려움: ORM에서는 쿼리를 실행하기 위해 ORM에서 제공되는 인터페이스 안에서 코드를 작성하고 쿼리화 해야하는데, 쿼리가 복잡해지는 경우(Union 문법, Join 문법 등이 복잡하게 얽히는 경우)에는 코드를 통한 쿼리 작성이 어려워질 수 있음.
- 진입 장벽: ORM을 제대로 활용하려면 DBMS에 대한 정확한 이해와 ORM의 작동원리, 순서에 대한 고도화된 이해가 있어야 하는데, 기존 SQL구문을 직접 작성하여 사용하던 개발자가 ORM을 갑자기 도입하려고 하면, 학습 시간이 꽤 소요될 수 있음.
마치며
내게 있어 가장 애착이 가는 ORM은 아무래도 KnexJS인것 같다.
Javascript를 이용한 서버 프로그래밍을 2017년도 말에 시작했는데, 그때부터 내가 프로젝트에 실질적으로 사용한것은 KnexJS로, 그 미묘한 복잡함과 짜증남이 자꾸만 나를 잡아당긴다.. ㅋㅋ
물론 지금은 더욱 편하고 고도화된 NestJS와 TypeORM을 주로 사용한다. 최신기술 최고..
오늘 포스팅에서는 ORM을 통한 DBMS의 웹솔루션 연결 그리고 개발에 대한 장/단점, ORM의 종류와 각 특징 등을 알아보았다.
'ETC > Databases' 카테고리의 다른 글
MySQL RDBMS에 대한 간단한 개념 훑어보기 (0) | 2023.12.26 |
---|