๐ขREST(Representational State Transfer) : ์์(Resource)์ ํํ(Representation)์ ์ํ ์ํ(State)๋ฅผ ์ ๋ฌ(Transfer)ํ๋ ๊ฒ์ ์๋ฏธ
โ ํ์ด์ง ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ XML ์ด๋ JSON ํ์์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ์๋ต
๐ขRestful API : REST ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ ์ปดํจํฐ์ ์์คํ ์ด ์์ ํ๊ฒ ๊ฐ์ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ
โ ์ค๋งํธ๊ธฐ๊ธฐ์ ํ๋ก๊ทธ๋จ(์ฑ) ์ ๋ณด๋ฅผ ์ ๋ฌ๋ฐ์ ์ ์ฅํ๊ฑฐ๋ ๊ฒ์๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ์ฌ ์ถ๋ ฅํ๊ธฐ ์ํด ์ฌ์ฉ
๐RestfulController.java
โป xyz.itwill10.controller ํจํค์ง์ RestfulController.java ํด๋์ค ์์ฑ
package xyz.itwill10.controller; // import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import xyz.itwill10.dto.Member; // //REST(Representational State Transfer) : ์์(Resource)์ ํํ(Representation)์ ์ํ ์ํ(State)๋ฅผ ์ ๋ฌ(Transfer)ํ๋ ๊ฒ์ ์๋ฏธ //โ ํ์ด์ง ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ XML ์ด๋ JSON ํ์์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ์๋ต //Restful API : REST ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ ์ปดํจํฐ์ ์์คํ ์ด ์์ ํ๊ฒ ๊ฐ์ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ //โ ์ค๋งํธ๊ธฐ๊ธฐ์ ํ๋ก๊ทธ๋จ(์ฑ) ์ ๋ณด๋ฅผ ์ ๋ฌ๋ฐ์ ์ ์ฅํ๊ฑฐ๋ ๊ฒ์๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ์ฌ ์ถ๋ ฅํ๊ธฐ ์ํด ์ฌ์ฉ // @Controller public class RestfulController { @RequestMapping(value = "/rest", method = RequestMethod.GET) public String rest() { return "rest/input"; } // /* //@RequestParam ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ํ๋์ ์ ๋ฌ๊ฐ์ ํ๋์ ๋งค๊ฐ๋ณ์์ ์ ์ฅ๋ฐ์ ์ฌ์ฉ @RequestMapping(value = "/rest", method = RequestMethod.POST) public String rest(@RequestParam String id, @RequestParam String name, Model model) { model.addAttribute("id", id); model.addAttribute("name", name); //๋ฐํ๋๋ ๋ฌธ์์ด(ViewName)์ ์ด์ฉํ์ฌ ViewResolver ๊ฐ์ฒด๊ฐ ๋ทฐ๋ก ์์ฑํ์ฌ ์๋ต ์ฒ๋ฆฌ return "rest/output"; } */ // //@ResponseBody : ์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋์ ๋ฐํ๊ฐ(๋ฌธ์์ด)์ ๋ฆฌ์คํฐ์ฆ ๋ฉ์ธ์ง ๋ชธ์ฒด๋ถ์ ์ ์ฅํ์ฌ ํด๋ผ์ด์ธํธ์๊ฒ ์ง์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ์๋ต๋๋๋ก ์ค์ ํ๋ ์ด๋ ธํ ์ด์ //โ ๋ฐํ๋๋ ๋ฌธ์์ด์ ViewResolver ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐ๋ก ๋ณํํ์ฌ ์๋ตํ์ง ์๊ณ ๋ฆฌ์คํฐ์ฆ ๋ฉ์ธ์ง ๋ชธ์ฒด๋ถ์ ์ ์ฅํ์ฌ Front Controller๊ฐ ์ง์ ์๋ต ์ฒ๋ฆฌ //โ Java ๊ฐ์ฒด๋ ๋ฆฌ์คํฐ์ฆ ๋ฉ์ธ์ง ๋ชธ์ฒด๋ถ์ ์ ์ฅ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก ์๋ต ๋ถ๊ฐ๋ฅ //@RequestBody : ๋ฆฌํ์คํธ ๋ฉ์ธ์ง ๋ชธ์ฒด๋ถ์ ์ ์ฅ๋์ด ๋ชจ๋ ์ ๋ฌ๊ฐ์ ๋ฌธ์์ด๋ก ์ ๊ณต๋ฐ๊ธฐ ์ํ ์ด๋ ธํ ์ด์ //โ POST, PUT, PATCH, DELETE ๋ฑ์ ์์ฒญ๋ฐฉ์์ ์ํด ๋ฆฌํ์คํธ ๋ฉ์ธ์ง ๋ชธ์ฒด๋ถ์ ์ ์ฅ๋์ด ์ ๋ฌ๋ ๋ชจ๋ ๊ฐ์ ๋ฌธ์์ด๋ก ์ ๊ณต๋ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ //โ GET ๋ฐฉ์์ ๋ฆฌํ์คํธ ๋ฉ์ธ์ง ๋ชธ์ฒด๋ถ๊ฐ ๋น์ด ์์ผ๋ฏ๋ก @RequestBody ์ด๋ ธํ ์ด์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ //โ ๋ฆฌํ์คํธ ๋ฉ์ธ์ง ๋ชธ์ฒด๋ถ์ ์ ์ฅ๋์ด ์ ๋ฌ๋ JSON ํ์(application/json)์ ๊ฐ์ ๋งค๊ฐ๋ณ์์ Java ๊ฐ์ฒด๋ก ์ ๊ณต๋ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ - ์ ๋ฌ๊ฐ์ ๊ฐ์ฒด ํ๋์ ์ ์ฅ @RequestMapping(value = "/rest", method = RequestMethod.POST) @ResponseBody public String rest(@RequestBody String input) { return input; } // //@ResponseBody ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋์ ๋ฐํ๊ฐ(Member ๊ฐ์ฒด)์ ๋ฆฌ์คํฐ์ฆ ๋ฉ์ธ์ง์ ๋ชธ์ฒด๋ถ์ ์ ์ฅํ์ฌ ํ ์คํธ ๋ฐ์ดํฐ์ ํ์์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ์ฌ ์๋ต ์ฒ๋ฆฌ //๋ฌธ์ ์ )๋ฆฌ์คํฐ์ฆ ๋ฉ์ธ์ง์ ๋ชธ์ฒด๋ถ์ Java ๊ฐ์ฒด๋ฅผ ์ ์ฅ ๋ถ๊ฐ๋ฅ - ์๋ฌ ๋ฐ์(406) //ํด๊ฒฐ๋ฒ)๋ฐํ๋๋ Java ๊ฐ์ฒด๋ฅผ ํ ์คํธ ๋ฐ์ดํฐ(XML ๋๋ JSON)์ ๋ฌธ์์ด๋ก ์๋ ๋ณํ๋๋๋ก ์ค์ ํ์ฌ ์๋ต ์ฒ๋ฆฌ ๊ฐ๋ฅ //โ jackson-databind ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ๋ก์ ํธ์ ๋น๋ ์ฒ๋ฆฌํ๋ฉด ์๋์ผ๋ก Java ๊ฐ์ฒด๊ฐ JSON //ํ์์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ณํํ์ฌ ๋ฐํ - ๋ฉ์ด๋ธ : pom.xml @RequestMapping("/rest_member") @ResponseBody public Member restMember() { Member member=new Member(); member.setId("abc123"); member.setPasswd("123456"); member.setName("ํ๊ธธ๋"); member.setEmail("abc@itwill.xyz"); // //jackson-databind ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด Member ๊ฐ์ฒด๊ฐ JavaScript Object ๊ฐ์ฒด๋ก ๋ณํ๋์ด ์๋ต return member; } // //@ResponseBody ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ์์ฒญ ์ฒ๋ฆฌ ๋ฉ์๋์ ๋ฐํ๊ฐ(List ๊ฐ์ฒด)์ ๋ฆฌ์คํฐ์ฆ ๋ฉ์ธ์ง์ ๋ชธ์ฒด๋ถ์ ์ ์ฅํ์ฌ ํ ์คํธ ๋ฐ์ดํฐ์ ํ์๋ชฉ๋ก์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ์ฌ ์๋ต ์ฒ๋ฆฌ @RequestMapping("/rest_list") @ResponseBody public List<Member> restMemberList() { List<Member> memberList=new ArrayList<Member>(); // Member member1=new Member(); member1.setId("abc123"); member1.setPasswd("123456"); member1.setName("ํ๊ธธ๋"); member1.setEmail("abc@itwill.xyz"); memberList.add(member1); // Member member2=new Member(); member2.setId("xyz789"); member2.setPasswd("789456"); member2.setName("์๊บฝ์ "); member2.setEmail("xyz@itwill.xyz"); memberList.add(member2); // //jackson-databind ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด List ๊ฐ์ฒด๊ฐ JavaScript Array ๊ฐ์ฒด๋ก ๋ณํ๋์ด ์๋ต return memberList; } // @RequestMapping("/rest_map") @ResponseBody public Map<String, Object> restMap() { Map<String, Object> map=new HashMap<String, Object>(); map.put("id", "abc123"); map.put("passwd", "123456"); map.put("name", "ํ๊ธธ๋"); map.put("email", "abc@itwill.xyz"); // //jackson-databind ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด Map ๊ฐ์ฒด๊ฐ JavaScript Object ๊ฐ์ฒด๋ก ๋ณํ๋์ด ์๋ต return map; } // @RequestMapping(value = "/rest/map", method = RequestMethod.GET) public String restInput() { return "rest/input"; } // //๋ชจ๋ ์ ๋ฌ๊ฐ์ด Map ๊ฐ์ฒด์ ์ํธ๋ฆฌ์ ์ ์ฅ๋์ด ๋งค๊ฐ๋ณ์๋ก ์ ๊ณต๋ฐ์ ์ฌ์ฉ ๊ฐ๋ฅ //โ ๋ชจ๋ ์ ๋ฌ๊ฐ์ Map ๊ฐ์ฒด๋ก ์ ๊ณต๋ฐ๊ธฐ ์ํด ๋ฐ๋์ @RequestParam ์ด๋ ธํ ์ด์ ์ฌ์ฉ @RequestMapping(value = "/rest/map", method = RequestMethod.POST) @ResponseBody public Map<String, Object> restOutput(@RequestParam Map<String, Object> map) { return map; } }
๐input.jsp
โป WEB-INF/views/rest ํด๋์ input.jsp ์์ฑ
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>SPRING</title> </head> <body> <h1>์ ๋ ฅํ์ด์ง</h1> <hr> <form method="post"> <table> <tr> <td>์์ด๋</td> <td><input type="text" name="id"></td> </tr> <tr> <td>์ด๋ฆ</td> <td><input type="text" name="name"></td> </tr> <tr> <td colspan="2"><button type="submit">์ ๋ ฅ์๋ฃ</button></td> </tr> </table> </form> </body> </html>
๐output.jsp
โป WEB-INF/views/rest ํด๋์ output.jsp ์์ฑ
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>SPRING</title> </head> <body> <h1>์ถ๋ ฅํ์ด์ง</h1> <hr> <p>์์ด๋ = ${id }</p> <p>์ด๋ฆ = ${name }</p> </body> </html>
๐pom.xml
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <!-- โ Java ๊ฐ์ฒด๋ฅผ JSON ํ์์ ํ ์คํธ ๋ฐ์ดํฐ๋ก ๋ณํํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.14.2</version> </dependency>