[JPA] JPA는 왜 써야할까? (1. JPA 소개)
자바 ORM 표준 JPA 프로그래밍 1장 요약 정리본입니당 :3
JPA를 사용하기 전 문제점
- CRUD SQL 반복 작성
- 데이터 중심 모델이 되기 쉬움
JPA를 사용하면서...
- CRUD SQL 자동 처리
- 객체 모델링과 관계형 데이터베이스 사이의 차이점 해결
- 객체 지향적 개발 -> 생산성, 유지보수 성능 향상
1.1 SQL을 직접 다룰 때 발생하는 문제점
1.1.1 수많은 반복
테이블마다 CRUD SQL 작성. 반복되는 코드.. 지루함 :(
1.1.2 SQL에 의존적인 개발
엔티티 : 비즈니스 요구사항을 모델링한 객체
SQL에 모든 것을 의존하는 상황에서, 개발자는 엔티티를 신뢰하고 사용할 수 없다.. 이건 진정한 의미의 계층 분할이 아니다. 논리적으로 엔티티와 JDBC&SQL이 아주 강한 의존 관계를 가지게 되기 때문!
1.1.3 JPA와 문제 해결
객체를 데이터베이스에 저장하고 관리할 때 : JPA API 사용
-> 저장 / 조회 / 수정 / 연관된 객체 조회
1.2 패러다임의 불일치
객체는 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치를 제공.
관계형 데이터베이스는 데이터 중심으로 구조화, 집합적 사고 요구.
-> 패러다임 불일치 : 객체와 관계형 데이터베이스는 지향하는 목적이 서로 달라 기능과 표현 방법이 다르다.
-> 때문에 객체 구조를 테이블 구조에 저장하는 데는 한계가 있다. 이러한 패러다임 불일치 문제는 개발자가 중간에서 해결해야 한다.
1.2.1 상속
객체엔 상속 기능이 있으나 테이블은 없다. (슈퍼, 서브타입 관계를 이용해 유사한 형태로 설계는 가능) 자식 객체(Item의 자식 Album)를 저장할 때 두 개 이상의 테이블을 갱신해야 한다.
-> JPA를 사용하면?
jpa.persist(album); // 저장
jpa.find(Album.class, albumId); // 조회
1.2.2 연관관계
객체는 참조를 통해 다른 객체와 연관관계를 가지고, 참조에 접근해 연관 객체를 조회한다.
테이블은 외래 키를 사용해 다른 테이블과 연관관계를 가지고, 조인을 사용해 연관된 테이블을 조회한다.
-> JPA를 사용하면?
member.setTeam(team); // 회원과 팀 연관관계 설정
jpa.persist(member); // 회원과 연관관계 함께 저장
Member member = jpa.find(Member.class, memberId);
1.2.3 객체 그래프 탐색
객체는 마음껏 객체 그래프를 탐색할 수 있어야 한다. 그러나 SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다. (member.getOrder().getDelivery().get...) 때문에 회원을 조회하는 메소드를 상황에 따라 여러 벌 만들어서 사용해야 한다.
memberDao.getMember();
memberDao.getMemberWithTeam();
memberDao.getMemberWithOrderWithDelivert();
-> JPA를 사용하면?
JPA는 연관된 객체를 사용하는 시점에 적절한 SQL을 실행한다. 따라서 연관된 객체를 신뢰하고 마음껏 조회할 수 있다. 이 기능은 실제 객체를 사용하는 시점까지 디비 조회를 미룬다고 해 지연 로딩이라 한다.
Member member = jpa.find(Member.class, memberId); // 처음 조회 시점에 SELECT MEMBER SQL
Order order = member.getOrder();
orger.getOrderDate(); // Order를 사용하는 시점에 SELECT ORDER SQL
1.2.4 비교
객체는 동일성 또는 동등성 비교라는 두 가지 비교 방법이 있다.
데이터베이스는 기본 키의 값으로 각 행을 구분한다.
Member member1 = memberDao.getMember(memberId);
Member member2 = memberDao.getMember(memberId);
member1 == member2 // false;
-> JPA를 사용하면?
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2 // true;
1.3 JPA란 무엇인가?
JPA :: 자바 진영의 ORM 기술에 대한 API 표준 명세. 자바 애플리케이션과 JDBC 사이에서 동작한다.
ORM :: Object-Relational Mapping. 객체와 관계형 데이터베이스를 매핑한다는 뜻.
ORM 프레임워크는 SQL를 개발자 대신 생성해 데이터베이스에 전달해준다. 또한 패러다임 불일치 문제를 해결해준다.
-> 객체 측면에서 정교한 객체 모델링을 할 수 있고 관계형 데이터베이스는 데이터베이스에 맞도록 모델링하면 된다.
JPA로 인해...
- 특정 구현 기술에 대한 의존도를 줄임
- 다른 구현 기술로 손쉽게 이동할 수 있게 됨
⭐️ JPA를 왜 사용해야 할까
- 생산성
반복적인 코드를 줄이고 디비 설계 중심을 객체 설계 중심으로 역전 가능 - 유지보수
엔티티 필드에 변화가 생겨도 JPA가 대신 수정 처리해주기에 유지보수할 코드가 줄어든다. - 패러다임의 불일치 해결
상속, 연관, 객체 그래프 탐색, 비교 등 패러다임 불일치 문제를 해결해줌 - 성능
작성해야 할 SQL문이 줄어든다 - 데이터 접근 추상화와 벤더 독립성
애플리케이션과 디비 사이에 추상화된 데이터 접근 계층을 제공해 애플리케이션이 특정 디비 기술에 종속되지 않도록 한다. - 표준
자바 진영 ORM 기술 표준이기에 다른 구현 기술로 손쉽게 변경이 가능하다.