0+ 스프링/0+ 스프링 MVC

[스프링 MVC] XML 데이터 파싱(RestTemplate)

힘들면힘을내는쿼카 2023. 5. 6. 02:07
728x90
반응형

[스프링 MVC] XML 데이터 파싱(RestTemplate)

 

요즘 대부분의 HTTP APIJSON 형식을 지원합니다.

하지만, 프로젝트를 진행하다보면 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가 동작하게 됩니다.

 

그림으로 설명하면 다음과 같습니다.

 

MappingJackson2XmlHttpMessageConverterObjectMapper를 상속 받은 XMLMapper라는 클래스를 통해서 매핑 작업을 하게 됩니다.

 

HttpMessageConverter의 구현체는 아래와 같습니다.

 

따라서 XML 데이터를 파싱하기 위해서 HttpMessageConverterXML을 처리해주는 컨버터를 등록하면 됩니다.!👍

 

 

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);
}

 

messageConvertersMappingJackson2XmlHttpMessageConverter가 들어있는 것을 알 수 있습니다.

 

MappingJackson2XmlHttpMessageConverter가 기본적으로 제공하는 content-type

1. application/xml; utf-8
2. text/xml; utf-8
3. application/*+xml; uff-8

 

 

 

 

 

728x90
반응형