본문 바로가기

Development/Tip

[Spring] ORM

ORM (Object Relational Mapping)

  • 객체 지향 언어에서 의미하는 객체와 RDB(Relational Database)의 테이블을 자동으로 매핑하는 방법
  • 보통 객체는 클래스를 의미하는데, 데이터베이스의 테이블과 클래스는 불일치가 존재할 수 있음
  • ORM이 이 둘의 불일치와 제약사항을 해결함
  • ORM을 이용하면 쿼리문 작성이 아닌 코드(메서드)로 데이터를 조작할 수 있음

ORM의 장점

ORM을 사용하면서 데이터베이스 쿼리를 객체지향적으로 조작할 수 있음
  • 이는 쿼리문 작성의 양이 현저히 줄어 개발 비용 감소
  • 객체지향적으로 데이터베이스에 접근하여 코드의 가독성을 높임
재사용 및 유지보수가 편리
  • ORM을 통해 매핑된 객체는 모두 독립적으로 작성되어 있어 재사용이 용이
  • 객체들은 각 클래스로 나뉘어 있어 유지보수가 수월
데이터베이스에 대한 종속성이 줄어듬
  • ORM을 통해 자동 생성된 SQL문은 객체를 기반으로 데이터베이스 테이블을 관리하기 때문에 데이터베이스에 종속적이지 않음
  • 데이터베이스를 교체하는 상황에서도 비교적 적은 리스크를 부담

ORM의 단점

ORM의 한계
  • 복잡한 서비스일 수록 직접 쿼리를 구현하지 않고 코드로 구현하는 것엔 한계가 있음
  • 복잡한 쿼리를 정확한 설계 없이 ORM으로만 구성하게 되면, 속도 저하와 같은 성능 문제가 발생할 수 있음
객체 관점과 데이터베이스 관계 관점의 불일치
  • 세분성(Granularity): ORM의 자동 설계 방법에 따라 데이터베이스에 있는 테이블 수와 애플리케이션의 엔티티 클래스 수의 불일치가 발생하여 클래스가 수가 더 많아질 수 있음
  • 상속성(Inheritance): RDBMS에는 상속이라는 개념이 없음
  • 식별성(Identity): RDBMS는 기본키(Primary key)로 동일성을 정의하지만, 자바의 경우 두 객체의 값이 같아도 다르다고 판단할 수 있음
  • 연관성(Associations): 객체지향 언어는 객체를 참조함으로써 연관성을 나타내지만, RDBMS에서는 외래키(foreign key)를 삽입함으로써 연관성을 표현함. 
  • 방향성: 객체지향 언어에서 객체를 참조하면 방향성이 존재하는데, 데이터베이스에서는 양방향의 관계를 가지기 때문에 방향성이 없음
    예를 들어, '사람' 객체가 '차' 객체를 참조할 수 있지만, 반대로 '차' 객체가 '사람' 객체를 자동으로 참조하지는 않는다.
    반면에 관계형 데이터베이스에서는 '사람' 테이블과 '차' 테이블이 연결되어 있다면, '사람'에서 '차'로의 참조뿐만 아니라 '차'에서 '사람'으로의 참조도 가능
  • 탐색(Navigation): 자바와 RDBMS는 어떤 값(객체)에 접근하는 방식이 다름
    예를 들어, 어떤 멤버의 회사 주소를 구하기 위해 자바에서는 member.getOrganization().getAddress() 와 같이 접근하지만
    RDBMS에서는 쿼리문으로 JOIN을 사용해 여러 테이블을 로드하여 값을 추출하는 접근 방식을 사용함

참고 자료

스프링 부트 핵심 가이드 "스프링 부트를 활용한 애플리케이션 개발 실무" , 장정우, 2022