Hanami는 Rails와 달리 모델 레이어를 Repository, Relation, Struct 세 가지 고유한 클래스로 분리하여 데이터베이스 상호작용을 관리합니다. 이 방식은 명확한 관심사 분리를 통해 애플리케이션의 유지보수성을 높이는 데 중점을 둡니다.
Hanami 모델 레이어의 핵심 구성 요소 및 역할
-
Repository: 애플리케이션이 데이터베이스와 상호작용하는 방식을 정의하고 캡슐화합니다. 특정 데이터 타입에 대한 조회 및 조작 메서드를 제공하여 비즈니스 로직과 데이터 접근을 연결합니다.
-
Relation: 데이터베이스 테이블에 대한 복잡한 쿼리를 구성하고 관리합니다. SQL 쿼리를 추상화하며, 쿼리 체이닝을 위한 기반을 제공하여 유연한 데이터 필터링을 가능하게 합니다.
-
Struct: 데이터베이스의 단일 행을 나타내는 순수 Ruby 객체입니다. 최소한의 메서드만 가진 불변 객체로 데이터를 표현하여 데이터 무결성을 유지하고, 불필요한 로직이 데이터 객체에 포함되는 것을 방지합니다.
데이터베이스 상호작용 과정 요약
-
마이그레이션:
hanami g migration으로 스키마를 정의하고hanami db migrate로 실행합니다. -
데이터 조작:
app["relations.books"]를 통해 Relation에 접근하여insert,update,first등으로 데이터를 해시 형태로 조작합니다. -
객체화:
app["repos.book_repo"]를 통해 Repository에 접근하면, Relation이 반환하는 데이터가 자동으로 Struct 객체로 변환됩니다. Repository는find,all등 편의 메서드를 제공하여 Struct 객체 조회를 돕습니다. -
쿼리 스코핑 및 체이닝:
by_year,by_author와 같은 복합 쿼리 로직은 Relation 클래스에 정의되어 쿼리 체이닝을 지원합니다. Repository는 이 Relation 메서드를 호출하여book_repo.by_year(2025).by_author("Ryan Bigg").first와 같은 유연한 쿼리를 구성합니다.