기존 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 구조는 지원되지 않으며, 평면적인 키-값 쌍에 한정됩니다.