Swift - RESTful, Open API, 기타 문법
REST?
(REpresentational State Transfer)
HTTP 기반의 소프트웨어 아키텍처 스타일로, 로이 필딩이 이를 정의했다.
특징으로는 resource, URI, URL, HTTP 메서드(GET, POST, PUT, DELETE)가 있다.
RESTful?
REST 설계 지침을 따르는 웹 서비스를 RESTful이라고 한다.
ex) REST의 원칙대로 깔끔하게 잘 설계한 API를 'RESTful하다' 로 표현
정보를 어떻게 다룰 것인가 하는 동작에 관한 명세는 포함하지 않을 것을 권고
= 정보의 분류 체계만 포함되어야 한다.
REST vs SOAP
항목 | REST 방식 | SOAP 방식 |
---|---|---|
기본 요청 URL | http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.xml 또는 .json | http://www.kobis.or.kr/kobisopenapi/webservice/soap/boxoffice |
WSDL URL | 해당 없음 | http://www.kobis.or.kr/kobisopenapi/webservice/soap/boxoffice?wsdl |
Operation | GET 방식으로 호출 | searchDailyBoxOfficeList |
응답 형식 | XML 또는 JSON (확장자 .xml / .json) | XML (SOAP 표준 형식) |
요청 방식 | HTTP GET (3번항의 요청 인터페이스 참조) | SOAP 메시지 기반 POST 방식 |
조회 조건 | 영화 구분(다양성/상업), 국적(한국/외국), 상영지역 등 | 동일 조건 |
특징 | 간단하고 가벼움. 확장자로 포맷 구분 가능 | 구조화된 메시지 형식, 정형화된 호출 |
XML
(Extensibe Markup Language)
파싱(Parsing)은 XML 데이터를 추출하여 분석하는 것을 말한다.(파싱을 처리하는 모듈: Parser)
장점은 플랫폼이 독립적이라는 것, 단점은 마크업 태그를 사용하여 데이터량이 크다는 것이다.
JSON
(JavaScript Object Notation)
XML의 장점은 그대로, 단점을 극복하기 위해 만들어졌다. (경량의 데이터량)
사람이 읽고 쓰기에도, 기계가 분석하고 생성하기에도 용이
구분 | 형식 | 명칭 | |
---|---|---|---|
집합 구조 | 여러 속성을 정의하는 순서 없는 집합 | { 키: 값, 키: 값, … } | JSON 객체 |
리스트 구조 | 비슷한 객체가 반복 나열되는 순서 있는 리스트 | [ 객체1, 객체2, … ] | JSON 배열 |
API
(Application Programming Interface)
두 개 이상의 컴퓨터 프로그램이 서로 통신하는 방법
UI는 컴퓨터와 사람을 연결하지만 API는 컴퓨터나 소프트웨어를 서로 연결
ex) printf, Java SE APIs, Windows API, SQLIte API, OpenGL API, Open API 등
Open API
일부 웹사이트에서 제공하는 SOAP 프로토콜이나 RESTful 형식을 사용한 공공 콘텐츠
ex) 서울 열린 데이터 광장, 공공데이터포털, 네이버 Open API 등등
present(_:animated:completion:)
func present(
_ viewControllerToPresent: UIViewController,
animated flag: Bool,
completion: (() -> Void)? = nil
)
//ex)
present(alert, animated: true, completion: nil)
//aleat라는 창 띄우기, 애니메이션 효과와 함께, 그 후 실행할 것 X (없으면 생략 가능)
모달 방식으로 새로운 뷰컨트롤러를 보여 준다.
(모달: 해당 뷰 컨트롤러를 없애야 원래 컨트롤러를 볼 수 있음)
present(표시할 뷰 컨트롤러:애니메이션 여부:뷰 컨트롤러 보여진 후 실행할 블록)
reverseGeocodeLocation(_:completionHandler:)
func reverseGeocodeLocation(_ location: CLLocation, completionHandler: @escaping CLGeocodeCompletionHandler)
//escaping 클로저 (@escaping): 클로저가 인자로 전달되었을 때, 함수 실행 종료 후 실행되는 클로저
//Non-Escaping 클로저는 이와 반대. 함수의 실행이 종료되기 전에 실행
클로저의 여러 축약 표현들
// 1. 기본 클로저 (매개변수 타입, 반환 타입, return 모두 명시)
let multiply = { (a: Int, b: Int) -> Int in
return a * b
}
var result = multiply(10, 20)
print(result) // 200
// 2. 또 다른 기본 클로저 (덧셈용)
let add = { (a: Int, b: Int) -> Int in
return a + b
}
result = add(10, 20)
print(result) // 30
// 3. 클로저를 매개변수로 받는 함수 정의
func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
return cal(x, y)
}
// 4. 클로저 상수를 매개변수로 전달
result = math(x: 10, y: 20, cal: add)
print(result) // 30
result = math(x: 10, y: 20, cal: multiply)
print(result) // 200
// ↓↓↓ 아래부터 클로저 표현 축약 단계 ↓↓↓
/* 5. 클로저를 함수 인자에 직접 작성
- 타입 명시
- 반환 타입 명시
- return 키워드 사용 */
result = math(x: 10, y: 20, cal: { (val1: Int, val2: Int) -> Int in
return val1 + val2
})
print(result) // 30
/* 6. trailing closure 사용
- 마지막 인자가 클로저이면 괄호 바깥으로 뺄 수 있음 */
result = math(x: 10, y: 20) { (val1: Int, val2: Int) -> Int in
return val1 + val2
}
print(result) // 30
/* 7. 반환 타입 생략
- Swift가 문맥으로 리턴 타입을 추론 */
result = math(x: 10, y: 20, cal: { (val1: Int, val2: Int) in
return val1 + val2
})
print(result) // 30
/* 8. trailing closure + 반환 타입 생략 */
result = math(x: 10, y: 20) { (val1: Int, val2: Int) in
return val1 + val2
}
print(result) // 30
/* 9. 단축 인자 이름 사용 ($0, $1)
- 매개변수 이름도 생략 가능 */
result = math(x: 10, y: 20, cal: {
return $0 + $1
})
print(result) // 30
/* 10. trailing closure + 단축 인자 이름 */
result = math(x: 10, y: 20) {
return $0 + $1
}
print(result) // 30
/* 11. return 생략
- 클로저 마지막 표현식이 결과로 자동 반환됨 */
result = math(x: 10, y: 20, cal: {
$0 + $1
})
print(result) // 30
/* 12. 최종 축약형: trailing closure + 단축 인자 + return 생략 */
result = math(x: 10, y: 20) { $0 + $1 }
print(result) // 30
+ JSON 파일로 파싱하기
모든 출처: youtube - smile han