Spring RestTemplate Basic
서버 어플리케이션을 만들때 REST API를 호출하려면 예전엔 고전적인 방법으로 URL Connection을 맺고 작업을 했던 시절이 있었습니다. 하지만 Spring에서는 이조차도 템플릿으로 제공을 해줍니다. RestTemplate이라는 클래스로 말이죠. 이번 포스팅은 RestTemplate을 간단하게 사용해보는 예제를 올려봅니다.
RestTemplate
자세한 Doc 문서는 RestTemplate 링크를 참조하시면 됩니다. 이번 포스팅은 설명보다는 예제 코드를 통해 실제 사용법을 알아보고자 합니다.
Example Code
예제 코드를 위해서는 두개의 어플리케이션을 만들어줘야 합니다. 하나는 REST API를 구현한 어플리케이션 하나는 테스트를 위한 어플리케이션입니다.
REST API Application
REST API를 구현한 어플리케이션은 다음 컨트롤러 클래스를 포함하고 있으면 됩니다.
import java.util.ArrayList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.PathVariable; 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.RestController; @RestController public class TestController { @Bean(name="internalStorage") public ArrayList<String> getInternalStorage(){ return new ArrayList<String>(); } @Autowired @Qualifier("internalStorage") private ArrayList<String> internalStorage; @RequestMapping(value = "/crud", method = RequestMethod.GET) public String getList(){ return internalStorage.toString(); } @RequestMapping(value = "/crud/{index}", method = RequestMethod.GET) public String get(@PathVariable int index){ return internalStorage.get(index); } @RequestMapping(value = "/crud", method = RequestMethod.POST) public String post(@RequestBody String value){ internalStorage.add(value); return "success"; } @RequestMapping(value = "/crud/{index}", method = RequestMethod.PUT) public String put(@PathVariable int index, @RequestBody String value){ internalStorage.set(index, value); return "success"; } @RequestMapping(value = "/crud/{index}", method = RequestMethod.DELETE) public String delete(@PathVariable int index){ internalStorage.remove(index); return "success"; } }
아주 간단하게 구현한 CRUD가 포함된 REST API 컨트롤러입니다. 이제 이것을 가지고 RestTemplate를 사용하는 테스트 코드를 만듭니다.
TEST Application
테스트를 위한 어플리케이션에는 다음과 같은 Junit 테스트 코드를 포함하면 됩니다.
import static org.junit.Assert.assertTrue; import java.util.HashMap; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.SpringApplicationConfiguration; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.web.client.RestTemplate; @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = DemoApplication.class) @WebAppConfiguration public class DemoApplicationTests { @Test public void testRestTemplate(){ // RestTemplate 객체를 얻는다. RestTemplate restTemplate = new RestTemplate(); //지정 URL을 GET 타입으로 호출한다. ResponseEntity<String> response = restTemplate.getForEntity("http://local.net/crud", String.class); // 정상적으로 처리가 되었는지 확인한다. assertTrue( response.getStatusCode().is2xxSuccessful() ); // 응답의 본문(body)를 얻으려면 getBody() 메소드를 호출한다. String html = response.getBody(); System.out.println(html); // 아이템을 삽입한다. response = restTemplate.postForEntity("http://local.net/crud", System.currentTimeMillis(), String.class); assertTrue( response.getStatusCode().is2xxSuccessful() ); response = restTemplate.postForEntity("http://local.net/crud", System.currentTimeMillis(), String.class); assertTrue( response.getStatusCode().is2xxSuccessful() ); // {}을 이용해 추가 파라미터를 지정할 수 있다. response = restTemplate.getForEntity("http://local.net/crud/{index}", String.class, 0); assertTrue( response.getStatusCode().is2xxSuccessful() ); // {}을 이용해 추가 파라미터 입력시 map도 사용할 수 있다. Map<String, Object> param = new HashMap<String, Object>(); param.put("index", 0); response = restTemplate.getForEntity("http://local.net/crud/{index}", String.class, param); assertTrue( response.getStatusCode().is2xxSuccessful() ); // 아이템을 갱신한다. restTemplate.put("http://local.net/crud/{index}", "update:"+System.currentTimeMillis(), 0); // 아이템을 삭제한다. restTemplate.delete("http://local.net/crud/{index}", 1); } }
심화 사용법은 추후에 다루도록(?) 하고 테스트 코드에 대한 설명은 코드 사이사이에 있는 주석으로 대체하겠습니다. :3
Closing Remarks
간단하게 RestTemplate 사용법에 대해 알아봤습니다.