์ƒ์„ธ ์ปจํ…์ธ 

๋ณธ๋ฌธ ์ œ๋ชฉ

[ Swift ] ๋„คํŠธ์›Œํฌ ํ†ต์‹  - JSON, API, REST API

๐ŸŽ iOS/Network

by AHN.Jihyeon 2024. 7. 14. 18:08

๋ณธ๋ฌธ

๋„คํŠธ์›Œํฌ

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด, ๋‘˜ ์ด์ƒ์˜ ์ปดํ“จํ„ฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜๊ณ  ์†Œํ†ตํ•˜๋Š” ๊ฒƒ

ํ•ธ๋“œํฐ๊ณผ ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ๋„ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด๋‹ค. 

 

 

โœ… JSON(JavaScript Object Notaion)

๋„คํŠธ์›Œํฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ •ํ•ด์ง„ ํ˜•์‹์„ ์ง€์ผœ ๊ตํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹์ด JSON ํ˜•์‹์ด๋‹ค. 

JSON์€ key-value ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค.

[
    {
        "name": "Jihyeon",
        "phoneNumber": "010-1111-2222"
    },
    {
        "name": "Swift",
        "phoneNumber": "010-3333-4444"
    },
    {
        "name": "Apple",
        "phoneNumber": "010-5555-6666"
    }
]

 

 

โœ… API(Application Programming Interface)

ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ฐฝ๊ตฌ, ์„ค๋ช…์„œ, ๋„๊ตฌ์ด๋‹ค. 

API๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ API ์„œ๋ฒ„์—๊ฒŒ ํ•„์š”ํ•œ ์š”์ฒญ์„ ํ•˜๋ฉด API ์„œ๋ฒ„๋Š” API๋ฅผ ํ†ตํ•ด ์‘๋‹ต์„ ํ•œ๋‹ค. 

 

 

 

โœ…  Swift Codeable

  • ์ธ์ฝ”๋”ฉ : ๋ฐ์ดํ„ฐ → ํŠน์ • ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
  • ๋””์ฝ”๋”ฉ : ์ธ์ฝ”๋”ฉ๋œ ๋ฐ์ดํ„ฐ → ์›๋ณธ์œผ๋กœ ๋ณ€ํ™˜

 

Swift์˜ Codeable ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๋ฉด ์ธ์ฝ”๋”ฉ๊ณผ ๋””์ฝ”๋”ฉ ๋ชจ๋‘ ๊ฐ€๋Šฅ

์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ JSON ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ์„ ๋งŽ์ด ํ•œ๋‹ค. 

 

 

๐ŸŒŸ JSON ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ์—์„œ Swift๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์ฝ”๋”ฉํ•ด์„œ ์ถ”์ถœํ•˜๋Š” ๊ณผ์ • ๐ŸŒŸ

1. Codeable์„ ์ฑ„ํƒํ•ด ์ธ์ฝ”๋”ฉ๊ณผ ๋””์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด ์ƒ์„ฑ

2. String์œผ๋กœ JSON ๋ชจ์–‘์˜ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ 

3. JSON ํ˜•์‹์œผ๋กœ ๋ฐ”๊พธ๊ธฐ :  jsonString์œผ๋กœ jsonData ์ƒ์„ฑ -> data(using: .utf8)

4. JSON ๋””์ฝ”๋”(JSON -> ์›๋ณธ์œผ๋กœ ๋ณ€ํ™˜) : JSONDecoder()

5. Codeable ๋””์ฝ”๋”ฉ ์ง„ํ–‰

 

import Foundation

struct PhoneBook: Codable { //Codable์„ ์ฑ„ํƒํ•ด ์ธ์ฝ”๋”ฉ๊ณผ ๋””์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๊ฐ€ ๋จ
    
    let name: String
    let phoneNumber: String
}

// string ์œผ๋กœ json ๋ชจ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ.
let jsonString = """
[
    {
        "name": "Jihyeon",
        "phoneNumber": "010-1111-2222"
    },
    {
        "name": "Swift",
        "phoneNumber": "010-3333-4444"
    },
    {
        "name": "Apple",
        "phoneNumber": "010-5555-6666"
    }
]
"""

// jsonString ์œผ๋กœ jsonData ๋ฅผ ์ƒ์„ฑ -> JSON ํ˜•์‹์œผ๋กœ ๋ฐ”๋€œ 
let jsonData = jsonString.data(using: .utf8)!

// Swift ๊ฐ€ ์ œ๊ณตํ•˜๋Š” JSON ๋””์ฝ”๋”.
let jsonDecoder = JSONDecoder()

// JSON -> Codable ๋””์ฝ”๋”ฉ ์ง„ํ–‰.
do {	
						//jsonDecoder๋กœ [PhoneBook] ํƒ€์ž…์œผ๋กœ jsonData์„ ๋””์ฝ”๋”ฉ ํ•œ๋‹ค.
    let phoneBooks = try jsonDecoder.decode([PhoneBook].self, from: jsonData)
    for phoneBook in phoneBooks {
        print("name: \(phoneBook.name), phoneNumber: \(phoneBook.phoneNumber)")
    }
} catch {
    print("JSON ๋””์ฝ”๋”ฉ ์‹คํŒจ")
}

 

 

 

โœ… URL ๊ธฐ๋ณธ ๊ตฌ์กฐ

URL(Uniform Resource Locator)์€ ์ž์›์˜ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์‹๋ณ„์ž๋‹ค.

์ฆ‰, ์›น์—์„œ ์ž์›์ด ์–ด๋””์— ์žˆ๋Š”์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 

  • URL (Uniform Resource Locators): ์›น์—์„œ ํŠน์ • ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ฃผ์†Œ.
  • Protocol: http, https → ์ธํ„ฐ๋„ท ํ†ต์‹  ๊ทœ์•ฝ์„ ์˜๋ฏธ.
  • Domain: ์ž์›์ด ์œ„์น˜ํ•œ ์„œ๋ฒ„(์ปดํ“จํ„ฐ)์˜ ์ด๋ฆ„. ์˜ˆ๋ฅผ ๋“ค์–ด google, naver . url ์˜ ์ •์ฒด์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • Port: ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์„œ๋ฒ„๋ฅผ ์ด์šฉํ• ์ง€ ๋ฒˆํ˜ธ๋กœ ๊ฒฐ์ •. HTTP ์˜ ๊ฒฝ์šฐ 80. HTTPS ๋Š” 443.
  • Path: ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž์›์˜ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋ƒ„.
  • Query: ์ž์›์— ๋Œ€ํ•œ ์ถ”๊ฐ€์ ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ. ์ฃผ๋กœ key=value ํ˜•์‹์œผ๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” &๋กœ ๊ตฌ๋ถ„.
  • Fragment: ์ž์› ๋‚ด์—์„œ ํŠน์ • ๋ถ€๋ถ„์„ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ ์‚ฌ์šฉ.

 

 

โœ… REST API(Representational State Transfer)

์›น ๊ธฐ๋ฐ˜์˜ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๊ฐ„๋‹จํ•˜๊ณ  ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ด๋‹ค.

REST๋Š” ์ž์›์„ URL๋กœ ์‹๋ณ„ํ•˜๊ณ , HTTP ๋ฉ”์„œ๋“œ(POST, GET, PUT, DELETE)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์›์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

JSON ๋˜๋Š” XML ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” API

 

 

 

๐ŸŒŸ REST API์˜ ์ฃผ์š” ๊ฐœ๋… ๐ŸŒŸ

 

1. ์ž์› (Resource)

URI(Uniform Resource Identifier, URI ์•ˆ์— URL์ด ํฌํ•จ๋œ ๊ฐœ๋…)๋กœ ์‹๋ณ„๋˜๋Š” ๋Œ€์ƒ.

์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์ •๋ณด๋Š” /users๋ผ๋Š” URI๋กœ ์‹๋ณ„๋  ์ˆ˜ ์žˆ๋‹ค.

 

 

2. HTTP ๋ฉ”์„œ๋“œ : ์„œ๋ฒ„๊ฐ€ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•œ(ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•œ) ์š”์ฒญ์˜ ์ข…๋ฅ˜

  • GET : ์กฐํšŒ
    ์˜ˆ) ์ธ์Šคํƒ€๊ทธ๋žจ ๊ฒŒ์‹œ๊ธ€ ๋ณด๊ธฐ 
  • POST : ์ƒ์„ฑ -> ๋‚ด๊ฐ€ ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์˜ฌ๋ ค ๋‘๊ฒ ๋‹ค๋Š” ์š”์ฒญ
    ์˜ˆ) ์ธ์Šคํƒ€๊ทธ๋žจ ํ”ผ๋“œ ์˜ฌ๋ฆฌ๊ธฐ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ, ์„œ๋น„์Šค ๊ฐ€์ž… 
  • PUT : ์—…๋ฐ์ดํŠธ -> ์„œ๋ฒ„์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ฒ ๋‹ค๋Š” ์š”์ฒญ 
    ์˜ˆ) ์ธ์Šคํƒ€๊ทธ๋žจ ํ”ผ๋“œ ์ˆ˜์ •, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ฒŒ์‹œ๋ฌผ ์ข‹์•„์š”, ๋‚˜์˜ ์ •๋ณด ์ˆ˜์ •
  • DELETE : ์‚ญ์ œ  -> ์„œ๋ฒ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๊ฒ ๋‹ค๋Š” ์š”์ฒญ
    ์˜ˆ) ์ธ์Šคํƒ€๊ทธ๋žจ ํ”ผ๋“œ ์‚ญ์ œ 

 

3. HTTP ์ƒํƒœ ์ฝ”๋“œ

ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋Œ€ํ•œ ์„œ๋ฒ„์˜ ์‘๋‹ต ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋ƒ„.

  • 200 OK: ์„ฑ๊ณต
  • 201 Created: ์ž์› ์ƒ์„ฑ ์„ฑ๊ณต
  • 400 Bad Request: ์ž˜๋ชป๋œ ์š”์ฒญ
  • 404 Not Found: ์ž์›์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ
  • 500 Internal Server Error: ์„œ๋ฒ„ ์˜ค๋ฅ˜

 

** URL์„ ๊ฐ€์ง€๊ณ  ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” Swift ํด๋ž˜์Šค๊ฐ€ URLSession.

 


๐ŸŒŸ GET(์กฐํšŒ) ์š”์ฒญ ์˜ˆ์ œ ์ฝ”๋“œ

import Foundation

// 1. ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋ณด๋‚ผ URL์„ ์ƒ์„ฑ
let url = URL(string: "https://jsonplaceholder.typicode.com/posts/1")!
// 2. URL์„ ๊ธฐ๋ฐ˜์œผ๋กœ URLRequest ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ
var request = URLRequest(url: url)
// 3. URLRequest ๊ฐ์ฒด์—  HTTP ๋ฉ”์„œ๋“œ๋ฅผ GET์œผ๋กœ ์„ค์ •
request.httpMethod = "GET"

/* 4. URLSession์˜ ๊ธฐ๋ณธ shared ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ URLSession์„ ์ƒ์„ฑ
URLSession์€ ๋„คํŠธ์›Œํฌ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค๋กœ, ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ์ž‘์—…์„ ๊ด€๋ฆฌ. 
URLSession.shared๋Š” ๊ธฐ๋ณธ ์„ธ์…˜ ์ธ์Šคํ„ด์Šค๋กœ, ์บ์‹œ, ์ฟ ํ‚ค, ์ธ์ฆ์„œ ๋“ฑ์˜ ๊ณตํ†ต ๊ตฌ์„ฑ์„ ๊ฐ–์ถ˜ ๊ณต์œ  ์„ธ์…˜์„ ์ œ๊ณตํ•œ๋‹ค. 
๊ธฐ๋ณธ์ ์œผ๋กœ shared ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋„คํŠธ์›Œํฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
*/
let session = URLSession.shared
// 5. URLSessionDataTask๋ฅผ ์ƒ์„ฑํ•˜์—ฌ GET ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ(์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก)
let task = session.dataTask(with: request) { data, response, error in
    // 6. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธ
    if let error = error {
        print("Error: \(error)")
        return
    }
    // 7. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•˜๋Š”์ง€ ํ™•์ธ
    guard let data = data else {
        print("No data")
        return
    }
    // 8. ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ํŒŒ์‹ฑ
    do {
        let json = try JSONSerialization.jsonObject(with: data, options: [])
        print("JSON Response: \(json)")
    } catch {
        print("Failed to parse JSON: \(error)")
    }
}
/* 9. ์š”์ฒญ ์‹œ์ž‘
URLSessionDataTask๋‚˜ URLSessionDownloadTask ๋“ฑ์˜ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ. 
๋„คํŠธ์›Œํฌ ์š”์ฒญ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผ์‹œ ์ค‘๋‹จ๋œ ์ƒํƒœ๋กœ ์ƒ์„ฑ๋˜๋ฏ€๋กœ, resume()์„ ํ˜ธ์ถœํ•ด ๋„คํŠธ์›Œํฌ ์ž‘์—… ์‹œ์ž‘.
*/
task.resume()

 

์‘๋‹ต ์ฒ˜๋ฆฌ: URLSessionDataTask์˜ ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  • ์—๋Ÿฌ ์ฒ˜๋ฆฌ: ๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋„์ค‘ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌ.
  • HTTP ์‘๋‹ต ์ฒ˜๋ฆฌ: ์„œ๋ฒ„์—์„œ ๋ฐ›์€ HTTP ์‘๋‹ต ์ฝ”๋“œ๋ฅผ ํ™•์ธ.
  • ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ: ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ. ์˜ˆ์ œ์—์„œ๋Š” JSON ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ์‚ฌ์šฉ.

 

ํด๋กœ์ € ๋‚ด๋ถ€์˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋Š” ํ•ด๋‹น ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ๋งŒ ์ฒ˜๋ฆฌ๋œ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ UI์— ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ,

ํด๋กœ์ € ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ.

 

 

๐Ÿ“Œ Swift์—์„œ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด Codable ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ,

JSONSerialization์€ ๋” ๋‚ฎ์€ ์ˆ˜์ค€์˜ JSON ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค!!!!

 

 

๐ŸŒŸ POST(์ƒ์„ฑ) ์š”์ฒญ ์˜ˆ์ œ ์ฝ”๋“œ

import Foundation

// 1. POST ์š”์ฒญ์„ ๋ณด๋‚ผ URL์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
let url = URL(string: "https://jsonplaceholder.typicode.com/posts")!
// 2. URL์„ ๊ธฐ๋ฐ˜์œผ๋กœ URLRequest ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
var request = URLRequest(url: url)
// 3. ์š”์ฒญ์˜ HTTP ๋ฉ”์„œ๋“œ๋ฅผ POST๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
request.httpMethod = "POST"
// 4. ์š”์ฒญ์˜ Content-Type์„ ์„ค์ •ํ•ด ์š”์ฒญ ๋ฐ”๋””์˜ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ JSON์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
request.setValue("application/json", forHTTPHeaderField: "Content-Type")

// 5. ์š”์ฒญ ๋ฐ”๋””์— ํฌํ•จํ•  JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
let parameters: [String: Any] = ["title": "foo", "body": "bar", "userId": 1]
// 6. ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ JSON ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์š”์ฒญ ๋ฐ”๋””์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
// ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ์ฒด๋ฅผ JSON ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์š”์ฒญ ๋ฐ”๋””์— ์„ค์ •.
request.httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: [])

// 7. URLSession์˜ shared ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ URLSession์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
let session = URLSession.shared
// 8. URLSessionDataTask๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
let task = session.dataTask(with: request) { data, response, error in
    // 9. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    if let error = error {
        print("Error: \(error)")
        return
    }
    // 10. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    guard let data = data else {
        print("No data")
        return
    }
    // 11. ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.
    do {
        let json = try JSONSerialization.jsonObject(with: data, options: [])
        print("JSON Response: \(json)")
    } catch {
        print("Failed to parse JSON: \(error)")
    }
}
// 12. ์š”์ฒญ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
task.resume()

 

 

 

์ฝ”๋“œ๋ฅผ ๋ณด๋‹ˆ GET, POST๊ฐ€ ํ—ท๊ฐˆ๋ฆฐ๋‹ค..๐Ÿซ 

์ฐจ์ด์ ์— ๋Œ€ํ•ด ์ข€ ๋” ์ •๋ฆฌํ•ด๋ณธ๋‹ค. 

 

GET ์š”์ฒญ๊ณผ POST ์š”์ฒญ์€ HTTP ํ”„๋กœํ† ์ฝœ์—์„œ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๋ฐฉ์‹์ด๋‹ค. 

 

๐ŸŒŸ GET ์š”์ฒญ

๋ชฉ์ : ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

ํŠน์ง•:

  • ๋ฐ์ดํ„ฐ ์š”์ฒญ: GET ์š”์ฒญ์€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์‚ฌ์šฉ. ์„œ๋ฒ„์—์„œ ์ž์›์„ ์ฝ๊ฑฐ๋‚˜ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ.
  • URL์— ๋ฐ์ดํ„ฐ ํฌํ•จ: ์š”์ฒญํ•  ๋ฐ์ดํ„ฐ๋Š” URL์˜ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์— ํฌํ•จํ•œ๋‹ค. 
    ์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž์˜ ID๋ฅผ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํฌํ•จ์‹œ์ผœ ์„œ๋ฒ„์— ์š”์ฒญ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. 
    https://api.example.com/dposts?userId=1
    ์—ฌ๊ธฐ์„œ ?userId=1 ๋ถ€๋ถ„์ด ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด๋กœ, ์„œ๋ฒ„์— userId๊ฐ€ 1์ธ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์š”์ฒญํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. 
    ์„œ๋ฒ„๋Š” ์ด ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ฝ๊ณ  ํ•ด๋‹น ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜.
    ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , userId๊ฐ€ 1์ธ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ธ๋‹ค(์‘๋‹ต).
  • ์บ์‹ฑ: GET ์š”์ฒญ์€ ์บ์‹œ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ๋™์ผํ•œ ์š”์ฒญ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด๋„ ๋„คํŠธ์›Œํฌ ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ์•ˆ์ „ํ•จ: GET ์š”์ฒญ์€ ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์•ˆ์ „ํ•˜๋‹ค.
  • idempotent: GET ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•ด๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๐ŸŒŸ POST ์š”์ฒญ

๋ชฉ์ : ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.
์˜ˆ) ์ธ์Šคํƒ€๊ทธ๋žจ ํ”ผ๋“œ ์˜ฌ๋ฆฌ๊ธฐ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ, ์„œ๋น„์Šค ๊ฐ€์ž… 

 

ํŠน์ง•:

  • ๋ฐ์ดํ„ฐ ์ „์†ก: POST ์š”์ฒญ์€ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ฑฐ๋‚˜ ์ œ์ถœํ•  ๋•Œ ์‚ฌ์šฉ. 
  • ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ฐ”๋””์— ๋ฐ์ดํ„ฐ ํฌํ•จ: ์š”์ฒญ ๋ฐ์ดํ„ฐ๋Š” HTTP ์š”์ฒญ์˜ ๋ฐ”๋””์— ํฌํ•จ๋œ๋‹ค. 
  • ์ผ๋ฐ˜์ ์œผ๋กœ JSON, XML, ๋˜๋Š” ํผ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ์ „์†ก.
  • ์บ์‹ฑ ์•ˆ ๋จ: POST ์š”์ฒญ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์บ์‹œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ํ•ญ์ƒ ์„œ๋ฒ„๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  • ์•ˆ์ „ํ•˜์ง€ ์•Š์Œ: POST ์š”์ฒญ์€ ์„œ๋ฒ„์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฏ€๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค.
  • idempotent ์•„๋‹˜: ๋™์ผํ•œ POST ์š”์ฒญ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

๊ด€๋ จ๊ธ€ ๋”๋ณด๊ธฐ