ORM(Object Relational Mapping) 이란 객체와 관계형 데이터베이스 간의 매핑을 위한 프로그래밍 기술이나 도구를 말한다. 객체를 연결해준다는 의미로 매핑시 SQL 언어가 아닌 어플리케이션 개발 언어로 데이터베이스에 접근할 수 있도록 해준다. 이로 인해 개발 언어의 일관성과 가독성을 높여준다는 장점을 가진다.
ORM은 갑자기 등장한 기술이 아닌 점차 발전해온 DB 연동 기술 이론이다. JDBC ➡️ QueryMapper ➡️ ORM(JPA)
는 포함/개선 관계로 이전 기술의 기능을 포함하고 있다.
JDBC(Java Database Connectivity)는 java와 DB를 연결시켜주기 위해 만들어진 기술이다. JDBC Driver는 여러 타입의 DB와 연결할 수 있는 기능을 제공한다.
JDBC Driver Manager는 런타임 시점에 Connection(연결)을 생성하여 쿼리를 요청할 수 있는 상태를 만들어주고 ➡️ Statement(상태)를 생성하여 쿼리를 요청하게 해주고 ➡️ ResultSet(결과셋)을 생성하여 쿼리 결과를 받아올 수 있도록 한다.
⚠️ 사용 후 close()를 호출하여 자원 해제를 해주어야 한다.
JDBC로 직접 SQL을 작성했을 때 SQL 쿼리 요청시 중복 코드가 발생하고, DB변 예외에 대한 구분 없이 SQL Exception으로 처리되고, 자원 관리를 따로 해줘야하는 등의 문제가 발생하였다. 이러한 문제들을 해결하기 위해 Persistence Framework(영속성 프레임워크)가 등장하였다.
Persistence Framework는 데이터를 오래 보존하고 지속적으로 사용할 수 있도록 영구적으로 저장하는 프레임워크이다. 데이터베이스와의 상호작용을 간편하게 처리할 수 있으며 많은 부분을 추상화하여 보다 객체 지향적인 방식으로 데이터를 다룰 수 있다. 객체-관계 매핑과, 트랜잭션 관리, 쿼리 언어를 제공한다.
Persistence Framework에는 SQL Mapper와 ORM이 있다.
SQL Mapper(Query Mapper)는 SQL 문장으로 직접 데이터베이스를 다룬다. SQL문과 객체(Object)의 필드를 매핑하여 데이터를 객체화한다. JDBC Template, MyBatis 등이 대표적이다.
ORM은 QueryMapper의 DB 의존성 및 중복 쿼리 문제를 개선하기 등장하였다. DAO 또는 Mapper를 통해 DB를 조작하는 것이 아니라 테이블을 하나의 객체(Object)와 대응 시켜 객체를 통해 간접적으로 데이터베이스를 다룬다. 즉, SQL Query가 아닌 코드와 메서드로 데이터를 조작할 수 있다. JPA, Hibernate 등이 대표적이다.
JDBC Template은 SQL Mapper의 첫 번째 주자로 탄생하였다. JDBC의 반복적인 작업을 처리하고 쿼리 수행 결과와 객체 필드를 매핑하는데 사용된다. RowMapper로 응답 필드 매핑 코드를 재사용하며 Connection, Statement, ResultSet의 반복적 처리를 대신해준다. 그러나 결과값과 객체 매핑에 여전히 많은 코드가 필요하다. JDBC Template는 JDBC Driver를 추상화하여 동작한다.
MyBatis는 SQL Mapper의 두 번째 주자로 탄생하였다. MyBatis 또한 JDBC의 반복적인 작업을 처리한다. SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리한다. 이로 인해 SQL 쿼리를 변경하더라도 자바 코드를 수정할 필요가 없게 되어 코드의 유지 보수성을 높인다. 그러나 SQL을 직접 작성해야 하므로 DB 기능에 종속적이다. ResultSet에서 자동으로 자바 객체로의 매핑을 지원하여 직접 매핑 코드를 작성하지 않아도 된다.