Spring & Spring boot

[Spring Boot] JPA - 1. ORM 과 JPA

jh4dev 2024. 7. 25. 15:48
<목차>

1. ORM
2. JPA & Hibernate

 

[ORM]

ORM은 Object Relational Mapping 의 줄임말로, 객체 관계 매핑을 의미한다.

객체지향 언어에서 의미하는 객체와 RDB의 테이블을 자동으로 매핑하는 방법으로, 자바에서는 클래스와 테이블을 매핑하는 것을 의미한다.

 

하지만, 클래스는 DB 테이블과 매핑하기 위한 목적으로 만들어진 것이 아니기 때문에, 불일치가 존재한다.

이같은 불일치와 제약사항을 해결하는 역할이 ORM 이다.

출처 : https://www.sixt.tech/object-relational-mapping

 

ORM 을 사용함으로써 얻을 수 있는 장점은 다음과 같다.

  • 데이터베이스 쿼리를 객체지향적으로 조작할 수 있다.
    • 쿼리 작성량이 현저히 줄어, 개발 비용을 줄일 수 있다.
    • 코드의 가독성을 높일 수 있다.
  • 재사용 및 유지보수가 편리하다.
    • ORM을 통해 매핑된 객체는 모두 독립적으로 작성되어 있어 재사용이 쉽다.
    • 객체들은 각 클래스로 나누어져있어 유지보수가 수월하다.
  • DB에 대한 종속성이 줄어든다.
    • ORM을 통해 자동으로 생성되는 쿼리는 객체를 기반으로 DB 테이블을 관리하기 때문에, DB에 종속적이지 않으며, DB를 교체하는 상황에서도 비교적 적은 리스크를 수반한다.

하지만, 장점만 있는 것은 아니다.

  • 복잡한 서비스의 경우, 복잡한 쿼리가 요구될 수 있으며, ORM 만으로 해결하기 어려운 경우가 있다.
    • 특히, 속도 저하 등의 성능 문제가 발생할 수 있다.
  • 애플리케이션의 객체 관점과, DB의 관계 관점간의 불일치가 발생한다.
    • ORM의 자동 설계 방법에 따라, DB 테이블 수와 애플리케이션의 Entity 수가 달라질 수 있다.
    • RDBMS에는 상속이라는 개념이 없다.
    • RDBMS는 PK로 동일성을 정의한다. 하지만, Java는 두 객체의 값이 같아도 다르다는 판단을 할 수 있다.
    • 객체지향 언어는 객체를 참조함으로써 연관성을 나타내지만, RDBMS에서는 FK 를 삽입함으로써 연관성을 표현한다.
    • 객체지향 언어에서 객체를 참조할 때는 방향성이 존재하지만, RDBMS에서 FK를 삽입하는 것은 양방향 관계를 가지기 때문에 방향성이 없다.

 


 

[JPA & Hibernate]

JPA 는, Java Persistence API 의 약자로, Java 진영의 ORM 기술 표준으로 채택된 인터페이스 모음이다.

JPA 또한, 실제 동작보다는 어떻게 동작해야 하는지에 대한 메커니즘을 정리한 표준 명세로 생각하면 된다.

 

JPA 는 내부적으로 JDBC를 사용한다.

개발자가 직접 JDBC를 구현하다보면 SQL에 의존하는 문제 등이 있어 효율성이 떨어지는데, JPA는 이 같은 문제점을 보완하여 자동으로 SQL을 생성하고, DB를 조작하여 객체를 자동 매핑하는 역할을 수행한다.

 

그렇다면, Hibernate는 무엇인가?

Hibernate(하이버네이트) 는 자바의 ORM Framework으로, JPA가 정의하는 인터페이스를 구현한  JPA 기반의 구현체로, 가장 많이 사용되고 있다. (이 외에도, EclipseLink, DataNucleus 등이 있다.)

이러한 하이버네이트의 기능을 더욱 편하게 사용하도록 모듈화한 Spring Data JPA 라이브러리를 사용할 예정이다.

 

Spring Data JPA는 스프링 하위 프로젝트 중 하나로, CRUD에 필요한 인터페이스를 제공하며, 하이버네이트의 엔티티 매니저를 직접 다루지 않고, 리포지토리를 정의해 사용함으로써, 스프링이 적합한 쿼리를 동적으로 생성하는 방식으로 DB를 조작한다.

JPA - Hibernate - Spring Data JPA

 


Spring Boot 에서 JPA 로 개발을 진행하기 전, ORMJPA의 개념에 대해 먼저 알아보았다.

비록 Spring Data JPA 라이브러리를 사용함으로써, 엔티티 매니저를 직접 다루진 않을 예정이나, JPA를 사용함에 있어 꼭 알고 있어야 하는 개념인 Entity, Entity Manager, Persistence Context 에 대해 알아보자.

 

 


[참고 도서]

 

<스프링 부트 핵심 가이드>
저자 : 장정우

출판사 : 위키북스