- Outsider's Dev Story
- 흔한 개발자의 개발 노트
- 내 아이큐 80, 너도 80, 둘이 합쳐 160 - 내…
- 조대협의 블로그
- 자바캔(Java Can Do IT) / 최범균 님
- Sangon, Han – 개발자; 읽고 생각하고 쓰고 …
- The Evolution of the Web
- NAVER D2
- Dashboard - SLiPP
- ITWorld Korea - 테크놀로지 리더를 위한 글…
- OKKY - All That Developer
- 웹Frameworks
- 오픈튜토리얼스
- 위키독스 / 온라인 책 제작 공유 플랫폼 서비스
- 블로터
- IT OnAir
- 한 처음에 / 백창92
- Divide my knowledge / 완프최
- SERI.org
Bigfat
[Spring] Jackson 라이브러리를 사용해 댓글 쓰기 구현하기 (게시판 구현) 본문
JSON 라이브러리 Jackson을 사용해 댓글 쓰기를 구현해보자
Jackson 라이브러리는 자바 표준 JSON 라이브러리로 JSON 뿐만 아니라 XML/YAML/CSV 등 다양한 형식의 데이터를 지원하는 data-processing(데이터 처리) 툴이다. 스트림 방식(works on core streaming API)이므로 속도가 빠르고 유연하며(참고1), POJO(Plain Old Java Object) 기반의 자바 객체들을 JSON으로 변환할 수 있다(참고2).
pom.xml에 아래와 같이 jackson-databind 의존성을 추가해준다.
1 2 3 4 5 6 7 | <!-- Jackson-Databind --> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.8.8.1</version> </dependency> | cs |
1. @ResponseBody 애노테이션을 이용한 JSON 변환
CommentController 클래스의 메서드에 @ResponseBody 어노테이션을 붙여준다. 메서드 선언부 앞에 작성할 수도 있고, 메서드의 타입 앞에 작성해줘도 된다. 기존의 코드에서 메서드 하나를 포함해 무려 20줄 가까이 사라져 깔끔해졌다.
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 | package com.edu.comment.controller; import java.util.HashMap; import java.util.List; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.edu.comment.dto.CommentDto; import com.edu.comment.service.CommentService; @Controller public class CommentController { @Autowired private CommentService commentService; @RequestMapping("/commentWrite.comment") @ResponseBody public HashMap<String, Object> writeAndReadComments(HttpSession session, CommentDto comment) { comment.setId(session.getAttribute("id").toString()); return commentService.writeAndReadComments(comment); } @RequestMapping("/commentRead.comment") public @ResponseBody List<CommentDto> readComments(int articleNumber, int commPageNum) { return commentService.readComments(articleNumber, commPageNum); } } | cs |
메서드에 @ResponseBody 어노테이션이 되어있다면 메서드에서 리턴되는 값은 View를 통해서 출력되지 않고 HTTP Response Body에 직접 쓰여지게 된다(참고3).
(17.05.26. MessageConverter에 대한 내용 삭제)
아래는 @ResponseBody 어노테이션을 작성하고 JSON 데이터를 받아오는 화면이다. Response Headers를 보면 Content-Type으로 application/json을 지원하는 것을 볼 수 있다.
아래는 Response Body에 JSON 데이터가 쓰여져있는 것을 보여주는 화면이다. 기존의 방식도 똑같이 Response Body에 JSON 데이터가 쓰여진다.
2. MappingJackson2JsonView를 이용한 JSON 변환 (17.05.29. 추가)
@ReponseBody 애노테이션을 사용하지 않고, MappingJackson2JsonView(이하 JsonView)를 Bean으로 등록해 Model에 심어진 키-값을 JSON으로 변환해줄 수 있다. JsonView를 사용하기 위해서는 BeanNameViewResolver를 빈으로 등록해줘야 한다. BeanNameViewResolver는 뷰의 이름(id)와 동일한 이름을 갖는 빈을 뷰 객체로 사용하며, 주로 커스텀 View 클래스를 사용해야 하는 경우에 사용한다(예를 들면, JSON 변환이나 파일 다운로드)(참고4).
우선 JSON 변환이 필요한 comment-context.xml에 아래와 같이 bean들을 추가한다. ViewResolver의 property로 order를 지정하여 우선순위를 지정할 수 있다. 이때 내림차순으로 우선순위가 증가한다.
1 2 3 4 5 6 | ... <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <property name="order" value="1" /> </bean> <bean id="JSON" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" /> ... | cs |
CommentController의 RequestMapping 메서드들은 더이상 @ResponseBody 애노테이션을 사용하지 않는다. 대신 JSON으로 변환할 키-값을 모델(Model)에 심고, JsonView의 이름(id="JSON")과 동일한 값을 return하면 JsonView가 Model을 JSON으로 변환하여 뷰로 넘겨주게 된다.
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 | package com.edu.comment.controller; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import com.edu.comment.dto.CommentDto; import com.edu.comment.service.CommentService; @Controller public class CommentController { @Autowired private CommentService commentService; @RequestMapping("/commentWrite.comment") public String writeAndReadComments(HttpSession session , Model model , CommentDto comment) { comment.setId(session.getAttribute("id").toString()); // Model에 심어진 값을 JSON으로 변환해준다. model.addAttribute("result", commentService.writeComment(comment)); model.addAttribute("comments", commentService.readComments(comment.getArticleNumber(), 10)); return "JSON"; } @RequestMapping("/commentRead.comment") public String readComments(Model model , @RequestParam int articleNumber , @RequestParam int commPageNum) { model.addAttribute("comments", commentService.readComments(articleNumber, commPageNum)); return "JSON"; } } | cs |
[Homepage of the Jackson Project 참고]
[Java Json library Jackson 사용법 참고1]
[Java Json 라이브러리 Jackson 사용법 참고2]
[@ResponseBody 이해하기 참고3]
[HTTP Content-Type 정리 참고]
[ViewResolver 구현 클래스와 다수의 ViewResolver 설정 참고4]
'Java > web' 카테고리의 다른 글
[Spring] MyBatis Mapper 파일 설정 방법 (0) | 2017.04.28 |
---|---|
[Spring] JUnit 사용하기 (0) | 2017.04.26 |
[Spring] MyBatis 사용하기, SqlSession (게시판 구현) (0) | 2017.04.25 |
[Spring] MyBatis 사용하기, 댓글 쓰기 구현하기 (게시판 구현) (0) | 2017.04.24 |
[Spring] MyBatis 사용하기, MapperFactoryBean (게시판 구현) (0) | 2017.04.24 |