ORM(Object-Relational Mapping)의 장단점은?

면접 답변

ORM이란 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)하는 도구입니다.

장점으로는 객체지향적인 코드로 인해 직관적이며 로직에 집중할 수 있고, 코드의 재사용성과 유지보수가 용이하다는 것이 있습니다. 또한, DBMS에 대한 종속성이 줄어들어, 다양한 데이터베이스로의 변경이 비교적 용이합니다.

단점으로는 잘못된 설계는 속도 저하와 데이터 일관성 문제를 초래할 수 있으며, 복잡한 프로젝트에서는 관리 난이도가 높아진다는 점, 프로시저가 많은 시스템에서는 객체지향적 접근을 적용하기 어려워 생산성 저하나 리스크가 발생할 수 있다는 것이 있습니다.

따라서 프로젝트의 복잡성에 따라 신중한 설계가 필요합니다.

개념 설명

ORM이란?

  • ORM: 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것

  • 데이터베이스 데이터 ← 매핑 → Object 필드

    • 객체를 통해 간접적으로 데이터베이스 데이터를 다룸

  • 중간계층을 Persistence Layer라 하며, ORM Framework들은 기존의 Entity Bean이 수행하던 Persistence Bridge의 역할을 ORM 패러다임의 Entity 방식으로 가능하게 함

    • Persistant API라고도 함

  • ORM 예시: JPA, Hibernate

    • JPA: 자바의 ORM 기술 표준으로 인터페이스 모음

    • Hibernate: JPA 표준 명세를 구현한 구현체

왜 매핑이 필요한가?

Image
  • 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용함

    → 객체 모델과 관계형 모델 간에 불일치가 존재

불일치가 일어나는 이유는?

  • 세분성: 데이터베이스에 있는 테이블 수보다 더 많은 클래스를 가진 모델이 생길 수 있음

    • ex) 객체지향 프로그래밍에서는 코드 재사용과 유지보수를 위해 두 개의 클래스로 관리하지만 데이터베이스상에는 하나의 테이블에 사용자의 세부 사항을 모두 저장하는 경우가 있을 수 있음

  • 상속성: RDBMS는 객체지향 프로그래밍 언어의 특징인 상속 개념이 없음

  • 일치(Identity): RDBMS는 기본키를 이용해서 동일성을 정의함

    • 자바: 주소값이 같거나 내용이 같은 경우를 구분해서 정의함

  • 연관성: 객체지향 언어는 객체 참조(Reference)를 사용하는 연관성을 나타내는 반면, RDBMS는 연관성을 ‘외래키(Foreign Key)’로 나타냄

  • 탐색: 자바와 RDBMS에서 객체를 접근하는 방법이 근본적으로 다름

    • 자바: 그래프 형태로 하나의 연결에서 다른 연결로 이동하며 탐색함

    • RDBMS: 쿼리수를 최소화하고 조인을 통해 여러 엔티티를 로드하고 원하는 대상 엔티티를 선택하는 방식으로 탐색함

장점

  • 객체지향적인 코드로 인해 더 직관적이고 로직에 집중할 수 있음

    • SQL문이 아닌 클래스의 메서드를 통해 데이터베이스를 조작할 수 있으므로 개발자가 객체 모델만 이용해서 프로그래밍을 하는 데 집중할 수 있음

    • 선언문, 할당, 종료 같은 부수적인 코드가 없거나 줄어듦

    • 객체마다 코드를 별도로 작성하기 때문에 코드의 가독성이 높아짐

    • SQL의 절차적이고 순차적인 접근이 아닌 객체지향적인 접근으로 인해 생산성을 높여줌

  • 재사용 및 유지보수 편리성 증가

    • ORM은 독립적으로 작성되어있고, 해당 객체들을 재활용할 수 있음

    • 매핑 정보가 명확하여, ERD를 보는 것에 대한 의존도를 낮출 수 있음

  • DBMS에 대한 종속성이 줄어듦

    • 대부분 ORM 솔루션은 DB에 종속적이지 않기 때문에 구현 방법뿐만 아니라 많은 솔루션에서 자료형 타입까지 유효함

      • 종속성이란? 프로그램 구조가 데이터 구조에 영향을 받는 것

    • 프로그래머는 Object에 집중함으로 극단적으로 DBMS를 교체하는 거대한 작업에도 비교적 적은 리스크와 시간이 소요됨

    • 또한 자바에서 가공할 경우 equals, hashCode의 오버라이드 같은 자바의 기능을 이용할 수 있고, 간결하고 빠른 가공이 가능함

단점

  • 완벽한 ORM으로만 서비스 구현이 어려움

    • 사용하기는 편하지만 설계는 매우 신중하게 해야함

    • 프로젝트의 복잡성이 커질경우 난이도가 올라갈 수 있음

    • 잘못 구현된 경우에 속도 저하 및 심각할 경우 일관성이 무너지는 문제점이 생길 수 있음

    • 일부 자주 사용되는 대형 쿼리는 속도를 위해 SP를 쓰는등 별도의 튜닝이 필요한 경우가 있음

    • DBMS의 고유 기능을 이용하기 어려움

  • 프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어려움

    • 프로시저가 많은 시스템에선 다시 객체로 바꿔야하며, 그 과정에서 생산성 저하나 리스크가 발생할 수 있음

꼬리 질문

  • ORM에서 데이터베이스 트랜잭션을 관리하는 방법은?

  • ORM을 사용하면 성능이 떨어지나요?

Last updated