이번 장에서는 도서 쇼핑몰 장바구니를 만드는 RESTful 웹 서비스에 대해 공부해 보겠습니다.
RESTful 웹 서비스란 HTTP와 웹의 장점을 최대 활용하는 REST 원리를 사용하여
구현되는 웹 서비스를 말합니다.
REST는 HTTP에서 어떤 자원에 대한 CRUD 요청을 리소스와 메소드로 표현하여
특정한 형태로 전달하는 방식입니다.
다시 말해서 어떤 자원에 대해서 CRUD 연산을 수행하기 위해서
URI로 자원을 명시하고 HTTP 방식(GET, POST 등)을 사용해서 요청을 보내고
요청에 대한 자원은 특정한 형태(JSON, XML 등)로 표현됩니다.
다음은 REST의 구성 요소입니다.
종류 | 설명 |
리소스 | 서버는 고유 아이디가 있는 리소스를 가지며, 클라이언트는 이런 리소스에 요청을 보냅니다. 리소스는 URI에 해당합니다. |
메소드 | 서버에 요청을 보내는 방식으로 GET, POST, PUT, PATCH, DELETE가 있습니다. CRUD 연산 중에서 연산에 맞는 Method를 사용해 서버에 요청합니다. |
리소스 형태 | 클라이언트와 서버가 데이터를 주고받는 형태로 JSON, XML, TEXT, RSS 등이 있습니다. 최근에는 키, 값을 활용하는 JSON을 주로 사용합니다. |
JSON 형태로 데이터를 주고 받기 위해서는 pom.xml 파일에 jackson-databind.jar 또는 jackson-mapper-asl.jar을
의존 라이브러리로 등록해야 합니다.
RESTful 방식의 에너테이션
REST 방식으로 컨트롤러를 작성할 때 사용되는 주요 에너테이션은 다음과 같습니다.
유형 | 설명 |
@RestController | @Controller와 @ResponseBody를 결합한 REST API를 제공하는 컨트롤러를 의미 |
@RequestBody | 컨트롤러 요청 처리 메소드의 매개변수에 선언되면 요청된 HTTP 요청 body를 해당 매개변수에 바인딩 |
@ResponseBody | 컨트롤러 요청 처리 메소드의 매개변수에 선언되면 반환 값을 응답 HTTP 응답 body에 바인딩 스프링은 요청된 메시지의 HTTP 헤더에 있는 Content-Type을 기반으로 HTTP Message converter를 사용하여 반환 값을 HTTP 응답 body로 변환 |
@RequestBody
@RequestBody 애너테이션은 HTTP 요청 body 내용인 XML, JSON 또는 기타 데이터 등을
자바 객체로 매핑하는 역할을 합니다.
폼 페이지에서 name=value 형태로 매개변수가 전달되면 @RequestParam 이나 @ModelAttribute를
이용합니다.
그러나 XML이나 JSON으로 형식을 갖춘 문자열 형태라면 @RequestBody를 이용합니다.
@RequestBody는 컨트롤러 내 요청 처리 메소드의 매개변수에 설정합니다.
body 내용을 메소드의 매개변수가 전달받을 뿐더러 body 내용 전체를 해당 매개변수 타입으로 변환해 줍니다.
다음은 @RequestBody를 선언한 예시입니다.
폼 페이지 입력된 다중 값을 &로 연결된 'name=value' 형태로 전달받습니다.
컨트롤러는 다음과 같이 작성해줍니다.
package com.springmvc.chap14;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/exam01")
public class Example01Controller {
@GetMapping
public String showForm() {
return "webpage14_01";
}
@PostMapping
public String submit(@RequestBody String param, Model model) {
model.addAttribute("title", "@RequestBody로 정보 받기");
model.addAttribute("result", param);
return "webpage14_result";
}
}
뷰 페이지는 다음과 같습니다.
<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
<title>RESTful 웹 서비스</title>
</head>
<body>
<h3>RESTful 웹 서비스</h3>
<form action="./exam01" method="post">
<p>이름 : <input name="name"/>
<p>나이 : <input name="age"/>
<p>이메일 : <input name="email"/>
<p><input type="submit" value="확인"/>
</form>
</body>
</html>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>RESTful 웹 서비스</title>
</head>
<body>
<h3>RESTful 웹 서비스</h3>
<p><%out.print(new java.util.Date()); %>
<p>${title }
<p>${result }
</body>
</html>
컨트롤러 내 submit()에서 @RequestBody가 선언된 매개변수 param은
뷰 페이지에서 입력한 데이터 값을 &를 이용한 name=value 형태로 저장되어 출력됩니다.
결과는 다음과 같습니다.
다음은 컨트롤러 내 요청 처리 메소드의 매개변수에 @RequestBody를 선언하여
JSON 형태로 전달받는 예시입니다.
pom.xml 파일에 다음과 같이 의존 라이브러리를 등록해줍니다.
<!-- JSON -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.2.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
컨트롤러를 다음과 같이 작성해줍니다.
package com.springmvc.chap14;
import java.util.HashMap;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@Controller
public class Example01Controller2 {
@GetMapping("/json")
public String showForm() {
return "webpage14_02";
}
@PostMapping("/test")
public void submit(@RequestBody HashMap<String, Object> map) {
System.out.println(map);
}
}
뷰 페이지는 다음과 같이 작성해줍니다.
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>RESTful 웹 서비스</title>
</head>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
var obj = {"name" : "heo", "age" : 25};
function test() {
$.ajax({
url : "<c:url value="/test"/>",
type : "post",
data : JSON.stringify(obj),
dataType : "json",
contentType : "application/json",
success : function(data) {
alert("성공");
},
error : function(errorThrown) {
alert("실패");
}
});
}
</script>
<body>
<h3>RESTful 웹 서비스</h3>
<button onclick="test()" type="button">실행하기</button>
</body>
</html>
/json을 실행하면 showForm()으로 webpage14_02.jsp 파일이 출력됩니다.
폼 페이지에서 실행하기 버튼을 누르면 /test가 호출되어 컨트롤러의 요청 처리 메소드 submit()이 실행됩니다.
@ResponseBody
@ResponseBody 애너테이션은 자바 객체를 HTTP 응답 body 내용으로 매핑하는 역할을 합니다.
@RequestBody와 마찬가지로 JSON이나 XML 처럼 형식을 갖춘 문자열 형태로 응답할 때 사용합니다.
컨트롤러 내 요청 처리 메소드 수준으로 설정하며,
요청 처리 메소드 반환 값을 HTTP 응답 body 내용으로 전달합니다.
다음은 @ResponseBody를 선언한 예시입니다.
package com.springmvc.chap14;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/exam02")
public class Example02Controller {
@GetMapping
public @ResponseBody Person submit() {
Person person = new Person();
person.setName("Heo");
person.setAge("25");
person.setEmail("abc@naver.com");
System.out.println(person);
return person;
}
}
참고로 Person 클래스 작성을 해주어야 합니다. (여기서는 생략하겠습니다.)
/exam02를 입력하게 되면 컨트롤러 내 요청 처리 메소드 submit()에서 설정된
person 객체 값을 JSON 형식으로 변환해서 응답합니다.
@RestController
@RestController 애너테이션은 컨트롤러에 @ResponseBody가 추가된 것으로
JSON 형태로 데이터를 반환합니다.
@Controller와는 다르게 @RestController는 반환 값에 자동으로
@ResponseBody가 붙어 자바 객체가 HTTP 응답 body 내용에 매핑되어 전달됩니다.
@Controller일 때는 반드시 @ResponseBody를 선언해주어야 하지만
@RestController를 사용하면 @ResponseBody를 사용하지 않아도 됩니다.
다음은 @RestController를 사용한 예시입니다.
package com.springmvc.chap14;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/exam03")
public class Example03Controller {
@GetMapping
public Person submit() {
Person person = new Person();
person.setName("Heo");
person.setAge("25");
person.setEmail("abc@naver.com");
System.out.println(person);
return person;
}
}
/exam03을 입력하면 이전 실습과 마찬가지로 다음과 같이 출력됩니다.
'SPRING' 카테고리의 다른 글
[SPRING]#58 도서 쇼핑몰 구현 (RESTful 웹 서비스3) (0) | 2024.02.18 |
---|---|
[SPRING]#57 도서 쇼핑몰 구현 (RESTful 웹 서비스2) (0) | 2024.02.18 |
[SPRING]#55 도서 쇼핑몰 구현 (유효성 검사8) (0) | 2024.02.17 |
[SPRING]#54 도서 쇼핑몰 구현 (유효성 검사7) (0) | 2024.02.17 |
[SPRING]#53 도서 쇼핑몰 구현 (유효성 검사6) (0) | 2024.02.17 |