Client 입장 서버
- RestTemplate를 주입 받음
private final RestTemplate restTemplate; // RestTemplateBuilder의 build()를 사용하여 RestTemplate을 생성합니다. public RestTemplateService(RestTemplateBuilder builder) { this.restTemplate = builder.build(); }
- 요청 받은 검색어를 Query String 방식으로 Server 입장의 서버로 RestTemplate를 사용하여 요청
public ItemDto getCallObject(String query) { // 요청 URL 만들기 URI uri = UriComponentsBuilder .fromUriString("http://localhost:7070") .path("/api/server/get-call-obj") .queryParam("query", query) .encode() .build() .toUri(); log.info("uri = " + uri); ResponseEntity<ItemDto> responseEntity = restTemplate.getForEntity(uri, ItemDto.class); log.info("statusCode = " + responseEntity.getStatusCode()); return responseEntity.getBody(); }
Query String
Spring의 UriComponentsBuilder를 사용해서 URI를 손쉽게 만들 수 있음
restTemplate.getForEntity(URI, 전달 받은 데이터와 매핑하여 인스턴스화 할 클래스의 타입)
- Get 방식으로 해당 URI의 서버에 요청 진행
요청의 결과값에 대해서 직접 JSON TO Object를 구현할 필요 없이 RestTemplate을 사용하면 자동으로 처리 해줌
- 따라서
response.getBody()
를 사용하여 두 번째 파라미터로 전달한 클래스 타입으로 자동 변환된 객체를 가져올 수 있음
Server 입장 서버
- Server 입장의 서버에서 itemList를 조회하여 요청받은 검색어에 맞는 Item을 반환
public Item getCallObject(String query) { for (Item item : itemList) { if(item.getTitle().equals(query)) { return item; } } return null; }
Client 입장 서버
- Item List 조회
public List<ItemDto> getCallList() { // 요청 URL 만들기 URI uri = UriComponentsBuilder .fromUriString("http://localhost:7070") .path("/api/server/get-call-list") .encode() .build() .toUri(); log.info("uri = " + uri); ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri, String.class); log.info("statusCode = " + responseEntity.getStatusCode()); log.info("Body = " + responseEntity.getBody()); return fromJSONtoItems(responseEntity.getBody()); }
결과 값이 다중 JSON으로 넘어오기 때문에 JSON To Object를 사용하지 않고 일단 String 값 그대로 가져옴
Server 입장 서버의 ItemResponseDto는 아래의 JSON 형태로 변환되어 전달됨
JSON 처리를 도와주는 라이브러리를 추가하여 받아온 JSON 형태의 String을 처리
public List<ItemDto> fromJSONtoItems(String responseEntity) { JSONObject jsonObject = new JSONObject(responseEntity); JSONArray items = jsonObject.getJSONArray("items"); List<ItemDto> itemDtoList = new ArrayList<>(); for (Object item : items) { ItemDto itemDto = new ItemDto((JSONObject) item); itemDtoList.add(itemDto); } return itemDtoList; }
JSONObject, JSONArray 이해하기
문자열 정보를 JSONObject로 바꾸기
JSONObject jsonObject = new JSONObject(responseEntity);
JSONObject에서 items 배열 꺼내기
JSONArray items = jsonObject.getJSONArray("items");
JSONArray로 for문 돌면서 상품 하나씩 ItemDto로 변환하기
List<ItemDto> itemDtoList = new ArrayList<>(); for (Object item : items) { ItemDto itemDto = new ItemDto((JSONObject) item); itemDtoList.add(itemDto); }
JSONObject에서 ItemDto로 변환하기
this.title = itemJson.getString("title"); this.price = itemJson.getInt("price");
ItemDto에 받아온 JSONObject를 사용하여 초기화하는 생성자 추가
@Getter @NoArgsConstructor public class ItemDto { private String title; private int price; public ItemDto(JSONObject itemJson) { this.title = itemJson.getString("title"); this.price = itemJson.getInt("price"); } }
Server 입장의 서버
- Server 입장의 서버에서 itemList를 ItemResponseDto에 담아 반환
public ItemResponseDto getCallList() { ItemResponseDto responseDto = new ItemResponseDto(); for (Item item : itemList) { responseDto.setItems(item); } return responseDto; }