ORM 과 JPA 란 ???

이유석·2022년 12월 21일
1

JPA - Entity

목록 보기
1/14
post-thumbnail

ORM (Object Relational Mapping) 등장 배경

JPA (Java Persistence API)

  • 자바 진영의 ORM 기술 표준이다.
    위 그림 에서 볼 수 있듯이 JPA 는 구조적으로 Java Application 과 JDBC 사이에 위치하고 있다.

JDBC (Java DataBase Connectivity)

  • 자바에서 데이터베이스에 접속 할 수 있도록 지원하는 자바 API이다.
    (데이터베이스 접근 후 삽입, 조회 등의 처리를 지원한다)
  • 객체는 메모리에 올라가 있는 대상으로 애플리케이션이 종료되면 객체 내 데이터는 모두 소멸된다.
    데이터의 소멸을 막기 위해 즉, 영속성을 갖기 위해서는 별도의 저장공간인 데이터베이스 등에 저장해야 하며,
    객체와 데이터베이스는 어떠한 방식으로든 데이터를 주고 받아야 한다.

  • ORM 이란 기술은 이름에서도 유추할 수 있듯이 객체 와 관계형 데이터베이스, 두 대상을 이어주는 역할을 담당한다.

  • ORM 기술 표준인 JPA 가 위 그림 에서 위치한 구조적 특징 역시 이러한 매개, 중간자 역할에서 비롯된 것이다.

그렇다면 ORM 기술이 없는 환경에서는 어떤 불편함이 있었을까?

JPA (자바 ORM 의 기술 표준)이 없는 환경

  • 관계형 데이터베이스는 객체 지향 애플리케이션과는 다른 데이터 표현 방식을 가지므로 객체를 데이터베이스에 직접 저장하거나 조회할 수 없다.

Java(객체 지향 프로그래밍) 과 RDB(관계형 데이터베이스) 의 패러다임 불일치

패러다임 불일치

  • 객체 지향 애플리케이션과 관계형 데이터베이스 사이의 데이터 표현 방식이 달라서 생기는 문제
    패러다임 불일치가 일어나는 이유는 애초에 이들의 목표와 동작 방식이 다르기 때문이다.

객체 지향

  • 필드와 메서드 등을 묶어서 객체로 잘 만들어 사용하는 것이 목표
  • 객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.

관계형 데이터베이스

  • 데이터를 잘 정규화해서 보관하는 것이 목표
  • 즉, 개발자가 객체 지향 애플리케이션과 데이터베이스 중간에서 SQL과 JDBC API를 사용해서 변환 작업 (객체 ↔ 데이터베이스)을 직접 해주어야 한다.

위 문제를 개발자가 코드를 통해 해결할 수 있는 방법은 2가지가 있다.

  • 모든 변환 작업에 대하여 개발자가 직접 SQL 코드를 개발한다. - SQL 의존적 개발
    • 나머지 객체에 대한 작업은 프로그램이 대신 수행한다.
  • 모든 변환 작업을 개발자가 직접 객체 지향 코드로 개발한다. - ORM 기술
    • 나머지 쿼리문 작성에 대한 작업은 프로그램이 대신 수행한다.

SQL 의존적 개발

SQL 에 의존하여 개발을 진행하면 아래와 같은 문제점이 발생한다.

Entity 와 강한 연관관계를 갖고있는 SQL 쿼리문

  • Entity 에 필드를 하나 추가한다고 생각해보자.

  • 이에 따라 변경되어야 하는 쿼리는 무수히 많아지며,
    개발자가 해당 쿼리들을 완전하게 처리하였다고 보장할 수 도 없다.
    (쿼리의 오류는 해당 쿼리를 실행 한 후 알 수 있기 때문이다.)

  • 이는 객체와 쿼리 생성 과정이 아주 강하게 서로 연결되어 있다고 할 수 있다.
    이런 관계 특징 상 수정된 요구사항 처리 과정에서 객체의 변경이 곧 쿼리 생성 과정에도 영향을 끼칠 수 밖에 없고 개발자 입장에서 객체의 수정 + 쿼리 생성 로직을 모두 고려하여 수정 사항을 처리해야 한다.

그렇다면 위 문제점을 ORM 즉, JPA 가 어떻게 처리하고 있는지 살펴보자.

JPA (자바 ORM 기술 표준)

사람이 하기에 어렵고 위험한 일을 로봇을 통해 대체하는 것과 유사하게 개발자가 비즈니스 요구사항 구현 및 요구사항 변경에 대처하는 과정에서 겪은 불편함을 JPA 가 대신 처리해주면 된다.
(개발자는 단지 JPA 가 제공하는 여러 API를 사용하기만 하면 된다.)

  • 다시 Entity 에 필드가 하나 추가되었다고 생각해보자.

  • JPA 는 Entity 클래스에 필드만 하나 추가해주면 된다. 나머지 쿼리 수정은 JPA 가 알아서 해준다.

  • 또한, 이로인해 발생하는 코드 변경은 대부분 컴파일 에러로 예외를 던지기 때문에 코드 실행 전에 처리되어야 한다. (개발자가 코드를 더 신뢰할 수 있다.)

  • 즉, JPA 가 개발자 대신 대상 Entity 를 분석한 뒤 생성한 SQL을 JDBC API 를 활용해서 데이터베이스에 요청한다.

이외에도, 여러가지 성능을 최적화 할 수 있는 기능을 제공한다.

  • 1차 캐시와 동일성 보장
  • 객체가 실제 사용될 때 조회하는 지연 로딩
  • 객체의 속성값이 변경되었을 때 만, 쿼리를 실행하는 변경 감지

출처

profile
https://github.com/yuseogi0218

0개의 댓글