우리가 흔히 사용하는 TypeORM, prisma, sequelize 등을 ORM이라고 부른다. ORM이라고 부르고 라이브러리를 설치해서 사용하게 되는데 이 ORM이라는게 무엇이고, 어떠한 장단점이 있는지 알아보자
ORM(Object-relatinal mapping)이란 객체(클래스)와 관계(관계형 데이터 베이스)와의 설정으로, 객체 지향 프로그래밍은 클래스를 사용하고 관계형 데이터 베이스는 테이블을 사용한다. 여기서 객체 모델과 관계형 모델간에 불일치가 존재 하는데 이 객체간의 관계를 바탕으로 SQL을 자동 생성하여 불일치를 해결 하는 것(Object와 DB의 관계를 매핑), 즉 우리가 만든 "객체"에 맞춰 SQL을 자동 생성해 데이터와 "동기화"시키는 일을 하는 것이 ORM이다.
"객체간의 관계를 바탕으로 SQL을 자동 생성하여 불일치를 해결 하는 것" 또는 "불일치를 해결 하기 위해 사용하는 툴"이라고 볼 수 있다.
객체 지향적 코드로 인해 더 직관적이고 비즈니스 로직에 집중할 수 있도록 도와준다.
-CRUD을 위한 긴 SQL 문장을 작성할 필요가 없다.
-각 객체(Model)별로 코드를 작성하여 가독성을 높여준다
-SQL의 절차적 접근이 아닌 객체적 접근으로 생산성을 높여준다
재사용 및 유지보수의 편리성이 증가한다.
-매핑 정보가 명확하며 ERD를 보는 것에 대한 의존도를 낮출 수 있다.
-ORM은 독립적으로 작성이 되어 있고 해당 객체들은 재사용이 가능하다.
DBMS에 대한 종속성이 줄어든다. (*종속성: 프로그램 구조가 데이터 구조에 영향을 받음)
-개발자는 Object에 집중함으로 DBMS를 교체하는 극단적인 작업에도 비교적 적은 리스크와 시간이 소요된다.
ORM만으로는 구현하기가 어려울 수 있다.
-사용은 편하지만 설계에는 매우 신중해야한다.
-프로젝트의 복잡성이 높아질 경우 난이도 또한 올라갈 수 있다.
-잘못 구현된 경우 속도 저하 및 심한 경우 일관성이 무너지는 문제점이 생길 수 있다.
프로시저가 많은 시스템에서는 QRM의 객체 지향적인 장점을 활용하기 어렵다.
-이미 프로시저가 많은 시스템에서는 다시 객체로 바꿔야 하며, 그 과정에서 생산성 저하 또는 리스크가 발생할 수 있다.
ORM을 사용한다고 하여 반드시 ORM에서 제공하는 코드만 사용할 필요는 없다. 일부 ORM에서는 SQL문을 작성하기 위한 query문을 쓸 수 있도록 메소드를 제공한다. (ex : sequelize.query()) 상황에 맞게 ORM에서 제공하는 메소드도 사용하고, 단점 보안을 ORM만으로 위한 구현하기 SQL문은 직접 작성하여 복합적으로 사용하는 것이 더 좋을 것이다.