RESTful/JSON/Open API (RESTful이 중요한 이유)

CDH·2025년 5월 5일
post-thumbnail

RESTful/JSON/Open API

영화진흥위원회 오픈API 정보

  • 2025년 5월 3일 기준


JSON 데이터의 코드 정렬과 가독성

https://codebeautify.org/jsonviewer

퀵타입 (quicktype) : JSON 데이터의 데이터 모델 만들기

https://app.quicktype.io/

JSON

Swift


REST(REpresentational State Transfer)

웹에서 정보를 주고받는 방법(아키텍처 스타일)

  • 웹에서 컴퓨터들이 데이터를 주고받는 규칙

REST의 특징

  • 리소스(resource)
    - 인터넷에 존재하는 모든 정보(회원, 게시글 등)
    - 예: /users/1 (1번 회원), /posts (게시글 전체)

  • 주소(URI, URL):
    - 리소스마다 주소가 있음
    - 예: https://site.com/users/1

  • 행동(HTTP 메서드):
    - 어떤 행동을 할지 정하는 방법
    - GET (가져오기), POST (생성), PUT (수정), DELETE (삭제)
    - 1번 유저 정보 가져오기
    • GET/users/1

RESTful

  • https://en.wikipedia.org/wiki/Representational_state_transfer
  • REST(REpresentational State Transfer)는 HTTP 기반의 소프트웨어 아키텍처 스타일
  • 로이 필딩(Roy Fielding)이 2000년에 UC 어바인에서 "Ritectural Styles
    and the Design of Network-based Software Architectures"는 박사 학위
    논문에 REST를 정의
  • REST 설계 지침을 따르는(최대한 지키는) 웹 서비스를 RESTful이라 함

- RESTful한 API 예

  • GET /users → 회원 목록 보기
  • GET /users/1 → 1번 회원 정보 보기
  • POST /users → 새 회원 추가
  • PUT /users/1 → 1번 회원 정보 수정
  • DELETE /users/1 → 1번 회원 삭제


    - RESTful하지 않은 예
  • 주소에 동작이 섞여 있음
  • POST /users/getUser → 회원 정보 보기
  • GET /users/deleteUser → 회원 삭제

RESTful API 와 HTTP 전송방식

일반적으로 서버에 요청하는 정보의 타입은 쓰기(Create), 읽기(Read),
수정(Update), 삭제(Delete)
로 구분되고, 네가지의 첫글자를 합쳐서
CRUD 라고 부름

  • URI 구성권고에 따르면 RESTful API 구성을 위한 URI에는 정보의 분류
    체계만 포함되어야지, 정보를 어떻게 다룰 것인가 하는 동작에 관한 명세는
    포함하지 않을 것을 권고함

  • URI 어떤 계층의 어떤 데이타라는 정보만 기재할뿐, 그 데이타를 읽을지 쓸지 등에 대한
    액션 구분은 URI 에 나타내지 않음

  • 권고안에서는 HTTP 메소드를 사용하여 이같은 액션을 구분해 줄 것을
    권고함

  • RESTful API 형식으로 데이터를 제공하면, 서버에서 작성해 놓은 URI 명세에
    따라 원하는 요청을 식별할 수 있도록 URI 를 구성하여 보내면 됨


알고가기 (API 개념이 중요한 이유)

  • 회사에 규모가 커지면 Open API를 통해 자신이 갖고 있는 회사의 정보를 개발자들에게 접근할 수 있도록 해준다
    -> 개발자들이 앱이나 웹사이트를 활용하게 되면서 홍보나 파일의 규모를 자동적으로 키워나갈 수 있다


REST vs SOAP


XML(Extensible Markup Language)

  • 시작 태그

  • 끝 태그

  • 빈 요소 태그

  • 파싱(Parsing)
    - XML데이터를 추출하여 분석
    - 파싱을 처리하는 모듈을 파서(parser)라 함

  • 장점
    - 플랫폼 독립적

  • 단점
    - 마크업 태그를 사용하므로 데이터량 큼


JSON(JavaScript Object Notation)


JSON의 구조

  • name/value 형태의 쌍
    - collection 타입
    - 프로그래밍 언어에서 object, record, struct, dictionary (swift), hash table, 키가 있는 list 등

  • 순서있는 값들의 리스트
    - array(swift), vector, list, sequence

  • JSON객체(object)는 name/value 쌍들의 순서없는 SET
    - object는 "{" 로 시작하고 "}" 로 끝냄
    - 각 name 뒤에 ":"을 붙임
    - ", "로 name/value 쌍을 구분

{ "이름": "김컴소", "나이": 20, "성별": "남" }
{ "이름": "김컴소",
"나이": 20,
"성별": "남",
"전화": {"휴대" :"010-1111-2222", "집" : "02-1111-2345"}
}

JSON 배열

  • array는 순서가 있는 값의 collection
  • array는 "["로 시작해서 "] " 로 끝냄
  • ","로 array의 값들을 구분

알고가기

※ 모든 struct은 Codable 프로토콜을 준수해야 한다


내가 사용할 오픈api : NASA Open API

API

  • Application Programming Interface
  • 두 개 이상의 컴퓨터 프로그램이 서로 통신하는 방법
  • 다른 소프트웨어에 서비스를 제공하는 소프트웨어 인터페이스
  • 컴퓨터와 사람을 연결하는 UI와 달리 API는 컴퓨터나 소프트웨어를 서로 연결
  • printf, Java SE APIs, Windows API, SQLIte API, OpenGL API, Open API 등

오픈 API (Open API)

일부 웹사이트에서 SOAP 프로토콜이나 RESTful 형식을 사용하여 공공 컨텐츠를 제공하는데 이를 오픈 API (Open API)라 함

https://github.com/dl0312/open-apis-korea
https://rapidapi.com/blog/most-popular-api/
https://data.seoul.go.kr/datasetRanking/popular.do


공공데이터 포털 Open API

  • 지역별 운행 시내버스 정보
  • 지역별 축제나 문화 관광지 안내 정보
  • 실시간 약국 정보
  • 도서관 좌석 정보
  • 지역별 제공 와이파이 정보
  • 쇠고기 이력 정보
  • 공공 기관의 채용, 행사 이벤트 등에 대한 정보
  • 예금대출 금리 비교 정보
  • GPS 기반 날씨와 미세먼지 정보
  • 아파트 실거래 가격 지수

http://www.data.go.kr


서울 열린 데이터 광장

  • 오픈 API와 더불어 시각화 자료, 파일 데이터등 다양한 형식의 자료 제공
  • 지하철역별 승하차 인원 및 시간대별 승객 현황
  • 보관 분실물 목록 조회
  • 미분양 주택 현황
  • 개별 공시지가
  • 공영 주차장 정보 및 주차 가능 대수 현황
  • 서울 안심 먹거리 목록
  • 버스 도착 정보 조회
  • 시장 마트 정보
  • 지역 시장 및 마트별 생필품 가격 정보
  • 일별 기상 관측 정보

https://data.seoul.go.kr/ 활용사례(갤러리)


네이버 Open API


카카오 개발자 서비스

https://developers.kakao.com/


11번가 Open API Center

https://openapi.11st.co.kr/openapi/OpenApiFrontMain.tmall

쿠팡 Open API

https://developers.coupangcorp.com/hc/ko


YouTube Data API

https://developers.google.com/youtube/v3/getting-started?hl=ko


Open API를 이용한 앱 개발 단계

  1. 원하는 정보를 제공하는 웹 서비스와 사용할 Open API 선정
  2. Open API 사용을 위한 신청과 인증키 발급
  3. 네트워크를 통해 데이터 요청
  4. 받은 데이터를 파싱하여 앱에서 사용

iOS 앱 개발을 위한 개념들

if~let vs guard~let

  • gaurd let이 제어문에서 가장 중요한 개념이다


failable initializer(실패 가능한 생성자: init?)

네트워킹

  1. URL 만들기
    • URL(string: String)
  2. URLSession 만들기
    • URLSession(configuration: URLSessionConfiguration)
  3. URLSession 인스턴스에게 task주기
    • URLSession인스턴스.dataTask(with:completionHandler:)
  4. task시작하기
    • URLSessionTask인스턴스.resume()

함수 : C언어 vs. Swift

함수의 매개변수와 자료형을 지정해줘야 한다
swift에서는 반환값의 자료형도 지정함


함수명이 궁금해요 : #function 리터럴(literal)

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/expressions/


1급 객체(first class object) 또는 1급 시민(first class citizen)

https://en.wikipedia.org/wiki/First-class_citizen

  • Swift의 함수는 1급 객체이다. (함수형 언어)
    1급 객체(first class object) 또는 1급 시민(first class citizen)
  • 다음 조건을 충족하는 객체를 1급 객체라고 한다.
    1) 변수에 저장할 수 있다.
    2) 매개변수로 전달할 수 있다.
    3) 리턴값으로 사용할 수 있다.


함수 : 일급 객체 실습해보기

func decideFun(x: Bool) -> (Int) -> Int {
    if x {
        return toUp
    } else {
        return toDown
    }
}

func down(num: Int) -> Int {
    return num - 1
}

func up(num: Int) -> Int {
    return num + 1
}

func upDown(Fun: (Int) -> Int, value: Int) {
    let result = Fun(value)
    print("결과 = \(result)")
}

let toUp = up
let toDown = down
let r = decideFun(x: true)

print(up(num: 10))
print(toUp(10))
upDown(Fun: toUp, value: 10)
upDown(Fun: toDown, value: 10)
print(type(of: r))
print(r(10))

클로저(Closure) 표현식

과제 부분의 출력 결과
(Int, Int) -> Int


후행 클로저(trailing closure)

  • 예시

func mul(a: Int, b: Int) -> Int {
    return a * b
}
let multiply = { (a: Int, b: Int) -> Int in
    return a * b
}
print(mul(a: 10, b: 20))
print(multiply(10, 20))

let add = { (a: Int, b: Int) -> Int in
    return a + b
}
print(add(10, 20))

func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
    return cal(x, y)
}
var result = math(x: 10, y: 20, cal: add) // return add(10, 20)
print(result)

result = math(x: 10, y: 20, cal: multiply) // return multiply(10, 20)
print(result)

result = math(x: 10, y: 20, cal: { (a: Int, b: Int) -> Int in
    return a + b
}) // 클로저 소스를 매개변수에 직접 작성
print(result)

result = math(x: 10, y: 20) { (a: Int, b: Int) -> Int in
    return a + b
} // trailing closure
print(result)


클로저의 축약 표현들

// 일반적인 클로저 정의 방식
let multiply = {(a: Int, b: Int) -> Int in
    return a * b
}
var result = multiply(10, 20)
print(result)

func mul(a: Int, b: Int) -> Int {
    return a * b
}
let result2 = mul(a:10, b:20)
print(result2)

// 변수에 클로저 할당
let add = {(a: Int, b: Int) -> Int in
    return a + b
}
result = add(10, 20)
print(result)

// 함수를 이용한 클로저 전달
func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
    return cal(x, y)
}

result = math(x: 10, y: 20, cal: add)
print(result)
result = math(x: 10, y: 20, cal: multiply)
print(result)

// 클로저 소스를 매개변수에 직접 작성
result = math(x: 10, y: 20, cal: {(val1: Int, val2: Int) -> Int in
    return val1 + val2
}) // 리턴형 생략
print(result)

result = math(x: 10, y: 20) {(val1: Int, val2: Int) in
    return val1 + val2
} // trailing closure, 리턴형 생략
print(result)

result = math(x: 10, y: 20, cal: {
    return $0 + $1
}) // 매개변수 생략하고 단축인자(shorthand argument name) 사용
print(result)

result = math(x: 10, y: 20) {
    return $0 + $1
} // trailing closure, 매개변수 생략하고 단축인자사용
print(result)

result = math(x: 10, y: 20, cal: {
    $0 + $1
}) // 클로저에 리턴값이 있으면 마지막 줄을 리턴하므로 return 생략
print(result)

result = math(x: 10, y: 20) { $0 + $1 } // return 생략
print(result)

/*
 클로저가 함수의 마지막 argument라면 마지막 매개변수 이름(cal:)을 생략한 후 함수 소괄호 외부에 클로저를 구현
*/

디폴트 매개변수(아규먼트) 정의하기


present(_:animated:completion:)

https://developer.apple.com/documentation/uikit/uiviewcontroller/present(_:animated:completion:)

0개의 댓글