-
JPA란 무엇인가?JPA 2019. 12. 22. 16:15
JPA(Java Persistent API)와 ORM(Object Relational Mapping)
JPA란 자바 ORM 기술에 대한 API 표준 명세를 의미합니다. JPA는 ORM을 사용하기 위한 인터페이스를 모아둔 것이며, JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus 같은 ORM 프레임워크를 사용해야 합니다.
JPA(Java Persistent API)
JPA는 ORM 표준 기술로 Hibernate, OpenJPA, EclipseLink, TopLink Essentials과 같은 구현체가 있고 이에 표준 인터페이스가 바로 JPA입니다. RDB 테이블은 객체지향적 특징(상속, 다형성, 레퍼런스, 오브젝트 등)이 없고 자바와 같은 언어로 접근하기 쉽지 않기 때문에 ORM을 사용해 오브젝트와 RDB 사이에 존재하는 개념과 접근을 객체지향적으로 다루기 위한 기술입니다.
ORM(Object-relational mapping)
ORM이란 객체와 DB의 테이블이 매핑을 이루는 것을 말합니다. 즉 객체가 테이블이 되도록 매핑 시켜주는 것을 말합니다. ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로서 데이터를 조작할 수 있습니다.
예를들어, User 테이블의 데이터를 출력하기 위해서 mysql에서는 SELECT * FROM user; 라는 query를 실행해야 하지만, ORM을 사용하면 User 테이블과 매핑된 객체를 user라 할 때, user.findAll() 라는 메서드 호출로 데이터 조회가 가능합니다.
query를 직접 작성하지 않고 메서드 호출만으로 query가 수행되다 보니, ORM을 사용하면 생산성이 매우 높아집니다. 그러나 query가 복잡해지면 ORM으로 표현하는데 한계가 있고, 성능이 raw query에 비해 느리다는 단점이 있습니다.
JPA탄생 배경
Mybatis에서는 테이블 마다 비슷한 CRUD SQL을 계속 반복적으로 사용했었습니다. 소규모라도 Mybatis로 애플리케이션을 만들어 보셨다면, DAO 개발이 매우 반복되는 작업이며, 이 작업이 매우 귀찮다는 경험을 해보았을 것입니다.
또한 테이블에 칼럼이 하나 추가된다면 이와 관련된 모든 DAO의 SQL문을 수정해야 합니다. 즉 DAO와 테이블은 강한 의존성을 갖고 있습니다.
이러한 이유로 SQL을 자동으로 생성해주는 툴이 개발 되기도 했지만 반복 작업은 마찬가지였고, 큰 효과를 얻지 못했던 것 같습니다. 그 이유는 객체 모델링보다 데이터 중심 모델링(테이블 설계)을 우선시 했으며, 객체지향의 장점(추상화, 캡슐화, 정보은닉, 상속, 다형성)을 사용하지 않고 객체를 단순히 데이터 전달 목적(VO, DTO)에만 사용했기 때문입니다. 다시 말하면 객체지향 개발자들이 개발하고 있는 방법이 전혀 객체 지향적이지 않다는 것을 느끼게 되었습니다.
JDBC API를 사용했을 때의 문제는 다음과 같습니다.
1. 유사한 CURD SQL 반복 작업
2. 객체를 단순히 데이터 전달 목적으로 사용할 뿐, 객체 지향적이지 못함(페러다임 불일치)
그래서 객체와 테이블을 매핑 시켜주는 ORM이 주목 받기 시작했고, JPA라는 표준 스펙이 정의 되었습니다.
JPA의 장점
- 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중 할 수 있으며, 객체지향 개발이 가능하다.
- 테이블 생성, 변경, 관리가 쉽다. 테이블 컬럼이 하나 변경되었을 경우, Mybatis에서는 관련 DAO의 파라미터, 결과, SQL등을 모두 확인하여 수정해야 하지만, JPA를 사용하면 JPA가 이런 일들을 대신해주기 때문에 유지보수 측면에서 좋습니다.(유지보수)
- 로직을 쿼리에 집중하기 보다는 객체자체에 집중 할 수 있다.
- SQL를 직접 사용하지 않고, 메서드 호출만으로 쿼리가 수행되어 빠른 개발이 가능하다.(생산성)
JPA의 단점
- 어렵다. JPA를 잘 사용하여 장점을 더 극대화 하기 위해서 알아야 할게 많다.(런닝커브가 높다.)
- 잘 이해하고 사용하지 않으면 데이터 손실이 있을 수 있다. (persistence context)
- 메서드 호출만으로 쿼리를 수행한다는 것은 성능상 문제가 있을 수 있습니다.(이 문제 또한 잘 이해해야 해결이 가능하다.)
- 복잡한 통계 분석 쿼리를 메서드만으로 해결하는 것은 힘든 일입니다. 이것을 보완하기 위해 SQL과 유사한 기술인 JPQL을 지원합니다. 물론 SQL자체 쿼리를 작성할 수 있도록 지원합니다.
'JPA' 카테고리의 다른 글
02. JPA 시작 (0) 2021.01.17 01-3. JPA란 무엇인가? (0) 2021.01.14 01-2. JPA 소개 (2) 2020.12.29 01-1. JPA 소개 (0) 2020.12.01 Pageable 사용하기 (0) 2020.02.08