첫 직장 생활을 할 때 원시 수준의 ORM 비스무리한 걸 만든 적이 있는데, 이 원시 ORM은 정해진 규칙으로 자바빈 스타일의 코드와 DB 테이블을 1대 1로 매핑해주는 기능을 제공했다. 기능은 아주 간단했다. 클래스 이름과 필드 이름을 사용해서 한 개 레코드를 삽입, 조회, 수정, 삭제하는 SQL을 매퍼가 대신 만들어서, 기본적인 CRUD를 쿼리 없이 자바 코드만으로 실행하는 기능이었다. 이때 작성했던 원시 수준 매퍼에 대한 내용을 2003년에 쓴 'JSP 실정 Know-How' 책(일명 해바라기 책)에 녹여 넣기도 했다. (지금 이 책을 다시 보니 내용이 참 많이 부끄럽다.)
원시적이긴 했지만 매퍼를 만든 가장 큰 이유는 SQL 쿼리를 잘 못했기 때문이다. 여러 테이블을 동시에 다루는 쿼리를 만들기보다는 매퍼를 이용해서 테이블과 1대 1로 연결된 객체를 생성하고 자바 코드에서 그 객체들을 조합해서 조인과 같은 효과를 내는 식으로 구현하는 경우가 많았다. 오라클의 힌트처럼 특화된 기능을 써야 하는 경우를 제외하면 쿼리 사용을 멀리했다.
이런 와중에 2004년에 하이버네이트란 걸 알게 되었다. SQL 조인보다 단일 테이블에서 데이터를 읽어와 코드에서 조합하는 방식을 선호하는 나에게 있어 하이버네이트는 그야말로 구세주였다. 내가 할 일을 ORM이 대신해주는 것이 많았기에 더 많은 기능을 구현할 수 있게 되었다.
10년 전인 2005년 1월에 하이버네이트에 대해 처음 쓴 글 : http://javacan.tistory.com/entry/100
마침 비슷한 시점에 마틴 파울러의 PoEAA 책을 읽었고 자연스럽게 도메인 모델이란 것에 빠지시 시작했다. 그 뒤로 도메인에 대한 내용을 조금씩 학습하면서 ORM을 선호하는 개발자 중 한 명이 되었다.
ORM 덕분에(?) 지금도 SQL 쿼리를 잘 몰라 단순한 쿼리밖에 작성하지 못한다. 그래서 최대한 복잡한 SQL은 회피하려고 노력하고 있다. 물론 ORM은 그 노력 중 하나이다.