ORM

Object-Relation Mapping의 약자이다.

도메인 모델을 사용하는 것이 Obeject

데이터베이스에 있는 테이블이 Relation

을 나타낸다고 생각하면 된다.

Hibernate나 JPA같은 ORM tool을 사용하는 방법은 간단하게 아래와 같다.

// 도메인 모델
Account account = new Account("junseo", "pass");
accountRepository.save(account);

JDBC와 달리 이렇게 도메인 모델을 사용해서 코딩을 하고, 이 객체를 자동으로 sql 데이터베이스에 영속화를 시켜주는 ORM을 사용하는 이유는 도메인 모델 기반으로 코딩하는 것이 훨씬 편하기 때문이다.

  • 객체 지향적 프로그래밍에 유리
  • 각종 디자인 패턴 사용 가능
  • 코드 재사용성이 좋음
  • 비즈니스 로직 자체에 집중하기 좋음
  • 테스트 코드 짜기가 쉬움
  • 유지 보수성이 좋음

위의 이유들로 도메인 모델을 사용하는 것이 JDBC보다 편하고, 따라서 그걸 가능하게 해주는 ORM을 사용하는 것이다.

ORM이란?

애플리케이션의 클래스와 SQL 데이터베이스 사이의 맵핑 정보를 기술한 메타 데이터를 사용하여, 자바 애플리케이션의 객체를 SQL 데이터베이스 테이블에 자동으로 깨끗하게 영속화해주는 기술이다.

장점 & 단점

장점

  • 생산성(매핑 정보를 정의만 하면, 쉽고 빠르게 데이터를 넣고 뺄 수 있다)
  • 유지보수성(코드가 간결해진다)
  • 성능(캐시를 사용, 성능 최적화 제공)
  • 밴더독립성(Direct만 생성해주면, 자동으로 해당 Direct에 맞는 sql을 생성해서 사용 -> 데이터베이스가 바뀌더라도 소스코드가 바뀌지 않는다.)

단점

  • 학습비용(공부하기 어렵다)

hibernate/jpa와 같은 ORM 밑단에는 jdbc가 있다. 즉 직접 쿼리를 만들어서 사용할 수도 있다.

ORM이 해결하려는 문제들

밀도문제

객체는 다양한 크기의 객체를 만들 수 있고, 커스터마이징 할 수도 있다.

그러나, 릴레이션은 테이블, 기본 데이터 타입 밖에 없다.

서브타입 문제

객체는 상속구조를 만들기 쉽고, 다형성을 이용해 참조하기도 쉽다.

그러나, 릴레이션은 상속이라는 것이 없다. 다형적인 관계를 표현할 수 없다.

식별성 문제

객체는 레퍼런스의 동일성(==), 인스턴스 동일성(equals())을 체크할 수 있다.

릴레이션에서는 다른 두 레코드간의 동일성은 primary key가 핵심이다. primary key로 동일성을 체크한다.

관계문제

객체쪽에서의 관계를 레퍼런스로 표현(ex. 레퍼런스 멤버변수 선언)이 된다. 그리고 그 관계에는 '방향'(ex. Study에서 User를 참조)이있다. List나 Set등을 사용하여 '다대다' 관계도 표현할 수 있다.

릴레이션에서는 오로지 외래키로만 관계를 표현할 수 있다. 방향도 없다.(사실상 Join을 이용한 양방향). '다대다'를 표현할 수도 없다.

데이터 네비게이션의 문제(가장 복잡하고, 성능에 영향을 많이줌)

객체에서는 레퍼런스를 타고, 원하는 데이터를 원하는 방법으로 사용가능하다.

그러나 릴레이션에서는 불가능하다. sql을 여러번 사용하면, 성능이 저하된다. 성능을 높이고 싶으면 가능한 한 트랜잭션 내에서 발생하는 쿼리를 줄여야한다. 매번 원하는 정보를 join해서 가져오거나 하는 것도 문제다. join한 모든 데이터를 쓰지 않기 때문에 비효율적이다. lazy loading도(n+1 select 문제) 좋은 방법은 아니다.

이런식으로, 객체와 릴레이션 패러다임은 많이 다르다. 둘 사이의 갭이 크다. ORM은 이 갭을 줄이고, 활용할 수 있게 노력하는 것이다.

0개의 댓글