Server(Client)와 Server간의 통신
Spring에서 가장 많이 사용하는 'Rest Template'
package com.example.client.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.client.service.RestTemplateService;
@RestController
@RequestMapping("/api/client")
public class ApiController {
//@Autowired
private final RestTemplateService restTemplateService;
public ApiController(RestTemplateService restTemplateService) {
this.restTemplateService = restTemplateService;
}
@GetMapping("/hello")
public String getHello() {
return restTemplateService.hello();
}
}
package com.example.client.service;
import java.net.URI;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
@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();
//String result = restTemplate.getForObject(uri, String.class);
ResponseEntity<String> result = restTemplate.getForEntity(uri, String.class);
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
//return result;
return result.getBody();
};
}
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("/hello")
public String hello() {
return "hello server";
}
}
서버를 두대를 올린 후 !
package com.example.client.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.client.model.UserResponseDto;
import com.example.client.service.RestTemplateService;
@RestController
@RequestMapping("/api/client")
public class ApiController {
//@Autowired //옛날에는 Autowired를 사용했는데, 요즘엔 생성자 주입방식으로 아래와 같이 사용한다.
// default 생성자 = final
private final RestTemplateService restTemplateService;
public ApiController(RestTemplateService restTemplateService) {
this.restTemplateService = restTemplateService;
}
// 객체를 받아 전달 -> Dto 필요
@GetMapping("/hello")
public UserResponseDto getHello() {
return restTemplateService.hello();
}
}
package com.example.client.model;
import lombok.Data;
@Data
public class UserResponseDto {
private String name;
private int age;
}
package com.example.client.service;
import java.net.URI;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import com.example.client.model.UserResponseDto;
@Service
public class RestTemplateService {
// http://localhost/api/server/hello
//response
//public String hello() {
public UserResponseDto hello() {
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:9090")
.path("/api/server/hello")
.encode()
.build()
.toUri();
System.out.println(uri.toString());
RestTemplate restTemplate = new RestTemplate();
// 결과를 only string으로 받을거야!
//String result = restTemplate.getForObject(uri, String.class);
//(1) String 경우
//ResponseEntity<String> result = restTemplate.getForEntity(uri, String.class);
//(2) dto를 받은경우
ResponseEntity<UserResponseDto> result = restTemplate.getForEntity(uri, UserResponseDto.class);
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
//return result;
return result.getBody();
};
}
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.example.server.model.UserDto;
@RestController
@RequestMapping("/api/server")
public class ServerApiController {
@GetMapping("/hello")
//public String hello() {
public UserDto hello() {
UserDto user = new UserDto();
user.setName("ila");
user.setAge(31);
return user;
}
}
package com.example.server.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
//모든 매개변수 받음
@AllArgsConstructor
public class UserDto {
private String name;
private int age;
}
실행
아래의 2개의 스크립트만 수정하면 된다.
package com.example.client.service;
import java.net.URI;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import com.example.client.model.UserResponseDto;
@Service
public class RestTemplateService {
// http://localhost/api/server/hello
//response
//public String hello() {
public UserResponseDto hello() {
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:9090")
.path("/api/server/hello")
// client에서 queryParam에 값을 넣게 되는 경우
.queryParam("name","i am")
.queryParam("age","21")
.encode()
.build()
.toUri();
System.out.println(uri.toString());
RestTemplate restTemplate = new RestTemplate();
// 결과를 only string으로 받을거야!
//String result = restTemplate.getForObject(uri, String.class);
//(1) String 경우
//ResponseEntity<String> result = restTemplate.getForEntity(uri, String.class);
//(2) dto를 받은경우
ResponseEntity<UserResponseDto> result = restTemplate.getForEntity(uri, UserResponseDto.class);
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
//return result;
return result.getBody();
};
}
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.example.server.model.UserDto;
@RestController
@RequestMapping("/api/server")
public class ServerApiController {
@GetMapping("/hello")
// 전달된 값을 받아 사용할때!
public UserDto hello(@RequestParam String name, @RequestParam int age) {
UserDto user = new UserDto();
user.setName(name);
user.setAge(age);
return user;
}
}
서버 재 실행