[Spring RestTemplate] postForEntity를 사용한 post전송

[Spring RestTemplate] postForEntity를 사용한 post전송

공부는 커뮤니케이션이다.

원석💎 2019. 9. 14. 15:31

포스팅 이유

기본적으로 Java포르젝트에는 HttpURLConnection객체가 있어서 직접 connection맺고 disconnection하며 통신을 하고 있었다. 그런데 Java의 기본 HttpURLConnection객체를 사용하면 프로젝트 보안검수(?) 시에 문제점이 발생한다. 그래서 Apache HttpClient가 생산성과 보안상 좋다는 말을 듣고 프로젝트에 일부(post, delete, put Method)는 Apache HttpClient를 도입해서 사용하고 있고 일부(Get Method)는 RestTemplate를 사용하고 있었다.

표준소스를 Apache HttpClient와 RestTemplate를 짬뽕해서 사용하는 이유와 장단점을 파악하기 위해 RestTemplate를 천천히 뜯어보려고 한다.

먼저 Post방식으로 보내는 방법을 시도해 보려고한다.

-------------------------

Post 방식으로 전송을 위한 시도

RestTemplate의 메소드가 getForEntity니까 postForEntity로 바꿔주면 되겠지?

당연히 Post에 Request Parameter가 없으니까 에러가 나겠지?

간단히 String 타입의 kwd변수에 abc를 넣고 전송해보자.

하지만 kwd는 전송 되지 않는다.

메소드의 변수를 봐도 Object객체를 받기 때문에 타입을 유추할 수 없다.

심지어 Nullable이라 null값도 받을 수 있다.

Map 객체에 담아서 던져보자!

Java 객체를 새로 만들어서 던져보자!

안됨......

postForEntity를 따라가보자

postForEntity메소드에 들어오면 Callback패턴을 만날 수 있다.

Callback을 따라 들어가면 request 변수가 requestBody 변수로 변경되고 Object였던 requestBody는 HttpEntity객체에 캐스팅 되거나 생성자의 변수로 넘어간다.

여차저차 해서 마지막에 가보면 HttpEntity객체의 requestBody를 끄집어 내어 getClass()로 Class형식을 뽑아 MessageConverter가 변환 시킬 수 있는 Class형식인지 확인한다.

결론, MessageConverter가 쓸수 있는 Class형식이 아니면 전송이 되지 않는다.

-------------------------

Post 방식 전송 예제

//Spring 4.3이상 @RestController public class HttpController{ //Test용 @PostMapping("ajax/post") public String postTest(@RequestParam(value="kwd", required=false, defaultValue="0") String parameter) { return parameter; } @GetMapping("ajax/postTest") public void post() { MultiValueMap parameters = new LinkedMultiValueMap<>(); parameters.add("kwd", "test"); //Test용 로컬 주소 String url = "http://localhost:8080/ajax/post"; ResponseEntity res = new RestTemplate().postForEntity(url, parameters, String.class); System.out.println(res.getBody()); System.out.println(res.getStatusCodeValue()); } }

소스코드:

https://github.com/sowen2819/SPRING/blob/master/http/httpBootTest/src/main/java/com/example/demo/HttpController.java

-------------------------

질문

1) 14개의 MessageConverter가 있던데 MultiValueMap이외에는 전송되지 않는다. 이유가 무엇일까?

2) 기본적으로 SpringTemplate는 java의 HttpURLConnection을 사용한다고 한다. 서버 환경에서 Connection Pool 관리가 안되면 실무 프로젝트에 적용할 수 없다. 해결방안은?

3) Youtube의 OAuth 2의 경우 accessToken을 파라미터로 넘길 수 있지만 FCM OAuth 2의 경우에는 Header의 Authorization에 accessToken을 넣어 보내야한다. Header를 보내는 방법은?

-------------------------

기타

사용 기술 : Spring-web ( 4.3.24 RELEASE, 5.1.9 RELEASE ), Spring Boot 2.1.8, Java 8

참고 : https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html

참고 : https://docs.spring.io/spring/docs/5.1.0.RC1/spring-framework-reference/integration.html#rest-client-access

참고 : https://stackoverflow.com/questions/38372422/how-to-post-form-data-with-spring-resttemplate

참고 : https://sjh836.tistory.com/141

from http://sosimhan-dev.tistory.com/3 by ccl(S)

댓글

이 블로그의 인기 게시물

[Linux] 파일 로그 보기(tail)

[샤니마스 SPRING PARTY2020] THE IDOLM @ STER SHINY COLORS SPRING...

2020 LCK 롤챔스 Spring 경기 재개 및 일정