본문 바로가기
코딩과 알고리즘

크레이의 앱개발 도전기 #12 - 레트로핏 연동1 ( 코틀린 )

※ 이 게시글은 크레이의 IT개발 관련 성장기를 다루고 있습니다. 관련지식이 약간 있어야 이해되실 수 있습니다. 가벼운 마음으로 읽어보시면서 흥미가 생기고 의욕이 생긴다면? 개발자의 자질이 있으신 겁니다 :)

지난 시간까지는 코틀린에서 Restful API 연동 연습을 위한 백앤드 서버 준비과정을 진행했었는데요.
코틀린 연동하기 전 테스트를 위해 포스트맨 사용법에 대해서 알아보았습니다.

https://itadventure.tistory.com/600

 

REST API와 포스트맨~!

코틀린 학습을 위한 백앤드 서버 막바지 준비과정입니다 :) 학습을 위한 준비과정이 더 큰 것 같네요 ㅎ.. 지난 게시글에서 Node.js 를 이용한 단순한 Restfull API 서비스를 준비했었는데요. https://itad

itadventure.tistory.com

이제 백앤드 서버에 연동할 수 있는 코틀린 앱을 만드는 과정에 대한 경험을 공유드립니다.
뭐.. 이러 저러한 여러 가지 방법이 있지만 그 중 가장 쉬워보이는 방법을 먼저 시도해보았습니다.

그럼 렛츠 고후우--

바인딩 설정과 인터넷 권한은 기본

2가지 세팅은 모든 앱 개발에서 기본!
첫째로, AndroidManifest.xml 파일에서 아래 인터넷 설정을 추가하고


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   
xmlns:tools="http://schemas.android.com/tools">

    <
uses-permission android:name="android.permission.INTERNET"/>
    <
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
/>

    <
application
       
android:usesCleartextTraffic="true"
       
android:allowBackup="true"


build.gradle(:app) 에서 바인딩 설정도 추가했습니다.


plugins {
   
id
'com.android.application'
   
id 'org.jetbrains.kotlin.android'
}

android {
   
namespace
'com.cray.retrofitsample'
   
compileSdk 32

   
buildFeatures {
        viewBinding
true
   
}
        :


그리고 의존성 변경을 위해 의례히 실행해야 하는 Sync Now 버튼을 클릭해주어야 하는데
아직은 익숙하지 않은지 이걸 안 눌러주어 자동 완성이나 import 가 안되었던 문제가 있어 좀 헤멨습니다 ㅎ.. 

레트로핏 사용을 위한 의존성 추가

레트로핏을 위해 build.gradle(:app) 파일에 의존성을 추가해야 하는데요.
한글로 치면 확장 기능이란 말이 잘 어울리는 것 같습니다.
무려(?) 4줄이나 추가하였는데 그만큼 주요 소스가 단순해진다는 면에서 좋은것 같습니다.


   :
dependencies {
      :
   
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
   
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
   
implementation 'com.squareup.retrofit2:converter-moshi:2.9.0'
   
implementation
'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'
      :
}
   :


인터페이스

다음으로 레트로핏에 대한 본격적인 스터디를 하면서 인터페이스를 추가하였는데요.
새롭게 알아낸 사실은 의례히 클래스나 인터페이스를 생성할 때
하나의 클래스당 1개의 파일을 추가하는 것이 철칙은 아니라는 것입니다.

즉, memberList 라는 클래스를 아래와 같이 추가할 때,
이 클래스를 추가하기 위해 memberList.kt 라는 파일을 추가하지 않고도
MainActivity.kt 파일에 몰아서 넣을 수도 있다는 점이지요.

그래서 인터페이스와 함께 memberList 클래스 파일을 MainActivity.kt 파일에 추가하였습니다.
뭐 나중에는 소스가 커질테니 관리 측면에서는 결국 나눠야겠지만요.


   :
interface JsonPlaceHolderApi {
   
@GET("/list")
   
suspend fun getMemberList(): List<memberList>
}

data class memberList (
   
val member_id: String = "",
   
val nickname: String = "",
   
val join_date: String = "",
   
val lastlogin_date: String = ""
)

class MainActivity : AppCompatActivity() {
       :


처음이니 회원 목록을 받아오는 list 를 호출하여 결과를 받아오는 부분만 간단히 진행해보았습니다.
관련 소스 코드는 아래와 같습니다.
Json 데이터가 이렇게 알아서 각 변수에 쏙쏙 들어간다니 세상 참 편해진 것 같습니다 :)
예전에는 데이터를 한땀 한땀.. 넣었었지요.


        :
class
MainActivity : AppCompatActivity() {
   
val api = Retrofit.Builder()
        .baseUrl(
"http://13.209.255.71:57156")
        .addConverterFactory(
MoshiConverterFactory.create())
        .build()
        .create(
JsonPlaceHolderApi::class.java
)

   
override fun onCreate(savedInstanceState: Bundle?) {
       
super.onCreate(savedInstanceState)
        setContentView(
R.layout.activity_main)

       
lifecycleScope.launch {
           
val list = api.getMemberList()
           
list.forEach {
               
Log.d("MyDebug", it.member_id)
               
Log.d("MyDebug", it.nickname)
               
Log.d("MyDebug", it.join_date.toString())
                
Log.d("MyDebug", it.lastlogin_date
.toString())
            }
        }

   
}
}


받아온 회원 목록 결과는 아직은 화면 어디에도 표시되지는 않는데요.
결과내역은 로그캣(Logcat) 창에만 표시됩니다.
아래 명령어가 바로 그것이지요.

Log.d("MyDebug", it.member_id)

내용 확인을 위해서는 아래와 같이 진행해야 하는데요.

1) Logcat 선택
2) Debug 선택상자 선택
3) 검색란에 'My' 문구를 입력해 주면 됩니다. 검색란에 문구를 입력하는 이유는
로그가 많이 발생해도 쉽게 찾기 위함이지요. 이런 검색어가 없으면 로그 내용이 어마 어마하게 나오더라구요.

멋지게 데이터를 받아오는데 성공!
좀 더 연습해서 익숙해지면 완전히 제 기술이 될것 같습니다. :)

다음 단계로 어느 부분을 진행할지는 서서히 고민해봐야겠네요.

이번 과정 진행을 위해서 오준석님의 생존코딩 유튜브 영상을 참조하였습니다.
크레이가 준비한 데이터와는 상이하나 기본 제공되는 데이터로 진행하시는 거라 연습해 보실 분은 아래 링크를 참조해 주시면 좋을 것 같습니다.

코틀린 코루틴 Retrofit - YouTube

 


필요하신 분께 약간이라도 도움이 되었으면 좋습니다.
오늘도 방문해주신 모든 분들께 감사드립니다. :)