Bigfat

[Spring] Jackson 라이브러리를 사용해 댓글 쓰기 구현하기 (게시판 구현) 본문

Java/web

[Spring] Jackson 라이브러리를 사용해 댓글 쓰기 구현하기 (게시판 구현)

kyou 2017. 4. 25. 20:58

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]

[Media type, Wikipedia 참고]

[HTTP Content-Type 정리 참고]

[ViewResolver 구현 클래스와 다수의 ViewResolver 설정 참고4]