본문 바로가기
Book

자바 ORM 표준 JPA 프로그래밍 - JPA 정리하기 (1) JPA 소개

by devLog by Ronnie's 2022. 7. 3.

들어가며


현업에서 JPA를 사용하고 있지만 항상 기본기가 중요하다는 생각하에 JPA에 교과서라고 불리는 김영한님의 자바 ORM 표준 JPA 프로그래밍을 읽으며 해당 내용을 정리하기로 했다. 현재 회사에서 나와 비슷한 연차인 동료와 함께 스터티 요일을 정해서 스터디할 분량을 정한 후에 각자 공부한 내용을 정리하여 설명하기로 하고 퇴근 후 스터디를 하기로 정했다.

 

이때 정리한 내용을 남겨둔다. 

 

 

 

1장


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

 

- 데이버베이스는 객체 구조와는 다른 데이터 중심의 구조를 가지므로 객체를 데이터베이스에 직접 저장하거나 조회할 수 없다. 따라서 개발자가 객체지향 애플리케이션과 데이터베이스 중간에서

SQL과 JDBC API를 사용해서 변환 작업을 직접해줘야 함

--> 여기서 문제는 CRUD와 같은 반복 작업들이 너무 많다는 점

- sql에 의존적인 개발 --> SQL과는 강한 의존관계를 가지고 있어 SQL의 의존적인 개발을 피할 수 없음. / 엔티티를 신뢰할 수 없음 / 진정한 의미의 계층 분할이 어렵다

- JPA와 문제 해결 - jpa를 사용하면 개발자가 직접 sql을 작성하는 것이 아니라 jpa가 제공하는 api를 사용하면 됨

 

1.2 패러다임의 불일치

 

- 애플리케이션 발전 -> 내부의 복잡성 증가 -> 복잡성을 제어 못하면 유지보수가 어려운 애플리케이션 탄생

- 객체지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들 제공 -> 그래서 현대의 복잡한 애플리케이션은 대부분 객체지향 언어로 개발

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

- 객체 지향 언어로 개발하고 관계형 데이터베이스에 저장해야된다면 중간에서 개발자가 문제를 해결해줘야함

- 하지만 이러한 문제를 해결하기 위해서는 너무 많은 시간과 코드를 소비해야한다.

 

패러다임의 불일치로 발생하는 문제들

 

1.2.1 상속

- 객체는 상속이라는 기능을 가지고 있지만 테이블은 상속이라는 기능이 없음 (일부 데이터베이스는 상속 기능은 지원하지만 객체의 상속과는 다름)

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

 

1.2.2 연관관계

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

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

- 참조 관계가 아닌 외래키 필드를 그대로 가지고 관계를 맺으면 좋은 객체 모델링은 기대하기 어렵고 결국 객체지향의 특징을 잃어버리게 된다.

- JPA는 연관관계와 관련된 패러다임의 불일치 문제를 해결해준다.

 

1.2.3 객체 그래프 탐색

- 객체는 마음껏 객체 그래프를 탐색할 수 있어야하는데 SQL을 직접 다루는 상황에서는 SQL의 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해지므로 객체지향 개발자에겐 큰 제약

- JPA는 연관된 객체를 사용하는 시점에 적절한 SELETE SQL을 실행한다. 따라서 JPA를 사용하면 연관된 객체를 신뢰하고 마음껏 조회할 수 있다. -> 이러한 기능을 지연 로딩이라고 한다 (실제 객체를 사용하는 시점까지 데이터베이스 조회를 미룬다고해서)

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

 

1.2.4 비교

- 데이터베이스는 기본 키의 값으로 각 로우를 구분

- 반면 객체는 동일성 (==) 비교와 동등성 비교 (equals() 메서드를 사용해 객체 내부 값 비교) 두가지 방법이 있다.

- 따라서 두가지의 방법에는 차이가 있다.

- 기본 키 값이 같은 회원 객체를 두번 조회해서 member1 / member2는 같은 데이터베이스 로우에서 조회했지만 객체 측면에서 볼 때 둘은 다른 인스턴스이다.

- 따라서 데이터베이스의 같은 로우를 조회했지만 객체의 동일성 비교에는 실패한다.

- 하지만 JPA에서는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다. 그러므로 member1 / member2의 동일성 비교에 성공한다.

 

1.2.5 정리

- jpa는 패러다임의 불일치 문제를 해결해주고 정교한 객체 모델링을 유지하게 도와준다.

 

 

 

1.3 JPA란 무엇인가?

  • 애플리케이션과 JDBC 사이에서 동작
  • ORM = ‘Object-Relational Mapping’ 객체와 관계형 데이터베이스를 매핑한다는 뜻
  • 자바 진영에도 다양한 ORM이 존재하지만 그중 하이버네이트 프레임워크가 가장 많이 사용. (거의 대부분의 패러다임 불일치 문제 해결해줌)

1.3.1 JPA 소개

  • EJB 3.0 (enterprise-java-beans)에서 하이버네이트를 기반으로 새로운 자바 ORM 기술 표준이 만들어졌는데 이것이 바로 JPA
  • JPA라는 표준 덕분에 특정 구현 기술에 대한 의존도를 줄일 수 있고 다른 구현 기술로 손쉽게 이동할 수 있는 장점이 있다.

1.3.2 왜 JPA를 사용해야 하는가?

  • 생산성 : 컬렉션에 객체를 저장하듯이 JPA에게 저장할 객체를 전달하면 된다. 따라서 지루하고 반복전이 코드와 CRUD용 SQL을 직접 작성하지 않아도 된다.
  • 유지보수 : SQL의 의존적인 개발을 하게 되면 필드가 하나 추가 될때 관련된 SQL들을 모두 수정해줘야하는데 JPA를 사용하면 해당 엔티티만 수정해주면 된다.
  • 패러다임의 불일치 해결
  • 성능 : JPA는 애플리케이션과 데이터베이스 사이에서 동작하므로 다양한 성능 최적화 기회를 제공한다.

 

다음과 같은 코드가 있을 때 JDBC API를 이용해 해당 코드를 직접 작성했다면 두번 조회했겠지만 JPA를 사용하면 한번 조회하고 두번째 조회할때는 첫번째 조회했던 회원 객체를 재사용한다.

참고로 하이버네이트는 SQL 힌트를 넣을 수 있는 기능도 제공한다.

  • 데이터 접근 추상화와 벤더 독립성 : 관계형 데이터베이스는 같은 기능도 벤더마다 사용법이 다르다. 그래서 다음 그림과 같이 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공해서 애플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 한다.

 

 

댓글