티스토리 뷰
앱개발 심화 1주차 정리 - 3
서버/클라이언트 개념
서버와 클라이언트
서버는 데이터나 리소스를 제공하는 시스템으로
클라이언트의 요청을 처리해 그에 맞는 응답을 반환한다.
클라이언트는 사용자를 대표해 서버에 요청을 보내며
그에 대한 응답을 받는 장치 및 프로그램에 해당한다.
3 - Tier 아키텍쳐
서버는 클라이언트에게 요청을 받으면 요청사항에 맞는
데이터를 데이터베이스에서 꺼내어 클라이언트에게 전달한다.
프로토콜
위 이미지에선 클라이언트의 요청을 서버가 알아듣지 못하고 있다.
이러한 상황을 방지하기 위해 지켜야하는 통신 규약을 프로토콜이라고 한다.
HTTP
클라이언트와 서버는 HTTP 라는 프로토콜을 이용해서 서로 통신한다.
여기서 HTTP를 이용해 주고받는 메시지는 "HTTP 메시지" 라고 부른다.
API
음식점에서 주문을 하려면 메뉴판을 보고 주문을 해야하는 것처럼
서버에 요청을 보내려면 정확한 방법에 따라 요청을 보내야 한다.
서버는 클라이언트가 리소스를 활용할 수 있도록 하기 위한
인터페이스를 제공해 줘야 하는 이것을 API라고 한다.
REST API
REST API란?
REST API란 REST를 기반으로 만들어진 API를 의미하는데
REST는 Representational State Transfer의 약자로
HTTP URI를 통해 자원을 명시하고, HTTP Method를 통해
해당 자원에 대한 CRUD 작업을 수행하는 것을 의미한다.
REST의 핵심 원칙
1. 자원(리소스)의 식별: 각 리소스는 고유한 URI로 식별된다.
2. 메시지의 상태를 통한 표현: 리소스는 JSON, XML 등의 형식으로 표현된다.
3. 상태가 없는 통신: 각 요청은 서버에서 필요한 모든 정보를 포함하고 있어야 한다.
이를 통해 서버는 각 요청을 개별적으로 처리할 수 있다.
4. 클라이언트 - 서버 구조: UI와 DB의 관심사가 분리되어 각각의 독립성이 높아진다.
5. 캐시 처리 가능: 응답 데이터에 캐싱이 가능한지 여부를 명시하여 성능을 향상시킬 수 있다.
6. 계층화된 시스템: 서버와 클라이언트 사이에 다양한 계층(보안, 로드 밸런싱 등)이 존재할 수 있다.
해당 REST 원칙을 지킨 API를 RESTful API라고 한다.
HTTP 메서드
- GET: 리소스 조회
- POST: 리소스 생성
- PUT: 리소스 수정
- DELETE: 리소스 삭제
REST는 주로 HTTP 프로토콜 위에서 구현된다.
JSON
JSON
데이터 저장 및 전송에 사용되는 경량의 데이터 교환 형식으로
서버의 응답은 보통 JSON형식의 데이터로 이루어져있다.
JSON데이터는 하나의 NAME과 VALUE로 이루어져있다.
데이터 이름은 String 타입이어야 하며 값에는
숫자, 문자열, 불리언, 객체, 배열 NULL값등이 올 수 있다.
JSON 배열
JSON 객체는 중괄호로 둘러쌓여 있고 JSON 배열은 대괄호로 둘러쌓여 있다.
다른 배열과 마찬가지로 쉼표를 사용해 배열 안에 여러 JSON 데이터를 포함할 수 있다.
GSON
Gson이란?
안드로이드 개발을 하다보면 Json 데이터를 코틀린(자바) 객체로
변환해야 할 때가 있는데 이러한 작업을 직렬화/역직렬화라고 한다.
Gson 라이브러리는 해당 작업을 매우 간단하게 처리할 수 있도록 해준다.
사용법
val gson = Gson()
val jsonString = gson.toJson(someObject)
Kotlin 객체를 Json으로 변환하는 구문이다.
val myClassInstance: MyClass = gson.fromJson(jsonString, MyClass::class.java)
Json을 Kotlin 객체로 변환하는 구문이다.
data class Person(
@SerializedName("person_name")
val name: String
)
Kotlin 데이터 클래스의 필드와 JSON의 키 이름이 다를 경우
@SerializedName 어노테이션을 활용하여 매핑이 가능하다.
Retrofit
Retrofit이란?
HTTP API를 자바, 코틀린의 인터페이스 형태로 변환해
안드로이드 개발 시 API를 쉽게 호출할 수 있도록 해주는 라이브러리이다.
Retrofit의 장점
- HTTP API 요청을 쉽고 간결하게 만들 수 있다.
(간단한 어노테이션을 통해 요청 메서드와 URL을 정의할 수 있다.)
- 내부적으로 OkHttp 라이브러리를 사용하여 통신, 이를 통해 안정적인 통신이 가능하다.
- 인터셉터를 사용하여 요청/응답 프로세스를 확장하거나 수정할 수 있다.
- 다양한 데이터 형식(JSON, XML 등)에 대해 데이터 변환 컨버터를 제공한다.
- RxJava, Coroutines와 같은 비동기 프로그래밍 라이브러리와 연동 가능하다.
Retrofit의 장점엔 간결성, 확장성, 안정성, 연동성 등이 있다.
Retrofit 사용법
implementation("com.squareup.retrofit2:retrofit:2.11.0")
implementation("com.squareup.retrofit2:converter-gson:2.11.0")
레트로핏을 사용하려면 그래들 파일에 retrofit과 gson 라이브러리를 추가해야한다.
// API 인터페이스 정의
interface ApiService {
@GET("users/{id}")
fun getUser(@Path("id") id: Int): Call<User>
}
여기서 User는 응답으로 받아올 데이터 클래스에 해당한다.
// Retrofit 인스턴스 생성하기
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
val apiService = retrofit.create(ApiService::class.java)
ApiService 객체를 통해 정의된 API 요청을 사용할 수 있다.
응답 처리하기
val response: Response<User> = apiService.getUser(id).execute()
응답을 동기식으로 요청하는 구문이다. 응답이 올 때까지 다음 코드의 실행이 중단된다.
apiService.getUser(id).enqueue(object: Callback<User> {
override fun onResponse(call: Call<User>, response: Response<User>) {
// 처리
}
override fun onFailure(call: Call<User>, t: Throwable) {
// 오류 처리
}
})
응답을 비동기식으로 요청하는 구문으로 응답 요청은 백그라운드에서 실행된다.
콜백을 사용해 응답에 대한 처리를 정의하며, 응답이 올 때 상황에 맞는 콜백이 실행된다.
응답 객체 사용하기
if (response.isSuccessful) {
// 유저 변수 초기화 (null값이 들어올 수도 있다.)
val user: User? = response.body()
} else {
// 오류 메시지 처리
val error: String = response.errorBody()?.string() ?: "Unknown error"
}
Response 객체를 통해 HTTP 응답의 여러 정보에 접근할 수 있다.
'내일배움캠프 > Android 국비지원' 카테고리의 다른 글
TIL 61일차 (챌린지반 7주차 세션 정리 및 과제) (0) | 2024.08.12 |
---|---|
TIL 60일차 (Compose 특강 3회차 정리) (0) | 2024.08.12 |
TIL 58일차 (앱개발 심화 1주차 정리 - 2) (0) | 2024.08.12 |
TIL 57일차 (앱개발 심화 1주차 정리 - 1) (0) | 2024.08.08 |
TIL 56일차 (챌린지반 6주차 세션 정리) (0) | 2024.08.08 |