URL 관련 기능 요약

Martin·2023년 2월 18일

TIL 아카이브

목록 보기
10/11

URL Type

let string = "https://market-training.yagom-academy.kr/"
let url = URL(string: string)

URL의 string에는 영문, 숫자, 특정 문자만 인식 가능, 한글과 띄어쓰기는 인식 X

url?.absoluteString // 절대주소 (urlString과 동일)
url?.scheme // http? htttps?
url?.host // "itunes.apple.com"
url?.path // "/search"
url?.query // "media=music&entity=musicVideo&term=collier"

URL - relativeTo:

let baseURL = URL(string: "https://itunes.apple.com")
let relativeURL = URL(string: "search", relativeTo: baseURL)
relativeURL?.absoluteString // "https://itunes.apple.com/search"
relativeURL?.baseURL // https://itunes.apple.com (URL? 타입)
relativeURL?.path // "/search"

URLComponents

var urlComponents = URLComponents(string: "https://itunes.apple.com/search?")!
let mediaQuery = URLQueryItem(name: "media", value: "music")
let entityQuery = URLQueryItem(name: "entity", value: "song")
let termQuery = URLQueryItem(name: "term", value: "jacob collier")
urlComponents.queryItems?.append(mediaQuery)
urlComponents.queryItems?.append(entityQuery)
urlComponents.queryItems?.append(termQuery)

urlComponents.queryItems?.append(mediaQuery)
urlComponents.queryItems?.append(entityQuery)
urlComponents.queryItems?.append(termQuery

URL에 포함되어 있는 한글, 띄어쓰기 등을 자동으로 인코딩하여 관리
쿼리 파라미터 등은 URLQueryItem 타입의 변수를 하여 별도로 관리

Codable

Codable = Decodable + Encodable
Codable로 구현한 구조체를 만들 때, 내부 변수 이름과 JSON의 변수 이름이 같아야 함
CodingKey라는 enum과 매칭시켜야 함

{
  "resultCount": 50,
  "results": [
    {
      "wrapperType": "track",
      "kind": "song",
      "artistId": 28223958,
      "collectionId": 295286350,
      "trackId": 295286499,
      "artistName": "Collier",
      "collectionName": "Collier - Ep",
      "trackName": "No Matter What",
      "collectionCensoredName": "Collier - Ep",
      "trackCensoredName": "No Matter What",
      "artistViewUrl": "https://music.apple.com/us/artist/collier/28223958?uo=4",
      "collectionViewUrl": "https://music.apple.com/us/album/no-matter-what/295286350?i=295286499&uo=4",
      "trackViewUrl": "https://music.apple.com/us/album/no-matter-what/295286350?i=295286499&uo=4",
      "previewUrl": "https://audio-ssl.itunes.apple.com/itunes-assets/Music/85/73/31/mzm.alxzrkgx.aac.p.m4a",
      "artworkUrl30": "https://is2-ssl.mzstatic.com/image/thumb/Music/v4/1b/78/78/1b7878d3-7718-66b3-643b-600c4098c944/source/30x30bb.jpg",
      "artworkUrl60": "https://is2-ssl.mzstatic.com/image/thumb/Music/v4/1b/78/78/1b7878d3-7718-66b3-643b-600c4098c944/source/60x60bb.jpg",
      "artworkUrl100": "https://is2-ssl.mzstatic.com/image/thumb/Music/v4/1b/78/78/1b7878d3-7718-66b3-643b-600c4098c944/source/100x100bb.jpg",
      "collectionPrice": 5.94,
      "trackPrice": 0.99,
      "releaseDate": "2008-11-05T08:55:31Z",
      "collectionExplicitness": "notExplicit",
      "trackExplicitness": "notExplicit",
      "discCount": 1,
      "discNumber": 1,
      "trackCount": 6,
      "trackNumber": 5,
      "trackTimeMillis": 304520,
      "country": "USA",
      "currency": "USD",
      "primaryGenreName": "Pop",
      "isStreamable": true
    },
  ]
}
struct Response: Codable {
    let resultCount: Int
    let tracks: [Track]
    
    enum CodingKeys: String, CodingKey {
        case resultCount
        case tracks = "results"
    }
}
struct Track: Codable {
    let title: String   // trackName
    let artistName: String  // artistName
    let thumbnailPath: String   // artworkUrl100
    
    // 실제 JSON 키와 매핑 (똑같다면 놔두고, 다르다면 오른쪽에 JSON 키이름 입력
    enum CodingKeys: String, CodingKey {
        case title = "trackName"
        case artistName
        case thumbnailPath = "artworkUrl100"
    }
}

URLSession

HTTP의 데이터 자료를 가져올 때 사용, URLSession은 생성 전에 configuration이 필요

let requestURL = urlComponents.url!
// URLSession - configuration 먼저 필요
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)

.default, .ephemeral를 사용하는데 ephemeral은 로컬 스토어에 캐싱 또는 쿠키 저장 작업을 하지 않음

URLSession - dataTask

네트워크로부터 데이터를 받아올 때 리퀘스트 URL과 받아온 이후 할 작업을 설정

session.dataTask(with: URLRequest, completionHandler: (Data?, URLResponse?, Error?) -> Void)
profile
제로부터 시작하는 이세계 Swift

0개의 댓글