๐ŸŽ iOS & Swift

[iOS+Network] Swift๋ฅผ ๊ณ๋“ค์ธ URL ๊ตฌ์กฐ ๋ถ„์„

taeeekki 2022. 8. 30. 11:42

URL ๋ถ„์„

๊ตฌ์กฐ

URL์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

scheme://[userinfo@]host[:port][/path][?query][#fragment]

 


 

scheme

ํ•ด๋‹น ๋ถ€๋ถ„์—๋Š” ์ฃผ๋กœ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์„ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๋ฉด ์ฃผ๋กœ http ๋˜๋Š” https ํ”„๋กœํ† ์ฝœ์ด ์œ„์น˜ํ•œ๋‹ค. ํ”„๋กœํ† ์ฝœ์ด๋ž€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ž์›์— ์ ‘๊ทผํ•  ๊ฒƒ์ธ๊ฐ€๋ฅผ ์ •ํ•œ ์•ฝ์† ๋˜๋Š” ๊ทœ์น™์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. htttps๋Š” http์— ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 


userinfo

URL์— ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํฌํ•จํ•ด์„œ ์ธ์ฆ์„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ฑฐ์˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 


 

host

๋„๋ฉ”์ธ ์ด๋ฆ„ ๋˜๋Š” IP ์ฃผ์†Œ๊ฐ€ ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.

 


 

port

http๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 80 ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , https๋Š” 443 ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํฌํŠธ ๋ฒˆํ˜ธ๋Š” ์ƒ๋žต์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

 


 

path

๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ(path), ๊ณ„์ธต์  ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

 


 

query

- key = value์˜ ํ˜•ํƒœ์ด๊ณ , ํ˜•ํƒœ๋Š” ?๋กœ ์‹œ์ž‘ํ•˜๊ณ  &๋กœ query๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์ฃผ๋กœ query parameter, query string์ด๋ผ๋Š” ๋ช…์นญ์œผ๋กœ ๋ถ€๋ฅด๊ณ , value ๊ฐ’์€ string(๋ฌธ์ž)์˜ ํ˜•ํƒœ๋กœ ์ธ์‹๋œ๋‹ค.

 


 

fragment

์„œ๋ฒ„์— ์ง์ ‘ ์ „์†กํ•˜๋Š” ์ •๋ณด๋Š” ์•„๋‹ˆ๊ณ , html ๋‚ด๋ถ€ ๋ถ๋งˆํฌ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

 

 


 

Swift์˜ URLComponents

URLComponents

URLSession์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด URLComponents๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค. URLComponents๋Š” Struct ํƒ€์ž…์ด๋ฉฐ, ํ•ด๋‹น ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์šฉํ•ด์„œ ์ด๋ฆฌ์ €๋ฆฌ ๋งŒ์ ธ ๋ชจ๋“ˆํ™”๋ฅผ ํ•˜๊ธฐ๋„ ํ•˜๊ณ , Alamofire๋‚˜ Moya๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์„ธ๋ถ€์ ์ธ ์ปจํŠธ๋กค๋„ ํ•˜๊ฒŒ ๋œ๋‹ค.

 

๊ธฐ๋ณธ์ ์œผ๋กœ URLSession์„ ์‚ฌ์šฉํ•˜๋ฉด dataTask์˜ ์ธ์ž๋กœ URL์„ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ ํ…๋ฐ URL ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ๋‹ด์•„์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ๋ถ„๋ฆฌํ•ด์„œ๋„ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

let url = URL(string: "https://api.themoviedb.org/3/search/person?api_key=YOUR_KEY&language=en-US&query=\(query)&page=1&include_adult=false&region=ko-KR")!

URLSession.shared.dataTask(url)

 

SubComponent๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๋ณด๋ฉด ์œ„์—์„œ ํ™•์ธํ•œ URL ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ฟผ๋ฆฌ ์•„์ดํ…œ์€ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Array๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด๋†“์€ ๊ฒƒ ๊ฐ™๋‹ค.

let scheme = "https"
let host = "api.themoviedb.org"
let path = "/3/search/person"

let language = "ko-KR"
let key = ""
let query = query.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

var component = URLComponents()
component.scheme = scheme
component.host = host
component.path = path
component.queryItems = [
    URLQueryItem(name: "api_key", value: key),
    URLQueryItem(name: "query", value: query),
    URLQueryItem(name: "page", value: "1"),
    URLQueryItem(name: "region", value: language),
]

URLSession.shared.dataTask(with: component.url!)

 

๊ทธ ์™ธ์— ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์ด๋‚˜ ๊ตฌ์„ฑ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜๋„๋ก ํ•˜์ž~ ์ด๋ ‡๊ฒŒ ๊ฐœ๋…๊ณผ ์ฝ”๋“œ๊ฐ€ ๋งค์นญ์ด ๋˜๋‹ˆ๊นŒ ์‹ ๊ธฐํ•˜๊ณ  ์žฌ๋ฐŒ๋Š” ๊ฒƒ ๊ฐ™๋‹ค! :-)