본문 바로가기
Programming/Spring

데이터 변환

by TinKerBellBass 2017. 8. 20.
728x90
반응형

참고도서

스프링 퀵 스타트
국내도서
저자 : 채규태
출판 : 루비페이퍼 2016.06.30
상세보기



1. JSON(JavaScript Object Notation)으로 변환

(1) VO 객체에 저장된 데이터를 JSON으로 변환한 형태

변수와 변수에 저장된 값을 키:값 형태로 변환

1
2
3
4
5
6
7
{
"seq":1,
"title":"가입인사",
"content":"잘 부탁드립니다.",
"regDate":2016-03-19,
"cnt":0
}
cs



JSON 배열 형태


1
2
3
4
[
{"seq":2"title":"임시제목""content":"임시 내용""regDate":2016-03-19"cnt":0},
{"seq":1"title":"가입인사""content":"잘 부탁드립니다.""regDate":2016-03-19"cnt":0},
]
cs



(2) Jackson2 라이브러리 


Maven Repository 에서 jackson databind 를 검색해서 pom.xml 에 등록

jackson-databind, jackson-annotation, jackson-core 라이브러리가 다운로드 됨



(3) HttpMessageConverter Interface


브라우저에서 서블릿이나 JSP 파일을 요청하면, 서버는 클라이언트가 요청한 서블릿이나 JSP를 찾아서 실행한다. 

그리고, 실행 결과를 Http 응답 프로토콜 메시지 보디(message body) 에 저장해서 브라우저에 전송한다.

이 응답 결과를 HTML이 아닌 JSON 이나 XML 로 변환하여 메시지 보디에 저장하려면,

스프링에서 제공하는 HttpMessageConverter 인터페이스를 구현한 변환기(Converter)를 사용해야 한다.

HttpMessageConverter 인터페이스를 구현한 많은 클래스 중 JSON 으로 변환해 주는 클래스는

MappingJackson2HttpMessageConverter 이다.


View 와 관련된 사항이기 때문에 Presentation Layer 의 스프링 컨테이너 설정 파일에 등록해서 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- presentation-layer.xml 에 등록 -->
<!-- namespace에 mvc 등록 -->
 
<!-- mappingJackson2HttpMessageConverter 등록 --> 
<!-- <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> -->
<!-- HttpMessageConver를 구현한 모든 변환기가 생성된다. -->
<mvc:annotation-driven/>
 
<!--
mvc:annotation-driven 이 생성하는 스프링 객체들
DefaultAnnotationHandlerMapping
AnnotationMethodHandlerAdapter
ConfigurableWebBindingInitializer
HttpMessageConver를 구현한 모든 변환기(메시지 컨버터) 등
-->
cs



(4) Controller 등록


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//dataTransform.do 요청
@RequestMapping("/dataTransform.do")
@ResponseBody
public BoardListVO dataTransform(BoardVO vo) {
    vo.setSearchCondition("TITLE");
    vo.setSearchKeyword("");
    List<BoardVO> boardList = boardService.getBoardList(vo);
    BoardListVO boardListVO = new BoardListVO();
    boardListVO.setBoardList(boardList);
    return boardListVO;
}
 
/* 
@ResponseBody 가 붙은 메소드의 반환 값은 자바 객체를 HTTP 응답 프로토콜의 몸체로 변환된다.
<mvc:annotation-driven> 을 추가했기 때문에 MappingJackson2HttpMessageConverter 에 의해
JSON 형태로 변환되어 HTTP 보디에 설정된다.
Jackson2 라이브러리를 받았기 때문에 스프링은 많은 컨버터 빈 객체 중 
MappingJackson2HttpMessageConverter 빈 객체를 를 사용한다.
ROME 라이브러리 -> AtomFeedHttpMessageConverter
JAXB2 라이브러리 -> Jaxb2RootElementHttpMessageConverter
*/
cs



HTTP 보디에 설정되는 VO 객체의 데이터 중 JSON 변환에서 제외하려면,

@JasonIgnore 어노테이션을 사용하면 된다.


1
2
3
4
5
6
7
8
public class BoardVO{
 
    // @JsonIgnore 어노테이션은 JSON 변환을 원하지 않는 데이터(필드)의 getter에 설
    @JsonIgnore
    public String getSearchCondition(){
        return searchCondition;
    }
}
cs

 

2. XML로 변환

(1) JAXB2 설정

JAXB2 API에서 제공하는 어노테이션을 사용하려면 
pom.xml 파일에 JAXB2 를 설정하고 presentation-layer.xml 스프링 컨테이너 설정파일에 클래스를 등록해야 하지만,
자바 6 버전 이후 버전에 기본(javax.xml.bind.annotation 패키지)으로 포함되어 있으므로 어떠한 설정도 필요가 없게 되었다.

(2) BoardVO 에 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// XML 변환 처리
// XmlAccessType.FIELD -> 필드가 자동으로 자식 엘리먼트로 표현됨
@XmlAccessorType(XmlAccessType.FIELD)
public class BoardVO {
    
    // @XmlAttribute, seq를 속성으로 표시 -> <BoardVO seq="값">
    @XmlAttribute    
    private int seq;
    private String title;
    private String writer;
    private String content;
    // 자바객체를 XML로 변환하려면 클래스에 기본 생성자가 있어야 하는데,
    // java.sql.Data 는 기본 생성자가 없기 때문에
    // java.util.Date 타입으로 설정해야 한다.    
    private Date regDate = new Date();
    private int cnt;
    // @XmlTransient, XML 변환에서 제외
    @XmlTransient    
    private String searchCondition;
    @XmlTransient    
    private String searchKeyword;
    @XmlTransient    
    private MultipartFile uploadFile;
cs


(3) BoardListVO 추가


XML 문서는 반드시 단 하나의 루트 엘리먼트를 가져야 한다. BoardVO는 하나의 게시글 정보를 저장하려고 사용하는 객체이다.

여러 게시글 목록을 XML 로 표현해야 하기 때문에, BoardVO 객체(자식 엘리먼트) 여러 개를 포함하면서 루트 엘리먼트로 사용할

또 다른 자바 클래스가 필요하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// @XmlRootElement(name = "boardList") -> 루트 엘리먼트 이름을 boardList 로 설정
@XmlRootElement(name = "boardList")
@XmlAccessorType(XmlAccessType.FIELD)
public class BoardListVO {
 
    // 필드명인 boardList 가 엘리먼트 이름으로 사용된다
    // 엘리먼트 이름을 board 로 
    @XmlElement(name = "board")
    private List<BoardVO> boardList;
 
    public List<BoardVO> getBoardList() {
        return boardList;
    }
 
    public void setBoardList(List<BoardVO> boardList) {
        this.boardList = boardList;
    }
}
cs



(4) Controller 등록


1
2
3
4
5
6
7
8
9
10
11
//dataTransform.do 요청
@RequestMapping("/dataTransform.do")
@ResponseBody
public BoardListVO dataTransform(BoardVO vo) {
    vo.setSearchCondition("TITLE");
    vo.setSearchKeyword("");
    List<BoardVO> boardList = boardService.getBoardList(vo);
    BoardListVO boardListVO = new BoardListVO();
    boardListVO.setBoardList(boardList);
    return boardListVO;
}
cs


728x90
반응형

'Programming > Spring' 카테고리의 다른 글

Spring JdbcTemplate Transaction  (0) 2017.08.22
Spring JdbcTemplate Method  (0) 2017.08.22
다국어 처리  (0) 2017.08.20
파일 업로드 / 예외처리  (0) 2017.08.20
AOP 기초  (0) 2017.08.19

댓글