빙응의 공부 블로그
[Spring]Spring - RestTemplate 본문
API를 이용하여 원하는 데이터 정보를 가져와야 하는데 XML처리를 해야한다. 이것에 대해 알아보자
📝RestTemplate
- HTTP 통신을 위한 도구로 RESTful API 웹 서비스와의 상호작용을 쉽게 위부 도메인에서 데이터를 가져오거나 전송할 때 사용되는 스프링 프레임워크의 클래스이다.
- 다양한 HTTP 메서드를 사용하며 원격 서버와 동기식 방식으로 JSON, XML 등의 다양한 데이터 형식과 통신이 가능
- 동기식 방식으로 요청을 보내고 응답을 받을 때까지 블로킹되며, 요청과 응답이 완료되기 전까지 다음 코드로 진행되지 않는다.
RestTemplate (Spring Framework 6.1.7 API)
RestTemplate (Spring Framework 6.1.7 API)
postForLocation Create a new resource by POSTing the given object to the URI template, and return the value of the Location header. This header typically indicates where the new resource is stored. URI Template variables are expanded using the given URI va
docs.spring.io
📝RestTemplate의 특징
🚩 HTTP 요청 및 응답에 대한 다양한 메서드를 제공한다.
Method | HTTP Method | Return Type | 설명 |
getForObject() | GET | Object | GET 요청에 대한 결과를 객체로 반환 |
getForEntity() | GET | ResponseEntity | GET 요청에 대한 결과를 ResponseEntity로 반환 |
postForLocation() | POST | URI | POST 요청에 대한 결과로 헤더가 저장된 URI을 반환 |
postForObject() | POST | Object | POST 요청에 대한 결과를 객체로 반환합니다 |
postForEntity() | POST | ResponseEntity | POST 요청에 대한 결과를 ResponseEntity로 반환합니다 |
put() | PUT | void | PUT 요청을 실행합니다 |
patchForObject() | PATCH | Object | PATCH 요청을 실행하고 결과를 객체로 반환합니다 |
delete() | DELETE | void | DELETE 요청을 실행합니다 |
headForHeaders() | HEADER | HttpHeaders | 헤더 정보를 추출하고 HTTP HEAD 메서드를 사용합니다 |
optionsForAllow() | OPTIONS | 지원되는 HTTP 메서드를 추출합니다 | |
exchange() | any | ResponseEntity | 헤더를 생성하고 모든 요청 방법을 허용합니다 |
execute() | any | T | 요청/응답 콜백을 수정합니다 |
🚩 HTTP 요청 및 응답을 자동으로 변환하고 역직렬화한다.
- HTTP 요청 및 응답을 자동으로 변환하고 역직렬화하는 기능을 제공한다. 이를 위해 RestTemplate는 기본적으로 MessageConverter를 제공한다.
- MessageConverter는 요청 및 응답 바디의 데이터 형식을 변환하고, 요청 및 응답 헤더의 콘텐츠 형식을 설정합니다.
RestTemplate restTemplate = new RestTemplate();
String url = apiUrl + "?serviceKey=" + secretKey + "&pageNo=" + page + "&numOfRows=100";
ResponseEntity<ResponseData> responseEntity = restTemplate.getForEntity(url, ResponseData.class);
- 위에 코드처럼 자신이 만든 ResponseData 객체를 이용해서 받아올 수도 있다.
📝 실습에 들어가기 앞서
사용할 API는 장애인 구인 실시간 현황이다.
한국장애인고용공단_장애인 구인 실시간 현황 | 공공데이터포털 (data.go.kr)
한국장애인고용공단_장애인 구인 실시간 현황
현재 진행중인 장애인 구인 사업체의 실시간 현황(연번,구인신청일,모집기간,사업장명,모집직종,고용형태,임금형태,임금,입사형태,요구경력,요구학력,사업장 주소,기업형태,담당기관,등록일,
www.data.go.kr
대충 이런식으로 되어있는데 나의 목표는 페이지 별로 데이터를 받아보고 시, 도 별로 구분해서 리턴하는 것이다.
📝 XML 파싱하기
🚩 1. Url 구성하기
- 제일 먼저 해야할 것은 API 요청을 보낼 Url을 구성하는 것이다.
@RestController
@RequiredArgsConstructor
public class Api_LinkTest2 {
@Value("${key}")
private String secretKey;
private final String apiUrl = "https://apis.data.go.kr/B552583/job/job_list";
@GetMapping("/api")
public ResponseEntity<ResponseData> callApi(
@RequestParam(value = "page") String page,
@RequestParam(value = "local") String local
) {
String url = apiUrl + "?serviceKey=" + secretKey + "&pageNo=" + page + "&numOfRows=100";
나는 페이지별로 보여주고 지역을 파라미터로 받아올 거라 이렇게 정했다.
기본 100개를 받고 다음 페이지를 검색하겠습니까?를 이용해 원하는 지역을 검색할 것이다.
🚩 2. API 응답 받기
// API 호출 및 응답 받기
RestTemplate restTemplate = new RestTemplate();
String url = apiUrl + "?serviceKey=" + secretKey + "&pageNo=" + page + "&numOfRows=100";
ResponseEntity<ResponseData> responseEntity = restTemplate.getForEntity(url, ResponseData.class);
RestTemplate를 이용해 쉽게 응답을 받아올 수 있다.
또한 MessageConverter를 이용해 내가 정의한 객체로 받아오는 것도 가능하여 편하다.
@Getter
@Setter
@ToString
@XmlRootElement(name = "response")
@XmlAccessorType(XmlAccessType.FIELD)
public class ResponseData {
private Body body;
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
public static class Body {
private Items items;
}
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
public static class Items {
private List<Item> item;
}
@Getter
@Setter
@ToString
@XmlAccessorType(XmlAccessType.FIELD)
public static class Item {
private String busplaName;
private String cntctNo;
private String compAddr;
private String empType;
private String enterType;
private String jobNm;
private String offerregDt;
private String regDt;
private String regagnName;
private String reqCareer;
private String reqEduc;
private String rno;
private String rnum;
private String salary;
private String salaryType;
private String termDate;
}
}
이번에 받아올 데이터는 이러한 형식으로 되어 있다.
🚩 3. 지역 기준으로 데이터 거르기
ResponseData responseData = responseEntity.getBody();
if (responseData != null && responseData.getBody() != null && responseData.getBody().getItems() != null) {
List<ResponseData.Item> filteredItems = new ArrayList<>();
String targetPrefix = local.split(" ")[0]; // local 파라미터를 공백을 기준으로 분리하고 첫 번째 단어를 선택
for (ResponseData.Item item : responseData.getBody().getItems().getItem()) {
if (item.getCompAddr().startsWith(targetPrefix)) {
filteredItems.add(item);
}
}
responseData.getBody().getItems().setItem(filteredItems);
}
위처럼 ResponseData는 객체이기 때문에 쉽게 검색이 가능하다.
✔ 전체 코드
@RestController
@RequiredArgsConstructor
public class Api_LinkTest2 {
@Value("${key}")
private String secretKey;
private final String apiUrl = "https://apis.data.go.kr/B552583/job/job_list";
@GetMapping("/api")
public ResponseEntity<ResponseData> callApi(
@RequestParam(value = "page") String page,
@RequestParam(value = "local") String local
) {
try {
// API 호출 및 응답 받기
RestTemplate restTemplate = new RestTemplate();
String url = apiUrl + "?serviceKey=" + secretKey + "&pageNo=" + page + "&numOfRows=100";
ResponseEntity<ResponseData> responseEntity = restTemplate.getForEntity(url, ResponseData.class);
// 받은 local 파라미터를 이용하여 compAddr의 앞 단어를 기준으로 검색
ResponseData responseData = responseEntity.getBody();
if (responseData != null && responseData.getBody() != null && responseData.getBody().getItems() != null) {
List<ResponseData.Item> filteredItems = new ArrayList<>();
String targetPrefix = local.split(" ")[0]; // local 파라미터를 공백을 기준으로 분리하고 첫 번째 단어를 선택
for (ResponseData.Item item : responseData.getBody().getItems().getItem()) {
if (item.getCompAddr().startsWith(targetPrefix)) {
filteredItems.add(item);
}
}
responseData.getBody().getItems().setItem(filteredItems);
}
return new ResponseEntity<>(responseData, responseEntity.getStatusCode());
} catch (Exception e) {
e.printStackTrace();
// 예외 발생 시 에러 응답 반환
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
'Spring > 개인공부_실습' 카테고리의 다른 글
[Spring]WebClient (0) | 2024.05.24 |
---|---|
[React + Spring]리액트와 스프링으로 API 받아서 처리하기 (0) | 2024.05.20 |
[React + Spring]리액트와 스프링 - 연동 (0) | 2024.05.17 |
[Spring]Spring Security + JWT(2) (1) | 2024.04.07 |
[Spring]Spring Security + JWT(1) (1) | 2024.04.07 |