1장. JPA소개
JPA를 사용하지 않으면 생기는 문제점 (=SQL을 직접 다룰 때 발생하는 문제점)
- 객체지향과 데이터 중심의 데이터베이스 설계간 패러다임 불일치로 인해 개발자가 직접 객체의 필드값을 데이터 중심의 데이터베이스 구조에 맞게 로직을 짜야하고, CRUD(생성,조회,수정,삭제) 쿼리를 짜야한다. (반복적이고 지루한 일...)
- SQL에 의존적인 개발 (=물리적으론 엔티티와 데이터베이스를 분리했어도, 논리적으론 강한 의존관계를 가지고 있음)
- 등록,조회,수정 코드가 변경되거나, 연관 객체끼리 참조하는 경우 코드레벨에서 우리가 원하는 객체, 그리고 데이터 값을 보장받을 수 없기 때문에 결국엔 SQL를 까봐야 한다..
- 상속 관계인 객체들을 저장하거나 조회하는 경우 원하는 타입만 따로 따로 조회하기 어렵고, 저장 또한 어렵다. 뿐만 아니라 작성해야할 코드량도 많아진다.
- 객체를 테이블에 맞춰 모델링을 하게 되면, 하나의 엔티티안에 어마무시한 필드가 생성될 것이다. (만약 한다고 하더라도 객체지향 설계가 깨지게 된다. (객체와 관련 없는 필드가 포함될 것이다.)
- 객체 모델은 외래 키가 필요 없음 vs 테이블은 참조가 필요 없고 외래키만 있으면 됨
- 결국 중간에서 개발자가 변환 작업을 해야한다. (패러다임 불일치로 인해 발생하는 소모적인 일)
- 객체 그래프 탐색을 보장할 수 없다. (엔티티와 SQL이 논리적으로 종속되어서 발생되는 문제)
- 복잡한 연관관계로 이루어진 객체를 한단계씩 찾아 들어가는 경우, 데이터 및 객체가 없을 수 있다.
즉, JPA 없이 SQL을 직접 다루게 되면, 전체적인 개발 생산성이 저하된다!!
JPA와 문제 해결
- JPA api를 통해 불필요한 CRUD 작성을 방지한다.
- persist(등록), find(조회), setXXX(수정), get특정객체(참조) 등
- 자바 컬렉션에 객체를 저장하듯이 JPA에게 객체를 저장한다.
- 연관관계가 있는 객체들을 처리하는 경우, JPA에게 연관관계 설정을 해주고, 저장만 하면 알아서 처리해준다.
- JPA는 연관객체를 사용하는 시점에 SQL를 수행하여 필요한 객체를 가져온다. (지연로딩)
- 보장된 객체 그래프 탐색을 가능케하며, 탐색에 있어 자유롭다.
- 데이터베이스로 부터 같은 기본 키 값으로 객체를 두번 조회하고 조회된 객체를 동일성(==) 비교를 하면 두객체는 불일치한다. 하지만 JPA는 같은 트랜잭션에서 같은 객체가 조회되는 것을 보장해준다.
SQL을 직접 사용했을때보다 훨씬 이점이 많다. 사용 안할 이유가 없는 JPA..!!
JPA란 무엇인가!?
JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준
- JPA가 제공하는 API를 사용하면 객체를 DB에 저장하고 관리할 때, 개발자가 직접 SQL을 작성하지 않아도 된다.
- JPA가 개발자 대신 적절한 SQL을 생성해서 DB에 전달하고, 객체를 자동으로 Mapping 해준다.
- JPA는 내부적으로 JDBC API를 활용하는데, 개발자가 직접 JDBC API를 활용하면 패러다임 불일치, SQL 의존성 등으로 인해 효율성이 떨어진다.
- 이 때, JPA를 활용한다면 모든 SQL에 대해 개발자 대신 JPA가 자동으로 해결해 준다는 점에서 생산성을 크게 높인다.
ORM
ORM(Object-Relational Mapping)은 객체와 관계형 DB를 매핑한다는 뜻
- ORM 프레임워크를 사용하면 객체를 마치 자바 컬렉션에 저장하듯 저장할 수 있고, 이에 대해 ORM 프레임워크가 적절한 SQL을 생성해서 DB에 객체를 저장해준다.
Hibernate
자바 진영의 다양한 ORM 프레임워크 중 가장 많이 사용되는 성숙한 프레임워크
- 이러한 Hibernate 기반으로 만들어진 ORM 기술 표준이 바로 JPA다.
- 즉, JPA라는 ORM 기술 표준을 구현한 것이 Hibernate이므로, JPA를 사용하려면 Hibernate를 사용하면 된다.
JPA를 사용해야하는 이유!!
생산성
JPA를 사용하면 자바 컬렉션에 저장하듯이 JPA에게 저장할 객체를 전달하면 된다.
지루하고 반복적인 코드를 개발자가 직접 작성하지 않아도 되며, DDL문도 자동으로 생성해주기 때문에 데이터베이스 설계 중심을 객체 설계 중심으로 변경할 수 있다.
유지보수
필드를 하나만 추가해도 관련된 SQL과 JDBC 코드를 전부 수행해야 했지만 JPA는 이를 대신 처리해주기 때문에 개발자가 유지보수해야하는 코드가 줄어든다.
패러다임의 불일치 해결
JPA는 연관된 객체를 사용하는 시점에 SQL을 전달할 수 있고, 같은 트랜잭션 내에서 조회할 때 동일성도 보장하기 때문에 다양한 패러다임의 불일치를 해결한다.
성능
애플리케이션과 데이터베이스 사이에서 성능 최적화 기회를 제공한다.
같은 트랜잭션안에서는 같은 엔티티를 반환하기 때문에 데이터 베이스와의 통신 횟수를 줄일 수 있다. 또한, 트랜잭션을 commit하기 전까지 메모리에 쌓고 한번에 SQL을 전송한다.
데이터 접근 추상화와 벤더 독립성
RDB는 같은 기능이라도 벤더마다 사용법이 다르기 때문에 처음 선택한 데이터베이스에 종속되고 변경이 어렵다. JPA는 애플리케이션과 데이터베이스 사이에서 추상화된 데이터 접근을 제공하기 때문에 종속이 되지 않도록한다.
만약 DB가 변경되더라도 JPA에게 알려주면 간단하게 변경이 가능하다.