티스토리 뷰
우리는 서비스에 필요한 데이터를 서버의 상태와 관계없이 영구적으로 저장하기 위해 RDBMS라는 도구를 많이 사용합니다. RDBMS는 키 값 하나로 테이블(데이터)간의 관계를 손쉽게 형성하여 데이터를 유기적으로 저장하는데 큰 도움을 줍니다. 하지만 RDBMS의 키를 이용한 관계 설정은 코드레밸에서 데이터들을 사용하는데에 불편함을 주기도 합니다.
OOP에서 객체간의 연관관계는 참조 형태로 이루어 집니다. 예를 들어 어떤 사람이 갖고 있는 음식 찾고자 할 때 다음과 같은 형태로 조회를 하게 될 것입니다.
person.getFood(); // 1
하지만 RDBMS의 경우 다음과 같이 키 값을 이용해 매칭 되는 값을 찾게 되죠.
foods.of(persionId: person.id) // 2 // 모든 음식들 중 특정 사람의 소유인 음식을 조회
ORM은 2번 처럼 작성해야 하는 코드를 1번 처럼 참조를 사용하도록 매핑해주는 도구로서 OOP스럽게 코딩하도록 도움을 줍니다.
장점
- 객체지향적인 코드로 인해 더욱 직관적인 코드 작성이 가능하고, 비지니스 로직에 집중하도록 돕는다.
- 선언문, 할당, 종료 같은 부수적인 코드가 없거나 급격히 줄어든다.
- 각종 객체에 대한 코드를 별도로 작성하기 때문에 코드의 가독성을 올려준다.
- SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 인해 생산성이 증가한다.
- 재사용 및 유지보수의 편리성이 증가한다.
- ORM은 독립적으로 작성되어있고, 해당 객체들을 재활용 할 수 있다.
- DBMS에 대한 종속성이 줄어든다.
- 대부분 ORM 솔루션은 DB에 종속적이지 않다.
- 종속적이지 않다는것은 구현 방법 뿐만아니라 많은 솔루션에서 자료형 타입까지 유효하다.
- 예를 들어 JPA의 표준 구현체인 hibernate의 경우 각 DBMS의 방언에 맞춰 쿼리를 생성한다.
단점
- 완벽한 ORM 으로만 서비스를 구현하기가 어렵다.
- 사용하기는 편하지만 설계는 매우 신중하게 해야한다.
- 프로젝트의 복잡성이 커질경우 난이도 또한 올라갈 수 있다.
- 잘못 구현된 경우에 속도 저하 및 심각할 경우 일관성이 무너지는 문제점이 생길 수 있다.
- 프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵다.
- 이미 프로시저가 많은 시스템에선 다시 객체로 바꿔야하며, 그 과정에서 생산성 저하나 리스크가 많이 발생할 수 있다.
ref.