1. https://www.data.go.kr/iim/api/selectAPIAcountView.do 를 방문한다.
2. 원하는 데이터 검색
3. 회원가입 및 로그인 후 활용 신청 하기 (목적은 간단하게 웹 사이트에 넣어보고 싶다고만 써도 된다)
4. 그럼 아래의 그림과 같은 인증키를 발급받을 수 있다
5. 인증키가 제대로 발급 되었는지 확인하는 방법
가이드 워드 파일을 열어보면 이런 항목이 보인다.
그럼 서비스키 앞의 '=' 까지 복사한 다음 주소창에 붙여 넣고, 위에서 발급받은 Encoding 일반 인증키를 붙인다
성공적으로 발급되었다면 아래와 같은 화면이 보인다
기본 URL: http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/
기본 URL 뒤에 아래 메서드 중 얻고자 하는 정보를 선택한다.
getHoliDeInfo 국경일 정보조회
getRestDeInfo 공휴일 정보조회
getAnniversaryInfo 기념일 정보조회
get24DivisionsInfo 24절기 정보조회
getSundryDayInfo 잡절 정보조회
아래는 24절기의 정보를 조회한 페이지이다. 보다시피 잘 나온다.
JAVA에서 활용하기 (Eclipse)
정보를 가져왔으니 이제 활용할 차례이다.
감사합니다

1. 먼저 DateAPI.java를 생성한다.
package kr.-.-.-.controller;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.ui.Model;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class DateAPI {
/**
* 국경일 정보조회: getHoliDeInfo
* 공휴일 정보조회: getRestDeInfo
* 기념일 정보조회: getAnniversaryInfo
* 24절기 정보조회: get24DivisionsInfo
* 잡절 정보조회: getSundryDayInfo
* */
// 제공받은 서비스키
private static String secretKey = "여기에 서비스키 입력";
// 국경일 정보조회
public static Map<String, Object> holidayInfoAPI(String year, String month) throws IOException, ParseException {
System.out.println(secretKey);
// URL을 만들기 위한 StringBulider
StringBuilder urlBuilder = new StringBuilder("https://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getHoliDeInfo?");
System.out.println("===============urlBuilder: " + urlBuilder);
// 서비스키 입력
urlBuilder.append("&" + URLEncoder.encode("ServiceKey", "UTF-8") + "=" + secretKey);
// 페이지 번호
urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8"));
// 한 페이지 결과 수
urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("20", "UTF-8"));
// 연
urlBuilder.append("&" + URLEncoder.encode("solYear", "UTF-8") + "=" + URLEncoder.encode(year, "UTF-8"));
// 월
urlBuilder.append("&" + URLEncoder.encode("solMonth", "UTF-8") + "=" + URLEncoder.encode(month.length() == 1 ? "0" + month : month, "UTF-8"));
// json으로 요청
urlBuilder.append("&" + URLEncoder.encode("_type", "UTF-8") + "=" + URLEncoder.encode("json", "UTF-8"));
// URL 객체 생성
URL url = new URL(urlBuilder.toString());
System.out.println("요청URL:: " + urlBuilder);
// 요청하고자 하는 URL과 통신하기 위한 Connection 객체 생성
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 통신을 위한 GET 메서드
conn.setRequestMethod("GET");
// 통신을 위한 Content type 설정
conn.setRequestProperty("Content-type", "application/json");
System.out.println("Response code:: " + conn.getResponseCode());
// 전달 받은 데이터를 BufferedReader 객체로 저장
BufferedReader rd;
if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
// 저장된 데이터를 줄 별로 읽어 StringBuilder 객체로 저장
StringBuilder sb = new StringBuilder();
String line;
while((line = rd.readLine()) != null) {
sb.append(line);
}
// 객체 종료
rd.close();
conn.disconnect();
// 전달 받은 데이터 확인
System.out.println(sb.toString());
//자바를 이용해 공공데이터 받아오는 방법 끝
return str2Map(sb.toString());
}
}
JSON으로 받은 데이터를 Hashmap으로 변환한다
/**
* Json String을 Hashmap으로 반환
*
* @param json
* @return
* */
public static Map<String, Object> str2Map(String json) {
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> map = null;
try {
map = mapper.readValue(json, Map.class);
System.out.println("=================map: " + map);
} catch (IOException e) {
e.printStackTrace();
}
return map;
}
2. GET 방식으로 호출할 (컨트롤러이름)Controller.java 컨트롤러를 만들어준다.
@GetMapping("/holidayInfoAPI")
public ResponseEntity holidayInfoAPI(@PathParam("year") String year, @PathParam("month") String month) {
ArrayList<HashMap> responseHolidayArr = new ArrayList<>();
//임의로 설정한 연도와 월
String solYear = "2024";
String solMonth = "11";
DateAPI dateAPI = new DateAPI();
try {
Map<String, Object> holidayMap = dateAPI.holidayInfoAPI(solYear, solMonth);
Map<String, Object> response = (Map<String, Object>) holidayMap.get("response");
Map<String, Object> body = (Map<String, Object>) response.get("body");
int totalCount = (int) body.get("totalCount");
//공휴일이 없는 경우
if(totalCount <= 0) {
System.out.println("공휴일 없음");
System.out.println("body = " + body);
}
//공휴일이 하루인 경우
if(totalCount == 1) {
HashMap<String, Object> items = (HashMap<String, Object>) body.get("items");
HashMap<String, Object> item = (HashMap<String, Object>) items.get("item");
responseHolidayArr.add(item);
System.out.println("item = " + item);
}
//공휴일이 이틀 이상인 경우
if(totalCount > 1) {
HashMap<String, Object> items = (HashMap<String, Object>) body.get("items");
ArrayList<HashMap<String, Object>> item = (ArrayList<HashMap<String,Object>>) items.get("item");
for(HashMap<String, Object> itemMap : item) {
System.out.println("itemMap = " + itemMap);
responseHolidayArr.add(itemMap);
}
}
System.out.println("===================year: " + solYear);
System.out.println("===================month: " + solMonth);
} catch (Exception e) {
e.printStackTrace();
}
return new ResponseEntity<>(responseHolidayArr, HttpStatus.OK);
}
정상적으로 작동하는 것을 확인할 수 있다.
다음 번에는 JSP에서 날짜 데이터를 불러와
컨트롤러 안에서 계산하는 방법을 구현해야 한다.

public ResponseEntity holidayInfoAPI(@PathParam("year") String year, @PathParam("month") String month) {
ArrayList<HashMap> responseHolidayArr = new ArrayList<>();
DateAPI dateAPI = new DateAPI();
// 공휴일이 발견된 횟수 저장
int holidayCnt = 0;
for (int solYear = 2024; solYear <= 2025; solYear++) {
for (int solMonth = 1; solMonth <= 12; solMonth++) {
try {
String solYearStr = String.valueOf(solYear);
String solMonthStr = String.valueOf(solMonth);
Map<String, Object> holidayMap = dateAPI.holidayInfoAPI(solYearStr, solMonthStr);
Map<String, Object> response = (Map<String, Object>) holidayMap.get("response");
Map<String, Object> body = (Map<String, Object>) response.get("body");
int totalCount = (int) body.get("totalCount");
if (totalCount <= 0) {
System.out.println("공휴일 없음");
System.out.println("body = " + body);
} else if (totalCount == 1) {
HashMap<String, Object> items = (HashMap<String, Object>) body.get("items");
HashMap<String, Object> item = (HashMap<String, Object>) items.get("item");
if("Y".equals(item.get("isHoliday"))) {
responseHolidayArr.add(item);
System.out.println("item = " + item);
holidayCnt++;
}
} else {
HashMap<String, Object> items = (HashMap<String, Object>) body.get("items");
ArrayList<HashMap<String, Object>> item = (ArrayList<HashMap<String, Object>>) items.get("item");
for (HashMap<String, Object> itemMap : item) {
if("Y".equals(itemMap.get("isHoliday"))) {
System.out.println("itemMap = " + itemMap);
responseHolidayArr.add(itemMap);
holidayCnt++;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.println("총 공휴일 개수:: " + holidayCnt);
return new ResponseEntity<>(responseHolidayArr, HttpStatus.OK);
}
이런식으로 공휴일의 개수도 셀 수 있다.
2024 - 2025의 공휴일은 총 36개임을 알 수 있다~
'백엔드 > java' 카테고리의 다른 글
설문조사 결과 chart.js로 차트 띄우기 - 도넛 차트 (0) | 2024.04.22 |
---|---|
1 자바 기본 자료형 (0) | 2023.02.08 |