코딩 기록들
[스프링 입문] 7.1 Server(Client) to Server 연결, Rest Template 사용 본문
지금까지는 서버 입장에서API를 제공하는 방법에 대해 학습.
이제부터는 우리의 서버가 client가 돼서 새로운 서버에게 요청하는 것에 대한것! (RestTemplate 활용)


// 요청을 받아줄 컨트롤러 패키지 만들기

getForEntity vs getForObject
1. getForEntity
- 반환의 형태가 response type을 지정해줘야 됨
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> result = restTemplate.getForEntity(uri, String.class);
System.out.println(result.getStatusCode()); //200 OK
System.out.println(result.getBody()); // hello server
return result.getBody();
2. getForObject (client가 돼서, client입장에서 호출하는것)
- response Entity 가 아닌, 우리가 지정한 타입(T)으로 받을 수 있음
- getForObject가 실행되는 순간이 client에서 http(서버)로 붙는 순간
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(uri, String.class);
return result;
< REST 템플릿을 통해 get 으로 통신하는 방법, url 컴포넌트 빌더를 가지고 주소 만드는 방법 예제 >
- 프로젝트를 client, server 2개로 만들어서 진행한다.
1. client 프로젝트

package com.example.client.controller;
import com.example.client.dto.UserResponse;
import com.example.client.service.RestTemplateService;
import org.apache.catalina.User;
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){
this.restTemplateService = restTemplateService;
}
@GetMapping("/hello")
public UserResponse getHello(){
RestTemplateService restTempLateService;
return restTempLateService.hello();
}
}
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 +
'}';
}
}
package com.example.client.service;
import com.example.client.dto.UserResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;
public class RestTemplateService {
// http://localhost/api/server/hello 로 호출을 해서
// response를 받아오는 과정
public UserResponse hello(){
// 주소만들기 - UriCoponentsBuilder
URI uri = UriComponentsBuilder
.fromUriString("http://localhost:9090")
.path("/api/server/hello")
.queryParam("name", "steve")
.queryParam("age", "10")
.encode() // 파라미터가 붙을경우 안정적으로 url인코딩을 해서 보내야됨
.build()
.toUri();
// 이걸 rest template이라는걸 통해서 통신을 할 것임
//주소가 잘 만들어졌는지 확인
System.out.println(uri.toString());
// RestTemplate restTemplate = new RestTemplate();
// String result = restTemplate.getForObject(uri, String.class);
// return result;
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<UserResponse> result = restTemplate.getForEntity(uri, String.class);
System.out.println(result.getStatusCode());
System.out.println(result.getBody());
return result.getBody();
}
}
2. server 프로젝트

-> application.properties 에 [ server.port = 9090 ] 적어준다
package com.example.server.controller;
import org.apache.catalina.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.setName(name);
user.setAge(age);
return user;
}
}
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;
}
'스프링 입문' 카테고리의 다른 글
[스프링 입문] 7. 네이버 지역검색 api 연동해보기 (1) | 2024.01.12 |
---|---|
[스프링 입문] 6.4 Filter - Intercepter 활용 (2) (1) | 2024.01.10 |
[스프링 입문] 6.3 Filter - Intercepter 활용 (1) (1) | 2024.01.10 |
[스프링 입문] 6.2 Spring Boot Custom Validation (0) | 2024.01.08 |
[스프링 입문] 6.1 Spring Boot Validation (1) | 2024.01.08 |