Spring의 RestTemplate 이해하기

2024. 8. 17. 14:17·Spring
728x90
반응형

 

 

RestTemplate

 

예시로 회원 가입 시 사용자의 주소를 받아와야 할 때 이 부분을 직접 구현하지 않고 이미 만들어져 있는 API를 사용하면 해당 기능을 간편하게 구현 할 수 있다. 이렇게 서버에서 다른 서버로 간편하게 요청할 수 있도록 Spring에서는 RestTemplate 기능을 제공한다.

 

 

💭 Client의 서버 포트 번호는 8080, Server의 서버 포트 번호를 7070으로 가정해 놓았을 때

RestTemplate Get 요청 알아보기

 

Client 입장

private final RestTemplate restTemplate;

// RestTemplateBuilder의 build()를 사용하여 RestTemplate을 생성합니다.
public RestTemplateService(RestTemplateBuilder builder) {
    this.restTemplate = builder.build();
}

 

RestTemplate를 주입 받는다.

 

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();
    log.info("uri = " + uri);

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

    log.info("statusCode = " + responseEntity.getStatusCode());

    return responseEntity.getBody();
}

 

요청 받은 검색어를 Query String 방식으로 Server의 서버로 RestTemplate를 사용하여 요청한다.

Spring의 UriComponentBuilder를 사용해서 URI를 쉽게 만들 수 있다. RestTemplate의 getForEntity는 Get 방식으로 해당 URI의 서버에 요청을 진행 한다. 첫번째 파라미터에는 URI,  두번째 파라미터에는 전달 받은 데이터와 매핑하여 인스턴스화할 클래스의 타입을 넣어준다.

요청의 결과값에 대해서 직접 JSON to Object를 구현할 필요없이 RestTemplate을 사용하면 자동으로 처리해준다. 따라서 response.getBody( )를 사용하여 두번째 파라미터로 전달한 클래스 타입으로 자동 변환된 객체를 가져올 수 있다.

 

Server 입장

public Item getCallObject(String query) {
    for (Item item : itemList) {
        if(item.getTitle().equals(query)) {
            return item;
        }
    }
    return null;
}

 

Server 입장에서는 itemList를 조회하여 요청받은 검색어에 맞는 Item을 반환한다.

 

RestTemplate POST 요청 알아보기

Client 입장

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

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

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

    log.info("statusCode = " + responseEntity.getStatusCode());

    return responseEntity.getBody();
}

 

UriComponentBuilder의 expand를 사용하여 {query} 안의 값을 동적으로 처리 할 수 있다.

RestTemplate의 postForEntity는 Post 방식으로 해당 URI의 서버에 요청을 진행 할 수 있다. 첫번째 파라미터에는 URI, 두번째 파라미터에는 HTTP Body에 넣어줄 데이터를 넣는다. Java 객체를 두번째 파라미터에 넣으면 자동으로 JSON 형태로 변환된다. 세번째 파라미터에는 전달 받은 데이터와 매핑하여 인스턴스화 할 클래스의 타입을 넣어준다.

 

Server 입장

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

    return getCallObject(query);
}

 

전달 받은 HTTP Body의 User 데이터를 확인

 

RestTemplate exchange

RestTemplate으로 요청을 보낼 때 Header에 특정 정보 추가하는 법 > exchange 사용

 

Client 입장

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

    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());
}

 

exchange 메소드의 첫번째 파라미터에 RequestEntity 객체를 만들어 전달해주면 uri, header, body의 정보를 한번에 전달 할 수 있다.

 

Server 입장

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의 정보를 확인 할 수 있다.

 

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Spring' 카테고리의 다른 글

서비스 디스커버리 Eureka 서버 이해하기 및 실습  (0) 2024.08.17
MSA와 Spring Cloud 이해하기  (0) 2024.08.17
Spring 데이터 검증 (Validation)하기  (0) 2024.08.17
Spring Security 접근 불가 페이지 만들기  (0) 2024.08.17
Spring Security 프레임워크 이해하기  (0) 2024.08.16
'Spring' 카테고리의 다른 글
  • 서비스 디스커버리 Eureka 서버 이해하기 및 실습
  • MSA와 Spring Cloud 이해하기
  • Spring 데이터 검증 (Validation)하기
  • Spring Security 접근 불가 페이지 만들기
waVwe
waVwe
    반응형
  • waVwe
    waVwe 개발 블로그
    waVwe
  • 전체
    오늘
    어제
    • ALL (184)
      • Python (1)
      • Spring (15)
      • DevOps (10)
      • Git (6)
      • JAVA (4)
      • C (22)
      • 코테 문제 풀이 (124)
        • 프로그래머스 (43)
        • 백준 (2)
        • 정올 (64)
        • SW Expert Academy (1)
        • 온코더 oncoder (14)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

    • 🐙 Github
  • 공지사항

  • 인기 글

  • 태그

    자료구조
    내일배움캠프
    스파르타코딩클럽
    프로그래머스
    스프링
    while문
    이진트리
    알고리즘
    연결리스트
    progate
    C언어
    Til
    CI/CD
    C
    스프링부트
    devops
    정올
    도커
    온코더
    깃헙
    docker
    아파치카프카
    springboot
    코테
    스파르타코딩
    형변환
    자바
    깃
    java
    MSA
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
waVwe
Spring의 RestTemplate 이해하기
상단으로

티스토리툴바