승승장규 2025. 2. 24. 16:13

RESTful 웹 서비스를 호출하고 응답을 처리하기 위한 템플릿 클래스로, HTTP 요청 및 응답을 보다 쉽게 주고받을 수 있도록 도와준다.

 

  • HTTP GET 메서드
      getForObject(url, responseType)
      getForEntity(url, responseType)
  • HTTP POST 메서드
      postForObject(url, request, responseType)
      postForEntity(url, request, responseType)
  • HTTP PUT 메서드
      put(url, request)
  • HTTP DELETE 메서드
      delete(url)
  • HTTP HEAD 메서드
      headForHeaders(url)
  • HTTP OPTIONS 메서드
      optionsForAllow(url)
  • HTTP PATCH 메서드
      patchForObject(url, request, responseType)
  • 일반적인 메서드
      exchange(RequestEntity <?> requestEntity, Class <T> responseType)
      execute(url, httpMethod, requestCallback, responseExtractor)

 

요청을 보낼 서버 GET ▼

// RestTemplate을 만들 수 있는 RestTemplateBuilder를 등록해주어야 한다.

private final RestTemplate restTemplate;

public 클래스 이름(RestTemplateBuilder builder){
	this.restTemplate = builder.build();
}

/*
build()는 RestTemplate를 반환하고 있다.
	public RestTemplate build(){
            return configure(new RestTemplate());
        }
*/

// 요청 URL 만들기
URI uri = UriComponentsBuilder
        .fromUriString("http://localhost:7070") // 요청을 보내고 싶은 서버 URL
        .path("요청을 받을 서버의 엔드포인트") // 보낼 서버의 Controller
        .queryParam("요청을 보낼 쿼리", query) // @RequestParam 방식으로 되어있음
        .encode()
        .build()
        .toUri();
        
// GET 방식으로 요청, 응답으로 날라온 해당 데이터를 받기 위해 클래스를 설정하면 자동으로 역직렬화 되어서 객체 형태로 담긴다.
ResponseEntity<반환 타입> responseEntity = restTemplate.getForEntity(uri, 반환 타입.class);
// 복합적인 데이터를 String타입으로 변환 후 재변환
ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);
return fromJSONtoDto(responseEntity.getBody());

public List<Dto> fromJSONtoDto(String responseEntity){
    JSONObject jsonObject = new JSONObject(responseEntity); // String의 정보를 담아서 JSON 형태로 다루기 위해
    JSONArray items = jsonObject.getJSONArray("배열을 담고 있는 키값 items"); // ex)items:[]
    List<Dto> dtoList = new ArrayList<>();
    
    for (Object item : items){
        Dto dto = new Dto((JSONObject) item); // JSONObject로 캐스팅
        dtoList.add(dto);
    }
    return dtoList;
}

// json 의존성을 추가해줘야함
public Dto(JSONObject item){
    this.title = item.getString("item 배열에 담긴 키값");
    this.price = item.getString("item 배열에 담긴 키값");
}

 

요청을 보낼 서버 POST ▼

URI uri = UriComponentsBuilder
        .fromUriString("http://localhost:7070")
        .path("엔드 포인트/{query}") // @PathVariable 방식
        .encode()
        .build()
        .expand(query)
        .toUri();
        
User user = new User("이름", "1234");

// POST 방식, HTTP body에 넣을 데이터, 매핑할 클래스
ResponseEntity<Dto> responseEntity = restTemplate.postForEntity(uri, user, Dto.class);

 

요청을 보낼 서버 exchange▼

URI uri = UriComponentsBuilder
        .fromUriString("http://localhost:7070")
        .path("엔드 포인트")
        .encode()
        .build()
        .toUri();
        
User user = new User("이름", "1234");

RequestEntity<User> requestEntity = RequestEntity
        .post(uri) // POST, GET 방식을 지정
        .header("X-Authorization", token) // 헤더에 담을 키-값
        .body(user);

// exchange 방식, RequestEntity , 매핑할 클래스
ResponseEntity<Dto> responseEntity = restTemplate.exchange(requestEntity, String.class);

return fromJSONtoDto(responseEntity.getBody());

public List<Dto> fromJSONtoDto(String responseEntity){
    JSONObject jsonObject = new JSONObject(responseEntity); // String의 정보를 담아서 JSON 형태로 다루기 위해
    JSONArray items = jsonObject.getJSONArray("배열을 담고 있는 키값 items"); // ex)items:[]
    List<Dto> dtoList = new ArrayList<>();
    
    for (Object item : items){
        Dto dto = new Dto((JSONObject) item); // JSONObject로 캐스팅
        dtoList.add(dto);
    }
    return dtoList;
}

 

응답을 보낼 서버 ▼

private final RestTemplateService restTemplateService;

public 클래스 이름(RestTemplateService restTemplateService){
    this.restTemplateService = restTemplateService;
}

// 요청에서 넘어온 query를 처리
@RequestParam("query") String query

// 요청에서 넘어온 {query}를 처리
@PathVariable String query

// 요청에서 넘어온 HEADER
@RequestHeader("X-Authorization") String token

 

간단하게 네이버 검색기능을 사용해 보자

 

만들고 싶은 서비스를 고려해서 사용하고 싶은 API를 가져와서 오기 전에

 

우선 API를 사용하기 전에 애플리케이션을 등록해야 한다.

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음

developers.naver.com

 

1. 상단에 Application에 애플리케이션 등록 클릭

2. 본인이 사용하고 싶은 API 선택 → 환경 추가 → URL 등록 

3. Client ID, Client Secret 키를 따로 저장해 놓기

 

RestTemplate exchange ▼

URI uri = UriComponentsBuilder
        .fromUriString("https://openapi.naver.com") // 기본 URL 설정
        .path("/v1/search/shop.json") // 네이버 검색 기능을 사용하기 위함
        .queryParam("display", 15) // 15개씩 가져올 것
        .queryParam("query", query)
        .encode()
        .build()
        .toUri();
        
RequestEntity<Void> requestEntity = RequestEntity
        .get(uri)
        .header("X-Naver-Client-Id", "{Client-Id}") // 발급받은 Client Id 키
        .header("X-Naver-Client-Secret", "{Client-Secret}")// 발급받은 Client Secret 키
        .build();
        
ResponseEntity responseEntity = restTemplate.exchange(requestEntity, String.class);

 

댓글수0