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

2022. 5. 13. 01:45Web/Spring

반응형

velog에서 옮겨온 글 입니다.

원본 날짜: 2022-03-07T19:27:47.062Z


김영한님의 '자바 ORM 표준 JPA 프로그래밍' 서적을 읽고 정리한 글 입니다.

SQL을 직접 다룰 때 발생하는 문제점

반복

  • 객체를 데이터베이스에 CRUD하려면 너무 많은 JDBC API를 코드로 작성해야 한다.
  • 테이블 마다 비슷한 일을 반복해야 하므로 무수히 많은 SQL을 작성해야 한다.

SQL에 의존적인 개발

  • 객체가 연관된 다른 객체를 사용할 수 있을지 없을지는 전적으로 사용하는 SQL에 달려있게 된다.
  • DAO를 사용해서 SQL을 숨겨도 어쩔 수 없이 DAO를 열어서 어떤 SQL이 실행되는지 확인해야 된다. 따라서, 개발자들은 엔티티를 신뢰하고 사용할 수 없다.
  • 따라서, 객체에 필드를 추가하거나, 조회하는 필드가 바뀔 때도 DAO의 CRUD 코드와 SQL 대부분을 변경해야 하는 문제가 발생한다.

패러다임 불일치

객체와 관계형 데이터베이스는 지향하는 목적이 다르므로 기능과 표현 방법이 다르다

상속

  • 객체는 상속이 있지만, 테이블은 상속이 없다.
  • 그나마 데이터베이스 모델링에서 이야기하는 '슈퍼타입 서브타입' 관계를 사용하면 객체 상속과 가장 유사한 형태로 테이블을 설계 가능하다.
    • 객체 저장 : 객체를 분해해서 두개의 INSERT 쿼리 사용
    • 객체 조회 : 두 테이블을 조인해서 조희한 정보로 객체를 생성
  • 이 과정이 모두 패러다임 불일치를 해결하려고 소모하는 비용이다.

JPA와 상속

  • 그냥 자바 컬렉션에 객체를 저장하듯이 JPA에게 객체를 저장하면 된다.
  • JPA는 자동으로 두 개의 INSERT 쿼리로 두 테이블에 나눠서 저장한다.
jpa.persist(album);
  • 조회도 마찬가지
  • JPA는 자동으로 두 개의 테이블을 조인해서 데이터를 조회하고 그 결과를 반환한다.
String albumId = "id100";
Album album = jpa.find(Album.class, albumId);

연관관계

  • 객체는 참조로 다른 객체와 연관관계를 가지고, 테이블은 외래 키를 사용한다.
  • 객체는 참조로 단방향으로만 조회 가능하지만, 테이블은 외래 키 하나로 양방향 조회가 가능하다.
  • 객체 지향적으로 모델링을 하면, 개발자가 중간에서 변환 역할을 해야 한다.

JPA와 연관관계

  • 객체의 관계를 설정하고 저장하면 된다.
  • JPA는 객체의 참조를 외래 키로 변환해서 적절한 INSERT 쿼리를 데이터베이스에 전달한다.
member.setTeam(team);
jpa.persist(member);
  • 객체를 조회할 때 외래 키를 참조로 변환하는 일도 JPA가 처리해준다.
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();

객체 그래프 탐색

  • SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다.
  • 결국, DAO에 상황별 메소드를 여러 벌 만들어서 사용해야 한다.
memberDAO.getMember();
memberDAO.getMemberWithTeam();
memberDAO.getMemberWithOrderWithDelivery();
  • 객체 그래프를 신뢰하고 사용할 수 있으면 이런 문제를 어느 정도 해소할 수 있다.

JPA와 객체 그래프 탐색

  • JPA를 사용하면 객체 그래프를 마음껏 탐색할 수 있다.
member.getOrder().getOrderItem()...
  • 실제 객체를 사용하는 시점까지 데이터베이스 조회를 미룬다. (지연 로딩)
  • JPA는 연관된 객체를 즉시 함께 조회할지 아니면 실제 사용되는 시점에 지연해서 조회할지를 설정으로 정의할 수 있다.

비교

  • 데이터베이스는 기본 키의 값으로 각 row를 구분한다.
  • 객체는 동일성(identity) 비교와 동등성(equality) 비교 두 가지 방법이 있다.
    • 동일성(identity) 비교 : '==', 객체 인스턴스 주소 값을 비교
    • 동등성(equality) 비교 : 'equals()', 객체 내부의 값을 비교
  • 데이터베이스의 동일한 로우를 두번 조회해서 각각 다른 객체에 저장하고 동일성 비교를 하면 다르다고 나온다.

JPA와 비교

  • JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다. (동일성 비교 성공)

JPA란 무엇일까?

  • 자바 진영의 ORM 기술 표준.
  • 자바 애플리케이션과 JDBC 사이에서 동작함.
  • 자바 ORM 기술에 대한 API 표준 명세. (인터페이스를 모아둔 것임)
  • 따라서, 구현한 프레임워크를 선택해야 하는데 하이버네이트가 가장 대중적.

왜 JPA를 사용해야 하는가?

  • 생산성 : SQL작성과 JDBC API를 사용하는 것 같은 지루하고 반복적인 일을 처리해줌.
  • 유지보수 : SQL, JDBC API 코드를 직접 수정할 필요가 없어지고, 객체지향 언어가 가진 장접들을 활용해서 유지보수하기 좋은 모델을 설계할 수 있음.
  • 패러다임 불일치 해결
  • 성능 : 다양한 성능 최적화 기회를 제공.
  • 데이터 접근 추상화와 벤더 독립성 : 특정 데이터베이스 기술에 종속되지 않도록 해줌. (Dialect)
  • 표준
반응형