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]
[XML]
[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 타입으로 리턴해야하는 것을 고민해 볼 수 있는 좋은 기회를 접할 수 있었습니다.
'Framework > SpringBoot' 카테고리의 다른 글
[SpringBoot] Java를 Kotlin으로 변환하기(Convert Java to Kotlin) (0) | 2019.09.26 |
---|---|
SpringBoot 프로젝트(2) - STS에서 GitHub로 프로젝트 올리기 (0) | 2018.12.02 |
SpringBoot 프로젝트(1) - SpringBoot, Spring Security, Gradle, MySQL을 이용한 프로젝트 생성 (2) | 2018.12.02 |