JPA (Java Persistence API)
- 자바 진영의 ORM 기술 표준이다.
위 그림 에서 볼 수 있듯이 JPA 는 구조적으로 Java Application 과 JDBC 사이에 위치하고 있다.JDBC (Java DataBase Connectivity)
- 자바에서 데이터베이스에 접속 할 수 있도록 지원하는 자바 API이다.
(데이터베이스 접근 후 삽입, 조회 등의 처리를 지원한다)
객체는 메모리에 올라가 있는 대상으로 애플리케이션이 종료되면 객체 내 데이터는 모두 소멸된다.
데이터의 소멸을 막기 위해 즉, 영속성을 갖기 위해서는 별도의 저장공간인 데이터베이스 등에 저장해야 하며,
객체와 데이터베이스는 어떠한 방식으로든 데이터를 주고 받아야 한다.
ORM 이란 기술은 이름에서도 유추할 수 있듯이 객체 와 관계형 데이터베이스, 두 대상을 이어주는 역할을 담당한다.
ORM 기술 표준인 JPA 가 위 그림 에서 위치한 구조적 특징 역시 이러한 매개, 중간자 역할에서 비롯된 것이다.
그렇다면 ORM 기술이 없는 환경에서는 어떤 불편함이 있었을까?
Java(객체 지향 프로그래밍) 과 RDB(관계형 데이터베이스) 의 패러다임 불일치
패러다임 불일치
- 객체 지향 애플리케이션과 관계형 데이터베이스 사이의 데이터 표현 방식이 달라서 생기는 문제
패러다임 불일치가 일어나는 이유는 애초에 이들의 목표와 동작 방식이 다르기 때문이다.객체 지향
- 필드와 메서드 등을 묶어서 객체로 잘 만들어 사용하는 것이 목표
- 객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
관계형 데이터베이스
- 데이터를 잘 정규화해서 보관하는 것이 목표
위 문제를 개발자가 코드를 통해 해결할 수 있는 방법은 2가지가 있다.
SQL 에 의존하여 개발을 진행하면 아래와 같은 문제점이 발생한다.
Entity 와 강한 연관관계를 갖고있는 SQL 쿼리문
Entity 에 필드를 하나 추가한다고 생각해보자.
이에 따라 변경되어야 하는 쿼리는 무수히 많아지며,
개발자가 해당 쿼리들을 완전하게 처리하였다고 보장할 수 도 없다.
(쿼리의 오류는 해당 쿼리를 실행 한 후 알 수 있기 때문이다.)
이는 객체와 쿼리 생성 과정이 아주 강하게 서로 연결되어 있다고 할 수 있다.
이런 관계 특징 상 수정된 요구사항 처리 과정에서 객체의 변경이 곧 쿼리 생성 과정에도 영향을 끼칠 수 밖에 없고 개발자 입장에서 객체의 수정 + 쿼리 생성 로직을 모두 고려하여 수정 사항을 처리해야 한다.
그렇다면 위 문제점을 ORM 즉, JPA 가 어떻게 처리하고 있는지 살펴보자.
사람이 하기에 어렵고 위험한 일을 로봇을 통해 대체하는 것과 유사하게 개발자가 비즈니스 요구사항 구현 및 요구사항 변경에 대처하는 과정에서 겪은 불편함을 JPA 가 대신 처리해주면 된다.
(개발자는 단지 JPA 가 제공하는 여러 API를 사용하기만 하면 된다.)
다시 Entity 에 필드가 하나 추가되었다고 생각해보자.
JPA 는 Entity 클래스에 필드만 하나 추가해주면 된다. 나머지 쿼리 수정은 JPA 가 알아서 해준다.
또한, 이로인해 발생하는 코드 변경은 대부분 컴파일 에러로 예외를 던지기 때문에 코드 실행 전에 처리되어야 한다. (개발자가 코드를 더 신뢰할 수 있다.)
즉, JPA 가 개발자 대신 대상 Entity 를 분석한 뒤 생성한 SQL을 JDBC API 를 활용해서 데이터베이스에 요청한다.
이외에도, 여러가지 성능을 최적화 할 수 있는 기능을 제공한다.
출처
- 자바 ORM 표준 JPA 프로그래밍 - 김영한 저
- https://doing7.tistory.com/105