일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 안드로이드 클린 아키텍처
- 안드로이드 Espresso
- 안드로이드 hilt
- 안드로이드 리싸이클러뷰
- coroutine
- 안드로이드 JUnit
- android DI
- 스타트업 코딩테스트
- android memory leak
- 안드로이드 mvvm
- Koin
- Android MVVM
- 안드로이드 테스트코드
- Android App Architecture Guideline
- 안드로이드 앱 아키텍처 가이드라인 설명
- 안드로이드 Mockito
- android clean architecture
- 코루틴
- 안드로이드 mvvm예제
- 안드로이드 앱 아키텍처 가이드라인 예시
- MVVM
- 안드로이드 앱 아키텍처 가이드라인 사용법
- 안드로이드 아키텍처 컴포넌트
- 안드로이드 의존성주입
- 안드로이드 앱 아키텍처 가이드라인
- sharedFlow
- Hilt
- 안드로이드 최적화
- 리싸이클러뷰 최적화
- RxJava
- Today
- Total
안드로이드 연구소
[MVVM만들기] http통신(Retrofit2) 본문
이전 예제에서 ViewModel과 LiveData와 DataBinding을 이용하여
안드로이드 기본 MVVM 패턴 파일을 만들었습니다.
사실 여기까지가 학문적으로는 MVVM구조 그자체를 만들기에 마쳤습니다.
하지만 실제로 어플을 만들기위해서는
UI를 채울 데이터들이 필요합니다.
또 데이터는 Object형태의 데이터가 올 수도 있고
리스트가 올 수 있을겁니다.
그리고 해당 데이터는 서버를 통해서 가져와야하고
TCP/IP, Socket, HTTP통신 등을 사용하여 클라이언트로부터 가져와야합니다.
오늘은 안드로이드에서 가장 대표적으로 사용하는
HTTP통신으로 object데이터와 list데이터를 가져오겠습니다.
물론 MVVM안에서요.
그럼 시작해보겠습니다.
Q1. ChatGPT, 이전 MVVM파일에서 retrofit2을 사용하여 어떻게 http통신을 할 수 있니?
앞전에 만들어둔 User 타입의 data class파일 형식을 그대로 사용하여서 데이터를 불어오겠습니다.
data class User(val name: String, val age: Int)
UserService.interface를 새로 만들어주어서
"[GET]/users/{userId}"를 통해서
userId값으로 파라미터에 해당하는 User타입의 데이터를 받아오겠다고 선언하였습니다.
interface UserService {
@GET("users/{userId}")
suspend fun getUser(@Path("userId") userId: String): User
}
또 데이터를 보관하는 레파리토리인 UserRepoisitory.kt를 생성하였습니다.
이제 Retrofit2를 사용하여 "https://api.example.com/users/{userId}" API에서
getUser메서드를 가진 UserRepository 클래스를 정의합니다.
비동기적으로 실행할 수 있는 코루틴임을 나타내기 위해 getUser 메서드에 suspend 수정자를 사용합니다.
class UserRepository {
private val userService: UserService by lazy {
val retrofit = Retrofit.Builder()
.baseUrl("https://api.example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build()
retrofit.create(UserService::class.java)
}
suspend fun getUser(userId: String): User {
val userResponse = userService.getUser(userId)
return User(userResponse.name, userResponse.age)
}
}
이젠 ViewModel에서 userRepository에서 불러온 데이터를 불러와야겠죠.
드디어 이전에 배운 코루틴 스코프와 빌더를 이용한 viewModelscope.launch를 해주어 비동기를 실행해줍니다.
그리고 위에서 만들어둔 userRepository.getUser()를 호출하여
새로운 userData를 viewModel에 저장합니다.
저장만 해두면 DataBinding이 알아서 xml의 TextView컴포넌트들의 UI업데이트 해주겠죠?
class MyViewModel : ViewModel() {
private val _userData = MutableLiveData<User>()
val userData: LiveData<User> = _userData
// UserRepository 추가
private val userRepository = UserRepository()
fun updateUser(newUser: User) {
//_userData.value = newUser
viewModelScope.launch {
val newUser = userRepository.getUser(userId)
_userData.value = newUser
}
}
}
MVVM안에서 retrofit으로 http을 통신하는 방법을 알아보았습니다.
간단히 정리해보면
1. Repository에서 retrofit을 이용하여 서버와 통신할 수 있게 세팅을 해놓고
2. ViewModel에서 1번에서 세팅해놓은 retrofit을 호출하여 데이터를 ViewModel에 있는 데이터에 저장한다.
3. LiveData, DataBiding는 저장한 데이터의 변화를 인지하고 UI업데이트하게된다.
오늘은 레파지토리를 사용하여
ViewModel에서 retrofit2으로 http통신하는 법을 배워보았습니다.
감사합니다.
'안드로이드 연구소 > MVVM+AAC' 카테고리의 다른 글
[MVVM만들기] Paging3 (0) | 2023.05.15 |
---|---|
[MVVM만들기] Lifecycle (1) | 2023.05.15 |
[MVVM만들기] DataBinding (0) | 2023.05.12 |
[MVVM만들기] ViewModel + LiveData (0) | 2023.05.12 |
[안드로이드 개발 공식 가이드라인] 안드로이드 아키텍처 컴포넌트 (0) | 2023.05.11 |