Language/Java

Java - JPA란 ? (+ORM)

JaeHoney 2020. 9. 21. 15:46

 

JPA란?

 

JPA(Java Persistence API) 자바 진영의 ORM 기술 표준입니다. 

 

ORM(Object Relational Mapping)객체-관계 매핑이라는 뜻입니다. 이는 OOP(객체 지향 프로그래밍)에서 쓰이는 객체를 구현한 클래스RDB에서 쓰이는 테이블자동으로 매핑(사상)하는 것을 의미합니다. 이 때 이 둘은 구조가 전혀 다르기 때문에 불일치가 발생하는데, ORM을 통해 객체와의 관계에 의거해서 SQL문을 자동으로 생성해주어서 이런 문제를 해결합니다. 따라서 ORM은 따로 SQL문을 짤 필요없이 객체를 통해 간접적으로 DB를 조작할 수 있게 합니다.

 

JPA에서는 이 ORM을 어떻게 구현하고 동작하는지를 기술하고 있는 인터페이스의 모음입니다.

 

ORM의 장단점

 

#장점

1. 객체 지향 코드

ORM은 SQL문이 아닌 클래스의 메서드DB를 조작할 수 있게 합니다. 즉, 더 보기 쉽고 개발자로 하여금 비즈니스 로직에만 집중할 수 있도록 합니다.

 

2. 재사용 및 유지보수

ORM은 독립적으로 작성되어 있고, 해당 객체들을 재활용 할 수 있습니다. 그래서 MVC패턴을 구현하는데 적합화 되어있습니다.

 

3. DBMS에 대한 종속성 감소

객체 간의 관계를 바탕으로 SQL문을 자동 생성하기 때문에 DBMS의 데이터 구조를 완벽하게 파악하지 않더라도 구현이 가능합니다. 객체 중심으로 프로그램을 짜기 때문에 DBMS를 교체하거나 큰 수정을 겪더라도 비교적 적은 노력이 필요하게 됩니다. 또한, 자바의 다양한 기능을 이용하고 가공하기 편리합니다.

 

#단점

1. 완벽하게 구현하기 어렵습니다.

사용할 때는 편하지만 설계는 신중하게 해야하며, 복잡하고 방대해질 수록 난이도는 기하급수적으로 올라갑니다. 또, 프로세스를 직접 관리해줘야 하기 때문에 비효율적인 코드를 작성하면 속도가 저하되고 문제가 발생할 수 있습니다.

 

2. DBMS의 고유 기능을 이용하기 어렵다.

DBMS의 훌륭한 기능들이 있는데, 이를 이용하면 프로젝트를 수정하거나 이식할 때 소요가 커집니다.

 

3. 프로시저가 많은 시스템에서 효율이 떨어진다.

데이터 액세스에 저장 프로시저를 많이 사용하는 프로젝트의 경우 ORM을 구현하려면 다시 객체로 전부 바꿔야하며 코딩해야할 요소들이 매우 많아지고, 생산성 저하, 에러 등을 야기할 수 있습니다.

 

 

JPA의 특징

 

JPA는 애플리케이션과 JDBC 사이에서 작동합니다. 즉, JPA 내부에서 JDBC API를 사용하고, SQL을 호출하여서 DB와 통신하게 됩니다. 이를 통해 JPA는 Java Collection 쓰듯 CRUD를 매우 간단하게 구현하고 유지보수도 아주 편리하게 해줍니다.

 

JPA 인터페이스를 구현하는 대표적인 오픈소스Hibernate가 있습니다.

 

이 중 가장 많이 사용되는 Hibernate는 ORM 프레임워크로 테이블 관계가 정의 되어있는 XML 파일의 메타 데이터로 객체 관계 매핑을 간단하게 수행하고 DB를 변경할 때 설정파일의 프로퍼티를 수정함으로써 쉽게 처리할 수 있게 합니다. Hibernate는 MySQL, Oracle, Sybase, Derby, PostgreSQL 등 많은 데이터베이스를 지원하며 POJO(Plain Old Java Object, 객체 지향 원리에 충실하자는 프로그래밍 방식)기반의 모델과도 잘 동작합니다.

 

#JPA의 성능 관련 기능

 - 1차 캐시와 동일성(identity) 보장

 같은 트랜젝션 안에서는 같은 엔티티를 반환합니다. (조회 성능이 향상됨, 프로세스 수를 줄여줌)

 

 - 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)

트랜젝션을 commit할 때 까지 INSERT 문을 메모리에 쌓고 commit하는 순간 쌓인 INSERT 문을 한번에 보냅니다. (서버와 통신하는 빈도를 줄일 수 있음)

 

 - 지연로딩 (Lazy loading)

 값이 실제로 필요한 시점에 SELECT 쿼리를 날림. (서버 통신 빈도를 줄임), 즉시 로딩(join sql로 한번에 관련된 객체들 까지 미리 가져옴)을 이용해 필요할 때 바로 DB를 조회 가능.