Evans Benedict
deVlog
Evans Benedict
전체 방문자
오늘
어제
  • * deVlog (7)
    • Daily (1)
    • Issues (0)
    • Ideas (1)
    • Coding (3)
      • JavaScript (2)
      • PHP (0)
      • C# (0)
      • Python (0)
      • Git (1)
    • Hacking (0)
    • ETC (2)
      • Databases (2)
      • Designs (0)
본 블로그는 hELLO 템플릿을 활용하여 제작되었습니다.
Evans Benedict

deVlog

[Database] ORM 원리 및 장단점 이해하기
ETC/Databases

[Database] ORM 원리 및 장단점 이해하기

2024. 1. 5. 14:52

이번 포스팅부터는 썸네일을 직접 만들어 넣기로..

시작하며

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의 작동 원리

  1. 객체 모델 생성: 애플리케이션의 데이터 구조를 코드 내에서 객체로 표현함.
  2. 스키마 매핑: 생성한 모델을 DBMS Schema에 매핑. 이 과정에서 Table, Column, Constraints 등이 정의됨.
  3. 쿼리 변환: 개발자가 작성한 코드를 이용해 ORM에서 SQL 쿼리로 변환함.
  4. 결과 매핑: 만들어진 쿼리를 실행하고, 그 결과를 다시 객체화하여 반환하면 코드에서 그 결과를 사용할 수 있게 됨.

위와 같은 방법으로 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
    'ETC/Databases' 카테고리의 다른 글
    • MySQL RDBMS에 대한 간단한 개념 훑어보기
    Evans Benedict
    Evans Benedict
    Hello there 👋 I'm full-stacked web engineer from South Korea. Contains daily posts, develop logs and something else.

    티스토리툴바