JPA 장점
CRUD SQL을 알아서 처리한다.
객체 모델링과 관계형 데이터베이스 사이의 차이점을 해결한다.
데이터베이스 종류를 쉽게 바꿀 수 있다. MySQL -> 오라클
SQL을 직접 다룰 때 발생하는 문제점
자바로 작성한 애플리케이션은 JDBC API를 사용해서 SQL을 DB로 전달한다.
반복, 반복 그리고 반복
객체를 데이터베이스에 CRUD 하기 위해서는 많은 SQL, JDBC API 가 필요하다.
각각의 테이블마다 이 작업을 반복해야 하는데, 그럴 때마다 비슷한 코드를 작성해야 한다.
// 회원 객체
public class Member{
private String memberId;
private String name;
}
// 회원용 DAO
public class MemberDAO{
public Member find(String memberId){
// 회원 조회용 SQL 작성
String sql = "SELECT MEMBER_ID, NAME FROM MEMBER M WHERE MEMBER_ID = ? ";
// JDBC API 를 사용해서 SQL 실행
ResultSet rs = stmt. executeQuery(sql);
// 조회 결과를 Member 객체로 매핑
String memberId = rs.getString("MEMBER_ID");
String name = rs.getString("NAME");
Member member = new Member();
member.setMemberId(memberId);
member.setName(name);
...
}
public void save (Member member){
// 회원 등록용 SQL 작성
String sql = "INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES (?,?)";
// 회원 객체의 값을 꺼내서 등록 SQL에 전달
pstmt.setString(1, member.getMemberId());
pstmt.setString(2, member.getName());
// JDBC API를 사용해서 SQL 실행
pstmt.executeUpdate(Sql);
...
}
}
SQL에 의존적인 개발
Member에 컬럼 1개를 추가한다고 가정하면 Member 클래스를 사용하는 CRUD 메서드와 SQL 모두 수정해줘야 한다.
DAO 클래스의 메서드명을 자세하게 적어도, 결국은 SQL을 열어서 원하는 클래스들을 조인하고 있는지 일일이 확인해야 한다.
진정한 의미의 JDBC API, SQL 계층 분할이 어렵다.
엔티티를 신뢰할 수 없다.
SQL에 의존적인 개발을 피하기 어렵다.
JPA와 문제해결
JPA는 JPA가 제공하는 API를 사용하면 되기 때문에 직접 SQL을 작성할 필요가 없다.
// 저장 기능
jpa.persist(member);
// 조회 기능
String memberId = "helloId";
Member member = jpa.find(Member.class, memberId);
// 수정 기능
Member member = jpa.find(Member.class, memberId);
member.setName("이름변경");
// 연관된 조회 기능
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
패러다임의 불일치
객체와 관계형 데이터베이스의 패러다임 불일치 문제로 인해 객체 구조를 테이블에 저장하는 데는 한계가 있다.
상속개념 불일치
객체: 상속 개념 존재
테이블: 상속 개념 없음
데이터베이스 모델링에서 얘기하는 슈퍼타입, 서브타입 관계를 사용해서 비슷하게 설계할 수 있다.
JPA는 상속과 관련된 패러다임 불일치 문제를 해결해준다.
// 객체 저장
jpa.persist(album);
// SQL이 각각 실행된다.
INSERT INTO ITEM...
INSERT INTO ALBUM...
// 객체 조회
String albumId = "id100"
Album album = jpa.find(Album.class, albumId);
// 두 테이블을 조인한 SQL이 실행된다.
SELECT I.*, A.*
FROM ITEM I
JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID
연관관계
객체: 참조를 이용해서 다른 객체와 연관관계를 가지고, 참조를 이용해서 연관된 객체 조회
테이블: 외래키를 사용해서 테이블과 연관관계를 가지고, 조인을 사용해서 연관된 테이블 조회
// 객체 : 참조 필드에 접근해서 팀에 접근 가능
member.getTeam();
// 테이블 : 외래키를 이용해서 조인을 통해 팀에 접근 가능
SELECT M.*, T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
객체 모델: 외래키 필요 없음. 참조만 필요함
테이블: 참조 필요 없음. 외래키만 필요함
개발자: 객체와 테이블 중간에서 변환 역할을 해야 한다.
JPA는 연관관계와 관련된 패러다임 불일치 문제를 해결해 준다.
// 저장
member.setTeam(team); // 회원과 팀 연관관계 설정
jpa.persist(member); // 회원과 연관관계 함께 설정
// 조회
Member member = jpa.find(Member.class, memberId);
Team team = memer.getTeam();
객체 그래프 탐색
객체 그래프 탐색: 참조를 사용해서 연관된 팀을 찾는 것
Team team = member.getTeam();
SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다.
member.getOrder() -> null 발생
JPA는 지연 로딩으로 실제 객체를 사용하는 시점에 데이터베이스에서 조회 SQL을 실행하도록 미루기 때문에 연관된 객체를 신뢰하고 조회할 수 있다.
설정을 통해 Member, Order를 즉시 함께 조회할 수도 있다.
비교
객체: 동일성 비교 (==), 동등성 비교 (equals())를 통해 객체구분
테이블: 기본 키 값으로 각 row 비교
// SQL로 객체 2개를 조회해서 비교하기
class MemberDAO {
public Member getMember(String memberId){
String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = ?";
...
return new Member(...);
}
}
class MemberService {
public boolean isSameMember() {
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
return member1 == member2; // false로 나온다.
}
}
JPA를 사용하면 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다.
class MemberService {
public boolean isSameMember() {
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
return member1 == member2; // true로 나온다.
}
}
정리
객체 모델, 테이블의 패러다임이 다른 문제를 극복하려고 개발자가 많은 시간과 코드를 사용해야 한다.
정교하게 객체를 객체지향적으로 모델링할수록 관계형 데이터베이스와의 괴리감이 커진다.
JPA는 이 패러다임 불일치 문제를 해결해 주고, 객체 모델링을 유지해 준다.
JPA란 무엇인가?
JPA: 자바 진영의 ORM 기술 표준
애플리케이션과 JDBC사이에서 동작한다.
ORM: 객체와 관계형 데이터베이스를 매핑
JPA 소개
자바 빈즈: 엔티티 빈이라는 ORM 기술이 있었지만 너무 복잡했다.
하이버네이트: 자바 빈즈보다 훨씬 선능이 좋고 사용하기 편했다.
JPA: 하이버네이트를 기반으로 새로운 자바 ORM이 만들어졌다. 인터페이스들을 JPA에 만들어뒀다.
왜 JPA를 사용해야 하는가?
생산성: SQL 작성 및 JDBC API 코드 작성을 JPA가 대신 처리해 준다.
유지보수: 엔티티에 필드 1개를 추가해도 JPA가 SQL, JDBC API 코드를 자동으로 수정해 준다.
패러다임 불일치 해결
성능: 다양한 성능 최적화를 제공한다.
// SQL을 한번만 실행하고, member2는 조회한 회원 객체를 재사용한다.
String memberId = "100";
Member member1 = jpa.find(memberId);
Member member2 = jpa.find(memberId);
데이터 접근 추상화와 벤더 독립성: 다른 종류의 데이터베이스를 한 프로젝트 안에서 자유롭게 넘나들 수 있다. JPA에게 어떤 데이터베이스를 사용할 건지만 말해주면 된다.
표준: 자바 진영의 ORM기술 표준이므로 다른 구현 기술로 손쉽게 변경할 수 있다.
정리
데이터베이스와 테이블 사이의 패러다임 불일치 문제가 있다.
이를 JPA는 쉽게 해결할 수 있다.
JPA는 자바 진영의 ORM기술 표준이다.
JPA의 장점에는 생산성, 유지보수, 패러다임 불일치 해결, 성능, 데이터 접근 추상호와 벤더 독립성, 표준이 있다.
참고자료
- https://www.yes24.com/Product/Goods/19040233 "자바 ORM 표준 JPA 프로그래밍-김영한"
'Coding > computer science' 카테고리의 다른 글
자바 ORM 표준 JPA 프로그래밍 | 04. 엔티티 매핑 (0) | 2023.09.06 |
---|---|
자바 ORM 표준 JPA 프로그래밍 | 03. 영속성 관리 (0) | 2023.08.29 |
자바 ORM 표준 JPA 프로그래밍 | 02. JPA 시작 (0) | 2023.08.22 |
JPA Proxy (2) | 2023.06.21 |
Spring JDBC를 이용한 데이터 접근 (0) | 2023.06.15 |