코딩 기록들

[스프링 입문] 7.1 Server(Client) to Server 연결, Rest Template 사용 본문

스프링 입문

[스프링 입문] 7.1 Server(Client) to Server 연결, Rest Template 사용

코딩펭귄 2024. 1. 10. 21:05

지금까지는 서버 입장에서API를 제공하는 방법에 대해 학습.

 

이제부터는 우리의 서버가 client가 돼서 새로운 서버에게 요청하는 것에 대한것! (RestTemplate 활용)

 

이렇게 설정하고 실행하면,
8080으로 잘 실행되고있는것(서버 잘 뜸)을 확인할 수 있음

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

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;
}