공부 흔적남기기

Spring Dto와 서버와 클라이언트가 통신할 때의 값의 Type 본문

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
반응형