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의 주요 차이점
| 특성 | GET | POST |
|---|
| 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 활용