Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

이지은님의 블로그

250319 - 자바 ORM 표준 JPA 프로그래밍 Chapter.1 JPA 소개 본문

TIL

250319 - 자바 ORM 표준 JPA 프로그래밍 Chapter.1 JPA 소개

queenriwon3 2025. 3. 19. 23:28

 오늘 배운 

스터디 중인 자바 ORM 표준 JPA 프로그래밍의 1챕터를 블로그에 정리해보았다.

📋 Chapter.1 JPA 소개

1) SQL을 직접 다룰 때의 문제점
2) 패러다임 불일치
3) JPA란?

 

 

Chapter.1 JPA 소개

1) SQL을 직접 다룰 때의 문제점

  • 데이터베이스는 객체 구조와는 다른 구조를 가지므로 데이터베이스에 직접 저장 및 조회가 불가능
    👉 변환과정을 거쳐야함 (번거로움)
  • 테이블의 필드가 추가될 때마다 관련 쿼리 코드를 모두 수정해야함
    👉 객체지향적으로 설계하면 필드가 늘어나더라도 추가 코드수정 ❌

🚨 SQL를 직접 다룰때의 문제점

1) 진정한 의미의 계층 분할이 어렵다.
2) 엔티티를 신뢰할 수 없다.
3) SQL에 의존적인 개발을 피하기 어렵다.

👉 JPA을 사용하면 코드의 중복을 줄일 수 있고 어플리케이션을 SQL이 아닌 객체 중심으로 개발할 수 있어 생산성유지보수성 이 좋고, 테스트를 작성하기도 편해짐

 

2) 패러다임 불일치

객체관계형 데이터베이스

지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법도 다르다.

➡︎ 패러다임 불일치 문제

 

1️⃣ 상속

객체는 상속이라는 기능을 가지고 있지만 테이블은 상속이라는 기능이 없다...

상위 객체를 저장하려면 이 객체를 분해해서 하위 객체를 만들어야한다.(코드의 양 증가)

JPA의 해결

jpa.persist(album);     // 1️⃣ Create

String albumId = "id100";
Album album = jpa.find(Album.class, albumId);   // 2️⃣ Read

위 Java 코드가 SQL로는 어떤 뜻일까?

INSERT INTO ITEM ...
INSERT INTO ALBUM ...   -- 1️⃣ Create

SELECT I.*, A.*
    FROM ITEM I
    JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID       -- 2️⃣ Read

 

2️⃣ 연관관계

객체참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회한다.

반면, 테이블외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다.

  • 관계형 데이터베이스는 조인이라는 기능이 있으므로, 외래키의 값을 그대로 보관해도 된다. 하지만 객체는 연관된 객체의 참조를 보관해야 연관된 객체를 찾을 수 있다.
    (객체는 참조 방향을 가진다.)
  • 개발자가 중간에서 외래 키참조의 변환 역할을 해야한다.
    👉 JPA가 변환을 처리해준다.

JPA의 해결

// 0️⃣ Entity
class Member {
    String id;
    Team team;      // 참조로 연관관계를 맺는다. Team 클래스에서 id는 PK
    String username;
}

// 1️⃣ Create
member.setTeam(team);   // 회원과 팀 연관관계 설정
jpa.persist(member);    // 회원과 연관관계를 함께 저장

// 2️⃣ Read
Member member = jpa.find(Mamber.class, memberId);
Team team = member.getTeam();

 

3️⃣ 객체 그래프 탐색

  • 객체는 마음껏 객체 그래플르 탐색할 수 있어야한다.
  • SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다. (🚨엔티티가 SQL에 논리적으로 종속)

JPA의 해결

지연 로딩: 실제 객체를 사용하는 시점까지 데이터베이스 조회를 미룸
👉 연관된 객체를 신뢰하고 마음껏 조회

member.getOrder().detOrderItem()...;    // 자유로운 객체 그래프 탐색
// 처음 조회 시점에 SELECT MEMBER
Member member = jpa.find(Member.class, memberId);

Order order = member.getOrder();
order.getOrderDate();       // Order를 사용하는 시점에 SELECT ORDER

 

4️⃣ 비교

  • 동일성 비교 (==) : 객체 인스턴스의 주소 값을 비교
  • 동등성 비교 (equals()) : 객체 내부의 값을 비교
  • 객체 지향에서 동일성을 비교할 때는 False(주소값을 비교함)
    👉JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장

 

3) JPA란 무엇인가?

  • JPA(Java Persistence API): 자바 진영의 ORM 기술 표준
  • ORM(Object-Relational Mapping): 객체와 관계형 데이터베이스를 매핑
  • JPA 저장: 1️⃣ Entity 분석, 2️⃣ INSERT SQL 생성, 3️⃣ JDBC API 사용, 4️⃣ 패러다임 불일치 해결을 하여 DB에 데이터를 반영한다.
  • JPA 조회: 1️⃣ SELECT SQL 생성, 2️⃣ JDBC API 사용, 3️⃣ ResultSet 매핑, 4️⃣ 패러다임 불일치 해결을 하여 DB의 데이터를 조회한다.
  • 매핑방법을 JPA가 해결해주면서 개발자는 데이중심인 관계형 데이터베이스를 사용해도 객체지향 애플리캐이션 개발에 집중할 수 있다.
  • 하이버네이트: 패러다임 불일치 문제를 해결해주는 성숙한 ORM 프레임워크

💡 JPA를 사용해야 하는 이유

1) 생산성: 반복적인 코드와 CRUD 쿼리를 개발자가 직접 작성하지 않아도 됨
2) 유지보수: 엔티티의 수정해도 수정할 쿼리 코드가 줄어듬 👉 유지보수해야하는 코드가 줄어든다.
3) 패러다임 불일치 해결: 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임 불일치 해결
4) 성능: 1차 캐시 사용으로, 조회한 객체를 재사용한다.
5) 데이터 접근 수상화와 벤더 독립성: 특정 데이터 베이스 기술에 종속되지 않도록 한다.

 

마이바티스와 차이점

마이바티스나 스프링 JdbcTemplate을 SQL 매퍼라고 한다.
👉 개발자가 SQL을 직접 작성
👉SQL에 의존하는 개발