[JAVA] 우리나라 법정공휴일, 대체휴무일 구하기

0

공휴일 일정 관리같은 건데, 캘린더 서비스를 구현해야 할 일이 있었다. 캘린더에 법정공휴일과 대체공휴일을 표기해야 했기 때문에 해당 날짜를 찾고 마킹하는 작업이 필요했다.

음력으로 지정된 공휴일

  • 설날
  • 부처님 오신날
  • 추석

변환 코드나 라이브러리를 찾아서 구현하면 되겠지하며, 쉽게 생각했다. (쉽지 않았다.)

공공데이터포털 한국천문연구원_음양력 정보

공공데이터포털에서 제공하는 API로 우리나라의 가장 간단한 방법이었을 것 같다.

전자정부표준프레임워크 컴포넌트

전자정부 프레임워크 유틸리티 클래스가 제공되고 있었다.

결론부터 말하면 이건 못쓴다.

많은 블로그에서 icu4j에 있는 com.ibm.icu.util.ChineseCalendar를 사용해서 계산하고 있었다.

클래스명만 봐도 중국 달력? 뭐 똑같으니까 쓰겠지 싶었지만 아니다 중국 음력과 한국 음력은 다르다.

애플 캘린더에서도 부처님 오신날이 중국 음력으로 계산되어 5월 26일에 달력에 표기되는 버그(?)가 있었다.

toLonar() 메서드를 확인해보면 위의 ChinseCalendar를 사용해서 결과를 리턴하고 있다.

일단 어이가 없었다... 많은 개발자들한테 욕먹지 않았을까? (우선 나부터 ㅋㅋ)

구현한 방법

인터넷을 돌아다니던 중 천사를 보았다.

1900-01-01 ~ 2200-12-31 까지 법정공휴일 데이터 셋을 만들어서 공유하신 것이다...

일단 내가 죽을때 까지 쓸 수 있겠다 싶었다. 필요한건 Solar Date와 Lunar Date 아니었던가?

공휴일을 관리하는 테이블과 공휴일 데이터 테이블을 조인하여 양력 데이터만 가져오는 쿼리를 작성하고

설날과 추석의 경우 앞 뒤로 연휴를 붙여주고 만약 주말인 경우 평일을 대체휴무일로 바꿔주는 코드로 해결했다.

{
    "code": 0,
    "message": "법정공휴일 조회",
    "data": [
        {
            "hldyNm": "신정",
            "hldyZhNm": "元旦",
            "hldyJaNm": "新正",
            "hldyEnNm": "New Year's Day",
            "solarYmd": "2023-01-01",
            "dayOfWeek": "일"
        },
        {
            "hldyNm": "설날(연휴)",
            "hldyZhNm": "春节",
            "hldyJaNm": "正月",
            "hldyEnNm": "The Lunar New Year",
            "solarYmd": "2023-01-21",
            "dayOfWeek": "토"
        },
        {
            "hldyNm": "설날",
            "hldyZhNm": "春节",
            "hldyJaNm": "正月",
            "hldyEnNm": "The Lunar New Year",
            "solarYmd": "2023-01-22",
            "dayOfWeek": "일"
        },
        {
            "hldyNm": "설날(연휴)",
            "hldyZhNm": "春节",
            "hldyJaNm": "正月",
            "hldyEnNm": "The Lunar New Year",
            "solarYmd": "2023-01-23",
            "dayOfWeek": "월"
        },
        {
            "hldyNm": "설날(대체공휴일)",
            "hldyZhNm": "春节",
            "hldyJaNm": "正月",
            "hldyEnNm": "The Lunar New Year",
            "solarYmd": "2023-01-24",
            "dayOfWeek": "화"
        },
        {
            "hldyNm": "3.1절",
            "hldyZhNm": "3.1节",
            "hldyJaNm": "3.1節",
            "hldyEnNm": "Independence Movement Day",
            "solarYmd": "2023-03-01",
            "dayOfWeek": "수"
        },
        {
            "hldyNm": "어린이날",
            "hldyZhNm": "儿童节",
            "hldyJaNm": "子供の日",
            "hldyEnNm": "Children's Day",
            "solarYmd": "2023-05-05",
            "dayOfWeek": "금"
        },
        {
            "hldyNm": "부처님오신날",
            "hldyZhNm": "佛诞日",
            "hldyJaNm": "お釈迦様の誕生日",
            "hldyEnNm": "Buddha's Birthday",
            "solarYmd": "2023-05-27",
            "dayOfWeek": "토"
        },
        {
            "hldyNm": "부처님오신날(대체공휴일)",
            "hldyZhNm": "佛诞日",
            "hldyJaNm": "お釈迦様の誕生日",
            "hldyEnNm": "Buddha's Birthday",
            "solarYmd": "2023-05-29",
            "dayOfWeek": "월"
        },
        {
            "hldyNm": "현충일",
            "hldyZhNm": "显忠日",
            "hldyJaNm": "顕忠日",
            "hldyEnNm": "Memorial Day",
            "solarYmd": "2023-06-06",
            "dayOfWeek": "화"
        },
        {
            "hldyNm": "광복절",
            "hldyZhNm": "光复节",
            "hldyJaNm": "光復節",
            "hldyEnNm": "National Liberation Day",
            "solarYmd": "2023-08-15",
            "dayOfWeek": "화"
        },
        {
            "hldyNm": "추석(연휴)",
            "hldyZhNm": "中秋",
            "hldyJaNm": "秋夕",
            "hldyEnNm": "Chuseok",
            "solarYmd": "2023-09-28",
            "dayOfWeek": "목"
        },
        {
            "hldyNm": "추석",
            "hldyZhNm": "中秋",
            "hldyJaNm": "秋夕",
            "hldyEnNm": "Chuseok",
            "solarYmd": "2023-09-29",
            "dayOfWeek": "금"
        },
        {
            "hldyNm": "추석(연휴)",
            "hldyZhNm": "中秋",
            "hldyJaNm": "秋夕",
            "hldyEnNm": "Chuseok",
            "solarYmd": "2023-09-30",
            "dayOfWeek": "토"
        },
        {
            "hldyNm": "개천절",
            "hldyZhNm": "开天节",
            "hldyJaNm": "韓国の建国紀念日",
            "hldyEnNm": "National foundation day of Korea",
            "solarYmd": "2023-10-03",
            "dayOfWeek": "화"
        },
        {
            "hldyNm": "한글날",
            "hldyZhNm": "韩国文字节",
            "hldyJaNm": "ハングルの日",
            "hldyEnNm": "Hangul proclamation day",
            "solarYmd": "2023-10-09",
            "dayOfWeek": "월"
        },
        {
            "hldyNm": "성탄절",
            "hldyZhNm": "圣诞节",
            "hldyJaNm": "聖誕祭",
            "hldyEnNm": "Christmas",
            "solarYmd": "2023-12-25",
            "dayOfWeek": "월"
        }
    ]
}

0개의 댓글