[SPRING:이론] 7 : RestTemplate

김승수·2024년 5월 27일
0

SPRING

목록 보기
7/27

⏰ 2024. 05. 27 월

✔ 스프링 이론 강의를 듣고 정리하면서 작성했습니다.

💡 목차

  1. RestTemplate 란?
  2. RestTemplate 사용 : 의존성 추가 및 RestTemplate을 주입
  3. RestTemplate GET 요청
  4. RestTemplate POST 요청
  5. RestTemplate exchange

RestTemplate 란?

  • RestTemplate은 Spring Framework에서 서버에서 다른서버로 간편하게 HTTP 요청하기 위해서 제공하는 클래스이다.
  • RestTemplate은 서버와 서버의 통신에 사용되며, RESTful 형식에 맞추어진 템플릿이다.

RestTemplate 사용 : 의존성 추가 및 RestTemplate을 주입

의존성 추가

implementation 'org.apache.httpcomponents:httpcore:4.4.15'
implementation 'org.apache.httpcomponents:httpclient:4.5.13'
  • Gradle 방식 의존성 추가

RestTemplate을 주입

private final RestTemplate restTemplate;

public RestTemplateService(RestTemplateBuilder builder) {		// #
    this.restTemplate = builder.build();
}
  • #: RestTemplateBuilder의 build() 메서드를 사용하여 RestTemplate을 생성

RestTemplate GET 요청

GET 요청

서버로 Request 하는 클라이언트 (➡)

public ItemDto getCallObject(String query) {
    // 요청 URL 만들기
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:7070")
            .path("/api/server/get-call-obj")
            .queryParam("query", query)
            .encode()
            .build()
            .toUri();

    ResponseEntity<ItemDto> responseEntity = restTemplate.getForEntity(uri, ItemDto.class);
    
    return responseEntity.getBody();
}
  • 요청 받은 검색어를 Query String 방식으로 Server 입장의 서버로 RestTemplate를 사용하여 요청
  • Spring의 UriComponentsBuilder를 사용해서 URI를 만듦
  • RestTemplate의 getForEntity는 Get 방식으로 해당 URI의 서버에 요청

클라이언트의 요청을 Response 하는 서버 (⬅)

public Item getCallObject(String query) {
    for (Item item : itemList) {
        if(item.getTitle().equals(query)) {
            return item;
        }
    }
    return null;
}
  • Server 입장의 서버에서 itemList를 조회하여 요청받은 검색어에 맞는 Item을 반환

RestTemplate Post 요청

POST 요청

서버로 Request 하는 클라이언트 (➡)

public ItemDto postCall(String query) {
    // 요청 URL 만들기
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:7070")
            .path("/api/server/post-call/{query}")
            .encode()
            .build()
            .expand(query)
            .toUri();

    User user = new User("Robbie", "1234");

    ResponseEntity<ItemDto> responseEntity = restTemplate.postForEntity(uri, user, ItemDto.class);

    return responseEntity.getBody();
}
  • 요청 받은 검색어를 Query String 방식으로 Server 입장의 서버로 RestTemplate를 사용하여 요청
  • UriComponentsBuilder의 expand를 사용하여 pathvariable의 {query} 값을 동적으로 처리
  • RestTemplate의 postForEntity는 Post 방식으로 해당 URI의 서버에 요청

클라이언트의 요청을 Response 하는 서버 (⬅)

public Item postCall(String query, UserRequestDto userRequestDto) {
    System.out.println("userRequestDto.getUsername() = " + userRequestDto.getUsername());
    System.out.println("userRequestDto.getPassword() = " + userRequestDto.getPassword());

    return getCallObject(query);
}
  • Server 입장의 서버에서 itemList를 조회하여 요청받은 검색어에 맞는 Item을 반환

RestTemplate exchange

RestTemplate exchange

  • RestTemplate으로 요청을 보낼 때 Header에 특정 정보를 같이 전달 하고 싶을 때, exchange 메서드 사용

서버로 Request 하는 클라이언트 (➡)

public List<ItemDto> exchangeCall(String token) {
    // 요청 URL 만들기
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:7070")
            .path("/api/server/exchange-call")
            .encode()
            .build()
            .toUri();

    User user = new User("Robbie", "1234");

    RequestEntity<User> requestEntity = RequestEntity
            .post(uri)
            .header("X-Authorization", token)
            .body(user);

    ResponseEntity<String> responseEntity = restTemplate.exchange(requestEntity, String.class);

    return fromJSONtoItems(responseEntity.getBody());
}
  • RestTemplate의 exchange를 사용
  • exchange 메서드의 첫 번째 파라미터에 RequestEntity 객체를 만들어 전달해주면 uri, header, body의 정보를 한번에 전달

클라이언트의 요청을 Response 하는 서버 (⬅)

public ItemResponseDto exchangeCall(String token, UserRequestDto requestDto) {
    System.out.println("token = " + token);
    System.out.println("requestDto.getUsername() = " + requestDto.getUsername());
    System.out.println("requestDto.getPassword() = " + requestDto.getPassword());

    return getCallList();
}
  • 전달된 header와 body의 정보를 확인 가능
profile
개발하는 미어캣

0개의 댓글