본문 바로가기
공부 기록

[JAVA x OPENAPI] 공공데이터포털 특일 정보 OpenAPI 사용하기 - 3 (통합 테스트)

by 타태 2023. 2. 15.


2023.02.15 - [공부 기록] - [JAVA x OPENAPI] 공공데이터포털 특일 정보 OpenAPI 사용하기 - 2 (JSON 응답을 JAVA 클래스로 받기 + 테스트)

 

[JAVA x OPENAPI] 공공데이터포털 특일 정보 OpenAPI 사용하기 - 2 (JSON 응답을 JAVA 클래스로 받기 + 테스

2023.02.13 - [공부 기록] - [JAVA x OPENAPI] 공공데이터포털 특일 정보 OpenAPI를 활용한 영업일 계산하기- 1 (공공데이터 포털 활용 신청) [JAVA x OPENAPI] 공공데이터포털 특일 정보 OpenAPI를 활용한 영업일

ktae23.tistory.com


이번 포스팅에서는 잘 매핑 된 HolidayResponse를 DB에 저장하거나 다른 곳에서 활용하기 좋게 컨버팅을 해보고 실제로 특일 정보 API를 요청해서 잘 받아 오는지 컨테이너를 띄워서 테스트 해보겠다.

먼저 컨버팅을 해볼텐데, 테스트를 추가하고 필요한 내용을 채워보자.

HolidayVendorServiceUnitTest

// ----
        final List<Holiday> holidays = holidayResponse.getHolidays();
        assertThat(holidays).hasSize(5);
        for (Holiday holiday : holidays) {
            Assertions.assertNotNull(holiday.getHolidayDate());
            Assertions.assertNotNull(holiday.getDescription());
        }
// ----

 

Holiday

@Getter
@RequiredArgsConstructor
public class Holiday {
    private final LocalDate holidayDate;
    private final String description;
}

 

HolidayResponse

@Getter
public class HolidayResponse {

    private static final int LOCDATE_LENTGH = 8;

    private Response response;

    public List<Holiday> getHolidays() {
        if(Objects.isNull(response)) return new ArrayList<>();

        return Arrays.stream(response.getItemArray())
            .map(v -> new Holiday(convertToLocalDate(v.locdate), v.dateName))
            .collect(Collectors.toList());
    }
    
    private LocalDate convertToLocalDate(String locdate) {
        if(!isValidLocDate(locdate)) throw new IllegalArgumentException("inValid");

        final int year = Integer.parseInt(locdate.substring(0, 4));
        final int month = Integer.parseInt(locdate.substring(4, 6));
        final int day = Integer.parseInt(locdate.substring(6, LOCDATE_LENTGH));

        return LocalDate.of(year, month, day);
    }

    private boolean isValidLocDate(String locdate) {
        return StringUtils.hasText(locdate)
            && locdate.length() == LOCDATE_LENTGH;
    }
	
    @Getter
    private static class Response {
        private Body body;

        private Item[] getItemArray() {
            return body.getItemArray();
        }
    }

    @Getter
    private static class Body {
        private Items items;

        private Item[] getItemArray() {
            return items.getItem();
        }
    }

    @Getter	
    private static class Items {
        private Item[] item;

    }

    @Getter
    private static class Item {
        private String dateName;
        private String locdate;
    }
}

**추가) 만일 공휴일이 없는 경우 items가 ""로 넘어오기 때문에 매핑에 실패한다.

이 경우 그냥 기본 생성자로 객체를 만들어 내기 때문에 response는 null이다.

이 경우 새로운 ArrayList를 생성하여 반환토록 하여 지장이 없도록 방어하였다.

 

 


섬세한 예외처리를 하지 않고 더 좋은 메서드명을 선택하는 등의 노력을 하지 않은 이유는 해당 응답에서만 사용 될 메서드이고 특일 정보를 구해오는 Task는 제한적으로 일어날 것이기 때문에 문제가 생겨도 충분히 개발자의 관리 하에 재시도가 가능하기 때문이다.

특일 정보는 6~8월 경에 현재 연도 기준으로 이후 2년치를 제공하고 있다.
그리고 갑작스러운 임시공휴일은 최대 하루 이내에 업데이트 된다고 한다.

때문에 당장 오늘이나 내일이 임시공휴일로 지정되는 일이 아니고서야 응답이 좀 잘못 된다고해서 그리 문제 될 일은 없다.
섬세한 예외처리를 하거나 분리를 해주는 비용에 비해 얻는 게 별로 없다는 뜻이다.


하루 한번 최신화를 시도하도록 배치를 작성해두고 모종의 이유로 실패했다면 확인하고 재시도하면 그만이다.

또, 실제로는 HolidayCreateCommand로 만들어서 Holiday를 생성할 책임이 있는 곳으로 전달했지만 해당 포스팅은 JSON 응답을 JAVA로 받는 예제가 없길래 작성하는 것이니 설명하지 않겠다.

이제 실제로 컨테이너를 띄워서 API 요청을 하고 Holiday를 잘 가져오는지 확인해보자.

@Disabled("실제 동작하는지만 확인, 인증 키 유효기간 : ~ 2025-02-10")
@SpringBootTest
class HolidayVendorServiceIntegrationTest {

    @Autowired
    private HolidayVendorService holidayVendorService;

    @Test
    void get() {
        final HolidayRequest holidayRequest = new HolidayRequest();
        HolidayResponse holidayResponse = holidayVendorService.get(holidayRequest);

        List<Holiday> holidays = holidayResponse.getHolidays();

        assertThat(holidays).hasSize(5);
        for (Holiday holiday : holidays) {
            Assertions.assertNotNull(holiday.getHolidayDate());
            Assertions.assertNotNull(holiday.getDescription());
        }
    }
}

테스트가 잘 실행 되었다.






자세히 설명하기엔 업무상 작성한 코드의 많은 부분을 설명해야 하다보니 많은 부분을 잘라 먹은 것 같아서 아쉽다.
하지만 이번 포스팅이 목표로 하는 바는 특일 정보 API 의 응답을 XML이 아닌 JSON으로 받아서 매핑하는 방법과 이를 테스트 하는 방법을 소개한는 것임을 양해 바란다.

이렇게 구한 공휴일은 동일 기간 내의 주말을 구하고 공휴일이 곧 주말인 날은 공휴일을 남기는 처리를 해준다.
이후 휴일 정보를 DB에 저장해 두면 영업일 계산하는 데 활용 할 수 있다.

소개한 방법은 휴일을 관리하며 매번 공휴일 정보를 체크하는 것이지만 반대로 영업일을 미리 계산하여 저장해 두고 공휴일이 추가 될 경우 해당 영업일만 지우는 것도 한 방법이 될 수 있겠다.

반응형

댓글