1) ViewController 생명주기
2) 메모리 관리 이해
3) Core Data 와 UserDefaults
4) 네트워크 통신 이해
5) 날씨 앱 만들기
해당 내용은 이 문서를 참고!
: 서버와 소통하게 해주는 인터페이스
API RequestAPI ResponseAPI 명세를 잘 읽고, 적절한 API Request를 넣으면 된다.
URL은 복잡해보이지만 구조를 가지고 있다.
- URL (Uniform Resource Locators): 웹에서 특정 위치를 나타내는 주소.
- Protocol:
http,https→ 인터넷 통신 규약을 의미.- Domain: 자원이 위치한 서버(컴퓨터)의 이름. 예를 들어
naver등. 해당 url 의 정체성을 나타낸다.- Port: 구체적으로 어떤 서버를 이용할지 번호로 결정. HTTP 의 경우 80. HTTPS 는 443.
- Path: 서버에서 제공하는 자원의 경로를 나타냄.
- Query: 자원에 대한 추가적인 매개변수를 전달하는 데 사용됨. 주로
key=value형식으로 표현되며, 여러 개의 매개변수는&로 구분.- Fragment: 자원 내에서 특정 부분을 가리킬 때 사용.
내 벨로그 주소를 예시로 알아보자.

위 사진을 보면 알겠지만 Port는 자주 생략된다고 한다.
: 전세계에서 대표적으로 널리 쓰이는 API 형식중 하나로, HTTP URL을 통해 자원을 명시한다.
REST API는 HTTP 메서드를 통해 자원의 CRUD를 결정한다.
- GET: 자원 조회 (Read)
- Post: 자원 생성 (Create)
- Put: 자원 업데이트 (Update)
- Delete: 자원 삭제 (Delete)
: Swift에서 서버와 URL로 통신하기 위해 제공되는 클래스
URLSession으로 네트워크 통신하되, 여러가지 커스텀한 설정을 할 때 URLSessionConfiguration 이용
ex) 네트워크 통신 타임아웃 시간 설정, 캐시 정책 설정 등
다음과 같이 객체 생성 가능
let defaultUrlSession = URLSession(configuration.default)
URLSessionTask으로 통신할 때 어떤 태스크 수행할 것인지 결정 가능
URLSessionDataTask: GET 요청, 서버로부터 데이터 가져오거나 전송할 때 사용URLSessionDownloadTask: 파일 다운로드시 사용, 백그라운드 다운로드 지원URLSessionUploadTask: 파일 업로드시 사용, 백그라운드 업로드 지원import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
fetchData()
}
// 서버 데이터를 불러오는 메서드 선언
private func fetchData() {
let defaultUrlSession = URLSession(configuration: .default)
guard let url: URL = URL(string: "https://reqres.in/api/users/1") else {
print("URL is not correct")
return
}
// URLRequest 설정
var request: URLRequest = URLRequest(url: url)
// GET 메소드 사용
request.httpMethod = "GET"
// json 데이터 형식임을 나타냄
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
// URLSession 생성 (기본 default 세션)
let session: URLSession = URLSession(configuration: .default)
// dataTask
session.dataTask(with: request) { (data, response, error) in
// http 통신 response 에는 status code 가 함께오는데, 200번대가 성공을 의미.
let successRange: Range = (200..<300)
// 통신 성공
guard let data, error == nil else { return }
if let response: HTTPURLResponse = response as? HTTPURLResponse{
print("status code: \(response.statusCode)")
// 요청 성공 (StatusCode가 200번대)
if successRange.contains(response.statusCode){
// decode
guard let userInfo: ResponseData = try? JSONDecoder().decode(ResponseData.self, from: data) else { return }
print(userInfo)
} else { // 요청 실패 (Status code가 200대 아님)
print("요청 실패")
}
}
}.resume()
}
}
// 데이터 구조체 정의
struct UserData: Codable {
let id: Int
let email: String
let firstName: String
let lastName: String
let avatar: URL
// JSON 키와 구조체 프로퍼티 간의 매핑을 위해 CodingKeys 열거형 정의
enum CodingKeys: String, CodingKey {
case id
case email
case firstName = "first_name"
case lastName = "last_name"
case avatar
}
}
// Support 구조체 정의
struct SupportData: Codable {
let url: URL
let text: String
}
// 최상위 구조체 정의
struct ResponseData: Codable {
let data: UserData
let support: SupportData
}