자바 ORM 표준 JPA 프로그래밍 - 기본편을 정리한 내용입니다.
SQL 중심적인 개발의 문제점
- 애플리케이션 개발할 때 객체지향 언어로 Java, Scala 등을 많이 쓴다.
- DB로는 아직까지는 Oracle, MySQL과 같은 RDBMS를 많이 쓴다.
- 객체를 관계형 DB에 관리하기 때문에 SQL를 작성해야 하는 게 필수이다.
- SQL 중심적인 개발의 문제
- 반복적인 CRUD 코드
- 객체에 필드가 추가되면 쿼리에도 필드를 추가해야 한다. (SQL 의존적인 개발)
- 객체지향과 관계형 DB와의 패러다임의 불일치
- 객체 지향 프로그래밍은 시스템의 복잡성을 제어할 수 있는 추상화, 캡슐화, 정보은닉, 상속, 다형성 등을 제공
- 상속관계의 차이
- 객체의 상속관계가 DB에서 그나마 유사한 게 슈퍼타입과 서브타입 관계
- Album에 저장하려면 객체 분해 후 각각 ITEM 테이블과 ALBUM 테이블에 저장해야 한다. (쿼리를 두 개 짜야함)
- Album을 조회하려면 각 테이블을 조인하는 쿼리를 작성하고 각 객체를 생성 후 함께 조회해야 한다. (복잡하다.)
- 그에 반해 자바 컬렉션에 저장과 조회는 매우 단순하게 작성할 수 있다.
- 연관관계의 차이
- 객체는
member.getTeam()
과 같이 참조를 사용한다. - 테이블은 조인으로 외래키를 사용한다.
- 테이블에 객체를 저장하려면 객체를 테이블에 맞추어 모델링하여 저장해야 한다. (객체지향적인 모델링 X)
- 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 하지만 실행된 SQL의 결과에 따라 탐색 범위가 결정된다. (엔티티 신뢰 문제 발생)
- 모든 객체를 미리 로딩할 수 없기 때문에 상황에 따른 조회 메소드를 여러 개 생성하게 된다.
- 객체는
- 비교하기 차이
- SQL 조회 결과를 생성한 객체에 각각 넣고 비교하면 레퍼런스가 다르기 때문에 다르다고 나온다.
- 자바 컬렉션에서 참조 객체를 조회하여 비교하면 참조 값이 같기 때문에 같다고 나온다.
- 객체답게 모델링할 수록 매핑 작업 증가
- 객체를 자바 컬렉션에 저장하듯이 DB에 저장하기 위해 나온 게 JPA(Java Persistence API)
JPA 소개
- Java Persistence API
- 자바 진영의 ORM 기술 표준
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계하고 관계형 DB는 관계형 DB대로 설계하면 그 중간에서 ORM 프레임워크가 매핑해준다.
- 대중적인 언어에는 대부분 ORM 기술을 가지고 있다.
- Typescript, python 등
- 자바 어플리케이션과 JDBC 사이에서 동작한다.
- 기존의 자바 표준이이었던 EJB 엔티티 빈이 성능상 좋지 않았음 → 오픈 소스로 하이버네이트 등장 → 자바 진영에서 하이버네이트를 다듬은 자바 표준으로 JPA 개발
- JPA는 인터페이스의 모음
- JPA 표준 명세의 구현체인 하이버네이트, EclipseLink, DataNucleus가 있다. 대부분 하이버네이트를 사용한다.
- 객체 중심적인 개발로 변화
- JPA 동작 - 저장
- JPA 동작 - 조회