모래블로그

[스프링] Spring RestTemplate 본문

Framework/Spring

[스프링] Spring RestTemplate

별모래 2023. 11. 22. 16:57
728x90

1. RestTemplate란

REST API 호출이후 응답을 받을 때까지 기다리는 동기 방식 으로,

 

스프링 3.0에서부터 지원하며 스프링에서 제공하는 http 통신에 유용하게 쓸 수 있는 템플릿이고,

REST 서비스를 호출하도록 설계되어 HTTP 프로토콜의 메서드 (GET, POST, DELETE, PUT)에 맞게 여러 메서드를 제공한다고 한다.

 

1) RestTemplate의 특징

  • HTTP 서버와의 통신을 단순화하고 RESTful 원칙을 지킨다.(json, xml을 쉽게 응답 받음)
  • 멀티쓰레드 방식을 사용한다.
  • blocking 방식 사용한다.1 요청 당 1 스레드가 할당 되며 각 스레드에서는 Blocking 방식으로 처리되기 때문에 응답이 올 때 까지 해당 스레드는 다른 요청에 할당 될 수 없다.

물론 block이 꼭 필요한 경우가 있겠지만 아무래도 성능적인 부분이나 병렬 방식의 많은 스레드는 과부하를 줄 수 있을 것이므로 최근에는 WebClient를 권고하는 추세라고 한다.

WebClient는 non-Blocking 이며 이 방식이 필요한 이유는 네트워킹의 병목 현상을 줄이고 성능을 향상 시킬 수 있기 때문이다. 또한 WebClient는 비동기, 동기 둘 다 지원 가능하기 때문에 훨씬 큰 장점이 된다.

 

 

아무튼 내가 맨 처음에 했던 것은 TMAP API를 사용하여 통합검색 적용해보기!

API 적용하는 법 구글링하다가 RestTemplate를 사용하여 하는 것을 발견했고, 이를 이용해서 아래 처럼 만들었다.
처음 테스트는 검색은 find 쪽이어서

findController에 작성했다.
(findController/ findDto/ findService/ findServiceImpl)
우리는 DB를 쓸 필요가 없어서 Dao는 생략!

폭풍 구글링을 한 결과

@GetMapping("/address")
    public String address() {
        System.out.println("지도 API 테스트");
        
    @Value("${TMAP_APPKEY}")
    private String tmap_apiKey; //티맵 API 앱키 설정

    @GetMapping("/find/address")
    public String tMapAPI() {
        URI uri = UriComponentsBuilder
                .fromUriString("https://apis.openapi.sk.com/")
                .path("tmap/pois")
                .queryParam("version", 1) //version은 1
                .queryParam("searchKeyword","스타벅스 부평점") //일단 스타벅스 부평점으로 검색
                .queryParam("count",1) // 1개만 출력
                .encode()
                .build()
                .toUri();

        RestTemplate restTemplate = new RestTemplate();

        //헤더를 넣기 위한 것
        RequestEntity<Void> req = RequestEntity
                .get(uri)
                .header("appKey", tmap_apiKey)
                .build();

        ResponseEntity<String> result = restTemplate.exchange(req, String.class);

        return result.getBody();
    }

물론 나중에는 FindServiceImpl로 옮겼다.😉

 

2. Gitignore 설정

티맵 앱키는 application.properties에 적어놨고, gitignore로 설정해놨다.

 

원래는,
application-api.properties를 새로 작성해서 거기에 api key들을 정리해두고 싶었는데,

.gitignore에
application-api.properties 도 적어보고,
resources.application-api.properties,
/src/main/resources/application-api.properties 등 경로까지 다 적어보고

application.properties에는
spring.profiles.include=api를 썼는데

gitignore 설정이 제대로 안된건지 깃허브에 그대로 올라가버리지 뭐야!😫 내 서비스키 노출이라니ㅠㅠ

찾아보니 spring.profiles.include 이게 지금 버전엔 적용이 안되는 걸로 바뀐 것 같아서 결국 저 applicaion-api.properties는 삭제하고, application.properties에 앱키들을 적용하고 저걸 gitignore로 설정하니까 됐다.😢

 

application.properties에는

#TMAP API
TMAP_APPKEY = 내 티맵 서비스키 

이렇게 쓰고,

.gitignore에

application.properties

만 적으면 끝이다..!

나의 .gitignore

 

참 쉬워.. 그냥 진작 이렇게 할걸! ㅠㅠ

그럼 applicaion.properties에 적은 서비스키는 어떻게 쓰느냐?

@Value("${앱키 변수명}")

이걸 이용하면 된다!

나는 application.properties에 TMAP_APPKEY 로 설정해둬서

@Value("${TMAP_APPKEY}")
private String tmap_apiKey;

라고 써뒀다.

아무튼 result.getBody 를 return 하니까 결과가 잘 나오더라🤭
api를 사용해서 결과를 받아와보니까 새롭고 신기했다.

 

 

REFERENCE🙇‍♀️

https://sangnamja-jh.tistory.com/30?category=898945

 

728x90