지금까지 대부분의 프로젝트를 JPA를 사용하여 DB를 사용해왔다. JPA의 대분류인 ORM이 탄상하게된 배경은 어떻게 될까?
DB가 탄생한 이후 해당 DB와 JAVA앱과 연동하기 위해 JDBC가 탄생하였다.
Java Database Connectivity의 축약어로 문장그대로 Java 앱과 연결시켜주기 위해 만들어진 기술이다. JDBC의 특징은 JDBC Driver를 통해 여러 DB들을 간편하게 Java 앱과 연결시킬수있다는것이다. JDBC이전에는 각각 의 DB에는 해당 DB를 만든 회사에서 만든 해당 DB의 Driver만이 해당 DB와 연결시킬수있어 매우 큰 불편함이 있었다. 이를 해결하기위해 JDBC는 통합 드라이버인 JDBC Driver를 제공하여 여러타입의 DB와 연결할수있는 기능을 제공한다.
JDBC Driver Manager는 DB에 보낼 쿼리문생성에 관여하는데 구체적으로는
위와 같이
- Connection을 생성하여 쿼리를 요청할수있는 상태로 만들고
- Statement를 생성하여 쿼리를 요청하게 해주고
- ResultSet을 생성해 쿼리 결과를 받아올수있게해준다.
*또한 반드시 사용후 각각 close()를 호출해서 자원해제를 시켜줘야한다.
하지만 JDBC는 직접 SQL문을 작성하는 방법에는 문제가 있는데 SQL 쿼리 요청시 중복 코드가 발생한다는 점과 어떤 DB에서 예외상황이 발생했는지 알수가 없이 일괄적으로 SQL Exception처리를 해버리는 점, 위에 작성한것처럼 사용후 Close()를 작성하는것처럼 각 상태에서 자원관리를 따로 해줘야하는 점 등 불편하점들이 많이 발생하였다. 이러한 단점들을 해결하기 위해 Persistence Framework가 등장하게되었다. Persistence Framework는 2가지가있는데 아래와같다.
Persistence Framework
1. SQL Mapper: JDBC Template, MyBatis 2. ORM : JPA, Hibernate
첫번째로 SQL Mapper가 먼저 등장하였는데 SQL Mapper는 QueryMapper로도 불리며 SQL문과 Object의 필드를 매핑하여 데이터를 객체화시키는 방법이다. SQL Mapper의 두가지 방법의 특징은 아래와같다.
JDBC Template :
쿼리 수행 결과와 객체 필드 매핑
RowMapper로 응답필드 매핑코드 재사용
Connection, Statement, ResultSet의 반복적 처리를 대신해준다.
--> 하지만 결고값을 객체 인스턴스에 매핑하는데 여전히 많은 코드가 필요하다.
MyBatis :
반복적인 JDBC 프로그래밍을 단순화
SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리
--> 하지만 여전히 직접 SQL문을 작성하는것은 매한가지(DB에 의존적)이며 테이블마다 비슷한 CRUD 반복, DB타입 및 테이블에 종속적이다.
이 다음에 등장하는게 바로 ORM이다. 해당 게시글은 다음게시글에 이어서 작성할예정이다.