본문 바로가기

Dot Computer Science/Concept

[Architectural pattern] Active Record, Data Mapper 패턴

    객체는 '데이터'와 '행동'을 운반한다. 대부분의 데이터는 영구적이며 데이터베이스에 저장해야 한다.

     

    Active Record 패턴과 Data Mapper 패턴은 Martin Fowler: Patterns of Enterprise Application Architecture(2003)에서 지어진 이름이다.

     

    Active Record

    An object that wraps a row in a database table or view, encapsulates the database access, and adds domain logic on that data. - Patterns of Enterprise Application Architecture(2003)

     

    Active Record 패턴은  도메인 객체에 데이터 액세스 로직을 직접 관리함으로써 가장 확실한 접근 방식을 사용한다. 

     

    Active Record

     

    Data Mapper

    A layer of Mappers that moves data between objects and a database while keeping them independent of each other and the mapper itself. - Patterns of Enterprise Application Architecture(2003)

     

    Data Mapper 패턴은 데이터 액세스 로직을 도메인 객체가 아닌 repository 라고 부르는 객체에서 관리한다. repository에서 객체를 CRUD 할 수 있다. 해당 패턴을 사용하면 도메인 객체는 그냥 바보가 된다. 속성을 정의하고 일부 로직을 정의하는 데에만 사용이 된다. 

     

    Data Mapper

     

    Active Record vs Data Mapper

    소프트웨어 개발에서 항상 염두에 두어야 할 한 가지는 앱을 유지 보수하는 방법이다.

    • Data Mapper 패턴은 대규모 앱에서 효과적인 유지 보수를 하는 데에 도움이 된다.
    • Active Record 패턴은 소규모 앱에서 단순하게 유지 관리를 할 수 있어서 좋다. 유지 보수 관리의 핵심은 단순함이기 때문이다. 

     

    ORM

    객체와 RDB의 테이블 데이터 저장 방식이 서로 다르다는 것을 알고 있기 때문에, ORM 프레임워크는 객체와 관계형 데이터베이스 사이의 매핑을 제공한다. 스타트업에서 많이 사용하는 Rails 프레임워크는 Active Record 패턴을 주로 사용하고, 대기업에서 많이 사용하는 Spring 프레임워크는 Data Mapper 패턴을 주로 사용한다. 

     

     

    Ruby의  Active Record

    • Active Record라는 디자인 패턴은 'ActiveRecord'라는 Ruby 모듈에서 제공된다.
    • 이 모듈에서 제공하는 기능을 사용하여 다음을 수행할 수 있다.
      • Establish a connection to a database.
      • Create database tables.
      • Specify associations between tables that correspond to associations between the Ruby classes.
      • Establish an ORM between Ruby classes/objects/attributes and the tables/rows/columns in the underlying database.
      • Peform CRUD operations on Ruby ActiveRecord objects.
    • ActiveRecord 모듈은 Rails에 내장되어 있다. 위의 기능은 Rails 앱을 만들고 scaffold 및 model generator를 실행할 때 활용된다.

     

    Rails의 Active Record

    • ActiveRecord::Base.establish_connection 메소드는 Rails 애플리케이션을 데이터베이스에 연결하기 위해 ./conifg/database.yml의 정보를 사용한다.
    • ActiveRecord::Migration 객체는 DB 스키마의 변화를 시간순으로 관리한다. 마이그레이션을 하면 ./db/schema.rb 파일을 업데이트한다. (flyway같은 툴을 사용할 필요가 없다.)
    • Rails의 ActiveRecord는 ORM으로써, 다음과 같은 메커니즘을 제공한다.
      • Represent models and their data.
      • Represent associations between these models.
      • Represent inheritance hierarchies through related models.
      • Validate models before they get persisted to the database.
      • Perform database operations in an object-oriented fashion.

     

    Spring의 Data Mapper

    • Spring 에서는 Hibernate, JPA와 같은 ORM을 사용하여 객체와 DB 간의 매핑 메커니즘을 제공한다
    • Spring Data는 DB 접근을 위하여 일관되고 추상화된 모델들을 제공한다. 이를 사용하여 다양한 DB 연동 개발을 심플하게 구축할 수 있다.