본문 바로가기
Python/API

ORM vs SQL Mapper

by JONGSKY 2022. 11. 5.
728x90
SMALL

1. 글을 작성하게 된 이유

 

Rest API를 만들면서 생겨난 이슈사항이다.

 

Rest API 설명 이미지

 

FastAPI를 이용해 request가 왔을 때  response를 해주는 Rest API를 만들고 있었다.

response를 위해서는 기존에 만들어진 db(mysql)에서 데이터를 가져와

미리 만들어진 분석 코드를 실행시켜 데이터 분석 결과를  결과값으로 응답해주어야 했다.

 

이때 기존에 만들어진 db에서 데이터를 어떻게 가져와야 할까 라는 고민이 생겼다.

ORM이 좋은 방법일까 아니면 SQL Mapper가 좋은 방법일까

장단점에 대해 비교해보자.

 

2. ORM vs SQL Mapper

 

ORM 이란?

 

ORM(Object-relational mapping)을 단순하게 표현하면 객체와 관계와의 설정이라 할 수 있다. OOP(Object Oriented Programming)에서 쓰이는 객체라는 개념을 구현한 클래스와 RDB에서 쓰이는 테이블을 자동으로 매핑하는 것이다. 객체 모델이 관계형 모델에 매핑되며 생길 수 있는 불일치 문제는 객체 간의 관계를 표현하여 해결한다.

즉, ORM을 이용해 객체관의 관계를 표현해 SQL문을 작성하지 않고 RDBMS를 조작할 수 있다.

 

 

ORM의 장점

  • 객체 모델만을 이용하여 객체지향적으로 프로그래밍을 할 수 있다.
  • SQL을 직접 작성하지 않아도 된다. (개발 시간 단축)
  • 유지보수 용이 (스키마의 수정이 필요할 때, 단순히 클래스를 수정하면 DB에 반영된다.)
  • DBMS 종속성이 줄어듦 (DBMS를 고려하지 않고 객체를 중심으로 개발한다.)

ORM의 단점

  • 데이터의 관계가 복잡할수록 구현하기 어렵다.
  • 복잡한 SQL문을 처리하기가 어렵다.
  • 객체 - 관계 간의 불일치가 발생할 수 있다. (세분성, 상속성, 일치, 연관성, 탐색)

N+1 Problem

ORM에서 성능 이슈가 발생하면 가장 흔한 원인으로 N+1 Problem이 언급된다.

ORM의 연관 관계에서 발생하는 문제로, 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수(N) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 된다.

예를 들어 사용자는 여러 개의 상품을 가지고 있을 수 있기 때문에 User 와 Product 엔티티가 1 : N 관계로 설정되어 있다고 가정해보자.
특정 유저를 조회했을 때 (SELECT 1번), 해당 유저와 관련된 상품을 N 번 더 조회하게 된다(SELECT N번).

 

 

SQL Mapper 란?

 

SQL을 직접 작성하여, SQL문과 객체(Object)의 필드를 매핑하여 데이터를 객체화하는 것이다.

 

SQL Mapper의 장점

  • JDBC를 사용했을 때 발생하는 불필요한 코드들을 줄일 수 있다.
  • SQL이 코드와 분리되어 있기 때문에 유지보수가 편한다.
  • SQL 쿼리를 그대로 사용하기에 복잡한 JOIN, 튜닝 등을 좀 더 수월하게 작성 가능하다.
  • 동적 쿼리 생성에 유용하다.

SQL Mapper의 단점 

  • SQL 구문을 직접 작성해야 한다. (db설정 변경 시 수정할 부분이 많음.)
  • 유지보수 하락 (객체 모델, 관계 모델 각각 개발해야 한다.)
  • DBMS의 종속성 (Oracle, MS SQL, My SQL 등등)

 

3. 결론

 

분명 SQL Mapper와 ORM은 상반되는 여러 가지 장단점이 있다.

 

내 상황으로 비춰보면 나의 선택은 ORM을 사용해보는 것이다.

 

과거 django로 ORM을 사용했던 경험이 있는데 굉장히 가독성이 좋고 편리했다.

 

또한 현재 개발이 필요한 부분이 여러 번의 분석 코드를 돌려야 하는데

이때마다 같은 쿼리문을 작성해줘야 하는 번거로움이 있으며

SQL Mapper 사용 시 session을 언제 열고 닫아야 할 지에 대한 내용이 추가되어야 하기 때문에

가독성이 굉장히 떨어질 것이라고 생각한다.

 

데이터 파트 개발에 있어서 협업을 하는 중이기 때문에

그리고 추후 다른 사람이 코드를 보는 것을 고려해 ORM으로 개발하는 것을 선택했다.

 

728x90
LIST