티스토리 뷰
시스템이 복잡해지면서 다른 시스템과 정보를 주고받을 일이 발상해는데, 이때 데이터 교환 포맷으로 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 |
'spring' 카테고리의 다른 글
day5 class02 Mapper XML 파일 설정 (0) | 2019.02.22 |
---|---|
day5 class05 Mybatis 프레임워크 시작하기 (0) | 2019.02.21 |
day4 class07 다국어 처리 (0) | 2019.02.16 |
day4 class05 파일 업로드 및 예외 처리 (0) | 2019.02.12 |
day4 class04 검색 기능 추가 구현 (0) | 2019.02.11 |
- Total
- Today
- Yesterday
- postHandler
- #java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent삭제
- 스프링 컨테이너
- 어노테이션
- NoClassDefFoundError
- blocking
- exclude-mapping
- 의존성 주입
- XmlWebApplicationContext
- @Autowired
- servlet context
- 의존성
- SqlSessionFactoryBean
- 검색
- Controller
- application context
- aspect oriented programming
- afterCompletion
- preHandler
- java.lang.NoClassDefFoundError: org/slf4j/event/LoggingEvent
- 횡단 관심
- ViewResolver
- setter 인젝션
- handlermapping
- JoinPoint
- aop
- LoggingEvent
- Class path contains multiple SLF4J bindings
- 컨트롤러
- multiple SLF4J bindings
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |