XLOG

[Swift] RestApi, 구글 캘린더 Api 를 이용하여 대한민국 공휴일 가져오기 본문

Swift/Etc

[Swift] RestApi, 구글 캘린더 Api 를 이용하여 대한민국 공휴일 가져오기

X_PROFIT 2023. 3. 13. 19:51

이전 회사 면접에서 내 포트폴리오에 RestApi 를 활용한 프로젝트가 없어서, 회사에서 이런 요구사항이 오면 어떻게 해결할지에 대한 질문을 받았었다.

다행히 이전에 캘린더 관련 프로젝트를 진행하며 대한민국 공휴일 데이터를 어떻게 가져올 수 있을까 고민하면서 Rest Api 에 대한 공부를 했었다.

1. Rest Api 란 무엇일까?

RESTful API는 두 컴퓨터 시스템이 인터넷을 통해 정보를 안전하게 교환하기 위해 사용하는 인터페이스입니다.
출처 : https://aws.amazon.com/ko/what-is/restful-api/

https://aws.amazon.com/ko/what-is/restful-api/

2. Swift에서 무엇을 사용할까?

 

그건 바로 URLSession, URLRequest 이다. 

URLSession
URLRequest

URLSession 에 URLRequest를 사용하여 통신프로토콜을 사용하여 결과를 받을 수 있다.

 

 

3. 사용할 Api

 

사용할 api 는 Google Calendar Api 이다.

우선 Google cloud 서비스에서 프로젝트를 생성한 후 Google Calendar Api 를 사용하도록 설정을 해준다.

그후 Google Api 에 접근권한을 위한 사용자 인증 정보로 들어가 api key를 등록 해주면 된다.

위에 두 정보를 보면 key 값은 가지고 있으니, 대한민국 공휴일 calendarId 를 확인하면 된다.

구글 캘린더에 들어가보면 다른 달력 가져온 리스트에 대한민국 공휴일 캘린더가 있다. 거기서 확인을 할 수 있다.

 

4. 그렇다면 사용하는 방법은?

 

간단하다.

func requestGet() {
        // 대한민국 공휴일 calendar id
        // ko.south_korea.official%23holiday%40group.v.calendar.google.com
  		// api key 는 내가 사용자인증정보로 생성한 key 값을 넣어주면 된다.
        let urlString = "https://www.googleapis.com/calendar/v3/calendars/\(calendarID)/events?key=\(apiKey)"
        guard let url = URL(string: urlString) else { return }
        // url Request 생성
        var request = URLRequest(url: url)
        request.httpMethod = "GET"
        URLSession.shared.dataTask(with: request) { data, response, error in
            guard error == nil else { return }
            guard let data = data else { return }
            guard let response = response as? HTTPURLResponse, (200 ..< 300) ~= response.statusCode else { return }
			// decode의 첫번째 인자는 우리가 JSON 구조체 타입 캐스팅이 필요하다.
			guard let jsonData = try? JSONDecoder().decode(CalendarJsonStruct.self, from: data) else {
                print("decode error")
                return
            }
        }.resume()
    }

위 코드를 실행해 보면 data 에 우리가 요청한 URLRequest로 부터 받은 데이터가 담겨 있다.

또한 위에 data 는 json 타입으로 전달되는 것을 Url 에 접속을 해봄으로써 알 수 있으며 그 구조 또한 알 수 있다.

struct CalendarJsonStruct: Codable {
    let kind: String
    let etag: String
    let summary: String
    let updated: String
    let timeZone: String
    let accessRole: String
    let defaultReminders : [String]
    let items: [dateItem]
}

그것을 토대로 JSONDecoder가 작동할 수 있도록 codable 한 구조체를 만들어서 decode 해주면 우리가 원하는 json 형태의 데이터를 얻을 수 있다.

 

5. 다음 시도해 볼 것은?

 

swift restapi 에 대한 검색을 해보면 Alamofire 라이브러리를 사용하는 코드들이 많이 나온다. first party 가 아닌 third party 라이브러리를 사용해봤을 때와의 비교, 장점 등을 파악해봐야 하지 않을까 싶다.