이전에 Django를 사용하면서 ORM에 대해 글을 남긴 적이 있었는데, 그 때는 ORM이 무엇인지, 어떻게 사용하는 것인지만 써서 ORM의 장,단점을 정리해보려고 한다.
Object Relational Mapping
: 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 도우미 역할을 한다.
1) 완벽한 객체지향적인 코드 -> 직관적인 이해가 쉬움
: ORM을 이용하면 SQL문이 아닌 클래스의 메서드를 통해 데이터베이스를 조작할 수 있어, 개발자가 객체 모델만 이용해서 프로그래밍을 하는 데 집중할 수 있게한다. SQL 문을 사용하면서 같이 필요한 선언문, 할당, 종료 같은 부수적인 코드가 사라지거나 줄어들며, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높일 수 있다. 객체지향적 접근과 SQL의 절차적/순차적 접근이 혼재되어있던 기존 방식과 달리 오직 객체지향적 접근만 고려하면 되기때문에 생산성이 증가한다.
2) 재사용, 유지보수, 리팩토링의 용이성
: ORM을 통해 작성한 객체를 재활용할 수 있다는 측면에서 재사용 및 유지보수의 편리성이 증가함
3) DBMS(DataBase Management System) 종속성 하락
:객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하고, 객체의 자료형 타입까지 사용할 수 있기 때문에 RDBMS의 데이터 구조와 객체지향 모델 사이의 간격을 좁힐 수 있다. 객체에만 집중할 수 있기 때문에 DBMS를 교체하는 큰 작업에도 리스크가 적고 드는 시간도 줄어든다. 예들 들어 자바에서 가공할 경우 equals
, hashCode
의 오버라이드 같은 자바의 기능을 이용할 수 있고, 간결하고 빠르게 가공할 수 있다.
1) ORM이 모든 걸 해결해줄 수 없다. -> 적절하게 SQL문을 사용할 수 있어야한다.
: 프로젝트의 복잡성이 커질 수록 난이도도 올라가고 부족한 설계로 잘못 구현되었을 경우 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있다. 또한 일부 자주 사용되는 대형 SQL문은 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있다.
2) 복잡한 쿼리문의 경우 오히려 SQL문으로 사용이 직관적이면서 효율적일 수 있다.
▷ 많은 수의 레코드에 대해 잦은 빈도로 벌크 업데이트를 수행하는 애플리케이션
- OLAP 애플리케이션
▷ 데이터 마이닝을 위해 사용되는 어플리케이션에서는 이미 데이터를 본래의 엔티티 상태로 사용하기 어렵다.
- 데이터의 인출 및 업데이트를 위해 핸드코딩으로 작성된 SQL 및 저장 프로시저를 이용하는 데이터베이스 환경
이 경우 JDBC 기반의 접근 방법이 최선의 선택이 될 수 있다. iBATIS SQL Maps 역시 이러한 환경에서 빛을 발한다
하지만 몇몇 ORM 제품은 기존 스키마 및 저장 프로시저와 효과적으로 연동될 수 있으므로, 이러한 환경에서도 ORM의 사용을 고려할 가치가 있다.
▷ 순수 SQL 기반 접근 방법을 적용하는 것이 적절한 애플리케이션
- 비즈니스 로직의 대부분이 데이터베이스에 이미 구현되어 있거나, 데이터베이스 무결성 제약( integrity constraint )이 적용되어 있는 경우 등을 그 예로 들 수 있다. 이러한 애플리케이션에서는 오브젝트 또는 ORM의 활용 여지가 매우 적으며, 데이터베이스 테이블을 도메인 오브젝트로 모델링 함으로써 기대할 수 잇는 효과가 거의 없다.
잘보고갑니다 👍