본문 바로가기
[Spring Boot]/[JPA]

[JPA] JPA 란?

by 북방바다코끼리표범 2023. 10. 17.

복습

https://shins99.tistory.com/105

 

[Spring Boot] DB 에서 데이터 조회하기

복습 https://shins99.tistory.com/104 [Spring Boot] DTO, DAO, Vo 복습 https://shins99.tistory.com/102 [Spring Boot] 스프링 부트에서 자주 사용하는 어노테이션 복습 https://shins99.tistory.com/97 [Spring Boot] 스프링 부트 시작하

shins99.tistory.com


ORM (Object-Relational Mapping)

- 객체와 관계형 데이터베이스를 매핑함

- ORM 프레임워크는 객체와 테이블을 매핑함

 

ORM 프레임워크 사용 장점

- 객체를 데이터베이스에 저장할때 INSERT SQL을 직접 작성 하지 않음

    (객체를 자바 컬렉션에 저장하듯이 ORM 프레임워크에 저장)

- 개발자가 데이터 중심인 관계형 데이터베이스를 사용하더라도 객체지향 어플리케이션 개발에 집중 가능

 

 

하이버네이트 (hibernate)

- 대부분의 패러다임 불일치 문제를 해결해주는 ORM 프레임워크

- 하이버네이트(hibernate.org)라는 오픈소스 ORM 프레임워크가 등장하면서 하이버네이트를 기반으로 새로운 자바 ORM 기술 표준이 만들어졌는데, 이것이 바로 JPA

 

패러다임 불일치란?

- 추상화, 상속, 다형성과 같은 특성을 가진 객체지향과 이러한 특성이 없는 데이터베이스는 서로 기능과 표현방법이 모두 다름 이것이 객체와 관계형 데이터베이스의 패러다임 불일치 문제

 

 

JPA (Java Persistence API)

- 자바 진영의 ORM 기술 표준

 

(JPA를 사용하려면 JPA를 구현한 ORM 프레임워크를 선택해야하는데, 가장 대중적인건 하이버네이트)

 

JPA 역할

  • Entity 분석
  • INSERT SQL 생성
  • JDBD API 사용
  • 패러다임 불일치 해결

 

JPA 장점

  • 특정 구현 기술에 대한 의존도를 줄임
  • 다른 구현 기술로 손쉽게 이동 가능

 

 

왜 JPA를 사용해야할까?

1) 생산성

- 자바 컬렉션에 객체를 저장하듯이 JPA에게 저장할 객체만 전달하면 JPA가 대신 처리함

jpa.persist(member); // 저장
Member member = jpa.find(memberId); // 조회

- 반복적인 코드와 CRUD용 SQL을 개발자가 직접 작성하지 않아도 됨

- CREATE TABLE과 같은 DDL 문을 자동 생성 가능

 

 

2) 유지보수

- SQL을 직접 다루면 엔티티에 필드를 하나만 추가해도 그에 해당하는 SQL과 결과를 매핑하기위한 JDBC API 코드를 모두 변경해야 하지만 JPA를 사용하면 이런 과정을 JPA가 대신 처리 함

 

- JPA가 패러다임의 불일치 문제를 해결해주므로 객체지향 언어가 가진 장점들을 활용해서 유연하고 유지보수하기 좋은 도메인 모델을 편리하게 설계 가능

 

 

3) 성능

- JPA는 애플리케이션과 데이터베이스 사이에서 동작하므로 최적화 관점에서 시도해볼 수 있는 것들이 많음

 

같은 회원을 두번 조회하는 코드

String memberId = "test"

Member member1 = jpa.find(memberId); // 조회
Member member2 = jpa.find(memberId); // 조회

- JPA를 사용하지 않았을땐 두번의 SELECT 쿼리가 수행됨

- JPA를 사용시  SELECT 쿼리가 한번만 수행되고, 그 다음은 이미 조회한 회원 객체를 재사용

 

 

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

- JPA는 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공해서 애플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 함

 

- 데이터 베이스 변경도 유연하게 처리가 가능하다. JPA에게 다른 데이터베이스를 사용한다고 알려주기만 하면 됨