Rails에서 유효성 검사 컨텍스트(Context)를 활용한 조건부 유효성 검사 구현 및 리팩토링

Valid with Context

작성자
GoRails Youtube
발행일
2026년 01월 19일

핵심 요약

  • 1 Rails 모델의 유효성 검사 시 `on: :context` 옵션을 사용하여 특정 조건에서만 유효성 검사를 실행하는 방법을 설명합니다.
  • 2 `save` 및 `valid?` 메서드에 `context` 키워드 인자를 전달하여 드래프트 저장과 게시(publish) 간 유효성 검사 로직을 분리하는 실용적인 예시를 제공합니다.
  • 3 컨트롤러의 `create` 및 `update` 액션에서 발생하는 코드 중복을 제거하고, 헬퍼 메서드를 활용하여 가독성과 유지보수성을 향상시키는 리팩토링 기법을 다룹니다.

도입

2026년 새해를 맞아 코드 읽기를 통한 학습의 중요성을 강조하며, Basecamp의 Fizzy 앱 코드에서 발견한 Rails 유효성 검사의 `context` 활용법을 소개합니다. 이 기능은 특정 상황에서만 유효성 검사를 조건부로 실행할 수 있게 하여, 일반적인 Rails 개발에서는 자주 접하지 못하지만 매우 강력하고 유용한 기능입니다. 본 내용은 간단한 블로그 애플리케이션을 예시로 들어, 게시물 드래프트를 저장할 때는 유효성 검사를 건너뛰고, 게시(Publish)할 때만 필수 필드 유효성 검사를 적용하는 방법을 단계별로 탐구합니다. 이를 통해 개발자들이 이 멋진 기능을 이해하고 실제 프로젝트에 적용할 수 있도록 돕는 것이 목표입니다.

Rails 유효성 검사 컨텍스트(Context) 구현

1. Rails 애플리케이션 설정 및 모델 생성

  • rails new valid_with_context 명령어를 사용하여 새로운 Rails 애플리케이션을 생성합니다.

  • rails generate scaffold Post title:string body:text 명령어로 Post 모델과 기본적인 CRUD 기능을 위한 스캐폴드를 생성합니다.

  • config/routes.rb 파일에서 `root ‘posts

index’와 같이 루트 경로를 설정하고, app/controllers/posts_controller.rb에서 respond_to` 블록 등 불필요한 코드를 정리하여 예시의 복잡성을 줄입니다.

2. 조건부 유효성 검사 로직 추가

  • app/models/post.rb 파일에 다음과 같이 유효성 검사 규칙을 정의합니다. on: :publish 옵션은 해당 유효성 검사가 :publish 컨텍스트에서만 실행되도록 지정합니다.

    ```ruby class Post < ApplicationRecord validates :title, :body, presence: true, on: :publish

    def publish save(context: :publish) end end ```

  • 게시물 생성/수정 폼(app/views/posts/_form.html.erb)에

결론

Rails에서 `on: :context` 옵션을 활용한 조건부 유효성 검사는 특정 상황에 따라 다른 유효성 검사 규칙을 적용해야 할 때 매우 유용합니다. 본 예시를 통해 `valid?` 메서드뿐만 아니라 `save` 메서드에도 `context` 인자를 직접 전달하여 동일한 기능을 구현할 수 있음을 확인했습니다. 이는 Rails 내부적으로 `context` 인자가 유효성 검사 로직으로 전달되어 처리되기 때문입니다. 또한, `create` 및 `update` 액션에서 발생하는 코드 중복을 제거하기 위해 헬퍼 메서드를 도입하여 컨트롤러 로직을 간결하고 가독성 높게 리팩토링하는 방법을 시연했습니다. 이 과정은 다른 개발자의 코드를 읽고 분석하는 것이 얼마나 중요한 학습 방법인지 다시 한번 상기시켜 줍니다. 짧은 시간이라도 코드를 탐색하며 새로운 기능을 발견하고 그 작동 원리를 깊이 파고드는 습관은 개발자로서의 성장에 큰 도움이 될 것입니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

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