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

Client 서버 만들기

server.port=8080

 

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

 

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으로 설정)

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

클라이언트에서 서버 호출하기


결과값 받는 방식을 바꿔보자

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 만들자

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.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로 바꿔준다
    }
}
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을 쓰고 있기 때문에 조금 더 간단하게 만들 수 있다.

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에서 요청이 들어오면

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메소드로 주고 받는다

 

 

만약 호출하는 주소 뒤에 파라미터가 붙는다면?

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

 

주소가 변경되었다

 

그럼 서버에서 받아서 다시 보내주기를 해보겠다..

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

@개발자 김혜린

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