자바 ORM 표준 JPA 프로그래밍 - [JPA 소개]

uuuu.jini·2023년 8월 19일
0

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


  • 애플리케이션 개발 시 객체 지향 언어 (java, Scala..)
  • 데이터베이스 개발 시 관계형 DB (Oracle, MySQL..)

객체를 관계형 DB에 관리

  • 데이터, 객체를 관계형 DB에 보관한다.
  • 객체를 관계형 DB에 저장시 SQL을 수많이 사용 => SQL 중심적인 개발의 문제점

문제점

  • 무한 반복, 지루한 코드: 수많은 CRUD 쿼리가 객체 하나를 저장할때에도 수없이 작성해야 한다. (자바 객체 <-> sql)
  • 객체 작성, 필드 추가 등의 상황 발생 시 수많은 쿼리가 생성 및 수정되어야 한다.

SQL에 의존적인 개발을 피하기 어렵다.

객체지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.

객체를 영구보관하는 다양한 저장소들이 존재하지만 현실적인 대안은 관계형 데이터베이스이다.

객체와 관계형 데이터베이스의 차이

  1. 상속
    데이터베이스에는 상속관계가 존재하지 않는다. => 부모 테이블, 자식 테이블을 만들어 둠으로써 필요시에 조인해서 데이터를 조회한다. (슈퍼타입, 서브타입 관계), 객체 저장시 테이블 두군데 (슈퍼타입, 서브타입) 모두 저장해주어야 한다. (번거롭 그잡채), 조회시에도 복잡한 쿼리 작성해야 한다.
  2. 연관관계
  3. 데이터 타입
  4. 데이터 식별 방법

✅ JPA 소개

JPA: Java Persistence API, 자바 진영의 ORM 기술 표준

ORM

Object-Relational Mapping(객체 관계 매핑)

  • 객체는 객체대로 설계, 관계형 데이터베이스는 관계형 데이터베이스대로 설계
  • ORM 프레임워크가 중간에서 매핑
  • 대중적인 언어에는 대부분 ORM 기술이 존재 (자바뿐만 아니라 닷넷 등)

JPA는 애플리케이션과 JDBC 사이에서 동작

JPA는 알아서 객체를 분석하여 SQL 문을 만들어준 후 JDBC api를 사용하여 쿼리를 수행해준다. => 마치 자바 컬렉션에 저장하듯이 코드를 작성하면 알아서 쿼리 수행 (패러다임 불일치 해결)

JPA 소개

  • EJB (엔티티 빈-자바표준)
    : 실용성 떨어짐, 많은 개발자들이 사용하지 않음
  • 하이버네이트 (오픈 소스)
    : EJB 쓰던 개발자가 답답해서 만든 소스, 오픈소스로 배포 => 많은 개발자들이 추가 지원
  • JPA (자바 표준)
    : EJB가 불편한걸 개선한 자바 표준 (오픈소스에서 출발한 표준), 실용적임

JPA는 표준 명세이다.

  • JPA 는 인터페이스의 모음
  • JPA 2.1 표준 명세를 구현한 3가지 구현체: 하이버네이트, EclipseLinke, DataNucleus (거의 하이버네이트를 사용)

JPA를 왜 사용해야 하는가?

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성, 유지보수, 패러다임의 불일치 해결
  • 성능, 데이터 접근 추상화와 벤더 독립성
  • 표준

JPA의 성능 최적화 기능

  1. 1차 캐시와 동일성 보장
    : 같은 트랜잭션 안에서는 같은 엔티티를 반환 (약간의 조회 성능 향상), DB Isolation Level 이 Read Commit이어도 애플리케이션에서 Repetable Read 보장
String memberID = "100";
Member m1 = jpa.find(Member.class, memberId); // SQL
Member m2 = jpa.find(Member.class, memberId); // 캐시
println(m1 == m2) // true
  1. 트랜잭션을 지원하는 쓰기 지연
    : 트랜잭션을 커밋할 때까지 INSERT SQL을 모음, JDBC Batch SQL 기능을 사용해서 한번에 SQL을 전송
transaction.begin(); // 트랜잭션 시작

em.persit(memberA);
em.persist(memberB);
em.persist(memberC);
// 여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.

// 커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // 트랜잭션 커밋
  1. 지연 로딩과 즉시 로딩
    : 지연 로딩 - 객체가 실제 사용될 때 로딩
    : 즉시 로딩 - JOIN SQL로 한번에 연관된 객체까지 미리 조회
// 지연 로딩
Member member = memberDAO.find(memberId); // select * from MEMBER
Team team = member.getTeam(); 
String teamName = team.getName(); // select * from TEAM
// 즉시 로딩
Member member = memberDAO.find(memberId); // select M.*, T.* FROM MEMBER M JOIN TEAM T ... 
Team team = member.getTeam(); 
String teamName = team.getName();

ORM은 객체와 RDB 두 기둥위에 있는 기술

profile
멋쟁이 토마토

1개의 댓글

comment-user-thumbnail
2023년 9월 3일

너 그렇게 열심히 살다간 죽어

답글 달기