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