https://www.data.go.kr/index.do
공공데이터를 사용 할 일이 있어서 위의 포털에서 데이터를 DB에 밀어넣을 일이 생겼다.
나같은경우는 표준산업분류코드를 사용했다.
기본적으로 공공데이터포털에서 로그인 > 활용신청은 끝난 상태라고 생각하고, 코드상에서만 설명하겠다.
1. controller
/*
* 1. www.data.go.kr (공공데이터포털)
* 2. 표준산업분류코드 API
* 3. 24개월마다 갱신해줘야됨 (마지막 갱신일 2023.08.09 박성윤)
* 4. 데이터는 JSON 형태로 받아옴
* */
@RestController
@RequestMapping("/api/batch/indust")
public class IndustController {
@Autowired
private IndustService industService;
@Value("${api.url}") // application.properties 또는 yml 파일에 설정한다.
private String apiUrl;
@Value("${api.serviceKey}") // application.properties 또는 yml 파일에 설정한다.
private String serviceKey;
@PostMapping
@Scheduled(cron = "0 0 3 1 9 ?")
public ResponseEntity<String> industBatch() throws Exception{
try {
String responseData = fetchDataFromAPI();
// 가져온 데이터를 DTO 객체 리스트로 파싱
List<IndustDataDto> dataList = parseResponseData(responseData);
// 데이터를 DB에 저장
industService.insertData(dataList);
return ResponseEntity.ok(responseData);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
}
private List<IndustDataDto> parseResponseData(String responseData) throws Exception {
JSONObject jsonObj = new JSONObject(responseData);
JSONArray dataArray = jsonObj.getJSONArray("data");
List<IndustDataDto> dataList = new ArrayList<>();
for (int i = 0; i < dataArray.length(); i++) {
JSONObject item = dataArray.getJSONObject(i);
IndustDataDto data = new IndustDataDto();
data.setMajor_emp_name(item.optString("고용업종명(대분류)"));
data.setMajor_emp_code(item.optString("고용업종코드(대분류)"));
data.setSub_emp_name(item.optString("고용업종명(중분류)"));
if(!item.isNull("고용업종코드(중분류)")) {
data.setSub_emp_code(item.getInt("고용업종코드(중분류)"));
}
data.setMinor_emp_name(item.optString("고용업종명(소분류)"));
if(!item.isNull("고용업종코드(소분류)")) {
data.setMinor_emp_code(item.getInt("고용업종코드(소분류)"));
}
data.setDetail_emp_name(item.optString("고용업종명(세세분류)"));
if(!item.isNull("고용업종코드(세세분류)")) {
data.setDetail_emp_code(item.getInt("고용업종코드(세세분류)"));
}
dataList.add(data);
}
return dataList;
}
private String fetchDataFromAPI() throws Exception {
// API URL 구성
StringBuilder urlBuilder = new StringBuilder(apiUrl);
urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + serviceKey);
urlBuilder.append("&" + URLEncoder.encode("page","UTF-8") + "=" + URLEncoder.encode("1","UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("perPage","UTF-8") + "=" + URLEncoder.encode("1200","UTF-8"));
// HTTP 요청 수행
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
try (BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
StringBuilder sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} finally {
conn.disconnect();
}
}
}
2. Service
@Service
public class IndustService {
@Autowired
private IndustMapper industMapper;
public void insertData(List<IndustDataDto> dataList) {
for(IndustDataDto data : dataList) {
industMapper.insertIndustData(data);
}
}
}
3. Mapper
@Mapper
public interface IndustMapper {
void insertIndustData(IndustDataDto data);
}
'Framework > Spring Boot😊' 카테고리의 다른 글
[Spring Boot] Spring Security 의존성 추가 시 bulid.gradle 파일 에러 해결 (0) | 2023.07.25 |
---|---|
[Spring Boot] 프로젝트 (3) - 이클립스 Spring Boot 프로젝트 구축 및 로그설정 (0) | 2023.07.13 |
[Spring Boot] sentry 를 스프링부트에 적용 (에러로그수집) (0) | 2022.09.21 |
[Spring boot] spring security 을 사용한 로그인 구현 (0) | 2022.04.27 |
[Spring] Spring 과 Spring Boot 차이 (0) | 2020.10.18 |