[자바 ORM 표준 JPA 프로그래밍 - 기본편] 01. JPA 소개

Turtle·2024년 6월 17일
0
post-thumbnail

🙄SQL 중심적인 개발의 문제점

데이터베이스에 데이터를 관리하려면 SQL을 사용해야 한다. 자바로 작성한 애플리케이션은 JDBC API를 사용해서 SQL을 데이터베이스에 전달한다. 이 과정에서 객체를 데이터베이스에 CRUD하려면 많은 SQL과 JDBC API를 코드로 작성해야 한다. 테이블마다 이런 비슷한 과정을 반복해야 하는데, 개발하려는 애플리케이션의 크기가 커질수록 무수히 많은 SQL을 작성해야 한다.

🙄패러다임의 불일치

객체와 관계형 데이터베이스는 지향하는 목적이 달라 둘의 기능과 표현 방법이 다르다.
이것을 객체와 관계형 데이터베이스의 패러다임 불일치 문제라고 한다. 따라서 객체 구조를 테이블 구조에 저장하는데 한계가 있다.

  • ✔️상속
    • 객체는 상속을 지원하나 테이블을 상속을 지원하지 않는다.

abstract class Item {
	Long id;
    String name;
    int price;
}

// ✔️상속관계
class Album extends Item {
	String artist;
}

// ✔️상속관계
class Movie extends Item {
	String director;
    String actor;
}

// ✔️상속관계
class Book extends Item {
	String author;
    String isbn;
}
  • ✔️JPA와 상속
    • JPA는 상속과 관련된 패러다임의 불일치 문제를 해결해준다.
    • 개발자는 마치 자바 컬렉션에 객체를 저장하듯이 JPA에게 객체를 저장하면 된다.
    • JPA를 사용해서 Item을 상속한 Album 객체를 저장하면 아래와 같은 과정을 거친다.
  • ✔️JPA가 persist() 메서드를 사용해서 객체를 저장한다.
jpa.persist(album);
  • ✔️JPA가 다음 SQL을 실행해서 객체를 ITEM, ALBUM 두 테이블에 나누어 저장한다.
INSERT INTO TEAM ...;
INSERT INTO ALBUM ...;
  • ✔️album 객체를 조회하기
String albumId = "id100";
Album album = jpa.find(Album.class, albumId);
  • ✔️JPA는 ITEM과 ALBUM 두 테이블을 조인해서 필요한 데이터를 찾고 결과를 반환한다.
SELECT I.*, A.*
	FROM ITEM I
    JOIN ALBUM A ON I.ITEM_ID=A.ITEM_ID;
  • ✔️연관관계
    • 객체는 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체에 조회한다. 반면 테이블은 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다.

  • ✔️객체를 테이블에 맞추어 모델링
    • 객체는 참조를 통해서 관계를 맺는다.
    • 객체는 외래 키가 필요없고 단지 참조만 있으면 되지만 테이블은 참조가 필요 없고 외래 키만 있으면 된다.
    • 따라서 중간에서 변환하는 역할을 하는 코드를 작성해야 한다.
  • ✔️JPA와 연관관계
    • 개발자가 회원과 팀의 관계를 설정하고 회원 객체를 저장한다.
    • JPA는 team의 참조를 외래 키로 변환해서 적절한 INSERT SQL을 DB에 전달한다.
    • 객체를 조회할 때 외래 키를 참조로 변환하는 일도 JPA가 대신 해준다.
class Member {
	String id;
    Team team;	     // 참조로 연관관계
    String username;
}

class Team {
	Long id;         // TEAM_ID(PK)
    String name;
}
public Member find(String memberId) {
	// SQL 실행
    ...
    Member member = new Member();
    ...
    // 데이터베이스에서 조회한 회원 관련 정보를 모두 입력
    Team team = new Team();
    ...
    // 데이터베이스에서 조회한 팀 관련 정보를 모두 입력
    
    // 회원과 팀 관계를 설정
    member.setTeam(team);
    return member;
}

🙄JPA

  • ✔️JPA
    • Java Persistence API
    • 자바 진영의 ORM 기술 표준
  • ✔️ORM
    • Object-Relational Mapping
    • 객체는 객체대로 설계
    • 관계형 데이터베이스는 관계형 데이터베이스대로 설계
    • ORM 프레임워크가 중간에서 매핑
    • 대중적인 언어에는 대부분 ORM 기술이 존재
  • ✔️JPA 동작 - 저장

  • ✔️JPA 동작 - 조회

  • ✔️JPA 성능 최적화 기능
    • 1차 캐시와 동일성 보장
      • 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상
      • DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장

    • 트랜잭션을 지원하는 쓰기 지연 - INSERT, UPDATE, DELETE
      • 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
      • JDBC BATCH SQL 기능을 사용해서 한 번에 SQL을 전송

    • 지연 로딩
      • UPDATE, DELETE로 인한 로우락 시간 최소화
      • 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고 바로 커밋
      • 지연 로딩 : 객체가 실제 사용될 때 로딩
      • 즉시 로딩 : JOIN SQL로 한 번에 연관된 객체까지 미리 조회

0개의 댓글