REST API in iOS

장수빈·2025년 7월 1일

CS

목록 보기
13/14

REST API의 개념 및 제약조건

REST API(Representational State Transfer)란?

REST는 HTTP 프로토콜을 기반으로 설계된 웹 서비스 아키텍처 스타일

REST의 핵심 제약 조건(Constraints)

제약 조건설명
Client-Server클라이언트와 서버가 독립적으로 분리되어야 합니다.
Stateless(무상태성)서버는 클라이언트의 상태를 유지하지 않습니다.
Cacheable(캐시 가능)응답은 캐시 가능 여부를 명확히 정의해야 합니다.
Uniform Interface일관된 인터페이스(HTTP 메서드 등)를 사용합니다.
Layered System다층 시스템 구조로 구성되어야 합니다.
Code on Demand클라이언트가 실행할 코드를 서버가 제공할 수 있습니다. (선택사항)

iOS에서 URLSession을 이용한 네트워크 요청 기본 과정

// URL 객체 생성
guard let url = URL(string: "https://api.example.com/data") else { return }

// URLSession으로 요청 생성
let task = URLSession.shared.dataTask(with: url) { data, response, error in
	guard let data = data, error == nil else {
	print("Error: \(error)")
	return
	}
	//데이터 처리
	print(String(data: data, encoding: .utf8)!)
}
//네트워크 요청 시작
task.resume()

URLSession 외의 네트워크 라이브러리와 장단점

Alamofire

항목설명
장점 ✅코드 간결성, 쉬운 사용법, 높은 확장성, 가독성 우수
단점 ❌외부 의존성 추가, URLSession보다 상대적으로 큰 크기

Moya(Alamofire 기반)

항목설명
장점 ✅네트워크 요청 추상화, 코드 구조화(MVVM)에 유리, 유지보수성 좋음
단점 ❌추가적인 러닝 커브, Alamofire에 추가적인 레이어

REST API에서 HTTP메서드들의 차이점과 용도

메서드설명용도 예시멱등성(Idempotent)
GET리소스 조회게시글 목록 가져오기✅ (O)
POST리소스 생성게시글 작성❌ (X)
PUT리소스 전체 교체(업데이트)프로필 전체 업데이트✅ (O)
PATCH리소스의 일부 변경프로필 일부(이름) 수정❌ (X)
DELETE리소스 삭제게시글 삭제✅ (O)

GET과 POST의 주요 차이점

특성GETPOST
Body 유무❌ (없음, 파라미터는 주로 URL)✅ (있음, HTTP Body에 포함 가능)
캐싱 가능 여부✅ 캐싱 가능❌ 기본적으로 캐싱하지 않음
멱등성✅ 멱등적❌ 비멱등적

멱등성(Idempotent): 같은 요청을 여러번 보내도 결과가 동일


PUT과 PATCH의 차이점&사용법

메서드설명사용 예시
PUT전체 리소스 교체사용자 프로필 전체 정보 수정
PATCH일부 필드만 부분 수정사용자 이름, 이메일만 변경
  • PUT: 전체 데이터 보내야함
  • PATCH: 변경할 데이터만 보낼 수 있음

HTTP 상태 코드 의미

코드 범위의미대표 코드
1xx정보성 응답(진행 중)100 Continue
2xx성공200 OK, 201 Created
3xx리다이렉션301 Moved Permanently, 304 Not Modified
4xx클라이언트 에러400 Bad Request, 401 Unauthorized, 404 Not Found
5xx서버 에러500 Internal Server Error, 503 Service Unavailable

4xx 에러와 5xx 에러 차이점 및 대응법

분류원인대응 방안
4xx클라이언트 요청 잘못사용자에게 알림(입력 확인 유도)
5xx서버 문제재시도 로직, 사용자에게 일시적 문제 안내

ex)

  • 401: 사용자에게 로그인 안내
  • 500: 일정 시간 후 재시도 안내

JSON 데이터를 Swift 객체로 변환 (Decoding)

struct User: Codable {
    let id: Int
    let name: String
}

let jsonData = """
{
    "id": 123,
    "name": "John"
}
""".data(using: .utf8)!

do {
    let user = try JSONDecoder().decode(User.self, from: jsonData)
    print(user.name) // "John"
} catch {
    print("Decoding error: \(error)")
}
  • Codable은 Encodable과 Decodable을 합친 프로토콜
  • Encodable: Swift 객체 -> JSON 인코딩
  • Decodable: JSON -> Swift 객체 디코딩

JSON 키와 Swift property 이름이 다를 경우 매핑법(CodingKeys)

struct User: Codable {
    let userID: Int
    let userName: String
    
    enum CodingKeys: String, CodingKey {
        case userID = "user_id"
        case userName = "user_name"
    }
}

요약

  • REST는 Stateless, Cacheable 등의 원칙을 가진 웹 서비스 디자인
  • URLSession은 iOS 네트워크 요청 기본 API, Alamofire 등 외부 라이브러리도 활용 가능
  • HTTP 메서드는 목적과 멱등성에 따라 선택
  • JSON <-> Swift 객체 변환은 Codable 활용
profile
iOS 공부 이모저모 낙서장

0개의 댓글