2022. 8. 30. 11:40ㆍ[Android APP] feat. Kotlin/Kotlin 공부
개요
앱을 개발할 때 서버에서 API를 통해 통신을 해서 데이터를 주고 받아야한다.
이 때 사용하는 라이브러리 중 하나가 Retrofit2이다.
본문
먼저 API란
데이터베이스와 통신을 원활하게 도와주는 일종의 통로같은 역할이다.
우리가 API서버에 무언가를 요청(Request)하면 API서버에서 처리하고 원하는 값들을 답변(Response) 해준다.
안드로이드 개발이라 하면 보통 클라이언트 개발을 한다고 생각하면 된다.
그림으로 설명하면 아래와 같다.
이런 관계라고 볼 수 있다.
게임을 하는 사람들은 알겠지만 우리가 게임을 하기위해 다운받는 건 서버가 아닌 클라이언트다.
사용자가 서버에 서비스를 요청하면 서버는 요청을 받아 답변을 해주는 것이다.
==================================================================================
안드로이드에서 API 서버에 통신을 해야하기 위해선 세 가지가 필요하다.
(Retrofit2 라이브러리를 사용)
1. Interface 정의
2. DTO
3. Retrofit으로 API 호출
로그인을 예시로 들어보자
로그인을 하기위해 아래 인터페이스를 정의한다.
예시
1. LoginService(인터페이스 정의)
interface LoginService{
@Headers("Content-Type: application/json")
@POST("/user/login")
fun requestLogIn(
@Header("sysCd") sysCd: String?,
@Body userInfo: LoginRequestDTO
): Call<LoginDTO>
}
- 여기서 아까 그림을 설명 빗대어 설명하자면 A, B라는 데이터는 헤더에 있는 sysCd와 Body에 있는 LoginRequestDTO이다. (이건 각 설계되어있는 API마다 요청할 때 필요한 값이 다르다.)
- 로그인을 하기위해 유저 아이디와 패스워드가 필요하다고 해보자.
- 이러이러한 식의 데이터를 보내서 너한테 요청할꺼야~라고 생각하면 된다.
2. LoginRequestDTO.kt
data class LoginRequestDTO(
val userId: String?,
val passwd: String?
)
DTO는 좀 더 세부적으로 어떠한 데이터를 보내줄것인지, 어떠한 데이터를 받아올 것인지 선언을 해주는 단계이다.
위와같이 서버에 보내줄 Body의 데이터 변수와 자료형을 서버에 알려준다.
2-1. LoginDTO
data class LoginDTO(
val code : Int,
val msg : String,
val value : Value
)
data class Value(
val token : String,
val status : String
)
그리고 이와 같이 받을 데이터를 정의해준다.
그럼 우리는 2번에서 요청에 필요한 값들 헤더 sysCd, 바디에 userID와 userPw를 주고(그림에서 A, B데이터)
Respone 값인 code, msg, value를 받아오는 것이다. (그림에서 C,D데이터)
3. Retrofit으로 요청하기
이제 어떤 데이터를 가지고 통신할지를 알려주었으니, 통신을 해야한다.
안드로이드에는 여러 통신 라이브러리들이 있지만(Volley, Retrofit, HTTPURLconnection 등) 가장 많이 사용하는 Retrofit2를 사용해서 통신해보자.
먼저 implement에 아래 라이브러리를 추가해준다.
//Retrofit(HTTP Connect)
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.5.0'
그리고 Retrofit을 통해 API서버와 통신을 한다
//Retrofit 호출 모듈
fun callRetrofit(url : String): Retrofit {
val gson : Gson = GsonBuilder()
.setLenient()
.create()
val retrofit: Retrofit = Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
return retrofit
}
baseurl에 API서버와 통신을 할 주소(예시처럼)를 적어주고
"http://서버주소(211:104:110:103):포트번호(50400)/user/login/"
val loginService: LoginService = retrofit.create(LoginService::class.java)
요렇게 아까 정의해줬던 인터페이스를 레트로핏에 적용시켜준다.
3-1. MainActivity.kt
그리고 요청에 필요한 헤더(sysCd)와 바디(LoginRequestDTO)값을 넣어준다.
val loginrequestDTO = LoginRequestDTO(userId, userPw)
//로그인 API 호출(자동 로그인)
loginService.requestLogIn(sysCd, loginrequestDTO)
.enqueue(object : Callback<LoginDTO> {
override fun onFailure(call: Call<LoginDTO>, t: Throwable) {
Log.d("retrofit", t.toString())
//서버와 통신 실패
}
//로그인 API 호출 성공
override fun onResponse(call: Call<LoginDTO>, response: Response<LoginDTO>) {
login = response.body()
//작업해주세요
}
})
이렇게 해서 요청할때 필요한 값이 잘 들어갔다면 통신을 성공하게 되고, LoginDTO에 있는 값들을 API측에서 쏴주게 된다.
========================================================================================
원래는 훨씬 복잡하게 안에 들어가야하는 로직이 많지만 간단하게 입문자들에게 도움이될까하고 쉽게 코드를 작성했다.
TIP) 그리고 위에 baseurl에서 http로 시작하는 주소를 API측에서 줄 때가 있는데
http는 보안적으로 문제가 되기 때문에 안드로이드에서 막아서 작동이 안될 경우가 있다.
xml폴더에 network-security-config.xml 파일을 만들어주고 아래와 같이 작성한다.
network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config cleartextTrafficPermitted = 'true'>
<domain includeSubdomains = 'true'>http://서버주소:서버포트/</domain>
</domain-config>
</network-security-config>
자신이 사용할 서버 url주소를 넣어주고 인증을 해주면 http로 시작하는 url도 잘 돌아가게 된다.
Androidmanifest.xml
<application android:networkSecurityConfig= "@xml/network_security_dconfig"/>
이렇게 추가해주면 잘돌아가게 된다!
오늘은 간단하게 여기서 끝!
'[Android APP] feat. Kotlin > Kotlin 공부' 카테고리의 다른 글
Android Kotlin : SHA-512 암호화 함수 (0) | 2022.09.08 |
---|---|
Android Kotlin : URI에서 파일명 및 확장자 추출하기 (0) | 2022.09.08 |
Android Kotlin : SharedPreferences를 이용한 자동 로그인 (0) | 2022.08.03 |
Android Kotlin : View Binding사용하기 (0) | 2022.08.03 |
Android Kotlin : 현재 시간 표시하기(Text Clock) (0) | 2022.08.03 |