프로필사진
RESTful(3) - JAXB2 API이용해서 XML처리하기

2019. 11. 25. 11:22🔴 Spring

300x250

JAXB2 API이용해서 XML처리

: 자바객체 & XML 사이의 변환처리를 해주는 API

XML → @XmlRootElement 객체 또는 @XmlType 객체로 읽기

@XmlRootElement 적용 객체 → XML로 쓰기

@XmlAccessorType : Java Bean이나 field를 serialized한다 = 자바객체 → xml으로 설정

@XmlAccessorType(XmlAccessType.FIELD) → 클래스 앞에 사용하면 xml으로 만들 범위 지정함

= 필드는 모두 추출한다!


<주요 JAXB Annotation>

@XmlAccessorType : XML 데이터를 어떤 방법으로 맵핑할지를 선언해줄 수 있는 annotaion으로 NONE을 사용할 시 XmlElement로 annotate된 객체만 맵핑시킵니다.

@XmlRootElement : Class에 사용하는 annotation으로 해당 클래스가 XML 특정 노드의 루트라는 것을 뜻합니다. name을 사용하여 root를 명시할 수 있습니다.

@XmlElement : 변수에 사용하는 annotaion으로 해당 변수가 XML의 노드임을 뜻 합니다. XmlRootElement로 선언된 영역에서 해당 변수 이름과 맵핑하려는 XML 데이터 노드 이름이 같다면 굳이 명시해주지 않아도 됩니다.

@XmlElementWrapper : 해당 변수가 특정 노드들을 감싸고 있는 Wrapper란 것을 명시해주는 annotaion 입니다.

출처 : https://skibis.tistory.com/338


예제

<GuestMessage.java>

package com.bitcamp.mvc.domain;

import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="",propOrder = {"id","message","createTime"}) -> xml 읽기
// propOrder : 삽입하는 순서 지켜야함!!
public class GuestMessage {
	
	private Integer id;
	private String message;
	private Date createTime;
	

	public GuestMessage(Integer id, String message, Date createTime) {
		this.id = id;
		this.message = message;
		this.createTime = createTime;
	}

	public GuestMessage() {
		
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
}

<GuestMessageList.java>

package com.bitcamp.mvc.domain;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "message-list") -> XML으로 씀
<message-list> ... </message-list> 생성됨
public class GuestMessageList {
	
	@XmlElement(name = "message")
	private List<GuestMessage> messages; -> 반환타입 지정해줌 (GuestMessage)
	<message-list> <message> ... </message> </message-list>

// 생성자
	public GuestMessageList() {
	}

	public GuestMessageList(List<GuestMessage> messages) {
		this.messages = messages;
	}

// Getter
	public List<GuestMessage> getMessages() {
		return messages;
	}
	
}

<GuestListController.java>

package com.bitcamp.mvc;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.bitcamp.mvc.domain.GuestMessage;
import com.bitcamp.mvc.domain.GuestMessageList;

@Controller
public class GuestListController {
	
	@RequestMapping("/guest/xmlList.xml")
	@ResponseBody
	public GuestMessageList xmlList() {
		
		return getmessageList(); -> GuestMessageList로 응답
	}

	private GuestMessageList getmessageList() { -> 정보 넣어주기
		
		List<GuestMessage> message = new ArrayList<GuestMessage>();
		message.add(new GuestMessage(1, "안녕하세요", new Date()));
		message.add(new GuestMessage(2, "반갑습니다", new Date()));
		message.add(new GuestMessage(3, "또만나요", new Date()));
		
		return new GuestMessageList(message);
	}
	
}

결과창:

Content-Type: text/html;charset=UTF-8 → Content-Type: application/json;charset=UTF-8

300x250