Jackson Library
- Java
JSON
라이브러리이다.
- Java
Object
를 Json
으로 변환한다.
설치
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
- XML용 Jacson 예)
![](https://velog.velcdn.com/images/gabriela/post/00b24deb-7e20-49fa-9f7c-81653d1018a7/image.png)
Annotation
@ResponseBody
- 메소드 레벨 Annotation
- 메소드의 반환 값이 응답 데이터라는 의미이다.
- Ajax 처리할 때 사용하는 Annotation 이다.
@ResponseBody
대체 가능
@RestController
ResponseEntity
클래스
@RestController
- 클래스 레벨 Annotation
- 모든 메소드에
@ResponseBody
를 디폴트로 추가하는 @Controller
이다.
- Ajax 처리할 때 사용하는 Annotation 이다.
@RequiredArgsConstructor
- 클래스 레벨 Lombok Annotation
- 처리 방식에 따라
@AllArgsConstructor
와 사용법이 나뉜다.
- Field를 final 처리 할 때
@Autowired
를 대신한다.
Null
이 아닐 때 사용한다.
- 생성자를 통한 자동주입(
@Autowired
)을 한다.
ResponseEntity Class
- Ajax 응답 전용으로 사용하도록 만들어놓은 Spring Class
@ResponseBody
가 포함되어 있어서 annotation을 작성할 필요가 없다.
JSON.stringify() 메서드
stringify()
: JavaScript 데이터 객체를 JSON 문자열로 반환한다.
예제
JSP
기본 태그 준비
<div>
<button id="btn_list">목록보기</button>
</div>
<hr>
<div id="list"></div>
Ajax1
$(function(){
fnList();
fnDetail();
})
function fnList(){
$('#btn_list').click(function(){
$.ajax({
type: 'get',
url: '${contextPath}/ajax1/list.do',
dataType: 'json',
success: function(resData){
$('#list').empty();
$.each(resData, function(i, elem){
$('#list').append('<div class="row"><span>' + elem.name + '</span>, ' + elem.age + '</div>');
})
}
})
})
}
function fnDetail(){
$(document).on('click', '.row', function(){
$.ajax({
type: 'get',
url: '${contextPath}/ajax1/detail.do',
data: 'name=' + $(this).find('span').text(),
dataType: 'json',
success: function(resData){
alert(resData.name + ', ' + resData.age);
}
})
})
}
Ajax2
$(function(){
fnList();
fnDetail();
})
function fnList(){
$('#btn_list').click(function(){
$.ajax({
type: 'get',
url: '${contextPath}/ajax2/list.do',
dataType: 'json',
success: function(resData){
$('#list').empty();
$.each(resData, function(i, elem){
$('#list').append('<div class="row">' + elem.name + ', ' + elem.age + '</div><input type="hidden" value="' + elem.name + '">');
})
}
})
})
}
function fnDetail(){
$(document).on('click', '.row', function(){
$.ajax({
type: 'get',
url: '${contextPath}/ajax2/detail.do',
data: 'name=' + $(this).next().val(),
dataType: 'json',
success: function(resData){
alert(resData.name + ', ' + resData.age);
}
})
})
}
Ajax3
$(function(){
fnList();
fnDetail();
})
function fnList(){
$('#btn_list').click(function(){
$.ajax({
type: 'get',
url: '${contextPath}/ajax3/list.do',
dataType: 'json',
success: function(resData){
$('#list').empty();
$.each(resData, function(i, elem){
$('#list').append('<div class="row" data-name="'+ elem.name +'">' + elem.name + ', ' + elem.age + '</div>');
})
}
})
})
}
function fnDetail(){
$(document).on('click', '.row', function(){
$.ajax({
type: 'post',
url: '${contextPath}/ajax3/detail.do',
contentType: 'application/json',
data: JSON.stringify({
'name':$(this).data('name')
}),
dataType: 'json',
success: function(resData){
alert(resData.name + ', ' + resData.age);
}
})
})
}
컨트롤러
@ResponseBody
produces
: 응답 데이터 타입
Jacson Library
준비
Ajax Controller 1
- Jackson 라이브러리를 통해
List<T>
가 자동으로 Ajax JSON 데이터(배열)
로 변환된다.
@RequestMapping("/ajax1")
@RequiredArgsConstructor
@Controller
public class AjaxController1 {
private final AjaxService ajaxService;
@ResponseBody
@RequestMapping(value="/list.do", method=RequestMethod.GET, produces="application/json; charset=UTF-8")
public List<AjaxDto> list() {
return ajaxService.getDtoList();
}
@ResponseBody
@RequestMapping(value="/detail.do", method=RequestMethod.GET, produces="application/json; charset=UTF-8")
public AjaxDto detail(@RequestParam(value="name") String name) {
return ajaxService.getDto(name);
}
}
Ajax Controller 2
produces
(응답타입)안에 필드값으로 스프링에서 제공하는 미디어타입도 존재함
produces=MediaType.APPLICATION_JSON_VALUE
==
produces="application/json"
@RequestMapping("/ajax2")
@RestController
@RequiredArgsConstructor
public class AjaxController2 {
private final AjaxService ajaxService;
@GetMapping(value="/list.do", produces=MediaType.APPLICATION_JSON_VALUE)
public List<AjaxDto> getDtoList() {
return ajaxService.getDtoList();
}
@GetMapping(value="/detail.do", produces=MediaType.APPLICATION_JSON_VALUE)
public AjaxDto getDto(@RequestParam(value="name") String name) {
return ajaxService.getDto(name);
}
}
Ajax Controller 3
@RequestMapping(value="/ajax3")
@RequiredArgsConstructor
@Controller
public class AjaxController3 {
private final AjaxService ajaxService;
@GetMapping(value="/list.do", produces="application/json; charset=UTF-8")
public ResponseEntity<List<AjaxDto>> list() {
return new ResponseEntity<List<AjaxDto>>(
ajaxService.getDtoList()
, HttpStatus.OK);
}
@PostMapping(value="/detail.do")
public ResponseEntity<AjaxDto> detail(@RequestBody AjaxDto ajaxDto) {
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", "application/json; charset=UTF-8");
return new ResponseEntity<AjaxDto>(
ajaxService.getDto(ajaxDto.getName())
, header
, HttpStatus.OK);
}
}
👉Spring Ajax활용 예제 전체(깃허브 클릭)
Controller
에서는 요청 호출만 하는것을 권장한다. 그 외의 할일은 서비스에서 한다.
- Jackson은
DTO 객체
대신 Map
을 만들어서 반환해도 동일하게 동작한다.
![](https://velog.velcdn.com/images/gabriela/post/1cc4faa9-c324-4284-be40-647ddfbba8f0/image.png)