도메인모델링과 ORM
웹 애플리케이션을 개발하면서 객체지향적인 설계 방식을 적용한다는 것이 생각만큼그리 만만한 일은 아니다. 특히 문제가 되는 부분이 바로 모델링된 객체와 데이터베이스 간의 맵핑을 처리하는 부분일 것이다.OOP와 관계형 데이터베이스 간에 일치하지 않는 부분(mismatch)이 존재하는 것이 그 첫째 이유겠지만, 개발자들에게익숙해져 버린 기존의 습관 때문에 발생하는 문제도 무시할 수는 없는 듯하다. 데이터베이스를 따로 모델링하고 ASP나 JSP,PHP 등의 스크립트 언어로 절차적인 방식으로 프로그래밍하던 시절의 그 "유혹적인 습관"을 떨쳐 버리기가 쉽지 않기 때문이다.

물론 반드시 이런 방식이 나쁘다고 말하는 것은 아니다. ASP나 PHP 등에 비해 어떤 것이 더 우수하다고 주장하는 건 더더욱아니다. 다만, 개발환경에 따라 그리고 사용하는 도구가 무엇이냐에 따라 개발 방법도 달라져야 함을 말하는 것이다. 예를 들면,레일스는 순수 객체지향 언어인 루비를 기반으로 한다. 또한 MVC 아키텍처 패턴을 따르고 액티브레코드라는 걸출한 ORM 도구도제공한다. 따라서 레일스로 웹 애플리케이션을 개발하는 경우에는 기존에 각종 웹 스크립트 언어들을 사용하여 페이지 단위로 개발하던것과는 다른 방식을 적용하는 것이 오히려 생산성을 높이고 프레임워크의 장점을 제대로 살릴 수 있는 방법이 된다.

조금 오래된 책이기는 하지만 마틴 파울러의 책 "엔터프라이즈 애플리케이션 아키텍처 패턴"에서는 엔터프라이즈 애플리케이션을 프리젠테이션, 비즈니스로직, 그리고 데이터소스의 3개 레이어(layer)로 나누고 다시비즈니스로직 레이어에서 사용하는 패턴으로 트랜잭션 스크립트 패턴, 테이블 모듈 패턴, 그리고 도메인 모델 패턴이라는 3개의패턴을 제시하고 있다. 그리고 이들 각각의 비즈니스 레이어 패턴들은 해당 패턴과 잘 어울리는 데이터소스 패턴이 존재한다. 예를들어, 마이크로소프트의 DNA나 .NET 기반으로 프로그래밍 하는 경우는 비즈니스 로직에서 레코드셋(recordset)이라는테이블 모듈 패턴을 사용하기 때문에 데이터소스 층에서는 테이블 데이터 게이트웨이 패턴이 잘 어울리는 것과 같은 식이다.

그렇다면 레일스의 경우는 어떨까? 레일스는 ORM 도구로 액티브레코드를 사용한다. 그리고 이 액티브레코드는 다름아닌 파울러의데이터소스 패턴 중 하나인 액티브레코드를 충실하게 구현한 것이다. 액티브레코드 패턴은 아주 복잡하지는 않은 도메인 모델에서모델과 데이터베이스 테이블이 잘 맵핑되는 경우에 적합한 패턴이라고 되어 있다. 결국 바꿔 말하면 레일스에서 액티브레코드를 제대로사용하려면 비즈니스 로직 부분에서는 도메인 모델 패턴을 따라야 한다는 말이 된다. OOAD에서 말하는 제대로 된 도메인 모델링을해야 한다는 말이다. 요는 "선 데이터모델링 후 도메인모델링"이 아니라 "선 도메인모델링 후 데이터맵핑"이 되야 한다는 것이다.

물론 이게 언제나 가능한 것은 아닐 것이다. 경우에 따라서는 레거시 데이터베이스가 이미 존재하고 있어서 어쩔 수 없이 이를 사용해야하는 경우도 있고, 또 조직이나 역할 분담 등 여러 가지 이유로 인해 데이터베이스 스키마에 대한 변경 자체가 불가한 경우에는어쩔 수 없이 다른 방법을 사용하는 일도 생길 수 있다. 그렇지만 그런 경우가 아닌, 애플리케이션을 새로 개발하고 데이터베이스의스키마까지도 맘대로(?) 다룰 수 있는 경우라면 우선 도메인 모델링부터 충실히 하는 것이 옳은 수순이 아닐까.
by thinkr | 2007/09/17 00:03 | 트랙백 | 덧글(5)
Commented by anarch at 2007/09/18 10:49
좋은 글 잘 읽었습니다. 저도 개인적으로 관심이 많은 부분인데요.. 레일스는 마이그레이션을 하고 모델을 작성하게 되지 않나요?
즉 스타일이.. 디비 모델링이 먼저 인듯 해서요. 레일스를 잘 몰라서 그런지는 모르겠습니다만.. :-)
모델을 설계하고 어떠한 모델이 연속성이 필요하다는 판단이 들때 데이터베이스와 맵핑하는게 DDD에서 말하는것 아닌가 하는 짧은 생각이 들어서요..
그리고 액티브 레코드 패턴은 테이블모듈 패턴과 더 맞지 않나 싶은데요.. 도메인 모델은 데이터 매퍼와 더 잘 맞는것 처럼 말입니다..
Commented by thinkr at 2007/09/18 14:29
레일스에 마이그레이션이 있다는 이유만으로 DB 모델링이 먼저일거라 생각하면 안됩니다. UP를 따르든 애자일 방법론을 따르든 어떤 식으로든 (간단하게라도) "설계"가 먼저 이루어지고 그 설계를 반영하기 위해 모델 객체도 만들고 이들 모델 객체 중에서 persistence가 필요한 경우는 마이그레이션도 만드는 게 순서일 겁니다. 레일스의 모델 객체들이 모두 액티브레코드 객체일 필요는 없는 이유가 여기에 있죠. 액티브 레코드 패턴이 도메인 모델 패턴과 더 잘 어울리는지 테이블 모듈 패턴과 더 잘 어울리는지는 생각하기에 따라 다를 수 있겠군요. 다만 레일스의 액티브레코드는 테이블 모듈 패턴보다는 도메인 모델 패턴을 염두에 둬야 더 잘 어울릴 것 같다는 게 제 생각입니다. 좋은 코멘트 감사 드립니다.~
Commented by anarch at 2007/09/18 14:46
답변감사합니다. 많은 걸 배우고 갑니다. :-)
Commented by 이병준 at 2007/11/01 11:13
"도메인"과 "마이그레이션"같은 용어가 감이 잘 오질 않는 중생입니다.
간단히 설명 부탁드리면 실례가 될런지요?
Commented by thinkr at 2007/11/01 14:48
"도메인(domain)"이란 말은 여러 곳에서 여러 용도로 쓰이지만, 대략 "업무영역" 정도라고 풀이하면 될 것 같습니다. 객체지향 모델링 절차들 중에 "업무영역"을 모델링하는 절차가 있는데 그걸 흔히 "도메인 모델링"이라고 하고 그렇게 해서 나온 결과물을 "도메인 모델"이라고 부르기도 합니다. 다만, 앞서 말한 "도메인 모델 패턴"이라는 것은, 의미는 비슷하나 마틴 파울러가 <엔터프라이즈 애플리케이션 아키텍처 패턴>이라는 책에서 말하고 있는 패턴 이름 중 하나일 뿐입니다(책을 참조하시면 좋겠습니다). 그리고 "마이그레이션(migration)"이란 말은 단순히 루비온레일스 프레임워크에서 제공하는 일종의 데이터베이스 스키마 관리 기법(툴)을 말하는 것입니다. 레일스에서는 DDL 대신 마이그레이션을 사용하여 데이터베이스 테이블을 만들고 버전관리도 하고 합니다. 이상은 제대로 아는게 거의 없는 중생이었습니다.
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.
< 이전페이지 다음페이지 >