티스토리 뷰

spring

day4 class07 데이터 변환

일상다반ㅅㅏ 2019. 2. 17. 22:43

시스템이 복잡해지면서 다른 시스템과 정보를 주고받을 일이 발상해는데, 이때 데이터 교환 포맷으로 JSON(JavaScript Object Notation)을 사용할 수 있다.


1. JSON으로 변환하기

1-1. Jackson2 라이브러리 내려받기

- 아래의 코드를 추가하면 Maven Dependencies에 jackson-databind-2.7.3.jar / jackson-annotations-2.7.0.jar / jackson-core-2.7.3.jar 파일이 생성된다.

- 2.7.2로 하면 찾을수 없는 에러가 나와서 2.7.3으로 해보니 에러가 나오지 않았다.

1
2
3
4
5
6
7
8
<!-- pom.xml -->
 
<!-- Jackson2 -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.7.3</version>
</dependency>
cs


1-2. HttpMessageConvertor 등록

- 일반적으로 브라우저에서 서블릿이나 JSP 파일을 요청하면, 서버는 클라이언트가 요청한 서블릿이나 JSP를 찾아서 실행한다. 그리고 실행 결과를 Http 응답 프로토콜 메시지 body에 저장하여 브라우저에 전송한다. 그래서 브라우저는 항상 실행 결과 화면만 표시했던 것이다.

- 이 응답 결과를 HTML이 아닌 JSON이나 XML로 변환하여 메시지 바디에 저장하려면 스프링에서 제공하는 HttpMessageConverter 변환기를 사용하면 된다.

- MappingJackson2HttpMessageConverter를 사용하는데 xml 변환도 처리할 것이기 때문에 annotation-driven을 설정한다.

1
2
3
<!-- presentation-layer.xml -->
 
<mvc:annotation-driven></mvc:annotation-driven>
cs


1-3. 링크 추가 및 controller 수정

- 데이터 변환 결과를 확인할 링크를 추가한다.

1
2
3
<!-- index.jsp -->
 
<a href="dataTransform.do">글 목록 변환 처리</a><br>
cs


- @ResponseBody는 자바 객체를 Http 응답 프로토콜의 몸체로 변환해준다.

- 스프링 컨테이너가 MappingJackson2HttpMessageConverter 변환기를 생성하도록 스프링 설정 파일에 <mvc:annotation-driven>을 추가했다.

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


- 검색 조건, 키워드, 파일 업로드 정보는 불필요하기 때문에 데이터 변환에서 제외 시킨다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// BoardVO.java
 
public class BoardVO {
 
    // ~~~
    
    @JsonIgnore
    public String getSearchCondition() {
        return searchCondition;
    }
    public void setSearchCondition(String searchCondition) {
        this.searchCondition = searchCondition;
    }
    @JsonIgnore
    public String getSearchKeyword() {
        return searchKeyword;
    }
    public void setSearchKeyword(String searchKeyword) {
        this.searchKeyword = searchKeyword;
    }
    @JsonIgnore
    public MultipartFile getUploadFile() {
        return uploadFile;
    }
    public void setUploadFile(MultipartFile uploadFile) {
        this.uploadFile = uploadFile;
    }
}
 
cs




2, xml로 변환하기

2-1. JAXB2 설정 추가

- JAXB2 API는 자바 6 이후 기본으로 포함되어 있어 별도의 라이브러리 추가는 필요 없다.

- @XmlAccessorType은 객체를 xml로 변환할수 있다는 의미이고 XmlAccessType.FIELD는 이 객체가 가진 필드(번수)들은 자동으로 자식 엘리먼트로 표현한다. 

- @XmlAttribute가 seq에만 붙은 것은 이를 속성으로 표현한다는 것이다. (<boardList seq="2">)

- @XmlTransient는 이를 데이터 변환에서 제외시키는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// BoardVO.java
 
@XmlAccessorType(XmlAccessType.FIELD)
public class BoardVO {
 
    @XmlAttribute
    private int seq;
    private String title;
    private String writer;
    private String content;
    private Date regDate;
    private int cnt;
    @XmlTransient
    private String searchCondition;
    @XmlTransient
    private String searchKeyword;
    @XmlTransient
    private MultipartFile uploadFile;
    
    // ~~~
    
    @JsonIgnore
    public String getSearchCondition() {
        return searchCondition;
    }
    public void setSearchCondition(String searchCondition) {
        this.searchCondition = searchCondition;
    }
    @JsonIgnore
    public String getSearchKeyword() {
        return searchKeyword;
    }
    public void setSearchKeyword(String searchKeyword) {
        this.searchKeyword = searchKeyword;
    }
    @JsonIgnore
    public MultipartFile getUploadFile() {
        return uploadFile;
    }
    public void setUploadFile(MultipartFile uploadFile) {
        this.uploadFile = uploadFile;
    }
}
 
cs


- xml 문서는 반드시 단 하나의 루트 엘리먼트를 가져야 한다. BoardVO 객체를 포함할 자바 클래스를 생성한다.

- @XmlRootElement는 루트 엘리먼트의 이름을 지정하고

- @XmlElement는 자식 엘리먼트의 이름을 지정하는데 이를 생략하면 루트 엘리먼트의 이름을 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// BoardListVO.java
 
@XmlRootElement(name = "boardList")
@XmlAccessorType(XmlAccessType.FIELD)
public class BoardListVO {
 
    @XmlElement(name = "board")
    private List<BoardVO> boardList;
    
    public List<BoardVO> getBoardList() {
        return boardList;
    }
 
    public void setBoardList(List<BoardVO> boardList) {
        this.boardList = boardList;
    }
}
 
 
cs


- BoardListVO 클래스의 형식에 맞춰준다.

1
2
3
4
5
6
7
8
9
10
11
12
// BoardController.java
 
@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