Programing/Spring

JAVA Class -> JSON, XML 변환 출력 jaxb marshalling 마샬링 작스비

리커니 2017. 10. 26. 11:59
반응형

 

전자정부 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 javax.annotation.Resource;

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

 

반응형