왼쪽에 F#을 붙여 넣고 "변환"을 클릭하세요 — XML로 바꿔드립니다F# 코드를 붙여 넣으세요

이 도구가 하는 일

F#을 쓰면서 .NET XML 설정, WCF 계약, SOAP 엔드포인트 근처에서 작업해 본 적이 있다면 이 고통을 이미 알고 계실 겁니다 — 레코드 타입은 깔끔하고 표현력도 좋지만, 거기에 맞는 XML을 손으로 쓰는 건 정말 귀찮은 일입니다. 여기에 F#을 붙여 넣으면 잘 짜인 XML이 한 번에 돌아옵니다 — 레코드 하나, 값이 채워진 let 바인딩, 혹은 중첩된 레코드를 가진 모듈 전체까지.

변환기는 여러분이 실제로 신경 쓰는 F#의 까다로운 부분들을 알고 있습니다. Some "x"를 담은 option<string>은 보통의 요소가 됩니다. None은 빈 요소가 되어 사라지지 않기 때문에 XML 형태가 예측 가능한 상태로 유지됩니다. decimal 리터럴(249.99m)은 접미사가 떨어집니다. list, seq, 배열은 컨테이너 요소가 되며 각 항목이 자식 요소로 하나씩 들어갑니다 — .NET에서 round-trip할 때 System.Xml.Serialization이 내부적으로 내뱉는 것과 같습니다.

판별 공용체도 자연스럽게 처리됩니다 — 케이스 이름이 요소 태그가 되고 페이로드는 자식 요소가 됩니다. 중첩된 레코드는 인라인으로 펼쳐지고, 튜플 필드는 형제 요소로, Map<K,V><Entry><Key/><Value/></Entry> 쌍이 됩니다. 속성 기반 커스터마이징([<XmlElement>], [<XmlAttribute>])에 대해서는 F#의 .NET 상호 운용 문서를 참고하세요 — 변환기는 해당 속성이 있을 때 존중합니다.

사용 방법

세 단계입니다. 한 줄짜리 레코드를 붙여 넣든 모듈 전체를 붙여 넣든 동일하게 동작합니다.

1

F#을 붙여 넣으세요 (또는 샘플을 써보세요)

왼쪽 에디터에 F#을 그대로 붙여 넣으세요. 레코드 타입, 값이 채워진 let 바인딩, 여러 개의 레코드, 또는 판별 공용체 — 모두 괜찮습니다. 먼저 현실적인 예시를 보려면 샘플 불러오기를 클릭하세요.

open 문을 지우거나 F# 문법을 정리하지 않아도 됩니다. Rider나 VS Code에서 보이는 모습 그대로 두세요. 그냥 붙여 넣으면 됩니다.

2

변환을 누르세요

초록색 변환 버튼을 클릭하세요. 도구가 레코드를 파싱하고 값이 채워진 인스턴스를 순회한 뒤, 한 번에 XML을 만들어냅니다. 실행 중에는 짧게 로딩 인디케이터가 나옵니다.

3

XML을 복사하세요

오른쪽 패널이 들여쓰기된, 잘 짜인 XML로 채워집니다. 표준을 따르는 어떤 파서도 받아들이는 결과물입니다. app.config, SOAP 픽스처, XmlSerializer round-trip 테스트, 혹은 문서에 바로 붙여 넣으세요.

실제로 유용한 순간

.NET XML 설정 파일

app.config / web.config 섹션을 모델링하는 F# 레코드가 바로 수정 가능한 XML 템플릿으로 바뀝니다 — 손으로 angle bracket을 칠 필요가 없습니다.

WCF / SOAP 픽스처

WCF 데이터 계약을 반영한 F# 레코드가 있다면. 붙여 넣어 SOAP 형태의 바디를 얻고, SoapUI나 Postman에 넣으세요.

레거시 XML 엔드포인트와의 Fable 연동

Fable로 구버전 XML API와 통신 중인가요? 공유된 F# 레코드를 붙여 넣으면 백엔드가 기대하는 XML 바디를 얻을 수 있습니다. option 필드도 제대로 처리됩니다.

XmlSerializer용 테스트 데이터

<code>XmlSerializer&lt;T&gt;</code>를 통해 예기치 않은 일 없이 round-trip되는 XML 시드 데이터를 생성하세요 — 통합 테스트, 목 서버, 회귀 테스트 스위트에 유용합니다.

자주 묻는 질문

레코드 여러 개를 한꺼번에 붙여 넣어도 되나요?

네 — 모듈 전체를 붙여 넣으세요. 각 레코드 타입은 중첩된 레코드가 펼쳐진 상태로 처리되고, and로 체이닝된 타입 정의들도 함께 다뤄집니다. 판별 공용체 케이스는 케이스 이름을 요소 태그로 유지합니다.

option, None, 기본값은 어떻게 처리되나요?

Some "x"를 가진 option<string>은 텍스트를 담은 보통의 요소가 됩니다. None은 빈 요소가 되어 형태가 안정적으로 유지됩니다 — 값이 채워진 레코드와 그렇지 않은 레코드 사이에서 필드가 사라지지 않습니다. voption도 같은 방식으로 동작합니다.

decimal, DateTime, Guid, 그 밖의 까다로운 타입들은요?

decimal(249.99m)은 접미사가 떨어지고 순수 숫자 텍스트가 됩니다. DateTime, DateTimeOffset, TimeSpan은 ISO-8601 문자열이 됩니다. Guid는 표준 8-4-4-4-12 16진 형식 그대로입니다. byte[]는 base64 텍스트가 됩니다 — XmlSerializer 동작과 일치합니다.

판별 공용체는 잘 되나요?

네. type Status = Active | Suspended of reason: string 같은 DU는 인자 없는 케이스에는 <Active/>를, 페이로드가 있는 케이스에는 <Suspended><reason>...</reason></Suspended>를 내놓습니다. 케이스 이름이 요소 태그가 됩니다 — 스키마와 맞물리는 XML에서는 대개 원하는 형태입니다.

제 코드가 저장되나요?

코드는 변환을 위해 백엔드로 전송되지만 저장하지 않습니다 — 페이로드는 로그에도 남기지 않습니다. 민감한 F#(내부 계약, 리터럴에 들어간 API 키 등)은 붙여 넣기 전에 한 번 확인해 주세요.

F#에서 computation expression이나 active pattern을 쓰고 있다면?

그것들은 XML 필드를 만들지 않습니다 — 제어 흐름 구문일 뿐 데이터가 아니기 때문입니다. 도구는 레코드 타입 정의와 값이 채워진 인스턴스를 보기 때문에 async { ... }나 banana-clip 패턴 매치는 무시됩니다. 명백한 구문 오류부터 먼저 고치세요. 파서가 씹을 수 있는 깔끔한 상태가 되도록요.

함께 쓰면 좋은 도구

F# to XML은 퍼즐의 한 조각입니다. 이들과 잘 어울립니다: