TIL - #29 JPA 심화! - ORM부터 RawJPA 까지

Quann·2023년 1월 31일
0

00. 개요

오늘은 JPA가 어떤 과정을 통해 탄생 되었는지부터 관련된 여러 부분을 학습했다.

탄생 배경을 안다는 것은, 어떤 문제점이 있었고 현재까지 어떻게 해결되어 왔는지,

내가 쓰고 있는 기능은 왜 탄생했고, 어떤 점을 보완하고 있는지 등에 대해 알 수 있는 계기가 된다.

따라서, DB 탄생 후 부터 Java 진영은 어떻게 객체와 DB 간의 연동을 진행해 왔는지 학습하는 것이

앞으로의 공부 방향성에도 도움이 될 것이라 판단했다.


01. ORM의 탄생 배경

1. DB가 탄생 한 이후, Java 앱과 연동을 위해 JDBC가 탄생했다

JDBC란, Java Database Connectivity로, Java 앱과 DB를 연결시키기 위해 만들어진 기술이다.
즉, 애플리케이션과 DB의 데이터를 주고 받을 수 있게 연결시켜주기 위한 하나의 기술로,
현재까지 자바의 표준 기술인 JPA도 이 기능을 바탕으로 동작한다.

따라서, JDBC를 통해 다양한 DB에 Connect 할 수 있게 된다. - 한 DB에 종속적이지 않다.

DB와의 연결을 위해 추상화 시켜놓은 인터페이스같은 것인데, 런타임 시점에 모든 DB에 공통적으로 동작하는
1. Connection 을 통해 쿼리 요청 상태를 만들고
2. Statement 를 생성해 쿼리를 요청하게 해주며
3. ResultSet 을 생성해 쿼리 결과를 받아오게 된다.
4. close() 를 통해 자원을 해제해주어야 한다.
위의 과정을 지원해주며, 자바 앱 <=> DB 간의 연동을 가능케 한다.

해당 과정에 대한 코드는 다음과 같다.
DriverManager를 통해 원하는 DB와의 연결을 시작으로 쿼리문의 발생 및 결과값을 조회해오는 코드이다.

     // 1. Connection 및 4.close()
    try (Connection connection = DriverManager.getConnection(url, username, password)) {
      

      // 2. Statement
      String insertSql = "INSERT INTO ACCOUNT (id, username, password) VALUES ((SELECT coalesce(MAX(ID), 0) + 1 FROM ACCOUNT A), 'user1', 'pass1')";
      try (PreparedStatement statement = connection.prepareStatement(insertSql)) {
        statement.execute();
      }

      String selectSql = "SELECT * FROM ACCOUNT";
      try (PreparedStatement statement = connection.prepareStatement(selectSql)) {
         // 3. ResultSet
        var rs = statement.executeQuery();
        while (rs.next()) {
          System.out.printf("%d, %s, %s", rs.getInt("id"), rs.getString("username"),
              rs.getString("password"));
        }
      }

02. JDBC의 한계와 QueryMapper의 탄생

JDBC로 직접 SQL을 작성할 경우,
1. SQL 쿼리 요청시 중복 코드가 발생하며
2. DB별 예외에 대한 구분 없이 Checked Exception 처리되며, (ex. SQL Exception 등)
3. 자원을 따로 관리해줘야 함
과 같은 문제점이 발생한다.

이에 따라, 문제 해결을 위해 Persistence Framework가 등장한다.

Persistence Framework는
1. SQL Mapper(JDBC Template, Mybatis 등)
2. ORM(JPA, Hibernate 등)
로 구성되어있다.

02.01. SQL Mapper(QueryMapper)

SQL 문과 객체의 필드를 매핑하여 데이터를 객체화하는 방식이다.
JDBC Template와 Mybatis가 존재하며,
쿼리 수행 결과와 객체의 필드를 매핑시켜 DB의 데이터와 객체간 연동될 수 있도록 한 기술이다.
Connection, Statement, ResultSet의 반복적인 처리를 대신해주어 JDBC의 한계를 극복하고자 했다.

하지만, 여전히 매핑에 많은 코드가 필요하고, SQL 쿼리를 직접 작성해줘야하거나, 테이블마다 비슷한 CRUD가 반복되는 등의 한계가 존재했다.
또한, Mybatis의 경우 DB 타입 및 테이블에 종속적이라는 단점도 존재했다.


03. ORM 등장

결국, 위에 설명한 QueryMapper의 DB 의존성 및 중복 쿼리 문제 등을 해결하기 위해 새로운 기술이 등장하는데,

이것이 바로 ORM 이다.
Object Relational Mapping 으로 - 객체지향을 관계형 데이터베이스에 매핑하는 기술이다.

JDBC, QueryMapper와 같이 DAO나 Mapper를 통해 조작하는 것이 아닌, 테이블을 하나의 객체와 대응시켜서, 둘 간의 간극을 좁히고자 한 기술이다.

이러한 개념이 도입되기 시작하면서 RawJPA 기술이 탄생하게 되었으며,
객체와 DB 데이터 간의 간극을 좁히고, 기존 JDBC/QueryMapper 의 단점을 극복해냈다.
이는, JPA가 현재까지 ORM 진영의 자바 기술 표준으로 자리잡게 되는 계기가 되었다.


04. 오늘의 한 문단

태정태세문단세

profile
코드 중심보다는 느낀점과 생각, 흐름, 가치관을 중심으로 업로드합니다!

0개의 댓글