본문 바로가기
Framework/SpringBoot

[SpringBoot] REST API Return XML Response

by 댓츠굿 2019. 5. 11.

 

SpringBoot에서 @RestController는 return하는 value를 알아서 JSON으로 변형해서 내려주지만, XML은 기본적으로 내려주지 않습니다. 간혹 XML로 리턴받길 원하는 팀이 있어 이참에 정리를 하고자 블로그 글을 쓰게 되었습니다.

 

설정 - Jackson XML을 project에 추가

XML 형태로 리턴하고자 할 때, 다음과 같이 Maven 이나 Gradle에서 설정 할 수 있습니다.

 

[Maven]

<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>

[Gradle]

compile "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.0"

 

설정과 함께 추가 작업을 해야됩니다. 추가 작업은 아래 링크를 참조하시면 됩니다.

설정 및 추가 작업을 하였고 XML로 리턴하는 것을 확인하였습니다.

 

그러나.. API를 제공하는 모든 곳이 XML로 리턴하는 문제가 생겼습니다. 그래서 설정파일에서 Jackson XML 제거 후, 아래와 같은 방식으로 기존 다른 메소드들은 JSON으로 리턴하고, 한 메소드에서만 XML로 리턴할 수 있도록 처리 하였습니다.

 

아래 예제는 고객의 주소 목록(List)을 가져오는 예제입니다. 여기서 눈여겨 볼 것은 리턴타입이 List라는 것입니다. [JSON]은 기존 JSON을 리턴했던 소스이고, [XML]은 XML로 리턴하도록 수정한 소스입니다.

cf.) 본 예제에서는 XML return을 간단히 예시하고자 익셉션 처리를 생략하였습니다.

 

 

 

ㆍController

[JSON]

[XML]

 

[JSON] 코드에서는 리턴타입이 List<AddressVO>이지만,

[XML] 코드에서는 리턴타입이 AddressVO인 것을 알 수 있습니다. 그 이유는 아래 'DTO in Controller Layer' 부분을 보며 얘기해보겠습니다.

 

 

 

ㆍDTO in Controller Layer 

[JSON]

AddressVO

 

[XML]

AddressVO

 

[JSON]에서 AddressVO 클래스의 property인 zipCode, roadAddress를 각각 선언하였다면,

[XML]에서는 AddressVO 클래스에 @XmlRootElement, @XmlAccessorType, @XmlElement 어노테이션을 선언해주었고,

property의 타입이 List<Address>로 바뀐 것을 볼 수 있습니다.

 

위 Controller를 보면, [JSON]의 리턴타입은 List<AddressVO>이고, DTO인 AddressVO에서는 각각의 property(우편번호, 도로명주소)선언하였습니다.

 

반면, 위 Controller에서 [XML]은 리턴타입이 AddressVO이고, DTO인 AddressVO의 property는 List<AddressVO>입니다. 즉 JSON과 반대입니다.

고객의 주소 목록(List)을 가져와야 하기 때문에 리턴타입이 List여야 하는데, [XML]에서는 그 역할을 DTO인 AddressVO가 하고 있습니다.

cf.) Swagger를 사용하기 때문에, @ApiModelProperty 어노테이션을 사용하였습니다.

 

 

 

ㆍService

고객의 주소 목록(List)을 가져오는 서비스입니다.

 

 

 

ㆍDTO

[JSON]

[XML]

[XML] 리턴 방식에서는 @Builder, @NoArgsConstructor, @AllArgsConstructor 를 추가해주어야 합니다. 그렇지 않으면 Constructor를 찾을 수 없다는 에러가 납니다.

 

 

 

한 메소드에서만 XML로 리턴을, 그것도 List 타입으로 리턴해야하는 것을 고민해 볼 수 있는 좋은 기회를 접할 수 있었습니다.

 

 

 

 

 

반응형