오늘은 어디로 갈까...

1. DAMO의 탄생 본문

ORM 만들기

1. DAMO의 탄생

剛宇 2009. 8. 20. 14:33

 현대 세계에서 개발을 함에 있어서, 꼭 빠지지 않는 부분이 있다면 데이터베이스 영역일것이다. 대부분 오라클, My-SQL, MS-SQL 등과 같은 관계형 데이터베이스를 사용해서 데이터 처리 부분을 위임하는 방식을 사용한다. 개발자들은 SQL을 직접 사용하여 데이터베이스에 접근한다. 그리고, CRUD를 처리하기 위해서 비생상적인 수많은 코드를 만들어낸다. DAMO는 이런 비생산적인 작업을 줄여보고자 탄생한것이다.

 

 자바 진영에는 Hibernate와 iBatis라는 유명한 ORM 프레임워크가 존재하고 있다.  

 Hibernate는 진정한 의미의 ORM 프레임워크라고 할 수 있다. 자바 객체와 관계형 데이터베이스를 맵핑하여, 데이터를 객체지향적으로 처리할 수 있게 도와준다. 도메인 설계가 잘 되어 있어야하고, 기술적 난이도가 조금(?) 높다는 점을 제외한다면 아주 좋다. 불행히도, 요구조건이 자주 변하는 국내환경에서 쓰기에는 위험부담이 너무 커서 주로 해외해서 많이 사용된다는 소문이 있다.

 iBatis는 넓은 의미의 ORM 프레임워크이다. 엄밀히 말하면 ORM 프레임워크라기 보다는 SQL Mapping 프레임워크에 가깝다. 객체와 관계형 데이터베이스를 맵핑하는것이 아니라, XML에 정의한 SQL을 맵핑하여 손쉽게 처리할 수 있도록 해준다. 즉, 객체와 테이블을 맵핑할 필요 없이, SQL만을 사용하여 데이터 처리를 할 수 있도록 해주는것이다.

 솔직히 말하면 관리 문서를 만들기 싫었기 때문이었다. 개발자에게 있어서 프레임워크 개발은 아주 쉽다. 거기다 즐겁기까지하니 너무 좋은일이 아닌가. 그런데, 그 만들어놓은 프레임워크를 다른 개발자가 사용할려면, 사용법을 적어놓은 문서, 즉, 설명서가 필요하다. 이 프레임워크의 구조는 어떻고, 이런 기능을 사용할라면 어떤식으로 해야하는등의 최소한의 친절이 필요한것이다. 게으른 본인에게 있어서는 이런 문서 작업이 너무나 귀찮게 느껴져서, 스스로 개발한 프레임워크를 묻어버리게 되었던 것이다. 그리고 iBatis를 그 대용품으로서 몇년동안 잘 사용해왔다.

 iBatis 자체는 사용하기 쉽고, 아주 맘에 들었다. 그런데, 아주 자잘한 CRUD 관련 SQL을 매번 작성해줘야한다는 번거로움이 있었다. 물론, 여러가지 툴을 이용해서 자동으로 CRUD 관련 SQL을 만들어주게 할 수도 있었지만, 그것 자체도 너무 번거롭게 느껴졌다. 즉, 게으른 본인에게는 좀 더 간편한 방법이 필요한 것이었다. 그래서 오랫동안 묵혀 두었던 DAMO를 버젼업하게 된것이다. 바로 우리가 다룰 0.4 버젼이다.

 0.4 버젼을 만들면서 자바 1.5이상에서만 돌아가도록 제약을 뒀다. 가장 큰 이유는 자바 1.5이상에서만 지원하는 어노테이션(Annotation)을 사용하기 위해서였다. DAMO는 자바 객체와 데이터베이스 테이블을 1:1 맵핑시킨다. 이 맵핑 정보를 정의하기 위해서 기존에는 XML을 사용했는데, 이 작업이 너무 번거로웠다. 그래서 가감히 어노테이션을 이용하기로 마음을 먹고, XML을 멀리 보내버린것이다

 그럼 우리가 만들 DAMO의 특성을 알아보자.

 본인이 여러 프로젝트를 하면서 느낀것은, 아무리 복잡한 업무라도 가장 잘게 나누면 쉽게 풀 수 있다는것이다. 그리고 잘게 나누면 결국 데이터베이스 내 테이블에 저장되어 있는 데이터를 insert, update, delete 한다는것이다. 그래서 insert, update, delete 작업은 Entity Object를 정의하면 자동으로 처리할 수 있도록 만들었다. 즉, 자바 객체와 데이터베이스의 테이블을 맵핑하면, 손쉽게 insert, update, delete를 할 수 있다는것이다. 물론 단순한 select도 Entity Object를 정의하면 자동으로 처리할 수 있다. 문제는 복잡한 select 일 경우였다. 여러 테이블을 join해서 원하는 결과값을 얻기 위해 만들어낸 복잡한 SQL을, 객체들간의 관계 정의만을 이용해서 만들어내기에는 너무나 복잡했다. 그래서 이럴 경우에는 SQL 문을 그대로 사용할 수 있도록 한것이다.

 간단한 요약하면, insert, update, delete, 간단한 select는, 맵핑 정보만 설정하면 객체지향적으로 사용할 수 있고(hibernate처럼), 복잡한 select 같은 경우에는 SQL을 그대로 사용할 수 있도록(iBatis처럼) 만들어진 것이 DAMO인 것이다.

 이런 방식이 좋은것인지는 모르겠지만, 본인이 느끼기에는 괜찮다고 느꼈기에 그렇게 만든것뿐이다.