일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- nodejs rabbitmq
- java 파티
- 자바 백준 팩토리얼 개수
- spring mongoTemplate
- Spring ipfs
- rabbitmq 싱글톤
- 안정해시
- spring mongodb
- java 1509
- java 백준 1509
- 자바 1676
- mongodb lookup
- 백준 2252 줄세우기
- Java Call By Refernce
- kotiln functional interface
- ipfs bean
- 백준 1504 java
- 백준 연결요소 자바
- go
- 익명 객체 @transactional
- spring mongodb switch
- java 1238
- kotiln const val
- ipfs singletone
- kotiln const
- java 팩토리얼 개수
- spring mongoTemplate switch
- 전략 패턴이란
- 백준 특정한 최단 경로
- javav 1676
Archives
- Today
- Total
공부 흔적남기기
Spring Dto와 서버와 클라이언트가 통신할 때의 값의 Type 본문
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
반응형
'web study > Spring' 카테고리의 다른 글
Spring으로 간단한 게시판 만들기 (0) | 2022.01.25 |
---|---|
Spring MVC 예제를 통한 이해 (0) | 2022.01.22 |
Spring JPA를 이용한 간단한 CRUD를 하면서 실수한 부분들 (0) | 2022.01.21 |
Spring 컨테이너에 빈 등록하는 2가지 방식 (0) | 2022.01.19 |
Spring 싱글톤 패턴 (0) | 2022.01.19 |