
백엔드 API 통신하는 법
1. API 인터페이스 정의
- com.example.appname경로에 network 패키지 생성 후 TestApi.kt 파일 생성
- Request와 Respose 타입 지정, API 메서드( POST/GET 등)지정
큰 흐름을 볼 수 있게, request는 없고 respose는 json으로 온다고 가정했고, json일 경우 타입은 Object로 작성해야한다 (String으로 했더니 에러가 발생했다)
package com.example.picktimeapp.network
import retrofit2.http.GET
interface TestApi {
@GET("test")
suspend fun test(): Object
}
2. Retrofit 인스턴스 제공
- com.example.appname.di 패키지 생성
- 그 안에 NetworkModule 파일 생성(Kotlin - Object)
- 실제 도메인에 맞게 BaseUrl 설정
// 기본 API URL을 제공하는 함수
@Provides
@Singleton
fun provideBaseUrl(): String = "https://your.api.url/" // ← 실제 도메인으로 수정
- API 인스턴스 create
@Provides
@Singleton
fun provideTestApi(retrofit: Retrofit): TestApi =
retrofit.create(TestApi::class.java)
- 전체 코드
package com.example.picktimeapp.di
// 네트워크 관련 모듈을 제공하는 패키지 선언
import com.example.picktimeapp.network.TestApi
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
// Dagger Hilt의 모듈로 선언
@Module
// SingletonComponent에 설치하여 앱 전역에서 사용 가능하도록 설정
@InstallIn(SingletonComponent::class)
object NetworkModule {
// 기본 API URL을 제공하는 함수
@Provides
@Singleton
fun provideBaseUrl(): String = "https://your.api.url/" // ← 실제 도메인으로 수정
// Gson 인스턴스를 제공하는 함수
@Provides
@Singleton
fun provideGson(): Gson = GsonBuilder().create()
// OkHttpClient 인스턴스를 제공하는 함수
@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient =
OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY // 네트워크 요청 및 응답 로그를 BODY 레벨로 출력
})
.build()
// Retrofit 인스턴스를 제공하는 함수
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient, gson: Gson, baseUrl: String): Retrofit =
Retrofit.Builder()
.baseUrl(baseUrl) // API 기본 URL 설정
.addConverterFactory(GsonConverterFactory.create(gson)) // JSON 변환을 위한 Gson 추가
.client(okHttpClient) // HTTP 클라이언트 설정
.build()
// Test
@Provides
@Singleton
fun provideTestApi(retrofit: Retrofit): TestApi =
retrofit.create(TestApi::class.java)
}
Gson
Google's Json
구글에서 개발한 Java용 JSON 변환 라이브러리로 JSON 데이터를 java 객체로 변환하거나 java 객체를 JSON 문자열로 변환해준다 Retrofit과 쉽게 연동 가능하여 함께 많이 사용한다
OkHttpClient
OkHttpClient는 Square에서 개발한 HTTP 클라이언트 라이브러리로, 네트워크 요청(HTTP 요청 및 응답)을 효율적으로 처리하는 역할을 한다. Retrofit과 함께 자주 사용되며, 네트워크 통신을 직접 구현할 때도 활용됩니다
- 인터셉터(Interceptor) 추가 가능
- 요청을 가로채서 로그 출력, 헤더 추가, 토큰 자동 갱신 등의 작업 수행 가능
- 커넥션 풀(Connection Pool) 지원
- 같은 서버에 여러 번 요청할 때, 커넥션을 재사용하여 속도 향상
- 캐싱(Caching) 기능
- 네트워크 응답을 저장해 두었다가 같은 요청이 오면 빠르게 반환 가능
- 웹소켓(WebSocket) 지원
- 실시간 데이터 전송이 필요한 경우 사용 가능 (ex. 채팅, 알림 서비스 등)
3. ViewModel에서 API 호출
- TestViewModel.kt 생성 후 호출 함수 추가
import androidx.lifecycle.viewModelScope
import com.example.picktimeapp.network.TestApi
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
import android.util.Log
@HiltViewModel
class TestViewModel @Inject constructor(
private val testApi: TestApi
) : ViewModel() {
var testResult = mutableStateOf<Object?>(null)
fun callTestApi() {
viewModelScope.launch {
try {
val result = testApi.test()
testResult.value = result
Log.d("TestViewModel", "서버 응답: $result")
} catch (e: Exception) {
Log.e("TestViewModel", "API 테스트 실패", e)
}
}
}
}
4. 버튼클릭 시 ViewModel의 API 호출 코드 호출
val testViewModel: TestViewModel = hiltViewModel()
Button(onClick = { testViewModel.callTestApi() }) {
Text("API 연결 테스트")
}
로그인 구현해보기
1. API 인터페이스 작성
package com.example.picktimeapp.network
import retrofit2.http.Body
import retrofit2.http.POST
data class LoginRequest(
val username: String,
val password: String
)
data class LoginResponse(
val username: String,
val name: String,
val level: Int
)
interface LoginApi {
@POST("your/login/endpoint") // 예: "auth/login" 또는 실제 경로로 수정
suspend fun login(@Body request: LoginRequest): LoginResponse
}
2. Retrofit 인스턴스 제공
package com.example.picktimeapp.di
// 네트워크 관련 모듈을 제공하는 패키지 선언
import com.example.picktimeapp.network.LoginApi
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton
// Dagger Hilt의 모듈로 선언
@Module
// SingletonComponent에 설치하여 앱 전역에서 사용 가능하도록 설정
@InstallIn(SingletonComponent::class)
object NetworkModule {
// 기본 API URL을 제공하는 함수
@Provides
@Singleton
fun provideBaseUrl(): String = "https://your.api.url/" // ← 실제 도메인으로 수정
// Gson 인스턴스를 제공하는 함수
@Provides
@Singleton
fun provideGson(): Gson = GsonBuilder().create()
// OkHttpClient 인스턴스를 제공하는 함수
@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient =
OkHttpClient.Builder()
.addInterceptor(HttpLoggingInterceptor().apply {
level = HttpLoggingInterceptor.Level.BODY // 네트워크 요청 및 응답 로그를 BODY 레벨로 출력
})
.build()
// Retrofit 인스턴스를 제공하는 함수
@Provides
@Singleton
fun provideRetrofit(okHttpClient: OkHttpClient, gson: Gson, baseUrl: String): Retrofit =
Retrofit.Builder()
.baseUrl(baseUrl) // API 기본 URL 설정
.addConverterFactory(GsonConverterFactory.create(gson)) // JSON 변환을 위한 Gson 추가
.client(okHttpClient) // HTTP 클라이언트 설정
.build()
// LoginApi 인터페이스의 구현체를 제공하는 함수
@Provides
@Singleton
fun provideLoginApi(retrofit: Retrofit): LoginApi =
retrofit.create(LoginApi::class.java) // Retrofit을 이용해 LoginApi 구현체 생성
}
3. ViewModel에서 API 호출
import androidx.lifecycle.viewModelScope
import com.example.picktimeapp.network.LoginApi
import com.example.picktimeapp.network.LoginRequest
import com.example.picktimeapp.network.LoginResponse
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
import javax.inject.Inject
import android.util.Log
@HiltViewModel
class LoginViewModel @Inject constructor(
private val loginApi: LoginApi
) : ViewModel() {
var loginResult = mutableStateOf<LoginResponse?>(null)
var errorMessage = mutableStateOf<String?>(null)
fun login() {
viewModelScope.launch {
try {
val response = loginApi.login(
LoginRequest(
username = email.value,
password = password.value
)
)
loginResult.value = response
Log.d("LoginViewModel", "로그인 성공: ${response.name}")
} catch (e: Exception) {
errorMessage.value = "로그인 실패: ${e.message}"
Log.e("LoginViewModel", "로그인 실패", e)
}
}
}
}
4. 버튼클릭 시 ViewModel의 API 호출 코드 호출
LoginButton(
onClick = {
viewModel.login()
onLoginClick() // 성공 시 다음 화면으로 전환하고 싶다면 여기에 조건 추가
},
enabled = email.isNotBlank() && password.isNotBlank()
)
참고
만약 응답 data 없이 HTTP 상태 코드(201, 404, 409 등)만 반환되는 경우 처리 방법
import retrofit2.Response
import retrofit2.http.Body
import retrofit2.http.POST
data class SignUpRequest(
val name: String,
val username: String,
val password: String
)
interface SignUpApi {
@POST("user")
suspend fun signUp(@Body request: SignUpRequest): Response<Unit>
}
통신결과는 Logcat을 이용해 확인할 수 있다 :)
'개발새발개발 > Kotlin' 카테고리의 다른 글
[Kotlin] 안드로이드 전역 폰트, 사이즈, 굵기 설정하기 Typography 설정 (0) | 2025.03.26 |
---|---|
[Kotlin] 안드로이드 스튜디오 배경색, 기본 컬러 지정하는 법 (0) | 2025.03.25 |
[Kotlin] 안드로이드 스튜디오 기본 컬러 정의하는 법(기본, Jetpack) (0) | 2025.03.23 |
[Kotlin] 안드로이드 스튜디오 프로젝트 기본 구조 이해하기 (0) | 2025.03.17 |
[Kotlin] 안드로이드 앱의 구조 및 동작 원리, 자바가 아닌 코틀린을 사용하는이유 (1) | 2025.03.16 |