Client 서버 만들기
<code />
server.port=8080
<java />
package com.example.client.controller;
import com.example.client.service.RestTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/client")
public class ApiController {
// @Autowired
// private RestTemplateService restTemplateService; 생성자 주입받는 방식이 아래와 같이 바뀌었음
private final RestTemplateService restTemplateService;
public ApiController(RestTemplateService restTemplateService) { //Autowired에서 alt+enter누르면 스프링이 자동으로 생성자 주입해줌
this.restTemplateService = restTemplateService;
}
@GetMapping("/hello")
public String getHello(){
return restTemplateService.hello(); //서버 호출해서 응답 받는 코드! (restTemplateService.hello()을 호출한다->RestTemplateService.java)
}
}
<java />
package com.example.client.service;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;
@Service
public class RestTemplateService {
//http://localhost/api/server/hello
//response
public String hello(){
URI uri = UriComponentsBuilder //주소를 만들 때 사용하는 함수
.fromUriString("http://localhost:9090") //호출할 주소
.path("/api/server/hello") //우리가 원하는 주소
.encode() //파라미터가 붙을 때 안정적으로 URI를 보내기 위해서 엔코딩함
.build()
.toUri(); //URI 리턴함
//즉, server 프로젝트를 호출한 것임
System.out.println(uri.toString());
RestTemplate restTemplate = new RestTemplate(); //http메소드를 전부 지원함
String result=restTemplate.getForObject(uri,String.class); //http method <get> -> 오브젝트 형태로 가져오겠다
return result;
}
}
server 만들기
(port 번호 9090으로 설정)
<java />
package com.example.server.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/server")
public class ServerApiController {
@GetMapping("")
public String hello(){ //String 형태로 client에 리턴할 것
return "hello server!";
}
}
클라이언트에서 서버 호출하기

결과값 받는 방식을 바꿔보자
<code />
package com.example.client.service;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;
@Service
public class RestTemplateService {
//http://localhost/api/server/hello
//response
public String hello(){
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:9090")
.path("/api/server/hello")
.encode()
.build()
.toUri();
System.out.println(uri.toString());
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> result = restTemplate.getForEntity(uri,String.class); //ResponseEntity로 받을 것이고 데이터 타입은 String으로 받을 것이다
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
return result.getBody();
}
}


json 형태는 어떻게 받을것인가? 가 궁극적인 목표
형태를 먼저 정의하자!
(서버가 이런 식으로 데이터를 줄 거야)

그러면 우리는 받을 준비를 한다
클래스를 정의하자
client, 받는 쪽에서 response를 정의할 것이기 때문에
dto 만들자
<code />
package com.example.client.dto;
public class UserResponse {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "UserResponse{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
<code />
package com.example.client.service;
import com.example.client.dto.UserResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;
@Service
public class RestTemplateService {
//http://localhost/api/server/hello
//response
public UserResponse hello(){
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:9090")
.path("/api/server/hello")
.encode()
.build()
.toUri();
System.out.println(uri.toString());
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<UserResponse> result = restTemplate.getForEntity(uri,UserResponse.class); //ResponseEntity로 받을 것이고 데이터 타입은 String으로 받을 것이다
// UserResponse result = ... 로 받아도 되지만, 헤더 내용을 알아야 하니까 ResponseEntity를 추천한다
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
return result.getBody(); //getBody()를 리턴하게 되니, 클래스 리턴 타입도 UserResponse로 바꿔준다
}
}
<code />
package com.example.client.controller;
import com.example.client.dto.UserResponse;
import com.example.client.service.RestTemplateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/client")
public class ApiController {
private final RestTemplateService restTemplateService;
public ApiController(RestTemplateService restTemplateService) {
this.restTemplateService = restTemplateService;
}
@GetMapping("/hello")
public UserResponse getHello(){ //컨트롤러에서도 리턴 타입을 UserResponse로 바꿔주자
return restTemplateService.hello();
}
}
클라이언트는 준비가 되었다!
그러면 서버에서도 그에 맞게 데이터를 제공해야 한다.
서버는 lombok을 쓰고 있기 때문에 조금 더 간단하게 만들 수 있다.
<code />
package com.example.server.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private String name;
private int age;
}
위 dto로 response를 내려주기만 하면 된다
api controller에서 요청이 들어오면
<code />
package com.example.server.controller;
import com.example.server.dto.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/server")
public class ServerApiController {
@GetMapping("/hello")
public User hello(){
User user = new User();
user.setAge(10);
user.setName("steve");
return user;
}
}
이렇게 하면

위와 같이 데이터의 형태가 만들어질 것이다.
이런 데이터를 내려줬을 때
client측에서 데이터를 파싱하기 위해서는
RestTemplate에서 getForEntity로 처리 가능
두 서버 다시 실행


어떠한 서버가 어떠한 형식의 data를 준다 라고 내용이 정해지면
json 표준 규격을 보고 클래스를 작성한다
그러고 나서 RestTemplate으로 데이터를 get/post 등등 http메소드로 주고 받는다
만약 호출하는 주소 뒤에 파라미터가 붙는다면?
<code />
package com.example.client.service;
import com.example.client.dto.UserResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;
@Service
public class RestTemplateService {
//http://localhost/api/server/hello
//response
public UserResponse hello(){
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:9090")
.path("/api/server/hello")
.queryParam("name","steve")
.queryParam("age",10)
.encode()
.build()
.toUri();
System.out.println(uri.toString());
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<UserResponse> result = restTemplate.getForEntity(uri,UserResponse.class);
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
return result.getBody();
}
}

주소가 변경되었다
그럼 서버에서 받아서 다시 보내주기를 해보겠다..
<code />
package com.example.server.controller;
import com.example.server.dto.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/server")
public class ServerApiController {
@GetMapping("/hello")
public User hello(@RequestParam String name, @RequestParam int age){
User user = new User();
user.setAge(age); //echo 방식으로 동작할 것이기 때문에 age, name 넣자
user.setName(name);
return user;
}
}
<java />
package com.example.client.service;
import com.example.client.dto.UserResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;
@Service
public class RestTemplateService {
//http://localhost/api/server/hello
//response
public UserResponse hello(){
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:9090")
.path("/api/server/hello")
.queryParam("name","Hyerin")
.queryParam("age",26)
.encode()
.build()
.toUri();
System.out.println(uri.toString());
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<UserResponse> result = restTemplate.getForEntity(uri,UserResponse.class);
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
return result.getBody();
}
}
결과


오늘은 RestTemplate으로 get 통신 하는 방법.
UriComponentBuilder로 주소를 만드는 방법을 알아보았다..
'Spring' 카테고리의 다른 글
Server to server - header (0) | 2022.07.16 |
---|---|
Server to server - POST (0) | 2022.06.27 |
Spring Boot - Interceptor (0) | 2022.06.20 |
Spring boot - Filter (0) | 2022.06.18 |
Spring - DTO를 사용하는 이유 (0) | 2022.06.16 |