1. JPA 소개
1.1 SQL을 직접 다룰 때 발생하는 문제점
1.1.1 반복, 반복 그리고 반복
- CRUD 기능 구현을 위한 SQL 작성
SELECT id, name FROM member WHERE id = ?
- JDBC API를 사용해 SQL 실행
ResultSet rs = stmt.executeQuery(sql);
- 조회결과를 객체로 매핑
String id = rs.getString("id"); String name = rs.getString("name"); Member member = new Member(); member.setId(id); member.setNam(name);
1.1.2 SQL에 의존적인 개발
: 테이블에 컬럼 추가 요구 -> 객체에 필드 추가, 관련 SQL 수정, 조회결과 추가 매핑...
- 엔티티를 신뢰할 수 없다.
- 진정한 의미의 계층 분할이 어렵다.
- SQL에 의존적인 개발을 피하기 어렵다.
1.1.3 JPA와 문제 해결
: 개발자가 직접 SQL을 작성하는 것이 아니라 JPA가 제공하는 API를 사용하면 JPA가 적절한 SQL을 생성해 DB에 전달한다.
jpa.persist(member); // 저장
Member member = jpa.find(Member.class, id); // 조회
1.2 패러다임의 불일치
- 관계형 데이터베이스는 데이터 중심으로 구조화되어 있고 객체지향 개념이 없다.
- 개발자가 객체와 관계형 데이터베이스 사이의 패러다임 불일치 문제를 해결하는 데 많은 시간과 코드를 소비한다.
1.2.1 상속
- 관계형 데이터베이스는 상속을 표현하기 난해하고, 그 것을 처리하기 위한 SQL 작성도 만만치 않다.
INSERT team INTO .. VALUES ..
INSERT member INTO .. VALUES ..
SELECT *
FROM team t
JOIN member m on t.team_id = m.team_id
- JPA를 아래와 같이 사용하면 위와 동일한 SQL을 작성해 실행시켜준다.
jpa.persist(member);
Member member = jpa.find(Member.class, id);
1.2.2 연관관계
- 객체는 참조에 접근해서 연관된 객체를 조회한다. 참조가 있는 방향으로만 접근 가능
- 테이블은 외래키를 사용해 연관관계를 가지고, 조인을 사용해 연관된 테이블을 조회한다. 양방향 접근 가능
- JPA는 참조를 외래키로 변환해 저장하고, 외래키를 참조로 변환해 조회한다.
member.setTeam(team);
jpa.persist(member);
Member member = jpa.find(Member.class, id);
Team team = member.getTeam();
1.2.3 객체 그래프 탐색
- SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해져 버린다.
- JPA는 연관된 객체를 신뢰하고 마음껏 조회할 수 있다. 실제 객체를 사용하는 시점까지 DB 조회를 미룬다.(지연로딩)
1.2.4 비교
- 같은 데이터베이스 로우에서 조회한 객체들은 각각 다르다.
Member m1 = memberDAO.getMember(id);
Member m2 = memberDAO.getMember(id);
m1 == m2 // false
- JPA는 동일 트랜잭션 내 같은 객체가 조회 되는것을 보장한다.
Member m1 = jpa.find(Member.class, id);
Member m2 = jpa.find(Member.class, id);
m1 == m2 // true
1.2.5 정리
객체 | 관계형 데이터베이스 | |
---|---|---|
상속 | 상속 | 상속과 유사한 슈퍼타입과 서브타입 |
연관관계 | 참조 | 외래키를 통해 조인 |
객체그래프탐색 | 참조를 통해 탐색 | SQL 조인 범위에 따른 범위 고정 |
비교 | == 주소값 비교 / equals() 객체 내부값 비교 | 기본키 값으로 각 row 구분 |
모델링 | 객체 지향 모델링 | 데이터 중심 모델링 |
1.3 JPA란?
- Java Persistence API
- 자바 진영의 ORM 기술 표준
ORM ? Object-Relational Mapping
객체와 관계형 데이터베이스 테이블 사이의 매핑 처리를 하여
각각 객체모델링과 데이터모델링을 가능하게 한다
- JPA 동작
1.3.1 JPA 사용 이유
표준 | 다른 구현 기술로 변경이 쉽다.
성능 | 동일 트랜잭션 내 데이터 중복 조회시 한 번만 DB에 전달한다.
생산성 | 반복되는 SQL 작성과 JDBC API 사용을 처리해준다.
유지보수 | 엔티티 필드 변경에 제약이 없다.
패러다임 불일치 해결 | 상속, 연관관계, 객체 그래프 탐색, 비교 문제가 해결된다.
데이터 접근 추상화와 벤더 독립성 | 특정 DB 기술에 종속되지 않는다.(DB Dialect)