[Spring] JPA

개발의 숩
|2023. 6. 28. 22:29

요약

객체와 관계형 데이터베이스 매핑으로 객체와 테이블 매핑하여 패러다임의 불일치 문제를 해결할 수 있는 방안으로, 생산성, 유지보수, 패러다임 불일치 해결, 데이터 접근 추상화와 벤더 독립성등의 장점을 가지고 있는 프레임워크

 

 

JPA(Java Persistence API)

자바 애플리케이션과 JDBC 사이에서 동작하며, ORM 기술 표준으로 사용되는 인터페이스의 모음

즉, 실제적으로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크

JPA를 구현하는 대표적인 오픈소스로는 Hibernate가 있다

 

 

ORM(Object Relational Mapping)

객체와 관계형 데이터베이스의 데이터를 매핑하는 기술

  • ORM 프레임워크가 객체와 데이터베이스 중간에서 매핑
  • 객체와 테이블을 매핑하여 패러다임 불일치 문제 해결

 

JPA의 동작

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

JPA는 JDBC API를 사용하여 데이터베이스와 데이터를 주고 받게 된다.

 

저장

  1. MemberDAO 클래스를 통해 persist()를 실행하면, JPA가 Entity 객체를 분석하여 SQL문을 생성한다
  2. JDBC API를 사용하여 DB에 생성된 INSERT SQL을 보내게 된다
  3. 이 과정에서 JPA는 객체와 데이터베이스 테이블의 패러다임 불일치를 해결한다

 

조회

  1. MemberDAO 클래스를 통해 find(id)를 실행하면, JPA는 SELECT SQL을 생성한다
  2. JDBC API를 사용하여 생성된 SELECT SQLD을 보낸다
  3. DB에서 반한된 정보를 ResultSet 매핑을 통해 객체로 변환해준다
  4. 이 과정에서도 패러다임 불일치 문제를 해결해준다

 

JPA를 사용하는 이유

생산성

  • JPA는 쿼리문을 별도로 작성할 필요가 없다
  • 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 애플리케이션 개발이 가능하다

유지보수

  • JPA에서는 쿼리를 직접 작성하지 않기 때문에 필드가 변경되더라도 매핑 정보만 잘 연결하면 SQL문은 자동으로 작성된다
  • 개발자가 작성해야 할 SQL과 JDBC API 코드를 JPA가 대신 처리해줌으로 유지보수해야 하는 코드 수가 줄어든다

패러다임 불일치 문제 해결

상속, 연관관계, 객체, 그래프 탐색, 비교등을 설계 차이로 인해 발생하는 패러다임 불일치 문제를 해결한다

  • 객체는 상속 구조를 만들 수 있으며, 다형성 구현이 가능하지만, 관계형 데이터베이스의 테이블은 상속이라는 개념이 존재하지 않는다
  • 객체는 참조를 통해 관계를 표현하며 방향을 가지고 있으나, 관계형 데이터베이스는 외래 키를 통해 관계를 표현하며, 방향이 존재하지 않는다. 또한 다대다 관계 문제를 해결하기 위해 조인을 사용한다
  • 이외에도 다양한 패러다임 불일치 문제가 존재한다

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

  • 데이터베이스 기술에 종속되지 않도록 한다
  • 데이터베이스를 변경하면 JPA에게 다른 데이터베이스를 사용한다고 알려주기만 된다

 

 

JPA의 단점

복잡한 쿼리 처리

  • 복잡한 쿼리를 사용할 경우는 SQL문을 사용하는게 나을 수도 있다. JPA에서는 Native SQL을 통해 기존의 SQL문을 사용할 수 있지만 그러면 특정 데이터베이스에 종속된다는 단점이 생긴다. 이를 보완하기 위해서는 SQL과 유사한 기술인 JPQL을 지원한다

성능 저하 위험

  • 객체 간의 매핑 설계를 잘못했을 때 성능 저하가 발생할 수 있으며, 자동으로 생성되는 쿼리가 많기때문에 개발자가 의도하지 않는 쿼리로 인해 성능이 저하되기도 한다

학습

  • JPA를 사용하기 위해선 학습해야 할 것들이 많다
  • JPA를 사용해도 SQL을 알아야 Hibernate가 수행한 쿼리 확인 및 성능 모니터링이 가능하다

 

 

 

 

JDBC API

자바 프로그래밍 언어와 다양한 데이터베이스 SQL 또는 테이블 형태의 데이터 사이에 독립적인 연결을 지원하는 표준

즉, 다양한 형태의 관계형 데이터베이스에 접속하여 자바 프로그래밍 언어와 데이터베이스 사이에 데이터를 주고 받을 수 있도록 지원하는 표준 자바 응용 프로그래밍 인터페이스이다.

 

JDBC API 역할

JDBC API는 표준 응용 프로그래밍의 인터페이스만을 제공해주는 것이고,

실질적인 인터페이스의 메소드 기능들에 대한 실제 구현은 DBMS 제조사들이 자신들의 데이터베이스에 맞게 구현하여 제공하며, 이를 JDBC 드라이버라고 한다

 

JDBC 드라이버

DBMS 회사들이 자신들의 데이터베이스 시스템에 접근할 수 있도록 표준 JDBC 인터페이스에 명시된 메소드들을 구현한 것

따라서 JDBC API를 사용할 경우, 하나의 자바 응용 프로그램만으로 JDBC 드라이버를 제공하는 어떤 종류의 관계형 DBMS에도 접근이 가능할 것이며, 사용자들은 특정 회사의 데이터베이스의 정확한 사용 방법을 몰라도 JDBC API만 배우면 데이터베이스 응용 프로그램을 구현할 수 있는 것이다.