본문 바로가기
Spring/Spring-detail

RestTemplate의 개념과 기본 사용법

by YoonJong 2023. 2. 26.
728x90

스프링에서 제공하는 HTTP 통신 기능을 쉽게 사용할 수 있게 설계되어 있는 템플릿입니다.

HTTP 서버와의 통신을 단순화하고 RESTful 원칙을 지킬수 있으며 동기 방식으로 처리됩니다.

REST 서비스를 호출하도록 설계되어 HTTP 프로토콜의 메소드에 맞게 여러 메소드를 제공합니다. 

 

+ 스프링 5.0 이후 부터는 WebClient 를 사용하기를 권장합니다.

https://tecoble.techcourse.co.kr/post/2021-07-25-resttemplate-webclient/

 

RestTemplate과 WebClient

이 글은 자바에서 HTTP 요청을 써봤거나 써보려고 하는 독자를 대상을 작성하였습니다. 스프링 어플리케이션에서 HTTP 요청할 때 사용하는 방법으로 RestTemplate과 WebClient가 있다. 스프링 5.0 이전까

tecoble.techcourse.co.kr

 

기본적인 예제를 작성해보겠습니다.

에제를 작성하는 환경은 port가 다른 환경인 2가지 서버가 필요합니다.

8080 과 8888 포트를 사용했습니다.

 

RestTemplate 설정

RestTemplate 은 org.springframework.web.client 패키지 안에 있으므로, gradle 에 web 이 추가되어 있다면 바로 사용할 수 있습니다.

 

1. String 기본 

UriComponentBuilder 를 사용하며, HTTP 통신을 할 uri 와 path 를 작성합니다.

new RestTemplate() 를 사용하며, 통신할 URI 가 get 요청이기 때문에 getForEntity를 사용합니다.

public String getName() {
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:8888")
            .path("/api/server/basic")
            .encode()
            .build()
            .toUri();

    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class);

    log.info("responseEntity.getStatusCode = {}", responseEntity.getStatusCode());
    log.info("responseEntity.getStatusCode = {}", responseEntity.getBody());

    return responseEntity.getBody();
}

 

2. DTO 관련

 

UriCompnentBuilder 를 사용해서 통신할 HTTP 정보를 작성합니다.

queryParam을 사용해서 값을 지정해줍니다.

@Data
public class MemberDto {

    private String name;
    private String email;
    private String organization;
}
public ResponseEntity<MemberTestDto> postDto(MemberTestDto memberTestDto) {
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:8888")
            .path("/api/server/dto")
            .queryParam("name", memberTestDto.getName())
            .queryParam("email", memberTestDto.getEmail())
            .queryParam("organization", memberTestDto.getOrganization())
            .encode()
            .build()
            .toUri();

    MemberTestDto dto = new MemberTestDto();
    dto.setName(memberTestDto.getName());
    dto.setEmail(memberTestDto.getEmail());
    dto.setOrganization(memberTestDto.getOrganization());
    log.info("name" + memberTestDto.getName());
    log.info("email" + memberTestDto.getEmail());
    log.info("organization" + memberTestDto.getOrganization());

    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<MemberTestDto> responseEntity = restTemplate.postForEntity(uri, dto, MemberTestDto.class);

    log.info("responseEntity.getStatusCode = {}", responseEntity.getStatusCode());
    log.info("responseEntity.getStatusCode = {}", responseEntity.getBody());

    return responseEntity;

}

 

3. Header 관련

Header 에 값을 지정하기 위해서는 RequestEntity 를 이용합니다.

post형식이므로 uri를 post 로 지정해주고

.header 를 통해 8888 포트의 @RequestHeader("header-input") 값을 name 에 지정해주고 값을 넣어줍니다.

.body를 통해서 입력받은 Dto 값을 넣어줍니다.

public ResponseEntity<MemberTestDto> addHeader(String header,
                                               MemberTestDto memberTestDto) {
    URI uri = UriComponentsBuilder
            .fromUriString("http://localhost:8888")
            .path("/api/server/add-header")
            .queryParam("name", memberTestDto.getName())
            .queryParam("email", memberTestDto.getEmail())
            .queryParam("organization", memberTestDto.getOrganization())
            .encode()
            .build()
            .toUri();

    RequestEntity<MemberTestDto> request = RequestEntity
            .post(uri)
            .header("header-input", header)
            .body(memberTestDto);

    log.info("header value = {}", header);
    log.info("name" + memberTestDto.getName());
    log.info("email" + memberTestDto.getEmail());
    log.info("organization" + memberTestDto.getOrganization());

    RestTemplate restTemplate = new RestTemplate();
    ResponseEntity<MemberTestDto> responseEntity =
            restTemplate.exchange(request, MemberTestDto.class);

    log.info("responseEntity.getStatusCode = {}", responseEntity.getStatusCode());
    log.info("responseEntity.getStatusCode = {}", responseEntity.getBody());

    return responseEntity;
}
728x90

댓글