JPA(Java Persistence API)
: 데이터를 영속화 하는 API
JPA사용하기 이전의 문제점
SQL를 직접 사용
SQL 중심적인 개발을 피하기 어렵다
- 기존
JDBC만 사용하면 반복적이며 비슷한SQL문을 많이 만들어야한다.(ex. CRUD)개발자가 SQL 매퍼가 되어버린다.
- 추가적인 요구사항이 들어왔을 때 DB query, 객체 등 의존하는 여러 코드를 수정해야 한다.
만약 컬럼이 하나 더 추가된다면, 가장 먼저 SQL Query를 수정해야 할것이고,
그다음 Entity 그다음 그와 관련된 로직 등… 수정해야 된다.
패러다임의 불일치
객체지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
- 어느 객체지향 개발자가
- 객체와 RDB는 다른 데이터구조를 가진다. 즉, 객체로 DB를 조회할 수 없다.
-
객체지향적 설계를 하게 되면 DB table과 JAVA 객체 간의 매핑하는 소모적인 작업을 지속해야 한다.
<img width=500px src=./img/jpa-table-object-relation.png>
객체 모델은 외래키가 필요 없고 단지 참조만 있으면 되지만
테이블은 참조가 필요 없고 외래 키만 있으면 된다.
JPA의 사용이유
- SQL 문을 개발자가 만들지 않기 때문에 객체 중심적인 개발을 할 수 있다.
- 특정 RDBMS 문법에 종속적이지 않은 개발이 가능하다.
JPA는 RDBMS 벤더가 달라도 설정만 해주면 알아서 쿼리가 나간다!
- 영속성 컨택스트는 효율적인 SQL 처리에 크게 기여하여 성능상의 이점
- 객체답게 모델링 할수록 SQL과 매핑하는 작업만 늘어나게 되어 SQL에 의존적으로 설계하게 되는 문제를
JPA는 객체를 마치List와 같은Java Collection에 저장하듯이 DB에 저장하여 문제를 해결한다.
JPA는 특정 DB에 종속적이지 않다.
- 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르다
DB의 방언이라고 한다.
- 가변 문자: MySQL은
VARCHAR, Oracle은VARCHAR2 - 문자열을 자르는 함수: SQL 표준은
SUBSTRING(), Oracle은SUBSTR() - 페이징: MySQL은
LIMIT, Oracle은ROWNUM
JPA 구동 방식
<img width=400px src=./img/jpa-work.png>
JPA의 가장 중요한 2가지
- 객체와 RDB 매핑(ORM)
- 영속성 컨텍스트