'자바 ORM 표준 JPA 프로그래밍'책으로 스터디를 진행하게 되었다.
처음 JPA는 공부해야한다! 라는 말을 들었지만, JPA가 진정 무엇인지 잘 모르고 있었다.
이번 스터디를 통해 매주 공부한 내용을 업로드하려한다.
JPA 소개
SQL을 직접 다룰 때 발생하는 문제점
- 위 그림과 같이 자바 애플리케이션은 JDBC API를 통해 SQL문을 활용하여 DB와 통신한다.
서로 다른 구조
- 데이터 베이스 : 데이터 중심의 구조를 가진다.
- 객체지향 애플리케이션 : 객체 구조를 가진다.
- 때문에 개발자가 객체지향 애플리케이션과 데이터베이스 중간에서 SQL과 JDBC API를 사용해서 변환 작업을 직접 해줘야하는 문제점이 발생한다.
- SQL에 의존적인 개발을 할 경우 데이터 접근 계층을 사용해서 SQL을 숨겨도 어쩔 수 없이 DAO를 열어서 어떤 SQL이 실행되는지 확인해야한다.
- 논리적으로 엔티티와 아주 강한 의존관계를 가지고 있어 이러한 관계는 객체에 필드를 하나 추가할 때도 DAO의 CRUD코드와 SQL 대부분을 변경해야 한다.
- 진정한 의미의 계층 분할이 어렵다.
- 엔티티를 신뢰할 수 없다.
- SQL에 의존적인 개발을 피하기 어렵다.
이러한 이유로 기존 SQL을 직접 다룰 때 문제들이 발생한다.
그렇다면 JPA는 이 문제를 어떻게 해결할까?
JPA와 문제 해결
- JPA 사용 -> JPA가 제공하는 API사용 -> 개발자를 대신해 적절한 SQL을 생성해 DB에 전달.
<해당 내용은 이후 자세히 알아보자!>
패러다임의 불일치
객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법도 다르다.
이것을 객체와 관계형 데이터 베이스의 패러다임 불일치 문제라 한다.
따라서 객체 구조를 테이블 구조에 저장하는 데는 한계가 있다.
JPA란 무엇인가?
- JPA는 자바 진영의 ORM 기술 표준이다.
그림과 같이 애플리케이션과 JDBC 사이에서 동작한다.
- ORM 이란?
- Object-Relational Mapping으로 객체와 관계형 데이터베이스를 매핑한다는 뜯이다.
- ORM프레임워크는 객체와 테이블을 매핑해줌으로 패러다임의 불일치 문제를 해결해준다.
- 하이버네이트
- 거의 대부분의 패러다임 불일치 문제를 해결해주는 성숙한 ORM 프레임워크.
JPA 소개
- 과거, 엔터프라이즈 자바 빈즈라(EJB)는 기술 표준을 만듬 -> 엔티티빈이라는 ORM 기술 포함 -> 너무 복잡하고 기술성숙도도 떨어지며, 자바 엔터프라이즈 애플리케이션 서버에서만 동작
- 이후, 하이버네이트 등장 -> EJB의 ORM 기술과 비교해서 가볍고 실용적이며 기술 성숙도가 높다.
- 많은 개발자 사용 이후, EJB3.0 -> 하이버네이트를 기반으로 새로운 자바 ORM 기술 표준 만듬 -> 이것이 JPA다.
- JPA는 자바 ORM 기술에 대한 API 표준 명세서다.
왜 JPA를 사용해야 하는가?
- 생산성
- 자바컬렉션에 객체를 저장하듯이 JPA에게 저장할 객체를 전달.
- JPA에는 DDL문들 자동으로 생성해주는 기능이 있다.
- 이와 같은 기능으로 데이터베이스 설계 중심의 패러다임 -> 객체 설계 중심 으로 역전.
- 유지보수
- 필드 추가 및 삭제시 수정 코드가 줄어든다.
- 코드 수 감소로 유지보수 용이
- JPA 패러다임의 불일치 문제를 해결 -> 객체지향 언어가 가진 장점을 활용
- 패러다임의 불일치 해결
- 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제 해결
- 성능
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
- JDBC API는 위 코드 조회를 위해 베이터베이스와 두번 통신
- JPA는 select sql을 한 번만 데이터베이스에 전달 -> 두 번째는 조회한 회원 객체 재사용
- 데이터 접근 추상화와 벤더 독립성
- 특정 데이터 베이스 기술에 종속되지 않기 때문에, 데이터 베이스 변경 시 JPA에게 알려주기만 하면 된다.
이번 장에서는 기존에 객체와 데이터베이스를 JDBC를 활용해 SQL로 데이터를 구조 받을 경우 생기는 문제점과
JPA가 이를 어떻게 보완하고, 어떤 이유로 사용하는지에 대해 알아보았다.