Scala에서 XML 변환기
Scala case class나 객체를 붙여넣으세요. 깔끔한 XML을 돌려드립니다.
이 도구가 하는 일
Scala case class에 맞는 XML 페이로드가 필요했던 적 있죠? Akka HTTP 픽스처, Play Framework 설정, 레거시 SOAP 연동, 혹은 테스트용으로요. 그때마다 XML을 직접 손으로 쓰느라 지쳤을 겁니다. 여기에 Scala를 붙여넣으면 잘 형성된 XML을 바로 돌려드립니다. 단일 case class든, 값이 들어간 val이든, 중첩 타입을 포함한 파일 전체든 — 모든 필드가 보존된 채로 나옵니다.
이 변환기는 Scala가 XML로 떨어질 때 어떻게 보이는지 제대로 이해합니다. 접미사가 붙은 BigDecimal 리터럴은 순수 숫자 텍스트로 나오고, None을 가진 Option[String] 필드는 조용히 사라지는 대신 빈 요소로 매핑됩니다. List[T]와 Seq[T]는 컨테이너 요소가 되어 요소 타입 이름을 단 자식을 하나씩 가지고, Map[K,V]는 <Entry><Key/><Value/></Entry> 쌍이 됩니다. 모델을 라운드트립할 때 scala-xml이나 jackson-module-scala가 내놓는 형태와 동일합니다.
중첩된 case class는 중첩 요소로 펼쳐지고, 컴패니언 오브젝트 상수는 무시되며, sealed trait 계층에서는 구체 서브타입 이름이 요소 태그로 그대로 남습니다. 여러 클래스를 한꺼번에 붙여넣어도 됩니다 — 관계는 유지되므로, Order에 List[OrderItem]과 ShippingAddress가 들어 있으면 셋 다 함께 돌아옵니다. 무엇이 데이터로 취급되고 무엇이 동작으로 취급되는지는 공식 case class 투어에서 다시 확인할 수 있습니다.
사용 방법
세 단계. 5줄짜리 case class든 모델 파일 전체든 흐름은 같습니다.
Scala를 붙여넣기 (또는 샘플 불러오기)
코드를 있는 그대로 왼쪽 에디터에 넣으세요. 단일 case class, 값이 들어간 val 인스턴스, 여러 클래스, sealed trait 계층 — 파서는 전부 잘 받아줍니다. 현실적인 예시를 먼저 보고 싶다면 샘플 불러오기를 누르세요.
import를 지우거나, package 선언을 제거하거나, Scala 문법을 정리할 필요 없습니다. IntelliJ나 Metals에서 보이는 그대로 두세요. 그냥 붙여넣으세요.
변환 누르기
초록색 변환 버튼을 클릭하세요. 도구가 case class를 파싱하고, 값이 들어간 인스턴스를 훑어서 한 번에 XML을 만들어 냅니다. 작업 중에는 짧은 로딩 표시가 뜹니다.
XML 복사
오른쪽 패널이 들여쓰기된, 잘 형성된 XML로 채워집니다. 표준을 따르는 어떤 파서든 받아들이는 형태입니다. Akka HTTP 테스트, Play XML 바디, SBT 리소스 파일 등 필요한 곳에 바로 복사해서 쓰세요.
실제로 쓸 만한 상황
Akka HTTP와 Play 픽스처
Akka HTTP나 Play에서 들어오는 XML 요청용 case class가 있고, 테스트나 curl 명령을 위해 현실적인 바디가 필요합니다. 클래스를 붙여넣고 XML을 받아서 spec에 넣으세요.
레거시 시스템용 XML 설정
30개 필드짜리 설정 case class가, 아직 XML을 원하는 구식 플랫폼(Mule, WebLogic, IBM MQ, 사내 툴) 용으로 바로 편집할 수 있는 XML 템플릿이 됩니다.
코드와 일치하는 문서
README, ScalaDoc, Confluence 페이지용 XML 예제를 실제 case class에서 바로 뽑아낼 수 있어서, 문서가 모델에서 멀어지지 않습니다.
SOAP와 scala-xml용 테스트 데이터
단위 테스트에서 쓰는 값이 채워진 인스턴스를, 통합 테스트나 WireMock 스텁, 또는 여전히 SOAP을 쓰는 시스템용 XML 시드 파일로 바꿔주세요.
자주 묻는 질문
case class 여러 개를 한꺼번에 붙여넣어도 되나요?
네 — 파일 하나를 통째로 붙여넣으세요. 각 최상위 case class가 중첩 타입을 펼친 형태로 나오고, 컴패니언 오브젝트 헬퍼는 무시됩니다. Order 안에 List[OrderItem]이 있으면 둘 다 제대로 된 중첩 구조로 출력됩니다.
Option, None, 기본값은 어떻게 처리되나요?
Some("x")를 가진 Option[String]은 안에 텍스트가 들어간 보통 요소가 됩니다. None은 빈 요소가 되어서 XML의 모양이 일정하게 유지됩니다 — 소리 없이 사라지지 않습니다. case class 필드의 기본값은 인스턴스에 해당 필드가 빠져 있을 때 사용됩니다.
BigDecimal, Instant, UUID 같은 특이한 숫자 타입은요?
BigDecimal은 접미사를 떼고 순수 숫자 텍스트로 나옵니다. java.time.Instant, LocalDate, LocalDateTime은 ISO-8601 문자열이 되고, UUID는 표준 8-4-4-4-12 16진 형식을 유지합니다. 프리미티브 래퍼(Int, Long, Double, Boolean)는 일반 텍스트가 됩니다 — jackson-module-scala가 기본으로 내놓는 형태와 같습니다.
List, Seq, Set, Map은 전부 똑같이 동작하나요?
거의 그렇습니다. List[T], Seq[T], Vector[T], Set[T]는 모두 컨테이너 요소가 되고, 요소 타입 이름을 단 자식을 아이템마다 하나씩 가집니다 — 즉 Items: List[OrderItem]은 <Items><OrderItem/><OrderItem/></Items>가 됩니다. Map[K,V]는 <Entry><Key/><Value/></Entry>의 컨테이너가 됩니다.
제 코드가 저장되나요?
코드는 변환을 위해 백엔드로 전송되지만 저장되지 않습니다 — 페이로드를 로그로 남기지 않습니다. 정말 민감한 Scala라면 다른 온라인 도구와 마찬가지로 붙여넣기 전에 한 번 훑어봐 주세요.
암시적 변환, 타입 클래스, 매크로가 들어 있으면요?
암시적 변환이나 매크로로 생성된 코드는 그 자체로 XML 필드를 만들지 않습니다 — 선언된 case class 멤버를 기준으로 동작합니다. 따라서 implicit val format이나 @JsonCodec 애너테이션은 사실상 무시되고, 원래 필드 모양이 그대로 나옵니다. 코드에 문법 오류가 있다면, 눈에 띄는 것부터 먼저 고치세요.
같이 쓰면 좋은 도구
Scala to XML은 퍼즐의 한 조각입니다. 이 도구들과 잘 어울립니다: