[스프링 MVC] XML 데이터 파싱(RestTemplate)
요즘 대부분의 HTTP API
는 JSON
형식을 지원합니다.
하지만, 프로젝트를 진행하다보면 XML
형식의 데이터를 파싱해야하는 경우가 생깁니다. 😭
XML
데이터를 파싱하는 방법에 대해서 소개하겠습니다.
MessageConverter
먼저 MessageConverter
에 대해서 알아야 합니다.^^
HTTP API
처럼 (JSON
, XML
등등…)데이터를 HTTP 메시지 body
에서
직접 읽거나 사용하는 경우HTTP 메시지 컨버터
가 기능을 제공하여 편리합니다.^^
MessageConverter가 뭘까요? 🤔
스프링 MVC
내부에서 HTTP 메시지 바디
를 읽어 문자나 객체로 변환해서 전달해줍니다.
이때, HttpMessageConverter
라는 기능을 사용하게 됩니다.
@RestController
public class MyController {
@GetMapping("/hello")
public String hello(@RequestBody HelloDto dto) {
return "ok";
}
}
위 코드에서 보면 @RequestBody
부분이 보일것 입니다.
이렇게 하면 viewResolver
대신에 HttpMessageConverter
가 동작하게 됩니다.
그림으로 설명하면 다음과 같습니다.
MappingJackson2XmlHttpMessageConverter
은 ObjectMapper
를 상속 받은 XMLMapper
라는 클래스를 통해서 매핑 작업을 하게 됩니다.
HttpMessageConverter
의 구현체는 아래와 같습니다.
따라서 XML
데이터를 파싱하기 위해서 HttpMessageConverter
에 XML
을 처리해주는 컨버터를 등록하면 됩니다.!👍
XML 파싱 예제
jackson-dataformat-xml 의존성 추가
// https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml'
XML 데이터 예시
<?xml version="1.0" encoding="utf-8"?>
<document>
<root>
<name>싱싱이</name>
<age>27</age>
</root>
</document>
HelloDto
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
@Data
@JacksonXmlRootElement(localName = "document")
public class HelloDto {
@JacksonXmlProperty(localName = "root")
private HelloDtoRoot root;
}
HelloDtoRoot
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
@Data
@JacksonXmlRootElement(localName = "root")
public class HelloDtoRoot {
private String name;
private int age;
}
RestTemplate Bean으로 등록
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
RestTemplate restTemplate = restTemplateBuilder
.setConnectTimeout(Duration.ofMillis(2000)) // 연결 타임아웃
.setReadTimeout(Duration.ofMillis(2000)) // 데이터 수신 타임아웃
.build();
return restTemplate;
}
}
XML 파싱uri
는 요청하고자 하는 서버의 주소 입니다.
public void parsingXMLAndMappingDto() {
HelloDto helloDto = restTemplate.getForObject(uri, HelloDto.class);
}
messageConverters
에 MappingJackson2XmlHttpMessageConverter
가 들어있는 것을 알 수 있습니다.
MappingJackson2XmlHttpMessageConverter
가 기본적으로 제공하는 content-type
1. application/xml; utf-8
2. text/xml; utf-8
3. application/*+xml; uff-8
'0+ 스프링 > 0+ 스프링 MVC' 카테고리의 다른 글
[스프링 MVC] 어떻게 컨트롤러는 다양한 종류의 파라미터를 받아서 처리할 수 있을까? 🤔 (0) | 2023.05.27 |
---|---|
[스프링 MVC] 서블릿 필터가 있는데 인터셉터는 왜 나온거지? (0) | 2023.05.26 |
[스프링 MVC] 서블릿 필터 예외처리 방법 (0) | 2023.05.26 |
[스프링 MVC] 서블릿 필터를 어떻게 스프링 빈으로 관리할 수 있을까? (0) | 2023.05.25 |
[스프링 MVC] Java에서 서블릿이 등장한 이유(Feat. 서블릿 기초 개념) (0) | 2023.03.28 |