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 표준 명세를 구현한 구현체
왜 매핑이 필요한가?
객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용함
→ 객체 모델과 관계형 모델 간에 불일치가 존재
불일치가 일어나는 이유는?
세분성: 데이터베이스에 있는 테이블 수보다 더 많은 클래스를 가진 모델이 생길 수 있음
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