공공데이터포털 API 가져오기 - 날짜와 관련된 정보

2024. 4. 4. 12:02· 백엔드/java

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);
}

 

 

출력화면 (공휴일이 없는 경우)

 

java console창

 

 

 

 

출력화면 (공휴일이 이틀 이상인 경우)
java console창

 

정상적으로 작동하는 것을 확인할 수 있다.

다음 번에는 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
'백엔드/java' 카테고리의 다른 글
  • 설문조사 결과 chart.js로 차트 띄우기 - 도넛 차트
  • 1 자바 기본 자료형
ssoyul
ssoyul
ssoyul
저장고
ssoyul
전체
오늘
어제
  • 분류 전체보기 (46)
    • 백엔드 (3)
      • java (3)
    • 프론트엔드 (1)
      • React (1)
    • 문제 풀이 (29)
      • 자바 (29)
    • 쪽지 기능 (3)
      • 구현 (3)
      • 문제와 해결 (0)
    • 알림 기능 (1)
      • 구현 (1)
      • 문제와 해결 (0)
    • 가계부 + 다이어리 (2)
      • 환경 설정 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.3.0
ssoyul
공공데이터포털 API 가져오기 - 날짜와 관련된 정보
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.