deprecated/코로나 알림(project-ios)

Swift5 네이버 검색 API 사용하기(뉴스)

lgvv 2021. 7. 26. 21:23

✅ 이번시간에는 네이버 검색 API에 대해서 알아볼 예정이야.

이 글을 작성하는 네이버 검색 API를 사용하는데 생각보다 오랜시간이 걸렸어서 ㅠㅠ 다시금 정리해보고자 하는 목적!

 

(목차)

1. 네이버 API 발급받아서 세팅하기

2. 내 프로젝트에 적용하기 (+ Codable 쉽게 만드는 법)

 

 

✅ 1. 네이버 API 발급받아서 세팅하기

https://developers.naver.com/docs/search/news/

 

검색 API 뉴스 검색 개발가이드

NAVER Developers - 검색 API 뉴스 검색 개발가이드

developers.naver.com

위에 보이는 사이트에 들어가서 API 발급신청을 하면 끝

1. 오픈 API이용 신청>  클릭

이후로는 네이버에서 안내해주는대로 하면 신청은 끝!

 

내 애플리케이션 > 개요

다음은 내 애플리케이션 개요 부분으로 이동하여 Client ID 및 Client Secret 정도가 있다는 것을 우선 확인하자.

Playground(Beta)

API Playground로 이동하면, API 요청시 어떤 형태로 내려오는지 미리 확인할 수 있어서, Codable을 작성할 때 크게 도움이 된다.

 물론, postman이나 다른 방법으로도 가능하겠지만 나는 이게 제일 편함!

 

 

✅ 2. 내 프로젝트에 적용하기

1️⃣ Codable를 활용하여 구조체 만들기

🔸Codable 쉽게 만드는 사이트 : https://app.quicktype.io/

사이트에 접속하여 APIplayground에 나온 json 형태의 파일을 넣어주면 간편하게 만들어줘서 유용하다.

//DetailModel.swift

import Foundation

// 네이버 뉴스 API 호출 메소드
class dataManager {
    static let shared : dataManager = dataManager()
    var searchResult : Welcome?
    
    private init() {
        
    }
}

// MARK: - Welcome
struct Welcome: Codable {
    let lastBuildDate: String
    let total, start, display: Int
    let items: [Item]
}

// MARK: - Item
struct Item: Codable {
    let title: String
    let originallink: String
    let link: String
    let itemDescription, pubDate: String

    enum CodingKeys: String, CodingKey {
        case title, originallink, link
        case itemDescription = "description"
        case pubDate
    }
}

위의 코드는 사이트를 이용하여 코더블을 간단히 만든 것!

dataManager는 싱글톤 형태로 사용하기 위한 것이다.

 

//LoadSEARCHnewsAPI.swift

import Foundation
import UIKit

class LoadSEARCHnewsAPI {
    
    static var shared = LoadSEARCHnewsAPI()
    
    let jsconDecoder: JSONDecoder = JSONDecoder()

    func urlTaskDone() {
        let item = dataManager.shared.searchResult?.items[0]
        print(item)
    }
    
    func requestAPIToNaver(queryValue: String) {
        
        let clientID: String = your Client ID
        let clientKEY: String = your Client Secret
        
        let query: String  = "https://openapi.naver.com/v1/search/news.json?query=\(queryValue)"
        let encodedQuery: String = query.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!
        let queryURL: URL = URL(string: encodedQuery)!
       
        var requestURL = URLRequest(url: queryURL)
        requestURL.addValue(clientID, forHTTPHeaderField: "X-Naver-Client-Id")
        requestURL.addValue(clientKEY, forHTTPHeaderField: "X-Naver-Client-Secret")
        
        let task = URLSession.shared.dataTask(with: requestURL) { data, response, error in
            guard error == nil else { print(error); return }
            guard let data = data else { print(error); return }
            
            do {
                let searchInfo: Welcome = try self.jsconDecoder.decode(Welcome.self, from: data)
                dataManager.shared.searchResult = searchInfo
                self.urlTaskDone()
            } catch {
                print(fatalError())
            }
        }
        task.resume()
    }
}

이렇게 작성하면 된다. 저기 코드에서 클라이언트 아이디와 시크릿만 네이버에서 발급받은 자신만의 키를 사용하자!

기존 파싱과 달랐던 점은, 헤더 부분에 클라이언트 id와 시크릿을 넣어주어야해서 이걸 어떻게 처리해야할지 많이 고민했었는데, 이번 시간을 통해 새로운 메소드를 알아갈 수 있었다.

 

이렇게 선언 후, 우리가 호출하고자 하는 함수에서 

SEARCHAPICALL.requestAPIToNaver(queryValue: "대한민국")

작성하면 정상적으로 호출이 완료되어 배열에 담기게 되고

dataManager.shared.searchResult?.items

이렇게 호출하여 우리는 사용할 수 있다.