JPA

[JPA] JPA란?

헝그리개발자 2021. 7. 22. 21:18

김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편' 강의를 요약한 내용입니다.

 

https://www.inflearn.com/course/ORM-JPA-Basic

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔

www.inflearn.com

 

ORM이란?

ORM은 Object-Relational Mapping(객체 관계 매핑)을 의미합니다.

ORM을 사용하는 이유는 객체지향 프로그램의 객체관계형 데이터베이스의 테이블 둘 간의 매핑을 ORM 프레임워크에게 위임하여, 애플리케이션은 객체지향대로 설계하고 DB는 관계형 데이터베이스대로 설계하는 것에 집중하기 위함입니다.

 

객체지향과 관계형 데이터베이스의 차이

그렇다면 객체지향과 관계형 데이터베이스의 차이는 무엇일까요?

 

첫 번째는 상속 관계입니다.

상속이란 부모의 멤버를 자식이 그대로 물려받는 것입니다.

객체지향에서 자식 객체를 조회하거나 변경한다고 하면 해당 객체만 핸들링하면 됩니다.

하지만 RDB의 설계 원칙은 '데이터 중복의 최소화'이기 때문에, 부모 테이블에게 물려받아야할 컬럼들은 자식 테이블과 foreign key에 의해 정규화되어있습니다.

따라서 자식 테이블을 조회하기 위해선 두 테이블을 조인해서 SELECT 해야 하거나, 데이터를 삽입하려해도 두 테이블을 두 번 INSERT 해야하는 번거로움이 존재합니다.

 

두 번째는 연관 관계입니다.

객체 지향에선 부모/자식 객체들 간 참조를 통해 단방향으로 연결되어 있습니다.

부모 타입 참조 변수에 자식 타입 객체를 대입할 수 있지만, 자식 타입 참조 변수에 부모 타입 객체를 대입할 수 없는 것과 같습니다.

반면 RDB에선 애초에 join의 방향을 고려하지 않아, 테이블간 양방향으로 접근이 가능합니다.

이러한 이유로 객체를 컬렉션으로 다룰 때와 SQL로 다룰 때 충돌이 일어나게 됩니다.

 

JPA란?(Java Persistence API)

JPA는 이런 패러다임의 불일치 문제를 해결하기 위해 등장한 ORM 프레임워크입니다.

Entity라는 클래스를 참고하여 자동으로 SQL 쿼리문을 작성해주고 개발자가 객체 지향적으로 개발하는데에 더 집중할 수 있도록 돕습니다.

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

JPA는 EJB(Enterprise JavaBeans)에서 시작하여 Hibernate(OpenSource API)를 거쳐 Java ORM 기술 표준으로 발전했습니다.

 

JPA의 장점

JPA를 사용함으로서 얻게 되는 이점들은 아래와 같습니다.

 

1. 생산성 향상

피곤하게 쿼리문을 만들 필요없이 DB의 CRUD를 수행하는 함수만 호출하면 쿼리문을 자동으로 생성하여 DB에 전송합니다.

따라서 변경 사항이 생겼을 때 더 유연하게 수정이 가능합니다.

 

2. 패러다임의 불일치 해결

위에서 설명한 문제를 해결해줍니다.

그 외에도 객체 비교할 때 같은 트랜잭션내에서 조회한 Entity는 같음을 보장합니다.

 

3. 성능 최적화

JPA에선 한 트랜잭션 내에 비즈니스 로직이 긴 경우에, 성능적인 이점이 있습니다.

  1. 캐싱
    • 같은 트랜잭션안에서 반복 동작은 캐싱을 통해서 성능을 향상 시킬 수 있습니다.
  2. 버퍼
    • 트랜잭션을 commit 할 때까지 INSERT SQL문을 모아놨다가 한꺼번에 처리합니다.
  3. 비즈니스 특성에 맞게 지연로딩과 즉시로딩을 옵션으로 끄고 켜기 가능
    • 지연 로딩은 Entity 조회 시점이 아닌 연관 관계를 참조하는 시점에 SQL이 질의되는 기능이고, 즉시 로딩은 Entity 조회 시점에 SQL이 질의되는 기능입니다.

 

 

Ref.

https://logical-code.tistory.com/140

 

[JPA] 즉시 로딩/지연 로딩

앞선 포스팅에서 프록시에 대해 알아보았습니다. 이번 포스팅에서는 JPA에서 프록시를 어떻게 활용하는지, 즉시 로딩과 지연 로딩을 통해 알아봅니다. 지연 로딩 (Lazy Loading) 1 2 3 4 5 6 7 8 9 @Entity p

logical-code.tistory.com