web study/Spring
Spring Dto와 서버와 클라이언트가 통신할 때의 값의 Type
65살까지 코딩
2022. 1. 22. 16:18
728x90
반응형
먼저 다음과 같이 네이버 API를 통해서 값을 받아왔을 때 어떻게 처리해야하는지 살펴보자
import com.sparta.week4.domain.ItemDto;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;
@Component
public class NaverShopSearch {
public String search(String query) {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "EUfNVMV_fUnsAr8cNe2C");
headers.add("X-Naver-Client-Secret", "EoL9wlu6YN");
String body = "";
HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query="+query, HttpMethod.GET, requestEntity, String.class);
HttpStatus httpStatus = responseEntity.getStatusCode();
int status = httpStatus.value();
String response = responseEntity.getBody();
System.out.println("Response status: " + status);
return response;
}
public List<ItemDto> fromJSONtoItems(String result){
JSONObject rjson = new JSONObject(result); //String을 JSON OBJECT로 바꿔줌
JSONArray items = rjson.getJSONArray("items"); //JSON에서의 item값을 배열로 바꿔줌
List<ItemDto> itemDtoList = new ArrayList<>(); //배열을 돌면서 값들을 JSON 형태로 바꿔주고
for(int i=0; i<items.length(); i++){
JSONObject itemJson = items.getJSONObject(i);
ItemDto itemDto = new ItemDto(itemJson); //DTO를 만들어 DTO 배열에 넣어줌줌
itemDtoList.add(itemDto);
}
return itemDtoList;
}
}
네이버 API에 요청을할떄 JSON방식으로 요청을 하였기 때문에 JSON방식으로 데이터가 넘어오는데 이 떄 서버에서 통신할 때에는 항상 String 값으로 넘어오게 되어있다. 그래서 JSONObject rjosn = new JSONObject(result)를 통해서 String에서 JSON형태로 바꿔주었다. Json형태에서 item에 해당하는 부분을 JSONArray itmes = rjson.getJSONArray("items")를 통해 꺼내주고 JSONArray이인 items에서 반복문을 돌려서 JSONObect를 꺼내서 itemDto를 만들어준다음에 리스트에 저장한다.
즉 변화과정을 보면 String -> JsonObject -> JsonArray -> JsonObject-> ItemDto이다.
public ItemDto(JSONObject itemJson) {
this.title = itemJson.getString("title");
this.image = itemJson.getString("image");
this.lprice = itemJson.getInt("lprice");
this.link = itemJson.getString("link");
}
ItemDto는 이러한 생성자가 있어 JSONObject를 받을 수 있다.
@GetMapping("/api/search")
public List<ItemDto> getItems(@RequestParam String query){
String resultString = naverShopSearch.search(query);
return naverShopSearch.fromJSONtoItems(resultString);
}
보면 리턴의 형태가 List<ItemDto>인데 ajax에서는 JSON 형태로 값을 받는다... Spirng Web의 기능떄문인 것 같다.
function addProduct(itemDto) {
$.ajax({
type: "POST",
url: "/api/products",
data:JSON.stringify(itemDto),
contentType: "application/json",
success : function (response){
$('#container').addClass('active');
targetId = response.id;
}
})
}
위코드는 컨트롤러에 JSONObject를 스트링형태로 날린다.
@PostMapping("/api/products")
public Product createProduct(@RequestBody ProductRequestDto requestDto){
Product product = new Product(requestDto);
return productRepository.save(product);
}
여기서 값을 받는데 contentType이 JSON이었기 떄문에 String을 JSON형태로 까서 requestDto로 들어와서 product로 바뀐다음에 DB로 저장되는 것 같은데 itemDto라는 JSON Object가 어떻게 requestDto의 값으로 들어올 수 있는걸까??
찾아보니 @RestController의 힘인 것 같다. @RestController는 객체를 알맞게 JSON형태로 바꾸어 저장하거나 보낼 수 있다고 한다!
728x90
반응형