Burninghering's Blog
article thumbnail
Published 2022. 6. 26. 05:58
Server to server - GET Spring

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
profile

Burninghering's Blog

@개발자 김혜린

안녕하세요! 반갑습니다.