본문으로 건너뛰기

Rails에 타입 지정 JSON 컬럼 추가: has_json 및 has_delegated_json

Rails adds support for typed json columns using has_json

작성자
jeff
발행일
2025년 12월 11일

핵심 요약

  • 1 Rails에 `has_json` 및 `has_delegated_json` 기능이 도입되어 JSON 컬럼에 스키마 정의 및 자동 타입 캐스팅을 지원합니다.
  • 2 이 기능은 JSON 컬럼 사용 시 수동 타입 변환, 기본값 관리, 키 일관성 유지의 어려움을 해소합니다.
  • 3 모델에서 JSON 컬럼의 키별 타입과 기본값을 선언하여 데이터 일관성을 높이고 개발 편의성을 향상시킵니다.

도입

Rails에서 JSON 컬럼은 사용자 환경설정 등 추가 데이터 저장에 유용하나, 스키마 부재와 타입 불일치 문제로 수동 관리가 필요했습니다. 최근 Rails PR #56258을 통해 `has_json` 및 `has_delegated_json` 기능이 도입되어 이 문제를 해결합니다. 이 기능은 모델 내에서 JSON 컬럼의 스키마를 정의하고 자동 타입 캐스팅을 지원하여 데이터 무결성 및 개발 편의성을 높입니다.

기존 JSON 컬럼 사용의 문제점

이전에는 JSON 컬럼을 단순한 Ruby 해시로 취급하여 수동 타입 캐스팅과 기본값 관리가 필수적이었습니다. 예를 들어, 폼에서 제출된 “true” 문자열이 불리언 true로 자동 변환되지 않아 데이터 일관성 문제가 발생했으며, 개발자는 JSON 컬럼 내의 모든 키와 기본값을 기억하고 관리해야 하는 부담이 있었습니다.

has_json을 통한 개선

새롭게 도입된 has_json 매크로는 모델 내에서 JSON 컬럼의 스키마를 선언할 수 있도록 합니다. 이를 통해 Rails는 각 키의 타입(예: 문자열, 불리언)을 추론하거나 명시적으로 지정할 수 있으며, 기본값 설정 및 자동 타입 캐스팅을 처리합니다.

ruby class User < ApplicationRecord has_json :preferences, theme: "light", # 문자열, 기본값 "light" notifications: true, # 불리언, 기본값 true language: :string # 명시적 문자열, 기본값 없음 end 이러한 정의를 통해 user.preferences.theme 접근 시 기본값이 자동으로 적용되고, user.preferences.notifications = "false"와 같이 문자열을 할당해도 자동으로 불리언 false로 캐스팅됩니다. 대량 할당 시에도 동일하게 작동하여 개발 편의성을 크게 높입니다.

has_delegated_json

user.preferences.theme처럼 중첩된 접근 대신, user.theme와 같이 JSON 속성에 직접 접근하고자 할 경우 has_delegated_json을 활용할 수 있습니다.

지원 타입 및 제한 사항

현재 string, boolean 그리고 암시적인 integer 세 가지 기본 타입을 지원합니다. 초기 버전에서는 중첩된 JSON 구조는 지원되지 않으며, 평면적인 키-값 쌍에 한정됩니다.

결론

Rails의 `has_json` 및 `has_delegated_json` 기능은 JSON 컬럼의 스키마 부재와 타입 불일치 문제를 효과적으로 해결합니다. 모델 내에서 명확하게 스키마를 정의함으로써 데이터 무결성을 확보하고, 수동 타입 캐스팅 부담을 줄여 개발 생산성을 향상시킬 수 있습니다. 이 기능은 사용자 환경설정 등 간단한 키-값 쌍을 JSON 컬럼에 저장하는 시나리오에서 특히 유용하며, 향후 중첩 구조 지원 등 기능 확장이 기대됩니다.

댓글 0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

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