본문 바로가기
DB

[DB] ORM, 장단점, 종류 질문, 답변

by 오렌지마끼야또 2023. 5. 10.
728x90
반응형

 

 

 

 

 

ORM이란

  • Object Relational Mapping, 객체-관계 매핑
  • 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.
  • 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.
  • 객체 모델과 관계형 모델 간에 불일치가 존재한다.
  • ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결한다.
  • 데이터베이스 데이터 <—매핑—> Object 필드
  • 객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
  • Persistant(영속) API라고도 할 수 있다.
  • Ex) JPA, Hibernate 등




객체-관계 간의 불일치

Granularity(세분성)

  • 경우에 따라 데이터베이스에 있는 해당 테이블 수보다 더 많은 클래스를 가진 객체 모델을 가질 수 있다.
  • 예를 들어, “사용자 세부 사항”에 대해 생각해보자.
  • 코드 재사용과 유지보수를 위해 “Person”과 “Address”라는 두 개의 클래스로 나눌 수 있다.
  • 그러나 데이터베이스에는 person이라는 하나의 테이블에 “사용자 세부 사항”을 저장할 수 있다.
  • 이렇게 Object 2개와 Table 1개로 두 개의 갯수가 다를 수 있다.
  • 1) Coarse Granularity(굵은/거친): PersonDetails Class
  • 2) Fine Granularity(가는/세밀한): Persion Class, Address Class

Inheritance(상속)

  • RDBMS는 객체지향 프로그래밍 언어의 자연적 패러다임인 상속과 유사한 것을 정의하지 않는다.
  • 즉, 상속의 개념이 없다.

Identity(일치)

  • RDBMS는 ‘sameness’라는 하나의 개념을 정확히 정의하는데, 바로 ‘기본키(primary key)’이다.
  • 그러나 자바에서는 객체 식별(a==b)과 객체 동일성(a.equales(b))을 모두 정의한다.
  • RDBMS에서는 PK가 같으면 서로 동일한 record로 정의하지만, Java에서는 주솟값이 같거나 내용이 같은 경우를 구분하여 정의한다.

Associations(연관성)

  • 객체지향 언어는 객체 참조(reference)를 사용하는 연관성을 나타내는 반면, RDBMS는 연관성을 ‘외래키(foreign key)’로 나타낸다.

Navigation(탐색/순회)

  • Java 및 RDBMS에서 객체에 액세스하는 방법은 근본적으로 다르다.
  • Java에서는 하나의 연결에서 다른 연결로 이동하면서 탐색/순회한다. (그래프 형태)
  • 예를 들어, aUser.getBillingDetails().getAccountNumber()
  • 이는 RDBMS에서 데이터를 검색하는 효율적인 방법이 아니다.
  • RDBMS에서는 일반적으로 SQL 쿼리 수를 최소화하고 JOIN을 통해 여러 엔터티를 로드하고 원하는 대상 엔터티를 선택(select)한다.





ORM의 장단점

장점

객체 지향적인 코드로 인해 더 직관적이고 비즈니스 로직에 더 집중할 수 있게 도와준다.

  • 선언문, 할당, 종료 같은 부수적인 코드가 없거나 급격히 줄어든다.
  • 각종 객체에 대한 코드를 별도로 작성하기 때문에 코드의 가독성을 올려준다.
  • SQL의 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 인해 생산성이 증가한다.

재사용 및 유지보수의 편리성이 증가한다.

  • ORM은 독립적으로 작성되어있고, 해당 객체들을 재활용 할 수 있다.
  • 때문에 모델에서 가공된 데이터를 컨트롤러에 의해 뷰와 합쳐지는 형태로 디자인 패턴을 견고하게 다지는데 유리하다.
  • 매핑정보가 명확하여, ERD를 보는 것에 대한 의존도를 낮출 수 있다.

DBMS에 대한 종속성이 줄어든다.

  • 대부분 ORM 솔루션은 DB에 종속적이지 않다.
  • 종속적이지 않다는것은 구현 방법 뿐만아니라 많은 솔루션에서 자료형 타입까지 유효하다.
  • 프로그래머는 Object에 집중함으로 극단적으로 DBMS를 교체하는 거대한 작업에도 비교적 적은 리스크와 시간이 소요된다.
  • 또한 자바에서 가공할경우 equals, hashCode의 오버라이드 같은 자바의 기능을 이용할 수 있고, 간결하고 빠른 가공이 가능하다.

 

단점

완벽한 ORM 으로만 서비스를 구현하기가 어렵다.

  • 사용하기는 편하지만 설계는 매우 신중하게 해야한다.
  • 프로젝트의 복잡성이 커질경우 난이도 또한 올라갈 수 있다.
  • 잘못 구현된 경우에 속도 저하 및 심각할 경우 일관성이 무너지는 문제점이 생길 수 있다.
  • 일부 자주 사용되는 대형 쿼리는 속도를 위해 SP를 쓰는등 별도의 튜닝이 필요한 경우가 있다.
  • DBMS의 고유 기능을 이용하기 어렵다. (하지만 이건 단점으로만 볼 수 없다 : 특정 DBMS의 고유기능을 이용하면 이식성이 저하된다.)

프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵다.

  • 이미 프로시저가 많은 시스템에선 다시 객체로 바꿔야하며, 그 과정에서 생산성 저하나 리스크가 많이 발생할 수 있다.

 

https://gmlwjd9405.github.io/2019/02/01/orm.html




ORM 프레임워크들

JDBC(Java Database Connectivity)

  • JDBC는 DB에 접근할 수 있도록 Java에서 제공하는 API이다.
  • 모든 Java의 Data Access 기술의 근간
  • 즉, 모든 Persistence Framework는 내부적으로 JDBC API를 이용한다.
  • JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.

 

JPA(Java Persistent API)

  • 자바 ORM 기술에 대한 API 표준 명세로, Java에서 제공하는 API이다.
  • 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다.
  • 즉, JPA는 ORM을 사용하기 위한 표준 인터페이스를 모아둔 것이다.
  • 기존에 EJB에서 제공되던 엔터티 빈(Entity Bean)을 대체하는 기술이다.
  • JPA 구성 요소 (세 가지)
  • 1) javax.persistance 패키지로 정의된 API 그 자체
  • 2) JPQL(Java Persistence Query Language)
  • 3) 객체/관계 메타데이터
  • 사용자가 원하는 JPA 구현체를 선택해서 사용할 수 있다.
  • JPA의 대표적인 구현체로는 Hibernate, EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있다.
  • 이 구현체들을 ORM Framework라고 부른다.

 

Hibernate

  • Hibernate는 JPA의 구현체 중 하나이다.
  • Hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는다는 것은 아니다.
  • Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 직접 작성하지 않을 뿐이다.
  • HQL(Hibernate Query Language)이라 불리는 매우 강력한 쿼리 언어를 포함하고 있다.
  • HQL은 SQL과 매우 비슷하며 추가적인 컨벤션을 정의할 수도 있다.
  • HQL은 완전히 객체 지향적이며 이로써 상속, 다형성, 관계등의 객체지향의 강점을 누릴 수 있다.
  • HQL쿼리는 자바 클래스와 프로퍼티의 이름을 제외하고는 대소문자를 구분한다.
  • HQL은 쿼리 결과로 객체를 반환하며 프로그래머에 의해 생성되고 직접적으로 접근할 수 있다.
  • HQL은 SQL에서는 지원하지 않는 페이지네이션이나 동적 프로파일링과 같은 향상된 기능을 제공한다.
  • HQL은 여러 테이블을 작업할 때 명시적인 join을 요구하지 않는다.
  • 장점
  • 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중 할 수 있으며, 객체지향 개발이 가능하다.
  • 테이블 생성, 변경, 관리가 쉽다. (JPA를 잘 이해하고 있는 경우)
  • 로직을 쿼리에 집중하기 보다는 객체자체에 집중 할 수 있다.
  • 빠른 개발이 가능하다.
  • 단점
  • 어렵다. (많은 내용이 감싸져 있기 때문에 알아야 할 것이 많다.)
  • 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다. (persistence context)
  • 성능상 문제가 있을 수 있다. (이 문제 또한 잘 이해해야 해결이 가능하다.)




Mybatis

  • 개발자가 지정한 SQL, 저장 프로시저 그리고 몇 가지 고급 매핑을 지원하는 SQL Mapper이다.
  • JDBC로 처리하는 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다.
  • 기존에 JDBC를 사용할 때는 DB와 관련된 여러 복잡한 설정(Connection)들을 다루어야 했지만 SQL Mapper는 자바 객체를 실제 SQL문에 연결함으로써, 빠른 개발과 편리한 테스트 환경을 제공한다.
  • 데이터베이스 record에 원시 타입과 Map 인터페이스 그리고 자바 POJO를 설정해서 매핑하기 위해 xml과 Annotation을 사용할 수 있다.
  • MyBatis는 원래 Apache Foundation의 iBatis였으나, 생산성, 개발 프로세스, 커뮤니티 등의 이유로 Google Code로 이전되면서 이름이 바뀌었다.
  • 장점
  • SQL에 대한 모든 컨트롤을 하고자 할때 매우 적합하다.
  • SQL쿼리들이 매우 잘 최적화되어 있을 때에 유용하다.
  • 단점
  • 애플리케이션과 데이터베이스 간의 설계에 대한 모든 조작을 하고자 할 때는 적합하지 않다.
  • 애플리케이션과 데이터베이스 간에 서로 잘 구조화되도록 많은 설정이 바뀌어야 하기 때문이다.

 

https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html

 

728x90
반응형

댓글