차이점 비교
회사에서 올해 초에 Spring + Spring JPA + Hibernate로 프로젝트를 진행하고 나서 ORM Framework에 재미가 들렸다. 그러던 중 이번에 Ruby on Rails(이하 RoR)를 사용하는 프로젝트에 참여하게 되었는데 Rails의 ActiveRecord와 Hibernate가 비슷하면서도 차이가 있어 정리해본다.
일단 Java 진영의 대표적인 ORM인 Hibernate와 Ruby 진영의 대표적인 ORM인 ActiveRecord는 언 듯 보면 매우 비슷하다. (같은 ORM Framework니까 당연..;)
근데 약간 깊이 들어가면 차이점이 있는데 마틴 파울러의 P of EAA에 아주 잘 설명되어 있다.
Rails의 ActiveRecord는 ActiveRecord Pattern으로 사용하게 된다.
ActiveRecord는 위 이미지처럼 Domain 안에서 데이터베이스에 객체를 컨트롤(CRUD)하도록 되어있다.
반면 Hibernate는 DataMapper Pattern 형태로 사용하게 된다.
Hibernate는 Domain과 Mapper가 분리되도록 구현하며 DB를 완전히 Domain 객체에서 격리시킨다.
사실 둘 중에 어느게 더 좋은가? 라는 질문은 무의미한 듯하다.
Domain 객체가 단순한 비즈니스 로직을 갖는 프로젝트의 경우 ActiveRecord가 더 좋은 선택이다.
단순한 로직인 경우 굳이 Mapper까지 만들어서 DB를 격리시킬 필요가 없기 때문이다.
(물론 단순한 비즈니스 로직을 갖는 프로젝트라고 하더라도 DB를 완전히 격리시켜서 개발을 해야 할 때가 있긴 하다.)
반면 비즈니스 로직이 매우 복잡한 경우는 Domain과 DB 간 Mapper Layer를 두어서 DB를 완전히 격리시키는 것이 유지보수도 좋을뿐더러 Domain이 지저분해지지 않는다.
쓰다 보니 ActiveRecord 패턴과 DataMapper 패턴간의 차이점을 설명하게 되었지만.. 각 패턴을 가장 잘 나타내는 게 Rails의 ActiveRecord이고 Java 쪽의 Hibernate라서 개발시에 참고를 하면 좋을 것 같다.
* Reference
- Enterprise Application Architecture: Mapping to Relational Databases
- 하이버네이트를 안 쓰는 것에 대한 변명 by 김성철
- Catalog of Patterns of Enterprise Application Architecture by martin fowler