본문 바로가기
Back-end/나머지공부

[나머지공부] RestTemplate

by 잔디🌿 2024. 7. 24.

    멋사 프로젝트와 이번 카테캠 과제에 RestTemplate이 쓰여서 공부해보려고 한다.

     

    RestTemplate이란?

     

    SpringBoot에서 RestTemplate는 HTTP 클라이언트를 쉽게 사용할 수 있도록 도와주는 라이브러리이다.

     

    GET,POST,DELETE,PUT 등을 사용하고, 원격 서버와 동기식 방식으로 JSON, XML등 다양한 데이터형식으로 소통한다.

    동기식 방식으로 요청을 보내고 응답을 받을 때까지 블로킹되며, 요청과 응답이 완료되기 전까지 다음 코드로 진행되지 않는다.

    원격서버와 통신할 때에는 응답을 기다리는 동안 대기해야한다.

     

     

    위와 같은 방식으로 소통한다.

     

    RestTemplate 사용법

     

    (요청명)ForObject

     

    설정한 요청에 대한 결과를 객체로 반환한다. 

    예를 들면 getForObject(url,Object.class) 이렇게 하면 해당 Url을 Get형태로 보낸다. 

    이 때 리턴 타입은 Object이다.

    Employee employee = restTemplate.getForObject(BASE_URL + "/{id}", Employee.class);

     

    위와 같이 반환 객체를 바로 꺼낼 수 있다는 장점이 있다. 하지만 응답의 헤더 값은 보지 못한다.

    body, header등의 요청 본문은 지원하지 않는다.

     

    (요청명)ForEntity

     

    설정한 요청에 대한 결과를 ResponseEntity로 반환한다.

    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, DTO명.class);
    
        log.info("statusCode = " + responseEntity.getStatusCode());
    
        return responseEntity.getBody();
    }

     

    이런 식으로 url과 받을 dto명을 파라미터로 전달하면 이에 대한 응답이 ResponseEntity<해당 DTO>로 오게 된다.

    body, header등의 요청 본문은 지원하지 않는다.

     

    exchange

    body, header등의 요청 본문을 지원한다.

    이 때 PUT, DELETE 등은 따로 파라미터로 넣어줘야한다.

    결과는 ResponseEntity로 반환된다.

     

    var url = "https://kauth.kakao.com/oauth/token";
    
    var headers = new HttpHeaders();
    headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
    
    var body = new LinkedMultiValueMap<String, String>();
    body.add("grant_type", "authorization_code");
    body.add("client_id", client_id);
    body.add("redirect_uri", "http://localhost:8080");
    body.add("code", code); // authorizationCode 값을 여기 넣으세요
    
    var request = new RequestEntity<>(body, headers, HttpMethod.POST, URI.create(url));
    
    RestTemplate restTemplate = new RestTemplate();
    
    ResponseEntity<KakaoLoginResponse> response = restTemplate.exchange(request, KakaoLoginResponse.class);
    
    System.out.println("Response: " + response.getBody());
    System.out.println(response.getBody().access_token());

     

     

    위 코드에서는 헤더를 생성하였고, 이를 전달해야한다. 따라서 exchange를 사용하였다.

    여기서는 body, header, HttpMethod, url로 Request 객체를 따로 생성해서 보냈다.

     

     

     

    https://adjh54.tistory.com/234#4.%20RestTemplate%20Body%20%26%20Request%20Entity%20%EA%B5%AC%EC%84%B1-1

     

    [Java] Spring Boot Web 활용 : RestTemplate 이해하기

    해당 글에서는 RestTemplate에 대해 이해하고 활용 방법에 대해 확인해 봅니다. 1) RestTemplate 💡 RestTemplate - HTTP 통신을 위한 도구로 RESTful API 웹 서비스와의 상호작용을 쉽게 외부 도메인에서 데이터

    adjh54.tistory.com

     

    https://blog.naver.com/seek316/223334925643

     

    [Java] Spring Boot - RestTemplate 사용하기

    RestTemplate 개요 Spring Boot에서 RestTemplate은 HTTP 클라이언트를 쉽게 사용할 수 있도록 ...

    blog.naver.com

    https://velog.io/@whdrb2643/SPRING-RestTemplate

     

    [SPRING] RestTemplate

    RestTemplate의 대한 개념과 get Post exchange 사용 방법 정리

    velog.io

     

     

    'Back-end > 나머지공부' 카테고리의 다른 글

    [나머지공부] 테스트코드 작성법  (0) 2024.07.21
    [나머지공부] 어노테이션이란?  (1) 2024.04.03