자바 ORM 표준 JPA 프로그래밍 | 김영한 - 교보문고
자바 ORM 표준 JPA 프로그래밍 | 자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다. 이 책은 JPA
product.kyobobook.co.kr
1장 - JPA 소개
1. SQL을 직접 다룰 때 발생하는 문제
1.1. 계속되는 반복
회원을 CRUD 하는 기능을 개발할 때
- 회원 객체 생성
public class Member {
private String memberId;
private String name;
}
- 회원 조회 기능
- 회원용 DAO 생성
- 회원 조회용 SQL 작성
- JDBC API를 사용해 SQL 실행
- 조회 결과를 Member 객체로 매핑
- 회원 등록 기능
- DAO에 회원 등록 기능 추가
- 회원 등록용 SQL 작성
- 회원 객체의 값을 꺼내서 등록 SQL에 전달
- JDBC API를 사용해서 SQL 실행
- 회원을 수정하고 삭제하는 기능을 만들 때도 동일한 일을 반복해야 함
- 데이터베이스 테이블이 많아질수록 무수히 많은 작업을 반복해야 함
1.2. SQL에 의존적인 개발
- 요구사항이 추가될 때, DAO를 열어서 어떤 SQL이 실행되고 있는지 일일이 확인해야 한다.
- SQL에 모든 것을 의존하는 상황에서는 개발자들이 엔티티를 신뢰하기 어렵다.
2. 패러다임의 불일치
객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법이 다르다.
따라서 객체 구조를 테이블 구조에 저장하는 데 한계가 있다.
어플리케이션을 객체지향 언어로 개발하고 데이터를 관계형 데이터베이스에 저장해야 한다면, 패러다임 불일치 문제를 개발자가 중간에서 해결해야한다.
2.1. 상속
객체는 상속 기능을 가지고 있지만 테이블은 상속 기능이 없다.
따라서 상속된 객체를 저장하려면 SQL을 각각 따로 작성해야 한다.
JPA를 사용하면 자바 컬렉션에 객체를 저장하듯이 JPA에 객체를 저장해서 패러다임의 불일치 문제를 해결해 준다.
2.2. 연관관계
객체는 참조를 사용해서 다른 객체와의 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회한다.
테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다.
- 객체는 참조가 있는 방향으로만 조회할 수 있다.
- member.getTeam() 은 가능하지만 team.getMember() 는 불가능
- 테이블은 외래 키 하나로 MEMBER JOIN TEAM , TEAM JOIN MEMBER 둘 다 가능 (양방향)
- 객체 모델은 외래 키가 필요 없고 참조가 필요 / 테이블은 참조가 필요없고 외래 키 필요
- 개발자가 중간에서 변환 역할을 해주어야 한다.
- JPA는 이 변환을 자동으로 처리해 주기 때문에, 개발자는 단순히 객체의 관계를 설정하고 객체를 저장하기만 하면 된다.
2.3. 객체 그래프 탐색
- 객체 그래프 탐색 : 참조를 사용해서 연관된 객체를 찾는 것
member.getOrder().getOrderItem()... // 자유로운 객체 그래프 탐색
객체는 마음껏 객체 그래프를 탐색할 수 있어야 하지만, SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다. 언제 끊어질지 모를 객체 그래프를 함부로 탐색할 수 없기 때문에, DAO를 열어서 SQL을 일일이 확인해야 하는 제약이 생긴다.
Member member = jpa.find(Member.class, memberId);
Order order = member.getOrder();
order.getOrderDate(); // Order를 사용하는 시점에 SELECT ORDER SQL
- JPA를 사용하면 연관된 객체를 신뢰하고 마음껏 조회할 수 있다.
- 실제 객체를 사용하는 시점까지 데이터베이스 조회를 미룬다고 해서 지연 로딩이라 한다.
- JPA는 연관된 객체를 즉시 함께 조회할지 아니면 실제 사용되는 시점에서 지연해 조회할지 간단한 설정으로 정의할 수 있다.
2.4. 비교
- 데이터베이스 : 기본키의 값으로 각 row를 구분
- 객체
- 동일성 비교 : == 를 사용해 객체 인스턴스의 주소 값을 비교
- 동등성 비교 : equals() 메소드를 사용해 객체 내부의 값 비교
class MemberDAO {
public Member getMember(String memberId) {
String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID + ?";
...
// JDBC API, SQL 실행
return new Member(...);
}
}
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member1 == member2; // false
위와 같이 기본 키 값이 같은 회원 객체를 두 번 조회한 뒤 동일성(==) 비교하면 false가 반환된다.
객체 측면에서 볼 때 둘은 다른 인스턴스이기 때문이다.
JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다.
String memberId = "100";
Member member1 = jpa.find(Member.class,memberId);
Member member2 = jpa.find(Member.class,memberId);
member1 == member2; // true
2.5. 정리
JPA는 패러다임의 불일치 문제를 해결해 주고, 정교한 객체 모델링을 유지하게 도와준다.
3. JPA란 무엇인가?
- JPA(Java Persistence API) : 자바 진영의 ORM 표준 기술
- 어플리케이션과 JDBC 사이에서 동작

- ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스를 매핑하는 것
- ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해 준다.


- ORM 프레임워크는 다양한 패러다임 불일치 문제들을 해결해 주기 때문에 정교한 객체 모델링을 할 수 있다.
- 객체와 관계형 데이터베이스를 을 어떻게 매핑해야 하는지 매핑 방법만 ORM 프레임워크에게 알려주면 된다.
- 다양한 ORM 프레임워크 중 하이버네이트 프레임워크가 가장 대중적으로 사용된다.
왜 JPA를 사용해야 하는가?
- 생산성 : 쿼리문을 별도로 작성하지 않고, 반복적인 일을 JPA가 대신 처리해 주어 생산성이 높아짐
- 유지보수 : 필드가 변경되더라도 매핑 정보만 잘 연결하면 SQL문은 자동으로 작성된다.
- 패러다임의 불일치 해결 : 상속, 연관관계, 객체 그래프 탐색, 비교 등의 패러다임 불일치 문제를 해결한다
- 성능 : 다양한 성능 최적화 기회를 제공하고, 여러 최적화 시도가 가능하다
- 데이터 접근 추상화와 벤더 독립성
- 어플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 한다.
- 데이터베이스를 변경하면 JPA에게 다른 데이터베이스를 사용한다고 알려주기만 하면 된다.
'자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 7장 - 고급 매핑 (0) | 2023.06.12 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 6장 - 다양한 연관관계 매핑 (0) | 2023.05.15 |
[자바 ORM 표준 JPA 프로그래밍] 5장 - 연관관계 매핑 기초 (0) | 2023.05.01 |
[자바 ORM 표준 JPA 프로그래밍] 4장 - 엔티티 매핑 (0) | 2023.05.01 |
[자바 ORM 표준 JPA 프로그래밍] 3장 - 영속성 관리 (0) | 2023.04.24 |
자바 ORM 표준 JPA 프로그래밍 | 김영한 - 교보문고
자바 ORM 표준 JPA 프로그래밍 | 자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다. 이 책은 JPA
product.kyobobook.co.kr
1장 - JPA 소개
1. SQL을 직접 다룰 때 발생하는 문제
1.1. 계속되는 반복
회원을 CRUD 하는 기능을 개발할 때
- 회원 객체 생성
public class Member {
private String memberId;
private String name;
}
- 회원 조회 기능
- 회원용 DAO 생성
- 회원 조회용 SQL 작성
- JDBC API를 사용해 SQL 실행
- 조회 결과를 Member 객체로 매핑
- 회원 등록 기능
- DAO에 회원 등록 기능 추가
- 회원 등록용 SQL 작성
- 회원 객체의 값을 꺼내서 등록 SQL에 전달
- JDBC API를 사용해서 SQL 실행
- 회원을 수정하고 삭제하는 기능을 만들 때도 동일한 일을 반복해야 함
- 데이터베이스 테이블이 많아질수록 무수히 많은 작업을 반복해야 함
1.2. SQL에 의존적인 개발
- 요구사항이 추가될 때, DAO를 열어서 어떤 SQL이 실행되고 있는지 일일이 확인해야 한다.
- SQL에 모든 것을 의존하는 상황에서는 개발자들이 엔티티를 신뢰하기 어렵다.
2. 패러다임의 불일치
객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법이 다르다.
따라서 객체 구조를 테이블 구조에 저장하는 데 한계가 있다.
어플리케이션을 객체지향 언어로 개발하고 데이터를 관계형 데이터베이스에 저장해야 한다면, 패러다임 불일치 문제를 개발자가 중간에서 해결해야한다.
2.1. 상속
객체는 상속 기능을 가지고 있지만 테이블은 상속 기능이 없다.
따라서 상속된 객체를 저장하려면 SQL을 각각 따로 작성해야 한다.
JPA를 사용하면 자바 컬렉션에 객체를 저장하듯이 JPA에 객체를 저장해서 패러다임의 불일치 문제를 해결해 준다.
2.2. 연관관계
객체는 참조를 사용해서 다른 객체와의 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회한다.
테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다.
- 객체는 참조가 있는 방향으로만 조회할 수 있다.
- member.getTeam() 은 가능하지만 team.getMember() 는 불가능
- 테이블은 외래 키 하나로 MEMBER JOIN TEAM , TEAM JOIN MEMBER 둘 다 가능 (양방향)
- 객체 모델은 외래 키가 필요 없고 참조가 필요 / 테이블은 참조가 필요없고 외래 키 필요
- 개발자가 중간에서 변환 역할을 해주어야 한다.
- JPA는 이 변환을 자동으로 처리해 주기 때문에, 개발자는 단순히 객체의 관계를 설정하고 객체를 저장하기만 하면 된다.
2.3. 객체 그래프 탐색
- 객체 그래프 탐색 : 참조를 사용해서 연관된 객체를 찾는 것
member.getOrder().getOrderItem()... // 자유로운 객체 그래프 탐색
객체는 마음껏 객체 그래프를 탐색할 수 있어야 하지만, SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다. 언제 끊어질지 모를 객체 그래프를 함부로 탐색할 수 없기 때문에, DAO를 열어서 SQL을 일일이 확인해야 하는 제약이 생긴다.
Member member = jpa.find(Member.class, memberId);
Order order = member.getOrder();
order.getOrderDate(); // Order를 사용하는 시점에 SELECT ORDER SQL
- JPA를 사용하면 연관된 객체를 신뢰하고 마음껏 조회할 수 있다.
- 실제 객체를 사용하는 시점까지 데이터베이스 조회를 미룬다고 해서 지연 로딩이라 한다.
- JPA는 연관된 객체를 즉시 함께 조회할지 아니면 실제 사용되는 시점에서 지연해 조회할지 간단한 설정으로 정의할 수 있다.
2.4. 비교
- 데이터베이스 : 기본키의 값으로 각 row를 구분
- 객체
- 동일성 비교 : == 를 사용해 객체 인스턴스의 주소 값을 비교
- 동등성 비교 : equals() 메소드를 사용해 객체 내부의 값 비교
class MemberDAO {
public Member getMember(String memberId) {
String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID + ?";
...
// JDBC API, SQL 실행
return new Member(...);
}
}
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member1 == member2; // false
위와 같이 기본 키 값이 같은 회원 객체를 두 번 조회한 뒤 동일성(==) 비교하면 false가 반환된다.
객체 측면에서 볼 때 둘은 다른 인스턴스이기 때문이다.
JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다.
String memberId = "100";
Member member1 = jpa.find(Member.class,memberId);
Member member2 = jpa.find(Member.class,memberId);
member1 == member2; // true
2.5. 정리
JPA는 패러다임의 불일치 문제를 해결해 주고, 정교한 객체 모델링을 유지하게 도와준다.
3. JPA란 무엇인가?
- JPA(Java Persistence API) : 자바 진영의 ORM 표준 기술
- 어플리케이션과 JDBC 사이에서 동작

- ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스를 매핑하는 것
- ORM 프레임워크는 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해 준다.


- ORM 프레임워크는 다양한 패러다임 불일치 문제들을 해결해 주기 때문에 정교한 객체 모델링을 할 수 있다.
- 객체와 관계형 데이터베이스를 을 어떻게 매핑해야 하는지 매핑 방법만 ORM 프레임워크에게 알려주면 된다.
- 다양한 ORM 프레임워크 중 하이버네이트 프레임워크가 가장 대중적으로 사용된다.
왜 JPA를 사용해야 하는가?
- 생산성 : 쿼리문을 별도로 작성하지 않고, 반복적인 일을 JPA가 대신 처리해 주어 생산성이 높아짐
- 유지보수 : 필드가 변경되더라도 매핑 정보만 잘 연결하면 SQL문은 자동으로 작성된다.
- 패러다임의 불일치 해결 : 상속, 연관관계, 객체 그래프 탐색, 비교 등의 패러다임 불일치 문제를 해결한다
- 성능 : 다양한 성능 최적화 기회를 제공하고, 여러 최적화 시도가 가능하다
- 데이터 접근 추상화와 벤더 독립성
- 어플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 한다.
- 데이터베이스를 변경하면 JPA에게 다른 데이터베이스를 사용한다고 알려주기만 하면 된다.
'자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 7장 - 고급 매핑 (0) | 2023.06.12 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 6장 - 다양한 연관관계 매핑 (0) | 2023.05.15 |
[자바 ORM 표준 JPA 프로그래밍] 5장 - 연관관계 매핑 기초 (0) | 2023.05.01 |
[자바 ORM 표준 JPA 프로그래밍] 4장 - 엔티티 매핑 (0) | 2023.05.01 |
[자바 ORM 표준 JPA 프로그래밍] 3장 - 영속성 관리 (0) | 2023.04.24 |