JAVA Class -> JSON, XML 변환 출력 jaxb marshalling 마샬링 작스비
전자정부 OpenAPI JAVA Class -> JSON XML 변환 출력 jaxb marshalling 마샬링 작스비
이번 포스팅에서는
전자정부프레임워크와 Spring-oxm, jaxb, marshalling 을 활용해
VO Class를 json과 xml로 변환해 출력하는 방법을 알아보도록 하겠습니다.
[Spec]
전자정부프레임워크 3.6
JAVA 8
Tomcat 7
1. pom.xml 에 spring-oxm 추가.
jaxb를 사용하기 위해선 spring-oxm을 dependency에 추가해 주어야 합니다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
위의 dependency 태그를 <dependencies> 태그 안에 넣어주세요.
여기서 주의 해야 할 점은 version이 spring version과 맞아야 합니다.
맞지않으면 전자정부 EgovImgPaginationRenderer 부분에서 에러가 날 수 있습니다.
2. dispatcher-servlet.xml 수정
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>egovframework.geon.citsts.api.dto.login.LoginVO</value>
<value>egovframework.geon.citsts.api.dto.login.LoginReturnData</value>
</list>
</property>
</bean>
<bean id="xmlView" class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg ref="jaxb2Marshaller"></constructor-arg>
</bean>
<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
</bean>
위 소스와 같이 3개의 bean 을 추가 합니다.
xmlView는 vo -> xml 변환에 필요한 view 입니다.
constructor-arg로 위의 jaxb2Marshaller로 연결이 되고 여기에서는 xml로 변환할 class를 매핑해줘야합니다.
jsonView는 vo -> json 변환에 필요한 view 입니다.
이제 vo class를 json과 xml 로 변환할 준비는 다 되었습니다.
3. web.xml 수정
.xml 과 .json 으로 출력 데이터의 타입을 구분 할 것이기때문에
해당 요청이 들어왔을때 서블릿이 반응할 수 있도록 매핑을 합니다.
그냥 추가만 해주시면 됩니다.
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.json</url-pattern>
</servlet-mapping>
4. Controller 구현
bean등록으로 jsonView와 xmlView가 메모리에 등록되었습니다.
Controller내에 @Resource 어노테이션을 사용해서 사용이 가능합니다.
Controller 상단에 두개의 뷰를 등록합니다.
import org.springframework.web.servlet.View;
@Controller
@RequestMapping(value="/api")
public class LoginController {
@Resource(name="jsonView")
private View jsonView;
@Resource(name="xmlView")
private View xmlView;
(중략..)
@RequestMapping(value="login.{dataType}", method=RequestMethod.GET, produces="text/plain;charset=UTF-8")
@ResponseBody
public ModelAndView loginCheck(@PathVariable("dataType") String dataType, HttpServletRequest request){
LoginReturnData result = new LoginReturnData();
ModelAndView mav = new ModelAndView();
String loginType = request.getParameter("LOGIN_TYPE");
String loginUid = request.getParameter("LOGIN_UID");
SearchVO params = new SearchVO();
params.setUserId(loginType+loginUid);
LoginVO data = null;
try {
data = loginService.getLoginInfo(params);
result.setId(loginUid);
result.setResult(data);
result.setErrMsg("Success");
result.setErrCd("0");
result.setTrId("soGr_V1_USE_001_MTUwNTc3OTc3Mjg3MQ==exampleexampleexample");
if (dataType.equals("json")){
mav.setView(jsonView);
}else if(dataType.equals("xml")){
mav.setView(xmlView);
}
mav.addObject("returnData", result);
} catch (Exception e) {
e.printStackTrace();
}
return mav;
}
소스를 위해서 부터 보시면 {dataType} 으로 xml과 json을 받기 위해 PathVariable을 사용했습니다.
그리고 출력을 위해 ModelAndView를 리턴합니다.
dataType에 따라서 ModelAndView의 View를 set하는 if문만 잘 보시면 될 것 같네요.
출력을 원하는 데이터는 받아와서 ModelAndView에 addObject 해주시면 됩니다.
위에서 사용된 2개의 vo는 아래와 같습니다.
5. VO class 구현
(사실 컨트롤러보다 이게 먼저하는게.......)
[LoginReturnData.class]
@XmlRootElement(name="returnData")
@XmlAccessorType(XmlAccessType.FIELD)
public class LoginReturnData {
@XmlElement(name="id")
@JsonProperty("id")
private String id;
@XmlElement(name="result")
@JsonProperty("result")
private LoginVO result;
@XmlElement(name="errMsg")
@JsonProperty("errMsg")
private String errMsg;
@XmlElement(name="errCd")
@JsonProperty("errCd")
private String errCd;
@XmlElement(name="trId")
@JsonProperty("trId")
private String trId;
(get, set 은 중략)
[LoginVO.class]
@XmlRootElement(name="result")
@XmlAccessorType(XmlAccessType.FIELD)
public class LoginVO {
@XmlElement(name="USER_YN")
@JsonProperty("USER_YN")
private String userYn;
@XmlElement(name="RESEARCH_YN")
@JsonProperty("RESEARCH_YN")
private String researchYn;
@XmlElement(name="USER_ID")
@JsonProperty("USER_ID")
private String userId;
@XmlElement(name="USER_NAME")
@JsonProperty("USER_NAME")
private String userName;
@XmlElement(name="DRIVER_CAR_NO")
@JsonProperty("DRIVER_CAR_NO")
private String driverCarNo;
@XmlElement(name="DRIVER_CAR_TYPE")
@JsonProperty("DRIVER_CAR_TYPE")
private String driverCarType;
(get, set 은 중략)
(VO에서 @JsonProperty("name") 의 name과 명칭이 같으면 중복표출될 수 있으니 주의하세요.)
[출력화면 예시 json]
http://localhost:8080/TestAPI/api/login.json?LOGIN_TYPE=k&LOGIN_UID=kun137
[출력화면 예시 xml]
http://localhost:8080/TestAPI/api/login.xml?LOGIN_TYPE=k&LOGIN_UID=kun137
참고)
xml 태그내에 속성값을 추가 할 때는 @XmlAttribute 어노테이션을 사용합니다.
예를 들어 result 내 version을 추가하고 싶다면
VO객체 내에 아래와 같이 추가하신 후 데이터를 set 하시면 됩니다.
@XmlAttribute
private String version;
이렇게 되면 <result version="1.0"> 이런식으로 출력이 가능하게 됩니다.
잘 출력되네요^^;
이처럼 몇개의 설정만으로도 xml, json 출력이 가능합니다.
json 파일을 읽는 방법은 아래의 Link를 참조하세요.
Link : json 파일 읽기 $.getJSON