Hanami for Rails 개발자를 위한 가이드: 폼, 유효성 검사 및 데이터 업데이트

Hanami for Rails Developers: Part 3: Forms - Ryan Bigg

작성자
발행일
2025년 10월 06일

핵심 요약

  • 1 Hanami에서 `new` 및 `create` 액션과 `form_for` 헬퍼를 사용하여 새 책 추가 폼을 구현하는 방법을 설명합니다.
  • 2 `dry-schema` 젬을 활용하여 액션 내에서 파라미터 유효성 검사를 추가하고, 유효성 검사 실패 시 에러 메시지를 표시하는 방법을 다룹니다.
  • 3 `edit` 및 `update` 액션을 생성하고, 폼 파셜을 재사용하며, 기존 데이터를 업데이트하고 유효성 검사 에러를 처리하는 과정을 상세히 안내합니다.

도입

본 블로그 게시물은 'Hanami for Rails 개발자를 위한 가이드' 시리즈의 세 번째 파트입니다. 이전 두 파트에서는 모델(리포지토리, 릴레이션, 스트럭처)과 컨트롤러(액션, 뷰, 템플릿)의 익숙한 개념을 다루며 Hanami가 이러한 디자인을 어떻게 접근하는지 살펴보았습니다. 이번 파트에서는 애플리케이션에 책을 추가하고 수정할 수 있는 폼을 도입하여 기존 애플리케이션의 기반을 계속 구축합니다. Rails 앱과 유사하게 `new` 및 `create` 액션과 `edit` 및 `update` 액션을 사용하여 폼을 구현하고, Hanami의 유효성 검사 및 데이터 처리 방식을 상세히 탐구합니다.

Hanami 애플리케이션에서 새로운 책을 추가하고 기존 책을 수정하는 과정을 단계별로 설명합니다. Rails 개발자에게 익숙한 개념과 Hanami의 차이점을 명확히 제시하며, 코드 예시를 통해 실제 구현 방법을 안내합니다.

1. 새 책 폼 구현

  • hanami g action books.newhanami g action books.create 명령어를 통해 액션을 생성합니다.

  • config/routes.rb 파일에 /books/new 경로를 books.new 액션에, /books 경로를 books.create 액션에 연결하는 라우트를 정의합니다.

  • app/templates/books/index.html.erb에 새 책 폼으로 이동하는 링크를 추가하고, app/templates/books/new.html.erbform_for 헬퍼를 사용하여 책 제목, 저자, 출판 연도를 입력받는 폼을 작성합니다. form_for 헬퍼는 Rails와 유사하지만 위치 인자를 사용하며, params[:book] 형태로 데이터를 전송합니다.

  • app/actions/books/create.rb에서 BookRepo를 의존성으로 주입받아 request.params[:book] 데이터를 사용하여 새 책을 생성하고, 성공 시 플래시 메시지를 설정한 후 생성된 책의 상세 페이지로 리다이렉트합니다.

  • 플래시 메시지 사용을 위해 config/app.rb에 세션 지원(config.sessions = :cookie, { secret: "..." })을 추가하고, app/templates/layouts/app.html.erb에 플래시 메시지를 표시하는 코드를 삽입합니다.

  • app/repos/book_repo.rbcommands :create를 추가하여 BookRepo가 책 생성 명령을 처리할 수 있도록 합니다.

2. 유효성 검사 추가

  • app/actions/books/create.rbparams 블록에 dry-schema 젬을 활용하여 유효성 검사를 정의합니다. required(:title).filled(:string)과 같이 titleauthor 필드는 필수 문자열로, year 필드는 선택적 정수로 지정합니다. 이는 Rails의 validates_presence_ofstrong_parameters 기능을 동시에 제공합니다.

  • handle 메서드 내에서 request.params.valid?를 통해 유효성 검사를 수행하고, 유효하지 않을 경우 response.flash.now[:error] 메시지를 설정하고 new_view를 렌더링하며 errors를 전달합니다.

  • app/actions/books/create.rbinclude Deps[new_view: "views.books.new"]를 추가하여 new_view를 의존성으로 주입받습니다.

  • app/views/books/new.rbexpose :errors를 추가하여 뷰에서 에러 객체에 접근할 수 있도록 하고, app/templates/books/new.html.erb에 에러 메시지를 표시하는 코드를 추가합니다.

3. 책 수정 폼 구현

  • hanami g action books.edithanami g action books.update 명령어를 통해 액션을 생성합니다.

  • config/routes.rb 파일에 get "/books/:id/edit" 경로를 books.edit 액션에, patch "/books/:id" 경로를 books.update 액션에 연결하는 라우트를 정의합니다.

  • app/templates/books/show.html.erbedit_book 경로를 사용하는 편집 링크를 추가합니다.

  • app/templates/books/_form.html.erb 파셜을 생성하여 newedit 뷰에서 폼 코드를 재사용합니다. 이 파셜은 form_type 변수를 통해 create 또는 update 상황에 따라 폼의 경로, HTTP 메서드, 제출 버튼 텍스트를 동적으로 변경합니다.

  • app/actions/books/edit.rb에서 id 파라미터를 뷰로 전달하고, app/views/books/edit.rb에서 book_repo.find(id)를 통해 책 데이터를 로드하여 expose :book으로 폼 필드를 자동으로 채웁니다.

  • app/actions/books/update.rb에서 idbook 파라미터에 대한 유효성 검사를 정의하고, handle 메서드에서 유효성 검사 후 book_repo.update를 호출하거나 edit_view를 렌더링하며 에러를 전달합니다.

  • app/actions/books/update.rbinclude Deps[edit_view: "views.books.edit"]를 추가하여 edit_view를 의존성으로 주입받습니다.

  • app/repos/book_repo.rbcommands :create, update: :by_pk를 추가하여 BookRepoid를 기준으로 책 업데이트 명령을 처리할 수 있도록 합니다.

  • app/views/books/edit.rbexpose :errors를 추가하여 업데이트 실패 시 에러를 표시할 수 있도록 합니다.

결론

이 글은 Hanami 프레임워크에서 Rails 개발자에게 익숙한 폼 생성, 데이터 유효성 검사, 그리고 CRUD(Create, Read, Update, Delete) 액션의 구현 방식을 상세히 다루었습니다. Hanami는 모델, 컨트롤러, 뷰의 책임을 명확히 분리하고, `dry-schema`와 같은 강력한 젬을 활용하여 액션 레벨에서 유효성 검사를 처리함으로써 코드의 응집도를 높이고 유지보수성을 향상시킵니다. 폼 파셜의 재사용 및 의존성 주입 패턴은 유연하고 확장 가능한 애플리케이션 개발을 가능하게 하며, Rails와 다른 Hanami만의 접근 방식을 이해하는 데 중요한 통찰을 제공합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!