Today I Learned/개념 정리

ORM

Malachai Lee 2022. 9. 29. 16:20

 

RDB

**Relational model(관계형 모델)**이란, 데이터를 여러개의 속성과 값을 통해 나타내는 모델이다. 데이터의 각 속성을 이루는 이루는 값은 데이터 자체의 고유성을 표현하기도 하며, 외무 모델과의 관계를 나타내는 등 특정 규칙을 통해 속성을 이룰 수 있다.

일반적으로 Relational model은 RDB(Relational Database; 관계형 데이터베이스)에 Table의 형태로 저장된다. Table은 각 데이터를 나타내는 Row와 데이터의 속성을 나타내는 Column으로 구성되며, Primary key(고유 키)가 각 Row에 대한 식별자의 역할을 하며 데이터를 식별한다.

 

OOP

 

개발 방법론

구조적 방법론 정형화된 분석 절차에 따라 사용자 요구사항을 파악하여 문서화하는 처리중심의 방법론이다. 빠르고 간단한 프로세스의 방법론이지만, 프로젝트 도중 발생할 리스크 관리의 부

malachai.tistory.com

클래스를 통해 프로그램을 설계 하는 OOP(Object-Oriented Programming; 객체 지향 프로그래밍) 방법론에선 객체 모델을 채택한다.

객체하나의 역할을 수행하는 메소드와 변수(데이터) 의 묶음을 뜻한다.

OOP가 새로운 개발 방법론으로 조명되며 객체 모델을 영속화 할 필요를 느끼게 되었다. 좋은 효율과 빠른 속도로 데이터를 저장할 수 있는 기존의 RDB를 사용하여 데이터의 영속화를 시도하게 되었다. 하지만 기존 RDB에 담을 수 있는 관계형 모델의 테이블 구조와 객체 모델이 가지는 클래스 구조의 불일치 때문에, 클래스 구조를 테이블 구조의 형태로 맵핑할 수 있는 방법을 찾게 되었다.

 

ORM

ORM(Object-Relational Mapping) 기술객체와 관계형 데이터베이스의 관계형 모델를 자동으로 매핑하여 연결해주는 기술을 말한다.

SQL Query을 자동으로 생성하여 관계형 모델의 테이블 구조와 객체 모델의 필드를 맵핑함으로써 RDB에 객체를 저장할 수 있게 해준다.

 

ORM의 요구사항

The Object-Relational Impedance Mismatch

객체 모델을 관계형 모델로 저장할 때 발생하는 문제, 즉 패러다임의 불일치를 해결하는 것이 ORM의 과제이다.

관계형 모델과 객체 모델이 불일치 하는 특징은 총 5가지로 정리할 수 있다.

Granularity - 세분성

데이터베이스의 테이블 수보다 더 많은 클래스가 있는 객체 모델이 있을 수 있다. 객체 모델이 관계형 모델보다 더 세분화되어 있기 때문이다.

예컨데, Contact 클래스의 필드에는 사용자가 정의한 Name 클래스가 존재할 수 있다.

create table Contact (
    id integer not null,
    first varchar(255),
    last varchar(255),
    middle varchar(255),
    notes varchar(255),
    starred boolean not null,
    website varchar(255),
    primary key (id)
)
public class Contact {
    private Integer id;
    private Name name;
    private String notes;
    private URL website;
    private boolean starred;
}

public class Name {
    private String first;
    private String middle;
    private String last;
}

테이블은 하나지만 클래스는 두 개인 불일치 문제가 발생한다.

 

Inheritance - 상속성

RDBMS에는 상속이란 개념이 없다. Supertype/Subtype 테이블의 개념을 통해 이를 극복할 순 있지만, 표준화 되어있지 않다.

Subtype 테이블인 candidates 테이블과 examiners 테이블은 각 Primary key 인 동시에 Foreign key인 id_person을 가진다. 이를 통해 Supertype 테이블인 person 테이블과 JOIN하여 표현될 수 있다.

 

Identity - 동일성

RDBMS는 정확히 하나의 동일성을 보장하는 개념인 Primary Key를 제공한다. 하지만 객체는 동일성(==) 뿐만 아니라 동등성(equals())을 모두 정의한다.

 

Associations - 연관성

객체 모델의 연관관계는 단방향 참조로만 이루어지는 반면, 관계형 모델의 연관관계는 양방향 참조이다.

RDBMS는 Foreign key 하나를 사용해서 Inner Join, Outer Join의 양방향 참조를 가진다. 하지만 객체 모델은 멤버 객체를 추가함으로써 참조할 수 있는 단방향 참조가 기본이다. 양방향을 참조하려면 양객테 모두에 멤버 객체를 추가함으로써 연관을 두 번 정의해야 한다.

 

Navigation - 탐색성

Java에서는 데이터에 접근할 때 dot 연산자를 이용하여 하나의 객체에서 출발해 다른 연결로 이어지는 객체 그래프 탐색 방식을 사용한다. 하지만 RDBMS는 SQL쿼리를 최소화하기 위해 JOIN을 통해 여러 엔티티를 불러와서 데이터를 탐색한다.

 

ORM 인터페이스와 제품의 종류

Java에서는 JDBC와 같은 인터페이스인 **JPA(Java Persistence Api)**를 통해 객체의 영속화를 돕는다. 대표적으로 JPA의 기능을 실제로 구현 한 프레임워크는 Hibernate가 있다.

 

JPA의 개념

JPA는 Java Persistence API이다. 2022.04.10 - [Today I Learned/개념 정리] - API란? RAM은 휘발성 데이터 저장장치로써 전기를 사용해 데이터를 저장하기 때문에 컴퓨터의 전원을 끄면 데이터가 소멸한다. 이..

malachai.tistory.com

 

 

[JDBC] JDBC, JPA/Hibernate, Mybatis의 차이 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

ORM의 장점

OOP를 도입한 개발자가 비즈니스 로직에 더 집중할 수 있게 도와준다.

  • SQL Query를 직접 생성하지 않고도 API에서 제공하는 메서드를 통해 데이터를 조작할 수 있다.
  • 각종 객체에 대한 코드를 별도로 작성하기 때문에 코드의 가독성을 올려준다.
  • DBMS와 소통할 때 SQL Query를 통한 절차적이고 순차적인 접근이 아닌 객체 지향적인 접근으로 생산성이 증가한다.

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

  • ORM을 통해 생성된 객체들을 재활용 할 수 있다.
  • 매핑정보가 명확하여, ERD(Entity Relationship Diagram; 개체 관계 모델)에 대한 의존을 줄일 수 있다.

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

  • 객체 간의 관계를 바탕으로 맵핑하기 때문에, 객체에 포함된 Primitive 부터 Referance 자료형 타입까지 영속화가 가능하다. 따라서 개발자는 객체의 설계에만 집중하더라도, 극단적으로 DBMS를 교체하는 거대한 작업에도 비교적 적은 리스크를 가질 수 있다.

ORM의 단점

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

  • 사용하기는 편하지만 설계는 매우 신중하게 해야한다.
  • 프로젝트의 복잡성이 커질경우 난이도 또한 올라갈 수 있다.
  • 잘못 구현된 경우에 속도 저하 및 일관성이 무너지는 문제점이 생길 수 있다.
  • 일부 자주 사용되는 대형 쿼리는 속도를 위해 StoredProcedure를 사용하는 등 별도의 튜닝이 필요한 경우가 있다.

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

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

[Oracle] 프로시저(Procedure)란? (feat. C.R.U.D)

안녕하세요 Foma 💻 입니다! 오늘은 여러 작업을 한번에 실행할 수 있는 프로시저에 대해서 알아보도록 하겠습니다. 바로 시작할게요~ 프로시저(Procedure)란? 데이터베이스에 대한 일련의 작업

fomaios.tistory.com

 

**각종 단점들을 극복하기 위해 Native SQL Query를 사용하는 경우가 있는데, 이는 DBMS간 이식성을 크게 저하시키기 때문에 근본적인 해결책이 아님을 알아야 한다.

ORM의 사용 전략

타겟 데이터베이스에 대한 이해

ORM 적용 환경에서 발생하는 많은 문제가 데이터베이스와 SQL의 문제를 간과함으로써 발생한다.

ORM을 적용할 때, SQL 및 데이터베이스의 락킹(locking) 모델을 무시하면 안된다. ORM은 작업을 쉽게 해 주는 툴이지, 구현되는 환경에 대한 이해를 불필요하게 만드는 툴은 아니다.

필요한 경우에서의 SQL Query 사용

앞서 언급한 이식성의 저하가 발생할 순 있지만, 많은 경우에서 더욱 큰 효과를 볼 수 있는것은 부정할 수 없다.

Hibernate, TopLink와 같은 ORM 제품은 SQL 쿼리 작성 기능을 제공한다. 하지만 경우에 따라 SQL문을 직접 작성해야 할 경우도 있다.

ORM 제품의 선택에 대한 충분한 검토

모든 ORM 제품이 동일한 수준의 기능을 제공하는 것은 아니다. 요구 사항을 반영하는 환경을 구축하고 2~3가지 제품을 비교 테스트해 봐야 한다. 이 과정을 통해 ORM이 성능 기준을 만족하는지 검증할 수 있다.

 

ORM 사용이 적합한 경우

  • 엔티티를 개별적으로 업데이트하고 간헐적으로 셋 기반 작업을 수행하는 OLTP 애플리케이션

ORM 사용이 적합하지 않은 경우

  • 많은 수의 레코드에 대해 잦은 빈도로 벌크 업데이트를 수행하는 OLAP 애플리케이션
  • 데이터의 인출 및 업데이트를 위해 핸드코딩으로 작성된 SQL 및 저장 프로시저를 이용하는 데이터베이스 환경
  • 순수 SQL Query 기반의 접근 방법을 적용하는 것이 적절한 애플리케이션

'Today I Learned > 개념 정리' 카테고리의 다른 글

프로세스 동기화  (1) 2022.09.29
DNS  (1) 2022.09.15
직관과 논리  (0) 2022.07.01
IP, Packet, Port  (0) 2022.06.28
DB Normalization  (0) 2022.06.14