JSON - JAVA
Rest
시대가 바뀌면서 직접적으로 개발하는 방식이 아닌 오픈API를 활용하는 기술들이 발달하고 늘어나고 있다.
오픈API를 활용하기 위해서 표준화된 데이터전송 방식인 JSON을 많이 사용하게 되는데 이러한 방식은
데이터만을 주고 받기때문에 @Controller가아닌 @RestController를 사용하게된다.
@Controller

@RestController

@Controller와 @RestController는 용도의 차이라고 이해하시면 될 것 같습니다!
예전에 프로그래밍을 할 때에는 jsp나 html과 같은 뷰를 전달해 주었기 때문에 @Controller를
사용해왔었지만, 최근에는 프론트엔드와 백엔드를 따로 두고, 백엔드에서는 REST API를 통해
json으로 데이터만 전달하기 때문에 편리성을 위해 @RestController를 사용하게 되었습니다
출처: https://mangkyu.tistory.com/49 [MangKyu's Diary]
JSON을 아직 이해하지 못했다면 먼저 JSON이 파싱되고 돌아가는 원리를 이해하고 오자 https://bbung95.github.io/framework/2021/05/24/JSON-Java.html
HttpComponents
Rest의 개념을 이해하고 적용하혀면 HttpComponents 라이브러리를 추기하여야한다.
Header의 수정은 response에서만 가능하며 요청을 client가 하기 때문이다.
- HttpGet : GET방식으로 보내는 방법으로 header의 수정이 가능하다.
- HttpPost : POST방식으로 보내는 방법으로 header와 body의 수정이 가능하다.
- HttpEntity : Http Protocol을 사용하는 통신의 headerDHK body에 접근하여 관련된 정보를 저장 할 수 있다.
상속받은 class로 RequestEntity, ResponseEntity가 있다.
GET방식
GET방식은 DATA가 header에 저장되기 때문에 url을 통해 Data를 넘긴다.
RestHttpClient
public class RestHttpClientApp {
public static void ReqeustHttpGet_UseCodeHaus() throws Exception {
//클라이언트 생성
HttpClient httpClient = new DefaultHttpClient();
String url = "http://127.0.0.1:8080/Spring14/user/json/user01?name=user02&age=10";
HttpGet httpGet = new HttpGet(url);
httpGet.setHeader("Accept", "application/json");
httpGet.setHeader("Content-Type", "application/json");
HttpResponse httpResponse = httpClient.execute(httpGet);
System.out.println(httpResponse);
System.out.println();
HttpEntity responseHttpEntity = httpResponse.getEntity();
InputStream is = responseHttpEntity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
System.out.println("[Server 에서 받은 Data 확인");
String serverData = br.readLine();
System.out.println(serverData);
JSONObject jsonObj = (JSONObject) JSONValue.parse(serverData);
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(jsonObj.toString(), User.class);
System.out.println(user);
}
}
RestController
@RestController
@RequestMapping("/user/*")
public class UserRestController {
@RequestMapping(value="json/{value}", method=RequestMethod.GET)
public User getUser(@PathVariable String value,
@RequestParam("name") String name,
@RequestParam("age") int age) throws Exception{
System.out.println();
System.out.println(value);
System.out.println(name);
System.out.println(age);
User user = new User();
user.setUserId("AAA");
user.setUserName("BBB");
user.setAge(100);
System.out.println(user);
return user;
}
}
POST방식
POST방식은 body에 Data가 저장되며 body에 Data를 담아 보낼 수 있다.
POST방식에서는 @RequestBody 어노테이션을 사용 할 수 있으며 @ModelAttribute와 같이 바인딩을 해준다.
@RequestBody는 CodeHaus의 바인딩하는 원리로 바인딩을 해준다.
- @RequestBody : 객체 <==> JSON
- @ModelAttribute : 객체 <==> http form data
RestHttpClient
public class RestHttpClientApp {
public static void RequestHttpPostData_UseCodeHaus() throws Exception {
HttpClient httpClient = new DefaultHttpClient();
String url = "http://127.0.0.1:8080/Spring14/user/json/getUser/user01";
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-Type", "application/json");
// 방법 1 : String 사용
// String dta = "{\"userId\":\"test\", \"userName\":\"홍길동\"}";
//
// 방법 2 : JSONObject 사용
// JSONObject json = new JSONObject();
// json.put("userId", "test");
// json.put("userName", "홍길동");
//
// 방법 3 : codehaus 사용
User user = new User("test", "홍길동", "1111", null, 10);
ObjectMapper objectMapper01 = new ObjectMapper();
String jsonValue = objectMapper01.writeValueAsString(user);
HttpEntity requestHttpEntity = new StringEntity(jsonValue.toString(), "utf-8");
httpPost.setEntity(requestHttpEntity);
HttpResponse httpResponse = httpClient.execute(httpPost);
System.out.println(httpResponse);
System.out.println();
HttpEntity responseHttpEntity = httpResponse.getEntity();
InputStream is = responseHttpEntity.getContent();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
System.out.println("[Server 에서 받은 Data 확인");
String serverData = br.readLine();
System.out.println(serverData);
JSONObject jsonObj = (JSONObject) JSONValue.parse(serverData);
ObjectMapper objectMapper = new ObjectMapper();
User returnUser = objectMapper.readValue(jsonObj.get("user").toString(), User.class);
System.out.println(returnUser);
}
}
RestController
@RestController
@RequestMapping("/user/*")
public class UserRestController {
@RequestMapping(value="json/getUser/{value}", method=RequestMethod.POST)
public Map getUser(@PathVariable String value,
@RequestBody User user) throws Exception{
System.out.println();
System.out.println("[From Client Data]");
System.out.println(value);
System.out.println("1 : "+user);
System.out.println("[To Client Data]");
User returnUser = new User();
returnUser.setUserId("AAA");
returnUser.setUserName("BBB");
System.out.println("2 : "+returnUser);
Map map = new HashMap();
map.put("user", returnUser);
return map;
}
}
Leave a comment