Hanami 애플리케이션의 라우팅은 config/routes.rb 파일에서 정의되며, Rails와 유사하지만 컨트롤러와 액션을 점(.)으로 구분하는 특징이 있습니다. 예를 들어, root to: "books.index"와 같이 사용됩니다.
액션 및 뷰 분리
Hanami는 Rails의 컨트롤러 개념을 액션(Actions)과 뷰(Views) 두 가지 클래스로 분리합니다.
-
액션(Actions): 요청 파라미터 파싱, 응답 처리, 인증/인가, 입력 유효성 검사 등 요청의 초기 단계를 담당합니다. 액션은 어떤 뷰를 렌더링할지 결정하는 역할도 수행합니다.
-
뷰(Views): 액션이 결정한 뷰 버전에 따라 데이터를 수집하고 표현하는 역할을 합니다. Rails의
respond_to와 유사한 방식으로 작동하며, 데이터 로딩 로직을 포함할 수 있습니다.
데이터 로딩 및 노출
Hanami 뷰에서는 include Deps를 통해 외부 의존성(예: repos.book_repo)을 명시적으로 주입받고, expose 키워드를 사용하여 템플릿에 데이터를 노출합니다. 이는 Rails에서 인스턴스 변수가 마법처럼 템플릿에 나타나는 방식과 대조됩니다. 데이터베이스 쿼리는 뷰 내부에 위치할 수 있는데, 이는 액션의 인증/인가 규칙 등으로 인해 모든 데이터가 필요하지 않을 수 있기 때문입니다.
파라미터 처리 및 조건부 렌더링
라우트 정의 시 "/books/year/:year"와 같이 파라미터를 포함할 수 있습니다. 액션은 request.params[:year]를 통해 이 파라미터를 접근하고, 파라미터 유무에 따라 다른 뷰를 조건부로 렌더링할 수 있습니다. 예를 들어, 특정 연도에 해당하는 책만 보여주는 Books::ByYear 뷰를 생성하고 사용합니다.
쇼(Show) 액션 및 라우트 명명
단일 리소스(예: 특정 책)를 보여주는 쇼 액션은 hanami g action books.show 명령으로 생성되며, get "/books/:id", to: "books.show" 라우트가 추가됩니다. 라우트에는 as: :book과 같이 이름을 부여하여 routes.path(:book, id: book.id)와 같이 명시적으로 경로를 생성할 수 있습니다. 이는 Rails의 동적 라우팅 헬퍼와 달리 명시적이며, 코드베이스에서 경로 정의를 쉽게 찾을 수 있게 합니다.
파트(Parts) - Hanami의 데코레이터
Hanami는 뷰에서 expose된 데이터를 Part라는 클래스로 감싸서 뷰 객체를 장식(decorate)합니다. 예를 들어 expose :books는 Views::Parts::Books와 Views::Parts::Book으로 래핑됩니다. 개발자는 app/views/parts/book.rb와 같이 사용자 정의 Part 클래스를 생성하여 show_path와 같은 헬퍼 메서드를 추가할 수 있습니다. 이를 통해 link_to book.title, book.show_path와 같이 템플릿 코드를 간결하게 만들 수 있으며, 메서드 정의 위치를 쉽게 파악할 수 있어 코드 유지보수성이 향상됩니다.