-
ORM과 JPA의 이해JPA 2024. 3. 1. 16:13
[영속성(Persistence)이란?]
영속성이란 데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되어 있는 개념을 말한다.
즉 소프트웨어적으로 실행한 것이 하드웨어적으로 반영되는 것을 영속성이라고 한다.
Java에서는 데이터의 영속성을 위한 JDBC를 지원해주는데, 이는 매핑 작업을 개발자가 일일히 수행해야한다는 번거로움이 있다.
따라서 JDBC 프로그래밍의 복잡함이나 번거로움 없이,
간단한 작업만으로 영속성 기능을 제공해주기 위해 나온 것이 Persistence Framework이다.
Spring FastAPI 와 같이 Framework 이기 때문에 정해진 방식을 따름으로써 영속성 기능을 활용할 수 있다.
Persistence Framework의 종류로는 SQL Mapper, ORM이 있다.
[영속성 프레임워크(Persistence Framework)]
정해진 방식을 따름으로써 DB와의 연동되는 시스템을 빠르게 개발하고, 영속성을 보장해주는 것이다.
1. 재사용 및 유지보수에 용이하다.
데이터 베이스에는 MySQL, MariaDB, PostgreSql 등 여러가지 종류가 있는데, 만약 DB를 교체하더라도 Persistence Framework는 그대로 두고 DB만 교체하면 되기때문에 재사용 및 유지보수에 용이하다.
2. 코드가 직관적이다.
Persistence Framework가 없다면 SpringBoot와 DB를 연결하는 부분을 개발자가 전부 관리를 해야만 한다.
[영속성 프레임워크의 종류]
1. SQL Mapper
SQL문을 개발자가 직접 작성한다(SELECT name FROM students)
객체와 SQL 필드를 매핑하여 데이터를 객체화하는 기술이다
객체와 테이블 간의 관계를 매핑하는 것이 아니라, SQL문을 직접 작성하고 작성한 쿼리를 어떤 객체에 매핑할지 바인딩하는 방법이다.
그렇기 때문에 DBMS에 종속적인 문제점을 갖고 있다
대표적인 SQL Mapper에는 JdbcTemplate, MyBatis가 있다
SQL Mapper(MyBatis)는 어떻게 사용할까?
MyBatis를 사용하여 Java의 비즈니스 로직 구현 부분과 SQL쿼리를 분리할 수 있습니다. 보통은 XML형식의 파일에 각각의 메서드와 실행시키고자 하는 SQL문을 매핑시켜놓습니다. 또한 Java코드내에서도 이를 수행할 수 있는데 아래 그림의 좌측 하단 부분의 코드가 이에 해당한다고 볼 수 있습니다. 이러한 경우 파일 형식을 통하여 물리적으로 Java코드와 SQL을 분리하는 SQL Mapper의 이점은 다소 상실하는 것 같습니다.
또한, SQL Mapper는 Java 개발자들에게 많은 편이성을 제공하였으나 코딩 과정이나 컴파일 도중에 SQL문의 오류를 캐치하기 어렵다는 한계가 있습니다.

2. ORM: Object Relation Mapping
이러한 단점을 보완하는 기술이라 볼 수 있는 것이 ORM이라 볼 수 있습니다.
SQL Mapper는 데이터 접근 부분을 SQL과 매핑시켰다면,
ORM은 객체와 테이블을 잇는, 조금 더 양 끝단의 편의성을 개발자에게 제공해준다고 할 수 있습니다.
다만, 여기서도 알아두면 좋은 점은 ORM을 사용하는 것이 JDBC API와 완전히 무관하지 않다는 점입니다.
아래 그림을 보시면 Spring Data JPA를 사용하여 영속성 계층을 구현한다고 하더라도 가장 밑단의 관계형 데이터베이스와 통신하는 작업은 JDBC API에서 수행하게 됩니다.
이를 염두에 두어 이후 관련 기술에 대한 깊은 지식을 탐구할 때 참고할 필요가 있겠습니다.

객체와 DB의 테이블을 자동으로 매핑시켜 RDB 테이블을 객체 지향적으로 사용하게 해준다.
객체 모델과 RDB의 테이블 간에는 불일치가 존재하는데,
ORM을 통해 객체간의 관계를 코드에 나타냄으로써 SQL을 자동으로 생성하고 불일치를 해결한다.
JDBC
JDBC(Java DataBase Connectivity)는 SQL Mapper 중 하나로, 데이터베이스에 연결 및 작업을 하기 위한 자바 표준 인터페이스 이다.
자바는 DB의 종류에 상관 없이 하나의 JDBC API를 이용해서 데이터베이스 작업을 처리한다.
이 JDBC는 DB에 접근해서 쉽고 효율적으로 CRUD를 수행하고, 고성능에서의 세련된 메소드를 제공하며 쉽게 프로그래밍 할 수 있게 해준다.SpringBoot와 DB를 연결하기 위한 최소한의 기능을 가지고 있다. (쿼리는 개발자가 작성)

JPA

Java Persistence API의 약자인 JPA는 Java ORM 표준이다.
위에서 말했듯 ORM은 객체지향 프로그래밍 구조에서 사용될 수 있는 구조이고, JPA가 Java영역에서의 ORM의 표준을 제시하는 Interface이다.이 외에도 JPA는 내부적으로 영속성 컨택스트를 생성하여 Entity를 관리한다.
변경 감지를 통해서 개발자가 Entity를 수정하기만 해도 그에 맞는 쿼리가 생성되고, 쓰기 지연 방식을 통해서 Query 저장소에 있는 Query들을 한번에 flush 시킴으로써 Connection을 최소화해 서비스 성능을 향상시킬 수 있다.JPA는 Interface라서 이를 구현할 구현체가 필요한데, 대표적인 구현체가 Hibernate이다.

Hibernate

Java ORM(JPA)구조에서 개발자가 따로 Query를 작성하지 않아도 되는 이유는 이 Hibernate가 내부적으로 Query를 생성하고 JDBC API를 호출하기 때문이다.
다만 생성되는 Query가 모든 개발환경에 적합하다고 볼 수 없고, 개발자 본인이 능동적으로 쿼리를 수정할 필요가 있는데 이때 Spring Data JPA가 사용된다.
Spring Data JPA
JPA를 한단계 더 추상화시킨 Repository라는 개념을 제시하여 개발자가 Respository Interface에 JpaRepository를 상속하기만 하면 사용시점에 Spring이 알아서 구현화 된 객체를 주입해준다.
또한 Respository Interface 내부에서 작성된 메서드 또한 Spring이 적합한 Query를 생성하여 전송하도록 해준다.
Query annotation을 통해서 개발자가 생성한 Query 문을 전송할 수도 있다.
끝으로
JDBC API, SQL Mapper, ORM은 서로가 마치 기술의 발전 계보를 잇는 것처럼 보입니다. SQL Mapper와 ORM은 서로 별개의 기술로 존재하지만 JDBC API를 밑단에 두고 각각 장단점이 존재한다고 할 수 있겠습니다.
ORM은 상당히 고도의 추상화를 제공하여 개발자들의 개발 속도를 높여주었다고 할 수 있습니다. 그렇다면 ORM만 사용하는 것은 항상 옳을까요?
저의 의견은 꼭 그렇지는 않다는 것입니다. 아래 그림을 보시면 ORM이 트렌디한 기술임에는 분명하지만 MyBatis에 대한 관심이 상당수의 동아시아 국가에서 보여지고 있는 것도 사실입니다. 따라서 여러 기술에 대하여 열린 자세와 익숙한 기술에 대한 비판적인 태도는 개발자에게 중요하다고 여겨집니다.

'JPA' 카테고리의 다른 글
[JPA] JPA의 이해 (0) 2024.07.28 연관관계 편의 메서드 (0) 2024.07.08 @mappedBy의 이해 (0) 2024.07.08 단방향 양방향 연관관계의 이해 (0) 2024.07.08 영속성 컨텍스트의 이해 (0) 2024.07.08