Chapter 1: JPA 소개

💡 책에서 기억하고 싶은 내용

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

  • 진정한 의미의 계층 분할 이 어렵다

  • 엔티티를 신뢰할 수 없다

  • SQL에 의존적인 개발을 피할 수 없다

1-1. JPA와 문제 해결

  • JPA를 사용하면 객체를 데이터베이스에 저장하고 관리할 때, 개발자가 직접 SQL을 작성하는 것이 아니라 JPA가 제공하는 API를 사용하면 된다

    • 그러면 JPA가 개발자 대신에 적절한 SQL을 생성하여 데이터베이스에 전달한다

  • JPA는 별도의 수정 method를 제공하지 않는다

    • 대신에 객체를 조회해서 값을 변경만 하면, 트랜잭션을 커밋할 때 데이터베이스에 적절한 UPDATE SQL 이 전달된다

2. 패러다임의 불일치

  • 객체는 속성(field)기능(method)을 가진다

    • 객체의 기능은 클래스에 정의되어 있으므로, 객체 인스턴스의 상태인 속성 만 저장했다가 필요할 때 불러와서 복구하면 된다

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

    • 이것을 객체와 관계형 데이터베이스의 패러다임 불일치 라고 한다

  • 패러다임 불일치로 발생하는 문제점은 아래와 같다

2-1. 상속

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

  • JPA는 상속과 관련된 패러다임의 불일치를 개발자 대신 해결해 준다

    • 개발자는 마치 자바 컬렉션에 객체를 저장하듯이 JPA에게 객체를 저장하면 된다

  • JPA의 persist() method를 사용해서 객체를 저장할 수 있다

2-2. 연관관계

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

    • 객체는 참조가 있는 방향 으로만 조회할 수 있다

  • 테이블은 외래 키 를 사용해서 다른 테이블과 연관관계를 가지고, JOIN 을 사용해서 연관된 테이블을 조회한다

  • JPA는 참조를 외래키로 변환해서 적절한 INSERT SQL 을 데이터베이스에 전달한다

  • 객체를 조회할 때 외래 키를 참조로 변환하는 일도 JPA가 처리해준다

2-3. 객체 그래프 탐색

  • SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다

    • 이것은 객체지향 개발자에겐 너무 큰 제약이다

    • 왜냐하면 비즈니스 로직에 따라 사용하는 객체 그래프가 다른데, 언제 끊어질지 모를 객체 그래프를 함부로 탐색할 수는 없기 때문이다

  • JPA는 연관된 객체를 사용하는 시점 에 적절한 SELECT SQL을 실행한다

    • JPA를 사용하면 연관된 객체를 신뢰하고 마음껏 조회할 수 있다

    • 이 기능은 실제 객체를 사용하는 시점까지 데이터베이스를 미룬다고 해서 지연 로딩 이라 한다

  • JPA는 지연 로딩을 투명(transparent) 하게 처리한다

    • 엔티티에 JPA와 관련된 어떤 코드도 직접 사용하지 않는다

  • JPA는 연관된 객체를 즉시 함께 조회 할지 아니면 실제 사용하는 시점에 지연해서 조회 할지를 간단한 설정으로 정의할 수 있다

2-4. 비교

  • 데이터베이스는 기본 키(PK)의 값으로 각 row 를 구분한다

  • 객체는 동일성(identity) 비교와 동등성(equality) 비교라는 두 가지 비교 방법이 있다

    • 동일성 비교는 == 비교이며, 객체 인스턴스의 주소 값 을 비교한다

    • 동등성 비교는 eqauls() method를 사용해서 객체 내부의 값 을 비교한다

  • JPA는 같은 트랜잭션 일 때, 같은 객체가 조회되는 것을 보장한다

3. JPA란 무엇인가?

  • JPA(Java Persistence API)는 자바 진영의 ORM 기술 표준 이다

    • 자바 ORM 기술에 대한 API 표준 명세다

  • ORM 프레임워크는 단순히 SQL을 개발자 대신 생성해서 데이터베이스에 전달해주는 것뿐만 아니라, 다양한 패러다임의 불일치 문제도 해결해 준다

    • 따라서 객체 측면에서는 정교한 객체 모델링 을 할 수 있고, 관계형 데이터베이스는 데이터베이스에 맞게 모델링 하면 된다

    • 그리고 둘을 어떻게 매핑해야 하는지 매핑 방법 만 ORM 프레임워크에게 알려주면 된다

  • JPA를 사용해야 하는 이유

    • 생산성

    • 유지보수

    • 패러다임의 불일치 해결

    • 성능

    • 데이터 접근 추상화와 벤더 독립성

    • 표준

Last updated