본문 바로가기

DEVELOPER/Database

[데이터베이스] ORM(Object Relational Mapping)에 대해서 알아보기


안녕하세요😎 백엔드 개발자 제임스입니다 :)

이번에 포스팅할 내용은 ORM입니다.

우리가 웹을 개발한다면 데이터베이스를 다루게 되는데, 이때 대부분 ORM이라는 용어를 접하게 됩니다. 그래서 이번 포스팅을 통해 이러한 ORM이 무엇이며, 어떠한 장단점이 있는지 알아보도록 하겠습니다.


ORM (Object Relational Mapping)


ORM은 Object Relational Mapping의 약자로, [객체-관계 매핑]을 의미합니다.

다시 말하면, OOP(Object Oriented Programming)에서 사용되는 객체라는 개념을 구현한 클래스관계형 데이터 베이스(RDBMS)에서 사용되는 테이블을 자동으로 연결하는 것을 말합니다.

(왼) 객체 표현 방식 , (오) 데이터베이스 테이블 표현 방식

위 그림에서 왼쪽은 Member 객체를 표현한 방식, 오른쪽은 데이터베이스의 테이블을 표현한 방식입니다. 이와 같이 클래스와 테이블은 형태가 다를뿐더러, 기존부터 호환가능성을 염두하고 만들어진 것이 아니기 때문에 매핑 과정에서 불일치가 발생합니다. 즉, 클래스에서 작성한 내용과 테이블에서 표현되는 정보에 오차가 발생할 수도 있습니다.

하지만 ORM은 객체 간의 관계, 테이블 구성 등에 대한 SQL 문을 자동으로 생성하는데요. 덕분에 객체와 관계형 데이터베이스와 매핑이 되고, 불일치도 해결할 수 있게 됩니다.

 

Java의 ORM 프레임워크 : JPA / Hibernate
JPA(Java Persistence API)는 자바의 ORM 기술 표준으로 인터페이스의 모읍입니다. 그리고 이러한 JPA를 구현한 구현체가 바로 Hibernate입니다.

객체-관계 간의 불일치


1) 세분성(Granularity)
2) 상속 성(Inheritance)
3) 일치(Identity)
4) 연관성(Associations)
5) 탐색(Navigation)

1) 세분성 (Granularity)

이 경우는 데이터베이스의 테이블 수보다 클래스 모델이 많은 경우를 말합니다. 가령 OOP(객체지향 프로그래밍)에서는 코드 재사용과 유지보수를 위해 Person과 Addres라는 두 클래스로 세분화하여 관리합니다. 반면, 데이터베이스는 person이라는 하나의 테이블에 사용자의 세부사항을 모두 저장할 수 있습니다. 이때 객체(Object)는 2개이나, 테이블(Table)은 한 개가 됩니다.

2) 상속성 (Inheritance)

OOP(객체지향 프로그래밍)에서는 상속 개념이 있으나, 관계형 데이터베이스에서는 상속 개념이 없습니다. 따라서 해당 테이블의 상속 관례를 표현하기가 쉽지 않게 됩니다.

3) 일치 (Identity)

RDBMS에서는 기본키(Primary Key, 식별자)를 통해서 동일한 개념(데이터)인지 정의할 수 있습니다. 하지만 객체에서는 주소 값이 같은지를 체크해야 하기 때문에 (a==b) 뿐만 아니라 (a.equals(b))를 모두 정의해야 합니다.

4) 연관성 (Associations)

중요한 포인트입니다. 관계형 데이터베이스에서는 테이블 간의 조인 관계(연관성)를 '외래키(Foreign Key)'로 나타냅니다. 반면, 객체지향에서는 외래키라는 개념이 따로 없기 때문에 객체 참조(Reference)를 통해서 연관성을 나타냅니다. 여기서 발생하는 차이가 있습니다. 만약 객체 간의 관계가 양방향일 경우엔 연관 정보를 두 번 참조시켜야 합니다. 하지만 RDBMS에서는 한 개 Column으로 관계를 나타낼 수 있습니다.

5) 탐색(Navigation)

Java와 RDBMS은 객체를 접근하는 방법이 근본적으로 다릅니다. Java는 그래프 형태로 하나의 연결에서 다른 연결로 이동하며 탐색을 진행합니다. 가령, user.getStamp().getStampCount() 형태로 해당 user가 소지한 도장 개수를 파악할 수 있습니다. 반면, RDBMS에서는 일반적으로 쿼리 수를 최소화하고 JOIN 명령어를 통해 여러 엔티티를 로드하고 원하는 대상을 SELECT 명령어를 통해서 조회(탐색)하는 방식입니다.


ORM의 장단점


장점

  • 완벽한 객체지향적인 코드
  • 재사용, 유지보수, 리팩토링 용이성
  • DBMS 종속성 하락 -> 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하고, 객체의 자료형 타입까지 사용할 수 있음.
  • RDBMS의 데이터 구조와 객체지향 모델 사이의 간격을 축소
객체 모델만을 이용해서 프로그래밍을 하는데 집중할 수 있게 됩니다.
또한 불필요한 코드 로직 작성 비중이 감소합니다. 다시 말하면 복잡한 SQL문을 다룰 필요 없이 entity 작성만으로 객체 간의 데이터 관계를 매핑할 수 있는 것입니다.

 

단점

ORM은 많은 장점이 있습니다. 그렇다고 단점이 없는 것은 아닙니다. ORM을 사용하는 것은 매우 편리하지만 그만큼 신중하게 설계할 필요가 있습니다. 또한 프로젝트의 복잡성이 높아질수록, 난이도 또한 비례하게 됩니다. 자칫 잘못하면, 속도 저하 및 일관성을 무너뜨리는 등 문제가 발생할 수 있습니다.

 

 

반응형