Springboot

[Springboot] 38. Server to Server란?

Song hyun 2024. 8. 14. 11:23
728x90
반응형

[Springboot] 38. Server to Server란?

 

1. Server to Server란?

 

2. Rest Template의 대표적인 메서드들

 

3. Server to Server 사용해보기

(1) 새로운 Spring Starter Project 만들기

 

 

(2) HomeController.java

package com.example.demo.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import lombok.extern.slf4j.Slf4j;

// @RestController = @Controller + @ResponseBody
@RestController // IoC 대상
@Slf4j // 비동기 방식으로 사용된다.
public class HomeController {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	// 주소 설계 : http://localhost:8080/m-todos/${id}
	// 테스트 주소: http://localhost:8080/m-todos/10
	@GetMapping("/m-todos/{id}")
	public ResponseEntity<?> restTest1(@PathVariable(name="id")Integer id) {
		// 1,2,User... -> 뭘로 할지 못정하겠어~
		// => 와일드 카드!
		
		// 1. 데이터 추출 확인
		System.out.println("id : "+id);		
		return ResponseEntity.status(HttpStatus.OK).body("반가워~");
	}
	

}

 

 

(3)  jsonPlacHolder - todos 받아오기

package com.example.demo.controller;

import java.net.URI;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

import lombok.extern.slf4j.Slf4j;

// @RestController = @Controller + @ResponseBody
@RestController // IoC 대상
@Slf4j // 비동기 방식으로 사용된다.
public class HomeController {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	// 주소 설계 : http://localhost:8080/m-todos/${id}
	// 테스트 주소: http://localhost:8080/m-todos/10
	@GetMapping("/m-todos/{id}")
	public ResponseEntity<?> restTest1(@PathVariable(name="id")Integer id) {
		// 1,2,User... -> 뭘로 할지 못정하겠어~
		// => 와일드 카드!
		
		// 1. 데이터 추출 확인
		System.out.println("id : "+id);		
		
		// RestTemplate 사용법
		// 1. URL 객체를 설정한다.
		URI uri = UriComponentsBuilder
				.fromUriString("https://jsonplaceholder.typicode.com/")
				.path("/todos")
				.path("/"+id)
				.build()
				.toUri();
				
		// 2.
		RestTemplate restTemplate1 = new RestTemplate();
		ResponseEntity<String> response = restTemplate1.getForEntity(uri, String.class);
		System.out.println(response.getHeaders());
		System.out.println("--------------------------");
		System.out.println(response.getBody());
		
		
		return response;
	}
	

}

 

 

package com.example.demo.controller;

import java.net.URI;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

import lombok.extern.slf4j.Slf4j;

// @RestController = @Controller + @ResponseBody
@RestController // IoC 대상
@Slf4j // 비동기 방식으로 사용된다.
public class HomeController {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	// 주소 설계 : http://localhost:8080/m-todos/${id}
	// 테스트 주소: http://localhost:8080/m-todos/10
	@GetMapping("/m-todos/{id}")
	public ResponseEntity<?> restTest1(@PathVariable(name="id")Integer id) {
		// 1,2,User... -> 뭘로 할지 못정하겠어~
		// => 와일드 카드!
		
		// 1. 데이터 추출 확인
		System.out.println("id : "+id);		
		
		// RestTemplate 사용법
		// 1. URL 객체를 설정한다.
		URI uri = UriComponentsBuilder
				.fromUriString("https://jsonplaceholder.typicode.com/")
				.path("/todos")
				.path("/"+id)
				.build()
				.toUri();
				
		// 2.
		RestTemplate restTemplate1 = new RestTemplate();
		ResponseEntity<String> response = restTemplate1.getForEntity(uri, String.class);
		System.out.println(response.getHeaders());
		System.out.println("--------------------------");
		System.out.println(response.getBody());
		
		
		return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response.getBody());
	}
	

}

 

 

(4) Todo 모델링하기

-TodoDTO.java

package com.example.demo.DTO;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Builder
public class TodoDTO {
	
	private Integer userId;
	private Integer id;
	private String title;
	private boolean completed;

}

 

 

(5) json을 다른 데이터타입으로 반환받기

package com.example.demo.controller;

import java.net.URI;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

import com.example.demo.DTO.TodoDTO;

import lombok.extern.slf4j.Slf4j;

// @RestController = @Controller + @ResponseBody
@RestController // IoC 대상
@Slf4j // 비동기 방식으로 사용된다.
public class HomeController {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
//	// 주소 설계 : http://localhost:8080/m-todos/${id}
//	// 테스트 주소: http://localhost:8080/m-todos/10
//	@GetMapping("/m-todos/{id}")
//	public ResponseEntity<?> restTest1(@PathVariable(name="id")Integer id) {
//		// 1,2,User... -> 뭘로 할지 못정하겠어~
//		// => 와일드 카드!
//		
//		// 1. 데이터 추출 확인
//		System.out.println("id : "+id);		
//		
//		// RestTemplate 사용법
//		// 1. URL 객체를 설정한다.
//		URI uri = UriComponentsBuilder
//				.fromUriString("https://jsonplaceholder.typicode.com/")
//				.path("/todos")
//				.path("/"+id)
//				.build()
//				.toUri();
//				
//		// 2.
//		RestTemplate restTemplate1 = new RestTemplate();
//		ResponseEntity<String> response = restTemplate1.getForEntity(uri, String.class);
//		System.out.println(response.getHeaders());
//		System.out.println("--------------------------");
//		System.out.println(response.getBody());
//		
//		
//		return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response.getBody());
//	}
	
	@GetMapping("/m-todos/{id}")
	public ResponseEntity<TodoDTO> restTest1(@PathVariable(name="id")Integer id) {
		// 1,2,User... -> 뭘로 할지 못정하겠어~
		// => 와일드 카드!
		
		// 1. 데이터 추출 확인
		System.out.println("id : "+id);		
		
		// RestTemplate 사용법
		// 1. URL 객체를 설정한다.
		URI uri = UriComponentsBuilder
				.fromUriString("https://jsonplaceholder.typicode.com/")
				.path("/todos")
				.path("/"+id)
				.build()
				.toUri();
				
		// 2.
		RestTemplate restTemplate1 = new RestTemplate();
		ResponseEntity<TodoDTO> response = restTemplate1.getForEntity(uri, TodoDTO.class);
		System.out.println(response.getHeaders());
		System.out.println("--------------------------");
		System.out.println(response.getBody());
		
		System.out.println(response.getBody().toString());
		
		
		return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response.getBody());
	}
	
	// 주소 설계: http://localhost:8080/exchange-test
	@GetMapping("/exchange-test")
	public ResponseEntity<?> restChangeTest() {
		
		// 여기 주소는 리소스 서버 주소 설정을 해야 한다.
		URI uri = UriComponentsBuilder
				.fromUriString("https://jsonplaceholder.typicode.com/")
				.path("/posts").build().toUri();
		
		// 2. 객체 생성
		RestTemplate restTemplate1 = new RestTemplate();
		// HTTP 메세지 Header 생성하기
		// exchange 메서드 활용
		
		// 1. 헤더 구성
		HttpHeaders headers = new HttpHeaders();
		// 'Content-type': 'application/json; charset=UTF-8'
		headers.add("Content-type", "application/json; charset=UTF-8");
		
		// 2. 바디 구성
		MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
		params.add("title", "안녕, 반가워");
		params.add("body", "후미진 어느 언덕에서 도시락 먹기");
		params.add("userId", "11");
		
		// 3. 헤더와 바디 결합 --> HttpEntity라는 Object가 받는다.
		HttpEntity<MultiValueMap<String,String>> requestEntity
		= new HttpEntity<>(params,headers);
		
		// 4. RestTemplate을 활용해서 HTTP 통신 요청
		ResponseEntity<String> response = restTemplate1.exchange(uri, HttpMethod.POST, requestEntity,String.class);
		System.out.println("response Header : "+response.getHeaders());
		System.out.println("response Body : "+response.getBody());
		
		return ResponseEntity.status(HttpStatus.CREATED).body(response.getBody());
	}
	

}
728x90
반응형