JSON - JAVA

Rest


시대가 바뀌면서 직접적으로 개발하는 방식이 아닌 오픈API를 활용하는 기술들이 발달하고 늘어나고 있다.

오픈API를 활용하기 위해서 표준화된 데이터전송 방식인 JSON을 많이 사용하게 되는데 이러한 방식은
데이터만을 주고 받기때문에 @Controller가아닌 @RestController를 사용하게된다.

@Controller

Controller

@RestController

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;
	}   

}

Categories:

Updated:

Leave a comment