Sam Story

레트로핏 (Retrofit) 본문

Android

레트로핏 (Retrofit)

Sam H 2024. 3. 26. 12:47

 

오늘은 안드로이드 스튜디오에서 서버와 통신하기 위해 사용하는 통신 라이브러리

레트로핏에 대해서 포스팅 해보려 한다.

 

기존 통신라이브러리인 OkHttp를 이용해서 더 편하고 사용하기 쉽게 만든 것이다.

 

레트로핏의 장점

  • 어노테이션 (Annotation) 사용으로 코드 가독성이 좋고 직관적인 설계가 가능하다
  • 통신 결과값을 JSON으로 변환해줄 필요가 없다.
  • 결과값을 메인 스레드에 바로 사용할 수 있다.

 

외에도 여러가지 장점이 있지만 다른 장점들은 직접 여러 통신 라이브러리를 쓰다보면 알 수 있다.

개인적으로 HttpUrlConnection , Volley , OkHttp 세가지 라이브러리들에 비해

레트로핏의 코드가 좀더 직관적이고 사용하기에도 편했었다.

 

레트로핏의 구성요소

레트로핏의 구성요소는 크게 3가지로 볼 수 있다.

 

1. DTO class (Data Transfer Object) 모델 - data class로 만들어 사용할 수 있다.

미리 통신해서 주고받을 데이터 틀을 만들어 두는것 이라고 생각한다.

 

2. Interface - 사용할 동작을 미리 정의해두는 인터페이스다.

여기서 사용할 동작이란 http method 포함 get, post등을 의미한다.

 

3. Retrofit.Builder() - 인터페이스를 실제로 사용할 인스턴스로

여기서 base Url이나 Converter 설정을 할 수 있다. 

 

그럼 실제 예제를 통해서 서버에서 간단한 데이터를 불러와서 확인해보는

예제를 만들어 보도록 하자.

 

 

예제

 

    // 레트로핏
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
    implementation 'com.squareup.retrofit2:converter-scalars:2.5.0'

 

먼저 레트로핏 관련 의존성들을 build.gradle 에 추가해준다.

※ 이번 예제는 레트로핏 최신버전은 아님 ※

 

 

DTO 클래스

package com.example.retrofitproject

data class Student(val name: String,val age: Int,val hobby: String)

 

 

 

인터페이스

package com.example.retrofitproject

import retrofit2.Call
import retrofit2.http.Field
import retrofit2.http.FormUrlEncoded
import retrofit2.http.POST

interface RetrofitInterface {

    // 서버에 POST로 요청한다.
    // 어노테이션들은 POST로 요청하기 위해서 써야하는 어노테이션임
    @FormUrlEncoded
    @POST("retrofitTest.php") // 서버의 php 파일명
    fun selectStudentData(

        @Field("name") name: String
    
    ): Call<Student>

}

 

 

 

레트로핏 빌더 클래스

package com.example.retrofitproject

import com.google.gson.Gson
import com.google.gson.GsonBuilder
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

class RetrofitBuilder {

    var retrofit: Retrofit? = null

    // 레트로핏 인스턴스 초기화 해주는 메서드
    fun getRetrofitObject(): Retrofit? {

        val gson: Gson = GsonBuilder()
            .setLenient()
            .create()

        if (retrofit == null) {
 
            retrofit = Retrofit.Builder()
                // 서버 ip
                .baseUrl("http://xx.xxx.xxx.xx")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build()

        }

        return retrofit

    }

}

 

 

여기까지 진행 했다면 서버와의 통신준비는 끝났다.

서버쪽 코드는 간단하게 POST로 이름값을 받아서 관련 데이터를 다시 보내주는 간단한 코드로 진행한다.

 

retrofitTest.php

<?php 
$con = mysqli_connect("호스트","유저","DB비밀번호","사용할 데이터베이스");

$name = $_POST['name'];

$sql = "SELECT * FROM student WHERE name='$name'";

$result = mysqli_query($con,$sql);

$response = mysqli_fetch_assoc($result);

echo json_encode($response);

?>

 

 

 

서버쪽 데이터베이스에 있는 데이터

 

 

이제 서버와 클라이언트(안드로이드) 가 통신할 준비가 끝났다.

메인 액티비티에서 통신을 하게되는데 먼저 레이아웃에는 간단한 텍스트뷰들을 만들어주고

이 텍스트뷰에 서버에서 통신한 결과값을 띄워주는 방식이다.

 

 

메인 액티비티 레이아웃

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    // 이름을 띄워줄 텍스트 뷰
    <TextView
        android:id="@+id/textViewStudentName"
        android:layout_margin="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:text="name"/>
   
    // 나이를 띄워줄 텍스트 뷰
    <TextView
        android:id="@+id/textViewStudentAge"
        android:layout_margin="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:text="age"/>

    // 취미를 띄워줄 텍스트 뷰
    <TextView
        android:id="@+id/textViewStudentHobby"
        android:layout_margin="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:text="hobby"/>
    
</LinearLayout>

 

 

메인 액티비티 

package com.example.retrofitproject

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import org.w3c.dom.Text
import retrofit2.Call
import retrofit2.Response
import retrofit2.create

class MainActivity : AppCompatActivity() {
    
    lateinit var textViewStudentName: TextView
    lateinit var textViewStudentAge: TextView
    lateinit var textViewStudentHobby: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 텍스트 뷰 초기화
        textViewStudentName = findViewById(R.id.textViewStudentName)
        textViewStudentAge = findViewById(R.id.textViewStudentAge)
        textViewStudentHobby = findViewById(R.id.textViewStudentHobby)

        // 레트로핏 으로 서버에 보낼 name 값
        val name = "sam"
        textViewStudentName.text = name
       
        // 레트로핏 빌더,인터페이스 초기화
        val retrofitBuilder = RetrofitBuilder()
        val retrofitInterface = retrofitBuilder.getRetrofitObject()!!.create(RetrofitInterface::class.java)
       
        // call 객체 초기화 인터페이스의 selectStudentData메서드에 name을 매개변수로 사용
        val call: Call<Student> = retrofitInterface.selectStudentData(name)
        
        call.enqueue(object : retrofit2.Callback<Student> {

            override fun onResponse(call: Call<Student>, response: Response<Student>) {

                // response로 온 값을 textView에 띄워준다.
                textViewStudentAge.text = response.body()?.age.toString()
                textViewStudentHobby.text = response.body()?.hobby.toString()

            }

            override fun onFailure(call: Call<Student>, t: Throwable) {

                // 응답에 실패한 경우
                Log.d("메인액티비티", "onFailure: $t")

            }

        })

    }

}

 

 

 

 

실행 결과

실행 결과

 

위에 과정을 잘 수행했다면 이렇게 성공적으로 서버에서 데이터를 불러올 수 있다.

 

 

위의 예제보다 서버에서 데이터를 불러오는 방법이나

안드로이드 쪽에서 데이터를 받을때 에 대한 처리는 훨씬 다양한 방법으로 처리할 수 있다.

이번 포스팅은 단순히 레트로핏의 사용방법에 대한 간단한 설명이기에

항상 통신을 할때 효율적인 데이터 처리에 대해 고민해 보도록 하자.

'Android' 카테고리의 다른 글

라이프 사이클 (Lifecycle)  (1) 2024.04.02
데이터 바인딩 (Data Binding)  (1) 2024.04.01
뷰 바인딩 (ViewBinding)  (0) 2024.03.19
Visibility 속성  (2) 2024.03.16
쉐어드프리퍼런스(Sharedpreferences)  (0) 2024.03.12