JPA
- Java Persistence API
- 자바 ORM 기술에 대한 표준API다.
- ORM : 객체와 관계형 DB를 매핑한다는 뜻이다.
- 객체와 관계형 DB사이의 차이를 해결해주는 좋은 도구이다.
JPA 장점
특정 구현 기술에 대한 의존도를 줄이고 다른 구현 기술로 손쉽게 교체할 수 있다.
왜 JPA를 사용하는가?
생산성
- Mybatis, SQL매퍼를 사용하면 JDBC API 사용 코드를 많이 줄일 수 있지만 여전히 반복적인 CRUD를 작성해야 한다.
- 객체 중심적 설계에서 일정 Boundary에 도달하게 되면 데이터 중심 설계로 변질된다.
- JPA는 실행시점에 자동으로 SQL을 만들어서 실행한다.
- SQL 작성이 주가 아닌 어떤 SQL이 실행될지 생각만 하면된다.
유지보수
- SQL을 직접 다루면 엔티티의 필드만 변경해도 모든 CRUD를 수정해야 한다.
- 이런 과정은 JPA가 대신 처리해주므로 필드 추가,삭제해도 수정하는 범위가 줄어든다.
- 객체 지향 언어가 가진 장점들을 활용해서 유연하고 유지보수 하기 좋은 Domain Modele를 설계를 할 수 있다.
패러다임의 불일치 해결
- 상속
- 객체는 상속 extends
- 관계형 DB는 super/sub table
- "jpa.persist()" 하나로 super,sub table 삽입 코드를 작성하지 않아도 된다.
- "jpa.find()"하나로 super,sub를 조인하는 쿼리를 작성하지 않아도 된다.
- 연관관계
- 객체는 참조
- 객체는 참조가 이루어지는 선,방향을 가지고 있는 쪽에서 참조를 한다.
- 테이블은 FK
- 테이블 관계에서는 닭발이 있는 곳에서 FK를 갖는다.
- 객체를 참조를 보관해야하고 테이블은 키를 보관해야 한다.
- JPA에는 참조할 객체를 저장하고 "persiste()"로 저장하면 객체와 관계형 DB 패러다임 불일치를 해결하기 위한 코드작성의 비용이 들지 않는다.
- 객체는 참조
- 객체 그래프 탐색
- 처음 실행하는 SQL에 따라 객체 그래프를 어디 까지 탐색할 수 있을지 정해진다.
- 그래서 DAO를 열어서 직접 sql 흐름을 다시 따라가야하는 비용이 발생한다.
- 연관된 엔티티를 조회할 메소드를 일일히 작생해야 한다.
- SQL에 의존적으로 개발하는 것이기 때문에, Entity가 SQL에 논리적으로 종속되어서 발생하는 문제이다.
- JPA를 사용하면 안전하게 조회가 가능하다.
- JPA는 실행시점까지 조회를 미루는 기능이 있는데 이것을 "지연로딩"이라고 한다.
- JPA는 지연로딩을 투명하게 처리한다.
- 실제 객체를 불러오는 시점이 아닌 연관 객체의 기능을 사용할 때 조회한다.
- 처음 실행하는 SQL에 따라 객체 그래프를 어디 까지 탐색할 수 있을지 정해진다.
- 비교
- 객체는 동등성과 동일성으로 구분한다.
- 동등성은 "==" 객체 인스턴스 주소 값을 비교.
- 동일성은 .equlas()로 객체 내부의 값을 비교.
- 객체는 PK로 각 row들을 구분한다.
- 각 객체를 같은 아이로 조회 할떄 m1,m2는? new 연산을 통해 새롭게 할당받는 다면?
- 다르다.
- 패러다임 불일치를 해결하기 위해 DB의 같은 로우를 조회 할 때마다 같은 인스턴스를 반환하도록 구현하는 것은 쉽지 않고, 여기에 여러 트랜잭션이 동시에 실행되는 상활까지 고려하면 문제는 더 어려워진다.
- JPA는 같은 트랜잭션일때 같은 객체가 조회되는 것을 보장한다.
- JPA에서 "jpa.find(-.class,1) == jpa.find(-.class,1)" 동등성이 보장된다.
- 객체는 동등성과 동일성으로 구분한다.
성능
- 같은 ID를 조회하는 경우.
- 웹 앱과 DB사이의 위치하는 JPA는 같은 아이디로 조회하는 것이 2번 오게 된다면 1번만 sql을 작성하고 보낸다.
- 두번째에서 재사용한다.
데이터 접근 추상화와 벤더 독립성(Dialect)
- 같은 기능도 각 벤더(Mysql,Oracle , ...) 마다 사용법이 다른 경우가 많다.
- 페이징 처리, 등등
- 결국 처음 애플리케이션 개발 때 선택한 DB 기술에 종속되고 다른 데이터베이스로 교체하는 것이 매우 어려웠다.
- 하지만 JPA는 애플리케이션과 데이터베이스 사이의 추상화된 데이터 접근 계층을 제공하므로 특정 데이터베이스 기술에 종속되지 않고 있다.
- 데이터베이스를 변경할 때 JPA에거 다른거로 교체했다고 알리기만 하면 된다.
- 개발단게에서 h2를 쓰고 실제 서비스를 출시할 때는 Mysql을 사용할 때 비용 부담은 JPA가 한다.
- JPA는 인터페이스의 모음이다.
'Spring > JPA' 카테고리의 다른 글
따로 따로 조회했을 때 연관관계가 있는 객체를 자동으로 로드해주나? (0) | 2023.03.21 |
---|---|
cacscade.REMOVE VS orphanRemoval = true (0) | 2023.02.26 |
Repository 작명 이슈 (mapping.PropertyReferenceException) (0) | 2023.02.15 |
EntityManger.persist()를 하고 ID값을 반환하는 과정 (0) | 2021.07.02 |
6. 다양한 연관 관계 매핑_7.고급매핑_8. 프록시와 연관관계 (0) | 2021.01.27 |
댓글