ORM이란??
Object Relational Mapping
- 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
- 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.
- 객체 모델과 관계형 모델 간에 불일치가 존재한다.
- ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.
- 데이터베이스 데이터 <—매핑—> Object 필드
객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
- Persistant API라고도 할 수 있다.
Ex) JPA, Hibernate 등
- EJB 엔티티빈 → 하이버네이트 → JPA ( 표준 인터페이스 ) ( Object Realtional Mapping )
- 하이버네이트 , EclipseLink ( JPA 구현체들 )
즉, JPA는 ORM기술이다. → 엔티티로 작성된 클래스(객체)들을 데이터베이스로 매핑해주는 것!
ORM의 장점
- ORM을 사용하면 객체간의 관계를 매핑해서 테이블로 생성해준다. 이로 인해 개발자는 SQL문을 작성하여 데이터베이스를 구축하는 것이 아니라 오직 비즈니스 로직에 더 집중이 가능하다. 또한 객체 지향적인 코드로 인해 더 직관적인 코드 생성이 가능하다. 이로 인해 코드의 가독성 또한 높아지게 된다.
- 당연히 재 사용성과 유지보수 역시 좋아진다. 이는 객체지향 설계 원칙으로 인한 장점들이다. ORM으로 인해 ERD를 보고 설계를 할 이유가 적어지고 오직 코드에만 집중할 수 있게 된다.
- DBMS에 대한 종속성이 낮아지게 된다. 무슨 말이냐 하면 데이터베이스 설계를 SQL 문을 작성하여 하는 것이 아니라 Java 객체지향 모델을 보고 자동으로 생성되는 데이터베이스이기 때문에 종속성이 낮아지고 오히려 코드에 대한 의존이 높아진다. 개발자는 코드에만 집중할 수 있게 되어 DBMS를 교체하는 작업이 있더라도 비교적 적은 비용과 시간이 투자된다. ( DBMS에 따라 문법이 다른 경우, 테이블 이름을 허용하는 경우가 다르지만 이 정도의 비용만 투자된다. )
ORM의 단점
-
ORM 만으로는 서비스를 구현하기 어려울 수 있다. 프로젝트의 규모가 커질수록 객체 간의 관계 역시 복잡해 질 수 있는 데, 이는 높은 난이도로 이어진다. 잘못 구현되는 경우, 이는 속도 저하로 이어지고 심각한 경우에는 서비스 불능으로 이어진다.
-
임피던스 불일치 (Impedance mismatches)
- 기존 관계형 데이터베이스의 SQL과 프로그래밍 언어 사이에 데이터 구조, 기능 등의 차이로 발생하는 충돌을 발생시킨다. 프로그래밍 언어와 SQL 언어의 차이에서 오는 간극의 특징에는 크게 5가지가 있다.
- 1.세분성(Granularity)
- 데이터베이스의 테이블 수 보다 더 많은 클래스가 있는 객체 모델이 있을 수 있다. 만약 멤버라는 클래스가 있다고 생각하면 데이터베이스에도 역시 멤버 테이블이 생성된다. 그런데 우리는 멤버라는 클래스가 모든 필드를 갖고 있게 설계하지 않는다. 만약 주소 정보가 있다면 국가, 시, 도로주소 등을 임베디드 타입으로 선언하고 이를 클래스로 만들기도 한다. 테이블은 하나지만 클래스가 두 개인 불일치가 발생한다.
- 2.Inheritance(상속)
- 객체지향 언어의 가장 큰 특징 중 하나인 상속이 데이터베이스 언어인 SQL에는 없다.
- 3.동일성(Identity)
- 관계형 데이터베이스에서는 기본적으로 데이터를 PK를 통해 관리한다. PK가 식별자가 되는 것인데 PK 가 같다면 같은 데이터가 되는 것이다. 프로그래밍 언어에는 동일성을 두 가지로 분류한다. 내용이 일치하는 경우, 객체의 주소가 아예 같아 같은 객체인 경우
- 4.연관성(Associations)
- 객체지향 언어에서는 단방향 참조로 이루어진다. ( 그렇게 하지 않으면 사이클이 생겨서 오류가 발생한다. ) 그러나 관계형 데이터베이스에서는 FK를 사용하여 양방향 참조를 지원한다.
- 5.데이터 탐색(Data navigation)
- 객체지향 프로그래밍 언어에서는 데이터를 탐색할 때, 객체에서 객체를 참조하는 그래프 방식으로 이어나가면서 탐색을 하게 된다. 관계형 데이터베이스에서는 SQL 쿼리를 최소화하기 위해서 연결되어 있는 데이터들을 JOIN을 통해 모두 가져온 후 탐색을 실시한다.
레퍼런스
[DB] ORM이란 - Heee's Development Blog