Spring
Spring 숙련 11 (RestTemplate & Open API)
sehunbang
2024. 1. 27. 20:47
RestTemplate이란 무엇일까?
Server To Server
서비스 개발을 진행하다보면
라이브러리 사용만으로는 구현이 힘든 기능들이 무수히 많이 존재합니다.
e.g 서비스에서 회원가입을 진행할 때 사용자의 주소를 받아야 한다면?
( 주소를 검색할 수 있는 기능을 구현해야하는데 직접 구현을 하게되면 많은 시간과 비용이 들어갑니다. )
카카오에서 만든 주소 검색 API를 사용한다면 해당 기능을 간편하게 구현할 수 있습니다.
우리의 서버는 Client의 입장이 되어 Kakao 서버에 요청을 진행해야합니다.
Spring에서는 서버에서 다른 서버로 간편하게 요청할 수 있도록 RestTemplate 기능을 제공하고 있습니다.
프로젝트 생성
Client Server 프로젝트 랑 Server Server 프로젝트를 만듭니다.

두 개의 프로젝트가 서버가 달라야 합니다.
Application.properties
server.port=7070
RestTemplate 사용방법
Client 입장의 서버는 8080
서버는 7070 port
Client 코드
1. controller
@RestController
@RequestMapping("/api/client")
public class RestTemplateController {
private final RestTemplateService restTemplateService;
public RestTemplateController(RestTemplateService restTemplateService) {
this.restTemplateService = restTemplateService;
}
@GetMapping("/get-call-obj")
public ItemDto getCallObject(String query) {
return restTemplateService.getCallObject(query);
}
@GetMapping("/get-call-list")
public List<ItemDto> getCallList() {
return restTemplateService.getCallList();
}
@GetMapping("/post-call")
public ItemDto postCall(String query) {
return restTemplateService.postCall(query);
}
@GetMapping("/exchange-call")
public List<ItemDto> exchangeCall(@RequestHeader("Authorization") String token) {
return restTemplateService.exchangeCall(token);
}
}
2. dto
@Getter
@NoArgsConstructor
public class ItemDto {
private String title;
private int price;
}
3. Entity 일반 클래스
@Getter
public class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
}
4.Service
@Slf4j
@Service
public class RestTemplateService {
public ItemDto getCallObject(String query) {
return null;
}
public List<ItemDto> getCallList() {
return null;
}
public ItemDto postCall(String query) {
return null;
}
public List<ItemDto> exchangeCall(String token) {
return null;
}
}
server 코드
Controller
@RestController
@RequestMapping("/api/server")
public class ItemController {
private final ItemService itemService;
public ItemController(ItemService itemService) {
this.itemService = itemService;
}
@GetMapping("/get-call-obj")
public Item getCallObject(@RequestParam String query) {
return itemService.getCallObject(query);
}
@GetMapping("/get-call-list")
public ItemResponseDto getCallList() {
return itemService.getCallList();
}
@PostMapping("/post-call/{query}")
public Item postCall(@PathVariable String query, @RequestBody UserRequestDto requestDto) {
return itemService.postCall(query, requestDto);
}
@PostMapping("/exchange-call")
public ItemResponseDto exchangeCall(@RequestHeader("X-Authorization") String token, @RequestBody UserRequestDto requestDto) {
return itemService.exchangeCall(token, requestDto);
}
}
dto
@Getter
public class ItemResponseDto {
private final List<Item> items = new ArrayList<>();
public void setItems(Item item) {
items.add(item);
}
}
@Getter
public class UserRequestDto {
private String username;
private String password;
}
entity
@Getter
public class Item {
private String title;
private int price;
public Item(String title, int price) {
this.title = title;
this.price = price;
}
}
Service
@Service
public class ItemService {
private final List<Item> itemList = Arrays.asList(
new Item("Mac", 3_888_000),
new Item("iPad", 1_230_000),
new Item("iPhone", 1_550_000),
new Item("Watch", 450_000),
new Item("AirPods", 350_000)
);
public Item getCallObject(String query) {
return null;
}
public ItemResponseDto getCallList() {
return null;
}
public Item postCall(String query, UserRequestDto requestDto) {
return null;
}
public ItemResponseDto exchangeCall(String token, UserRequestDto requestDto) {
return null;
}
}