제육's 휘발성 코딩
article thumbnail
반응형

JAXB 란? 

JAXB(Java Architecture for XML Binding)는 자바 객체와 XML 문서 간의 매핑을 쉽게 처리하기 위한 자바 API입니다. 

JAXB는 XML 스키마를 기반으로 자동으로 자바 클래스를 생성하고, 자바 클래스와 XML 문서 간의 양방향 매핑을 지원합니다.

JAXB에서 제공하는 Marshaller와 UnMarshaller를 사용해서 HTTP POST 요청에 대한 XML 데이터를 자바 객체로 변환하고, 응답하는 예제를 만들어볼게요.

 

Marshaller과 UnMarshaller 

Marshaller는 자바 객체를 XML 문서로 변환, Unmarshaller는 XML 문서를 자바 객체로 변환해 줍니다.

 

먼저 XML 예제는 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<employee empid="1111">
    <address>
        <city>Noida</city>
        <locality>Sector-88</locality>
        <pin>201301</pin>
    </address>
    <address>
        <city>Kannauj</city>
        <locality>Kamala Nagar</locality>
        <pin>209724</pin>
    </address>
    <name>Dinesh Rajput</name>
    <salary>100000.0</salary>
</employee>
  • Root Element인 employee에 속성 값이 있고, 하위 Element에서 address는 리스트 형태로 갖춰져 있네요. 해당 XML에 맞춰 자바 객체를 만들어봅시다. 

 

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.List;
import javax.xml.bind.annotation.*;


@Getter
@Setter
@ToString
@XmlRootElement(name = "employee")
@XmlAccessorType(XmlAccessType.FIELD)
public class RequestVo {

    @XmlAttribute // 루트 엘리먼트 속성 값
    private int empid;

    @XmlElement(name = "address") // 하위 엘리먼트
    private List<Address> address;

    @XmlElement(name = "name")
    private String name;

    @XmlElement(name = "salary")
    private float salary;
}
  • 요청 XML에 대한 자바 객체를 RequestVo로 만들고, 각 엘리먼트에 맞게 name을 선언해 줍니다.

 

@Getter
@Setter
@ToString
@XmlRootElement(name = "address")
public class Address {
    private String locality;
    private String city;
    private int pin;
}
  • 하위 엘리먼트인 address도 객체로 만들어서 네이밍에 맞춰 선언해 줍니다.

 

@PostMapping("/jaxb")
@ResponseBody
public ResponseEntity<String> unmarshalling(@RequestBody byte[] requestXml) throws JAXBException {
    JAXBContext jaxbContext = JAXBContext.newInstance(RequestVo.class);

    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

    RequestVo requestVo = (RequestVo) jaxbUnmarshaller.unmarshal(new ByteArrayInputStream(requestXml));
    log.info("requestVo = {}",requestVo);

    Marshaller marshaller = jaxbContext.createMarshaller();
    StringWriter writer = new StringWriter();

    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    marshaller.marshal(requestVo, writer);

    String responseXml = writer.toString();

    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(MediaType.APPLICATION_XML);

    return new ResponseEntity<>(responseXml, httpHeaders, HttpStatus.OK);
}
  • HTTP POST 방식으로 XML 요청이 왔을 때 응답해 주기 위한 컨트롤러를 간략하게 만들었어요. 요청온 XML을 Unmarshaller를 통해 자바 객체로 변환한 후 로그를 한번 출력하고, Marshaller를 통해 다시 XML로 변환해서 응답해 주는 예제입니다.

 

requestVo = RequestVo(empid=1111, address=[Address(locality=Sector-88, city=Noida, pin=201301), Address(locality=Kamala Nagar, city=Kannauj, pin=209724)], name=Dinesh Rajput, salary=100000.0)
  • 로그를 확인해 보면 Unmarshaller가 정상 동작했네요. 

 

포스트맨 요청 결과

포스트맨으로 요청했을 때 요청한 XML을 정상 반환해 주는 걸 확인할 수 있어요. 

 

 

 

반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^