본문 바로가기
Spring/Spring

[Spring] Rest API 요청, 전달 Controller 만들기

Rest API 요청, 전달 Controller 만들기

이 포스팅에서는 Spring에서 RestAPI를 만드는 방법에 대하여 기술하겠습니다. 구글을 통해서 검색해보면 대부분 스프링부트로 구현한 게시글이 많아 일반 스프링에서 RestAPI를 만들고자 하는 분들에게 도움이 되었으면 좋겠습니다. 이포스팅에서는 RestAPI가 무엇인지에 대해서는 자세히 다루지 않고 간단히 개념적인 부분만 설명하며 대부분의 내용은 순수하게 기능을 구현하는 방법위주로 작성되었습니다.

 

 

1. RestAPI 란?

Rest는 Representational State Transfer의 약자로 자원을 이름으로 구분하여 해당 자원의 정보를 주고받는 모든 것을 의미합니다. 일반적으로는 서버에 특정 URL을 던져주면 서버에서 JSON형태의 데이터로 응답을 하고 클라이언트는 그것을 활용하는 식으로 많이 이용되어 지는데 여기서 클라이언트는 일반적인 사용자가 될 수도 있겠지만 사용자가 아닌 또다른 웹시스템이 될수도 있습니다. 

 

 

 

 

 

2. RestAPI Response(전달) 컨트롤러

RestAPI가 뭔지 대략적으로 알았다면 클라이언트가 특정 URL로 요청을 했을때 서버는 어떤식으로 응답을 해야할지 Spring기준으로 컨트롤러를 통해 작성할 예정이며 응답하는 데이터의 형태는 JSON으로 진행하겠습니다.

 

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.1</version>
</dependency>

JSON을 사용하기 때문에 JSON라이브러리를 추가합니다.

 

 

 

@ResponseBody
@RequestMapping(value = "/responseRestAPI.do", method = RequestMethod.GET)
public void responseRestAPI(HttpServletResponse response) throws Exception {

  ObjectMapper mapper = new ObjectMapper();
  Map<String, String> map = new HashMap<String, String>();

  map.put("name", "apple");
  map.put("price", "10000");

  String jsonStr = mapper.writeValueAsString(map);

  response.setCharacterEncoding("UTF-8");
  response.setContentType("application/json; charset=UTF-8");
  response.getWriter().write(jsonStr);  
}

컨트롤러에서 생성한 맵을 JSON으로 변환하여 응답합니다.

 

 

 

 

3. RestAPI Request(수신) 컨트롤러

 

@RequestMapping(value = "/requestRestAPI.do", method = RequestMethod.GET)
public String requestRestAPI(Model model) throws Exception {

  URL url = new URL("http://17.135.65.255/TestApi?no=1");

  ObjectMapper mapper = new ObjectMapper();
  StringBuilder sb = new StringBuilder();
  BufferedReader br;

  List<Map<String, Object>> listMap = new ArrayList<Map<String,Object>>();

  try {
    HttpURLConnection con = (HttpURLConnection)url.openConnection();

    //Request Header 정의
    con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");

    //전송방식
    con.setRequestMethod("GET");

    //서버에 연결되는 Timeout 시간 설정
    con.setConnectTimeout(5000);

    //InputStream 읽어 오는 Timeout 시간 설정
    con.setReadTimeout(5000); 

    //URLConnection에 대한 doOutput 필드값을 지정된 값으로 설정한다. 
    //URL 연결은 입출력에 사용될 수 있다. 
    //URL 연결을 출력용으로 사용하려는 경우 DoOutput 플래그를 true로 설정하고, 
    //그렇지 않은 경우는 false로 설정해야 한다. 기본값은 false이다.
    con.setDoOutput(false); 

    if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
      br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
      String line;
      while ((line = br.readLine()) != null) {
      sb.append(line).append("\n");
      }
      br.close();

      mapper.readValue(sb.toString(), new TypeReference<List<Map<String, Object>>>(){});
      model.addAttribute("listMap", listMap);
    } else {
    	model.addAttribute("error", con.getResponseMessage());
    }
  } catch (Exception e) {
  	System.err.println(e.toString());
  }
  return "test/api.tiles";
}

 

 

 

 

 

댓글