ORM / Low-Level Query

개요

내가 진행하는 프로젝트의 대부분은 Prisma라는 ORM을 사용하여 DB를 생성, 관리한다. 물론 프리즈마가 ORM이고, 이를 사용하기 위해 어떤 세팅을 해야하며, 무슨 메서드나 문법을 사용하는 지도 잘 안다. 왜냐면 계속 사용해왔으니까!!!

 

그럼 도대체 Prisma를 왜 사용할까? 아니, 분명 현업에서는 대개 Low-Level Query를 사용한다고 알고 있는데,  나는 지금  왜 Low-Level Query를 사용하지 않고 ORM을 사용하고 있을까?

 

솔직하게 말하자면... 그냥 편하고 익숙해서...

 

내가 좋은 개발자가 되기 위해 노력하고, 공부하는데... 사용하는 이유가 고작 '편하고 익숙해서?' 라는 생각이 들자 깊이 반성을 시작했다... 내가 ORM을 쓴다면, 적어도 무슨 차이가 있고, 왜 사용하는지는 확실히 알아야 할 것 아닌가!?

 

따라서 오늘은 ORM과 Low-Level Query가 무엇이고, 무슨 차이가 있는지 알아보는 시간을 가져보자!

 

ORM (Object-Relational Mapping)

객체 지향 프로그래밍 언어(JavaScript, Python 등)와 관계형 데이터베이스(RDBMS)의 테이블 간 매핑을 제공하여, DB 작업을 객체 지향 방식으로 처리할 수 있게 하는 라이브러리나 툴을 의미한다. ORM을 통해 데이터베이스의 테이블과 컬럼이 프로그램 내의 객체와 속성으로 추상화된다. 대표적인 ORM 라이브러리로는 Prisma, Sequelize (JavaScript), TypeORM (TypeScript), Django ORM (Python), Hibernate (Java) 등이 있다.

 

사용이유

 

  • 생산성 향상: 객체와 데이터베이스 간의 매핑을 통해 SQL 작성 없이도 CRUD(Create, Read, Update, Delete) 작업을 쉽게 처리할 수 있어 개발 속도를 높일 수 있다.
  • 가독성: 객체 지향적인 코드로 데이터베이스 로직을 다루기 때문에 코드를 읽고 이해하기가 쉬워진다.
  • 유지 보수성: 스키마 변경과 코드 리팩토링 시 SQL을 일일이 수정할 필요 없이 ORM 설정만 수정해도 되므로 유지 보수가 용이하다.
  • 안전성: ORM은 SQL Injection 공격을 막기 위한 여러 안전 장치를 제공하므로 보안에 강하다.

 

단점

  • 성능 오버헤드: ORM은 SQL을 추상화하기 때문에, 특정 복잡한 쿼리나 조인(join) 작업에서 성능이 저하될 수 있다.
  • 제한된 SQL 기능: ORM이 제공하는 추상화 계층에선 복잡한 SQL 기능(세부적인 조인, 서브쿼리, 윈도우 함수 등)을 구현하기 어려운 경우가 있다.

 

 

Low-Level Query (Raw SQL)

SQL을 직접 작성하여 데이터베이스와 상호작용하는 방식. 보통 query()execute() 같은 메서드를 통해 SQL 문을 직접 전달하여 데이터베이스 작업을 수행한다.

 

사용이유

 

  • 성능 최적화: 복잡한 쿼리( 서브쿼리, 윈도우 함수,  그룹핑 등)나 다중 조인 작업에서, SQL을 직접 작성하여 최적화된 쿼리를 실행할 수 있다.
  • 세부적인 제어: 특정 데이터베이스에서만 지원하는 기능이나 고유한 쿼리 문법을 자유롭게 사용할 수 있다.

 

단점

 

  • 코드 가독성 저하: SQL을 직접 코드에 포함하면 코드가 길어지고 가독성이 떨어질 수 있다.
  • 보안 리스크: SQL을 직접 작성하는 경우 SQL Injection 같은 보안 문제에 취약하다.
  • 유지 보수 어려움: 데이터베이스 스키마 변경 시 SQL 쿼리를 일일이 수정해야 하므로 유지 보수가 어렵다.

 

ORM / Low-Level Query 차이

특성 ORM Low-Level Query
생산성 높은 생산성 제공 쿼리 작성 시간 증가
가독성 객체 지향적 코드로 가독성이 높다 SQL 포함 시 코드가 복잡해질 수 있다
성능 복잡한 쿼리에서 성능 저하 성능 최적화에 유리
유지보수 스키마 변경 시 유지 보수 쉽다 쿼리마다 수정이 필요
보안 ORM 기본 보안 제공 직접 관리 필요 (SQL Injection 위험)
복잡한 쿼리 지원 일부 제한 복잡한 쿼리 및 특수 기능에 최적화

 

 

 

 

ORM / Low-Level Query 혼합 사용

대부분 ORM을 사용하면서도 특정한 복잡한 쿼리나 성능이 중요한 부분에서 Low-Level Query를 사용하는 방식으로 혼합하여 사용이 가능하다.

 

기본적인 CRUD 작업은 ORM을 사용하여 관리하고, 성능이 중요한 대규모 집계 쿼리, 복잡한 다중 조인, 세부적인 최적화가 필요한 작업은 Low-Level Query를 사용하여 두 방식을 조합하면 생산성, 유지 보수, 성능 측면에서 최적의 균형을 맞출 수 있다.

 

 

'Side Projects' 카테고리의 다른 글

redis / ioredis 패키지 비교  (1) 2024.11.18
TCP Multi-Player - 트러블 슈팅  (0) 2024.11.05
Protocol Buffers?  (4) 2024.10.24
Text-RPG(CLI) - 트러블슈팅  (1) 2024.10.22
모듈 시스템에서 변수 바인딩 방식  (0) 2024.10.11