기존 axis1.x대에서 spring boot cfx 로 마이그레이션 할때 주의점
Posted by Albert 20Day 16Hour 29Min 32Sec ago [2026-02-17]
SOAP 방식은 WSDL이라는 명세서가 일치해야 합니다. CXF로 바꿨을 때 타 시스템(클라이언트)이 아무런 수정 없이 통신하려면 다음 3가지 요소가 기존 Axis 때와 완벽히 동일해야 합니다.
1. WSDL의 네임스페이스(Namespace)와 서비스명
타 시스템은 특정 주소(targetNamespace)와 서비스 이름을 보고 데이터를 해석합니다.
- 위험 요소: CXF는 기본적으로 자바 패키지 명을 기반으로 네임스페이스를 자동 생성합니다 (예: package com.example -> http://example.com/).
- 해결책: @WebService 어노테이션에서 기존 Axis의 WSDL에 적혀있던 targetNamespace와 serviceName을 똑같이 강제 지정해야 합니다.
- Java
@WebService( targetNamespace = "http://old-axis-namespace.com", serviceName = "OldAxisService" )
2. SOAP 메시지 스타일 (RPC vs Document)
Axis 1.x는 예전 방식인 RPC/Encoded 스타일을 많이 썼고, CXF는 현대 표준인 Document/Literal 방식을 기본으로 합니다. 이 스타일이 다르면 타 시스템에서 "데이터 형식이 맞지 않는다"는 에러가 발생합니다.
- 확인 방법: 기존 WSDL 파일 상단에 style="rpc"인지 style="document"인지 확인하세요.
- 해결책: 기존 스타일이 RPC였다면 CXF에서도 어노테이션으로 맞춰줘야 합니다.
- Java
@SOAPBinding(style = SOAPBinding.Style.RPC) // 기존이 RPC였다면 필수!
3. XML 요소 이름과 순서 (JAXB 어노테이션)
Axis는 자바 변수명을 그대로 XML 태그로 만들지만, CXF(JAXB)는 가끔 대소문자나 언더바 처리가 미묘하게 다를 수 있습니다. 특히 List 처리가 item이라는 태그로 감싸지느냐 아니냐의 차이가 발생할 수 있습니다.
- 해결책: 응답용 DTO 클래스에서 @XmlElement를 사용하여 XML 태그 이름을 기존 Axis가 내보내던 이름과 정확히 일치시켜야 합니다.
- Java
@XmlElement(name = "USER_NAME") // 기존 Axis 응답 태그가 대문자였다면 똑같이! private String userName;
주의해야 할 점 (현실적인 문제)
"데이터 값은 정상인데 타입이 달라서 발생하는 문제" 기존에 Axis에서 xsd:anyType으로 대충 던지던 값을 CXF에서 명확한 List<String>으로 정의하면, 타 시스템의 Stub(클라이언트 소스코드)이 이 변화를 감지하지 못하고 파싱 에러를 낼 수 있습니다.
결론적으로 타 시스템의 수정을 막으려면:
- 기존 Axis가 생성했던 WSDL 파일 내용을 옆에 띄워두고,
- CXF가 생성한 새로운 WSDL을 비교하며 네임스페이스, 메서드명, 파라미터명이 글자 하나 안 틀리고 똑같은지 대조하는 과정이 반드시 필요합니다.
추천 전략
기존 시스템을 건드릴 수 없는 상황이라면, "WSDL-to-Java" 방식을 쓰세요. 새로 코딩하지 말고, 기존 Axis의 WSDL 파일을 CXF 툴에 넣어서 서버 소스 코드를 생성(Reverse Engineering) 시키는 겁니다. 그러면 CXF가 기존 WSDL 구조에 맞는 어노테이션을 자동으로 다 달아주기 때문에 타 시스템과의 호환성을 99% 유지할 수 있습니다.
기존 Axis의 WSDL 파일을 지금 가지고 계신가요? 그렇다면 그 파일을 기반으로 CXF 코드를 생성하는 것이 가장 안전한 시작입니다.