티스토리 뷰

728x90

▶ 개념

💡 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스

 

자바 진영에서 ORM( Object - Relational Mapping ) 기술 표준으로 사용되는 인터페이스 모음

  • 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크
  • JPA를 구현한 대표적인 오픈소스로는 Hibernate가 있다.

▶  JPA 동작

  • 애플리케이션과 JDBC 사이에서 동작한다.
  • JPA를 사용하면 JPA 내부에서 JDBC API를 사용하여 SQL을 호출해서 DB와 통신

JPA 동작 과정

  • 하나의 앱에는 하나의 EntityManager Factory를 생성하고 각 요청에 따라 EntityManager를 생성하여 커넥션 풀을 만들고 DB에 요청

내부 동작

  • EntityManager는 하나의 스레드에서 사용하고, 사용이 끝나면 반납
  • 그 이유는 트랜잭션 단위로 EntityManager를 사용한다. 여러 스레드가 동시에 사용한다면, 영속성 컨텍스트와 DB 간의 데이터 동기화가 깨지게 된다. 커밋이 된 이후에는 영속성 컨텍스트는 반납했다가 새롭게 생성해야 한다.

▶  JPA 사용이유

💡SQL의 문제점?

  1. 같은 코드의 무한 반복 → sql 코드, 기본 CRUD의 반복
  2. 패러다임의 불일치: 객체와 관계형 DB의 차이 → 객체를 DB에 넣을 때 문제 발생
  3. SQL 의존적 개발: 만약 테이블에 하나의 Column을 추가해야 한다면 모든 SQL의 변경(INSERT, UPDATE, SELECT 등 관련된 모든 쿼리와 메소드)이 필요하다. 논리적인 계층 분할이 어렵게 된다.
  4. **객체 -RDB 패러다임의 불일치 : 객체는 추상화, 상속, 다형성(클래스, 메소드)**의 특징을 가지고, RDB는 데이터 중심으로 이뤄져,RDB에 객체를 저장하는 데 불일치가 발생함
  5. 상속: 객체랑 다르게 테이블은 상속이라는 기능이 없어서, 개발자가 여러 설정/쿼리를 생성해야 함
  6. 연관관계: 객체는 참조를 사용해서 연관된 객체를 조회하는 데, 테이블은 외래 키로 연관 관계를 설정하고 조인으로 연관 테이블을 조회함

💡이를 극복한 JPA를 사용하는 이유

  • SQL 중심적인 개발에서 객체 중심적인 개발이 가능하다.
  • 생산성이 증가한다.
    • DDL문 자동 생성
    • 간단한 메서드로 CRUD가 가능해진다.
    • SQL을 작성하고 JDBC API 를 사용하는 반복적인 일을 대신 처리해준다.
  • 유지 보수가 쉽다.
    • 기존 : 필드 변경 시 모든 SQL 수정
    • JPA : 필드만 추가하면 된다. SQL은 JPA 가 처리한다.
  • Object와 RDB간의 패러다임 불일치 해결
    • 상속 / 연관 관계 / 객체-RDB 패러다임 불일치를 해결한다.
    • JAVA의 존재하는 상속 관계를 객체의 상속 관계를 지원하지 않는 데이터베이스에서 JPA는 아래 방식으로 해결

JPA의 DB 상속 관계

  • 성능 최적화 기회를 제공한다.
    • 애플리케이션과 데이터베이스 사이에서 성능 최적화 기회를 제공한다.
    • 같은 트랜잭션 안에서는 같은 엔티티를 반환하기 때문에 데이터 베이스와의 통신 횟수를 줄일 수 있다. 또한, 트랜잭션을 commit하기 전까지 메모리에 쌓고 한번에 SQL을 전송한다.
  • 데이터 접근 추상화와 벤더 독립성
    • RDB는 같은 기능이라도 벤더마다 사용법이 다르기 때문에 처음 선택한 데이터베이스에 종속되고 변경이 어렵다. JPA는 애플리케이션과 데이터베이스 사이에서 추상화 된 데이터 접근을 제공하기 때문에 종속이 되지 않도록 한다.
    • 만약 DB가 변경되더라도 JPA에게 알려주면 간단하게 변경이 가능하다. (유연하다)

▶  JPA 의 장 / 단점

장점

  • SQL문이 아닌 메서드를 통해서 DB 조작이 가능하기 때문에, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데 만 집중이 가능해진다.
  • Query와 같이 필요한 선어문 / 할등등의 부수적인 코드가 줄어들어 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높일수 있다.
  • 객체 지향적인 코드 작성이 가능해진다.
  • 유지 보수 및 리팩토링에 유리하다.

 

단점

  • 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우에는 속도 저하 및 일관성을 무너뜨리는 문제점이 발생할 수도 있다. ( 개발자가 의도하지 않은 자동으로 생성된 Query로 인해 성능이 저하되기도 함 )
  • 복잡하고 무거운 Query문은 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 쓰는게 나은 상황이 발생할 수도 있다.
  • 학습 비용이 비싸고 시간이 오래 걸린다.

 

 

 

**추가 JPA 관련 용어**

 

※ ORM( Object - Relational Mapping )

  • 객체와 관계형 데이터베이스의 데이터를 자동으로 Mapping( 연결 ) 해주는 것을 의미한다.
  • 객체 지향 프로그래밍 ⇒ 클래스 사용 / 관계형 데이터베이스 ⇒ 테이블 사용
  • 객체 모델과 관계형 모델 간의 존재하는 불일치를 ORM을 통해 객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치 해결한다.

 

※ Hibernate

  • : JPA 구현체의 한 종류로, (DataNucleus, EclipseLink등 다른 구현체도 존재): JPA가 DB와 자바 객체를 매핑하기 위한 인터페이스이고 Hibernate는 이를 구현한 라이브러리이다.

 

🔎 Spring Data JPARepository를 정의하여 사용하는 더 쉬운 방법(Repository 내부적으로는 EntityManager을 사용)

  • JPA를 편하게 쓰기 위한 모듈

 

🔎 JPQL이란JPQL은 DB SQL에 의존하지 않고, 쉽게 말하면 객체 지향 SQL이라 보면 된다.

  • 엔티티 객체를 대상으로 쿼리 (반면 SQL은 테이블을 대상으로 쿼리)
  • nativeQuery = true → SQL
  • nativeQuery = false (default) → JPQL

 

🔎 query DSL

query DSL정적 타입을 이용해서 SQL, JPQL을 코드로 작성할 수 있도록 도와주는 오픈소스 빌더 API

  • query DSL을 사용하는 목적은 뚜렷하다.기존 방식(Mybatis, JPQL, etc..)은 모두 문자열(=String) 형태로 쿼리가 작성되었고 이로 인해 Compile 단계에서 Type-Check 불가했다.이러한 risk를 줄이기 위해 query DSL이 등장했고 이를 통해 Compile 단계에서 Type-check가 가능해진 것이다.
  • JPQL에 대한 보완을 위해 나온 것이 query DSL이라고 볼 수 있다.

 

 

 

'Spring > 기타' 카테고리의 다른 글

서블릿(Servlet) VS 스프링(Spring)  (0) 2022.11.30
스프링 빈(Bean)이란  (1) 2022.09.19
스프링 IoC 컨테이너 (Inversion Of Control)  (0) 2022.09.05
Spring MVC 구조  (0) 2022.08.22
스프링 의존 관계 주입(DI)  (0) 2022.08.09
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함