오늘은 JPA가 어떤 과정을 통해 탄생 되었는지부터 관련된 여러 부분을 학습했다.
탄생 배경을 안다는 것은, 어떤 문제점이 있었고 현재까지 어떻게 해결되어 왔는지,
내가 쓰고 있는 기능은 왜 탄생했고, 어떤 점을 보완하고 있는지 등에 대해 알 수 있는 계기가 된다.
따라서, DB 탄생 후 부터 Java 진영은 어떻게 객체와 DB 간의 연동을 진행해 왔는지 학습하는 것이
앞으로의 공부 방향성에도 도움이 될 것이라 판단했다.
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"));
}
}
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 등)
로 구성되어있다.
SQL 문과 객체의 필드를 매핑하여 데이터를 객체화하는 방식이다.
JDBC Template와 Mybatis가 존재하며,
쿼리 수행 결과와 객체의 필드를 매핑시켜 DB의 데이터와 객체간 연동될 수 있도록 한 기술이다.
Connection, Statement, ResultSet의 반복적인 처리를 대신해주어 JDBC의 한계를 극복하고자 했다.
하지만, 여전히 매핑에 많은 코드가 필요하고, SQL 쿼리를 직접 작성해줘야하거나, 테이블마다 비슷한 CRUD가 반복되는 등의 한계가 존재했다.
또한, Mybatis의 경우 DB 타입 및 테이블에 종속적이라는 단점도 존재했다.
결국, 위에 설명한 QueryMapper의 DB 의존성 및 중복 쿼리 문제 등을 해결하기 위해 새로운 기술이 등장하는데,
이것이 바로 ORM 이다.
Object Relational Mapping 으로 - 객체지향을 관계형 데이터베이스에 매핑하는 기술이다.
JDBC, QueryMapper와 같이 DAO나 Mapper를 통해 조작하는 것이 아닌, 테이블을 하나의 객체와 대응시켜서, 둘 간의 간극을 좁히고자 한 기술이다.
이러한 개념이 도입되기 시작하면서 RawJPA 기술이 탄생하게 되었으며,
객체와 DB 데이터 간의 간극을 좁히고, 기존 JDBC/QueryMapper 의 단점을 극복해냈다.
이는, JPA가 현재까지 ORM 진영의 자바 기술 표준으로 자리잡게 되는 계기가 되었다.
태정태세문단세