배운 것
API 이용해보기
프로젝트를 수행하면서 스프링 3계층(Controller, Service, Repo) 숙달
서버 - 클라이언트 통신 프로세스 익히기
내용 정리
API 이용해보기
네이버 쇼핑 API를 이용 신청해보고, 이용해보았다.
ARC로 테스트 해보고,
자바코드로 변환해서 자바로도 API를 테스트해보았다.
public class NaverShopSearch {
public String search() {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "발급받은 Client ID");
headers.add("X-Naver-Client-Secret", "발급받은 Client Secret");
String body = "";
HttpEntity<String> requestEntity = new HttpEntity<String>(body, headers);
ResponseEntity<String> responseEntity = rest.exchange("https://openapi.naver.com/v1/search/shop.json?query=아이맥", HttpMethod.GET, requestEntity, String.class);
HttpStatus httpStatus = responseEntity.getStatusCode();
int status = httpStatus.value();
String response = responseEntity.getBody();
System.out.println("Response status: " + status);
System.out.println(response);
return response;
}
public static void main(String[] args) {
NaverShopSearch naverShopSearch = new NaverShopSearch();
naverShopSearch.search();
}
}
아이맥에 대해 검색
자바코드로 변환된 네이버 검색 API를 웹서비스에 이용할 수 있다.
그러기 위해선, 필요한 작업이 2가지가 있다.
1. 검색어는 사용자가 입력해야 함
2. 검색 결과를 문자열로 받는 것이 아니라, DTO로 바꾸어야 함
우선, 기존의 검색 결과를 DTO로 받기 위해 DTO클래스를 생성한다.
// 검색 시에 주고받을 데이터들을 담아 놓는 클래스
@Getter
public class ItemDto {
private String title;
private String link;
private String image;
private int lprice;
public ItemDto(JSONObject itemJson) {
this.title = itemJson.getString("title");
this.link = itemJson.getString("link");
this.image = itemJson.getString("image");
this.lprice = itemJson.getInt("lprice");
}
}
네이버 쇼핑 검색 API를 사용하는 클래스를 수정한다
@Component // 스프링에게 필요할 때 알아서 갖다쓰라고 권한을 주는 것
public class NaverShopSearch {
// 네이버 검색API를 활용해 검색하는 메소드
public String search(String query) {
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("X-Naver-Client-Id", "KYLAUEXJ4BCUErigMPMS");
headers.add("X-Naver-Client-Secret", "rJATsm5fGM");
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);
System.out.println(response);
return response;
}
// 검색 결과를 Dto에 담고, Dto리스트를 반환하는 메소드
// 검색 결과(문자열) -> JSON -> DTO -> DTO List
public List<ItemDto> fromJSONtoItems(String result) {
// 문자열 -> JSON
JSONObject rjson = new JSONObject(result);
// JSON에서 items 배열을 꺼낸다
JSONArray items = rjson.getJSONArray("items");
List<ItemDto> itemDtoList = new ArrayList<>(); // 검색 결과를 담을 리스트
// 꺼내온 items배열을 순회하며 값을 꺼냄
for(int i=0; i<items.length(); i++) {
JSONObject itemJson = items.getJSONObject(i);
// items배열의 저장된 각 요소에서 필요한 데이터들을 꺼내서 dto에 담음
ItemDto itemDto = new ItemDto(itemJson);
// 리스트에 담음
itemDtoList.add(itemDto);
}
return itemDtoList;
}
}
사용자가 입력한 검색어에 따라 검색을 실행하고, 결과를 DTO로 담고 클라이언트에게 반환한다. (반환하는 것은 Dto가 담긴 List)
검색을 실행했을 때, 문자열로 반환이 되기 때문에,
1) 문자열을 JSON으로 변환해서 2) DTO로 만들고 (추출하고자 하는 데이터들을 추출(title, image등)), 3) 그 DTO를 담는 List를 클라이언트에 반환한다.
Controller를 작성한다.
@RequiredArgsConstructor
@RestController
public class SearchRequestController {
// 네이버 검색 API를 사용하기 위해 필요
private final NaverShopSearch naverShopSearch;
@GetMapping("/api/search") // (/api/search?query=검색어)의 query임을 매핑
public List<ItemDto> getItems(@RequestParam String query) {
// 1. 네이버 검색 API를 사용해 매개변수로 받은 검색어로 검색한다.
String resultString = naverShopSearch.search(query);
// 2. 검색한 결과를 Dto로 담고 반환한다.
return naverShopSearch.fromJSONtoItems(resultString);
}
}
사용자가 입력한 검색어는 query에 대입되고, query로 검색을 수행 후, 검색결과는 Dto가 담긴 리스트를 클라이언트에 반환한다.
스프링 3계층 (Controller, Service, Repo)
프로젝트를 수행하면서 스프링 3계층을 다시 숙달해보는 시간을 가졌다.
그리고, 프로젝트를 수행할 때, 어떤 식으로 진행해야 되는지도 알 수 있었다.
1. API 설계
예시) 관심 상품 등록하기 → POST /api/product
※ API 정보
a. 요청 정보
- 요청 URL
- 요청 방식 (GET, POST ...)
- 요청 데이터 ( 서버 요청 시, 줘야 할 데이터, 매개변수 )
b. 서버가 제공할 기능
- 서버가 수행할 동작
c. 응답 데이터
- 클라이언트에게 반환할 정보
2. 3계층 설계하기
- Controller
- ProductRestController: 관심 상품 관련 컨트롤러
- SearchRequestController: 검색 관련 컨트롤러
- Service
- ProductService: 관심 상품 가격 변경
- Repository
- Product: 관심 상품 테이블
- ProductRepository: 관심 상품 조회, 저장
- ProductRequestDto: 관심 상품 등록하기
- ProductMypriceRequestDto: 관심 가격 변경하기
- ItemDto: 검색 결과 주고받기
이렇게 전체적인 설계 후에, 어떤 식으로 구현을 할 지도 대강 정해두고 코드를 짠다!
느낀 점 / 보완할 점
3주차에 이어 4주차에서도 프로젝트를 진행하면서 3계층을 숙달하는 시간을 가졌는데, 아직 미흡함을 느낀다.
서버 - 클라이언트간 통신에서 어떤 식으로 프로세스가 진행이 되는지,
스프링의 3계층 구성, 특히 Dto클래스에 대해서 미흡함을 많이 느낀 시간이었다. 너무헷갈려ㅕ역
'아카이브 > 스프링' 카테고리의 다른 글
스파르타 코딩클럽 [ 웹 개발의 봄, Spring ] - 회고 (0) | 2022.01.24 |
---|---|
스파르타 코딩클럽 [ 웹 개발의 봄, Spring ] - 5주차 (0) | 2022.01.22 |
스파르타 코딩클럽 [ 웹 개발의 봄, Spring ] - 3주차 (0) | 2022.01.05 |
스파르타 코딩클럽 [ 웹개발의 봄, Spring ] - 2주차 (0) | 2022.01.02 |
스프링의 정석 (세션) (0) | 2021.12.28 |