Ruby to XML 변환기
Ruby 클래스나 객체를 붙여넣으세요. 깔끔한 XML을 돌려드립니다.
이 도구가 하는 일
Ruby 클래스에 맞추려고 XML 페이로드를 손으로 짜본 적 있다면 — Rails의 to_xml 픽스처, 오래된 SOAP 호출, 혹은 Nokogiri Builder 템플릿이든 — 보일러플레이트가 얼마나 금방 쌓이는지 아실 겁니다. 여기에 Ruby를 붙여넣으면 한 번에 잘 정돈된 XML을 돌려드립니다. attr_accessor 클래스 하나든, Struct.new든, 모델 파일 전체든, 깊게 중첩된 객체든 결과는 같습니다. 모든 필드가 보존된 완전한 XML 문서가 나옵니다.
단순 문자열 치환이 아닙니다. Ruby 값들이 실제로 어떻게 직렬화되는지 이해합니다. BigDecimal("49.99")는 지수 표기 없이 평범한 숫자 문자열로, Time과 DateTime은 ISO-8601 문자열로, Symbol은 앞의 콜론이 빠지고, nil은 사라지지 않고 빈 요소로 남고, 배열은 항목마다 자식 하나를 가진 컨테이너 요소가 됩니다 — Nokogiri::XML::Builder와 Rails의 to_xml이 보통 만들어내는 것과 똑같습니다.
클래스 구조도 존중됩니다. 각 최상위 클래스는 클래스 이름(snake_case)을 딴 루트 요소가 되고, attr_accessor 심볼들은 자식 요소로, 중첩된 객체는 인라인으로 펼쳐지고, OrderItem의 배열은 <items> 래퍼 안에 항목마다 <order_item>이 하나씩 들어가는 형태가 됩니다. 해시는 키/값 자식 요소가 되고, 상속된 속성도 함께 나옵니다. Rails 모델이나 평범한 PORO를 붙여넣으면, render xml:이나 REXML::Document.new(REXML 참고)가 돌려주는 것과 비슷한 결과가, 귀찮은 절차 없이 나옵니다.
사용 방법
세 단계면 끝. Struct 하나를 붙여넣든 lib 폴더 전체를 붙여넣든 흐름은 같습니다.
Ruby 붙여넣기 (또는 샘플 시도)
왼쪽 에디터에 Ruby를 그대로 떨어뜨리세요. attr_accessor 클래스, Struct.new 단축 구문, 여러 개의 클래스, 값이 채워진 인스턴스 — 뭐든 괜찮습니다. 먼저 샘플 불러오기를 눌러 현실적인 Order 예시부터 보셔도 됩니다.
require 줄을 지우거나 모듈을 떼어내거나 문법을 단순화할 필요가 없습니다. 에디터에 있는 모습 그대로, 그냥 붙여넣으세요.
변환 누르기
녹색 변환 버튼을 누르세요. 도구가 Ruby를 읽고, 모든 클래스와 속성을 유지한 채 XML을 한 번에 만들어냅니다. 처리하는 동안 짧은 반짝임이 표시됩니다.
XML 복사
오른쪽 패널에 표준을 준수하는 어떤 파서든 받아들일 수 있는 들여쓰기된 잘 정돈된 XML이 채워집니다. SOAP 요청, RSpec 픽스처 파일, Rails 통합 테스트, API 문서 등에 그대로 붙여 쓰세요.
이럴 때 진짜 편합니다
Nokogiri나 Builder 픽스처 만들기
Ruby 클래스가 있고 Nokogiri::XML::Builder나 ERB 템플릿용 XML 템플릿이 필요한 경우. 클래스를 붙이고, XML을 받아, Builder 블록에 붙여 넣으면 끝입니다.
Rails to_xml 시드 데이터
속성이 20개쯤 되는 ActiveRecord 모델이나 PORO가 통합 테스트용 또는 여전히 XML을 받는 외부 시스템용으로 바로 편집 가능한 XML 시드 파일이 됩니다.
레거시 SOAP 연동
오래된 SOAP/XML-RPC 서비스와 통신하는 Ruby 클라이언트에서 Ruby 클래스에 맞춘 요청 본문이 필요할 때. 모델을 붙이고 XML 엔벨로프 형태를 얻은 다음, <a href="https://www.ruby-doc.org/" target="_blank" rel="noopener">Savon</a> 템플릿과 씨름하지 마세요.
문서와 코드 싱크 유지
README, API 레퍼런스, XSD 기반 문서용 XML 응답 예시를 실제 Ruby 모델에서 바로 생성하세요. 문서가 코드에서 벗어날 일이 없습니다.
자주 묻는 질문
여러 클래스를 한 번에 붙여넣어도 되나요?
네 — lib 파일 전체를 붙이셔도 됩니다. 각 최상위 클래스는 중첩 클래스가 펼쳐지고 슈퍼클래스 속성까지 포함된 상태로 나옵니다. 믹스인은 자신의 attr_accessor를 제공하는 것으로 취급됩니다. 조용히 버려지는 건 없습니다.
Struct.new 단축 구문은 동작하나요?
네. Order = Struct.new(:order_id, :customer_name, :total_amount)은 대응하는 attr_accessor를 가진 클래스와 동일하게 취급됩니다. 키워드 스타일 struct(Struct.new(:a, keyword_init: true))도 동작합니다 — 어느 쪽이든 결과 XML은 같습니다.
BigDecimal, Time, Symbol, nil은 어떻게 처리되나요?
BigDecimal("49.99")은 그냥 문자열 49.99가 됩니다(지수 표기 없음, 뒤에 bd 마커도 없음). Time, DateTime, Date는 ISO-8601 문자열로 렌더링됩니다. Symbol은 콜론이 빠져 평범한 텍스트가 됩니다. nil은 사라지지 않고 빈 요소(<field/>)가 되므로 XML 형태가 일관되게 유지됩니다.
배열, 해시, 중첩 객체는요?
배열은 컨테이너 요소가 됩니다 — items = [OrderItem.new, OrderItem.new]는 <items><order_item/><order_item/></items>가 되고, 요소 클래스 이름으로 항목마다 자식 하나씩 들어갑니다. 해시는 <entry><key/><value/></entry> 쌍이 됩니다. 중첩 객체는 Rails to_xml과 같은 방식으로 인라인 자식 요소로 펼쳐집니다.
제 코드가 저장되나요?
코드는 변환을 위해 백엔드로 전송되지만 저장되지 않습니다 — 페이로드를 로그하지 않습니다. 온라인 도구 일반론이지만, Ruby 안에 진짜 민감한 리터럴(API 키, 고객 PII 등)이 있다면 붙여넣기 전에 지워주세요.
메타프로그래밍이나 define_method를 쓰는 코드는요?
런타임에만 존재하는 것들(define_method로 추가된 메서드, method_missing으로 설정되는 속성, 계산된 속성을 가진 믹스인 모듈 등)은 정적 코드만으로는 추론할 수 없습니다. 이 도구는 선언된 attr_accessor, attr_reader, Struct 필드, 명시적 할당을 읽습니다. 메타프로그래밍으로만 나타나는 필드가 있다면, 변환기가 볼 수 있도록 attr_accessor로 적어두세요.
함께 쓰면 좋은 도구
Ruby to XML은 퍼즐의 한 조각입니다. 이 도구들과 잘 어울립니다: