일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Thread
- hilt error
- edittext 연결
- 디자인 패턴 예제
- apache nginx
- 안드로이드 mvvm 예제
- 안드로이드 스튜디오 인터넷 연결 안되어 있을 때
- 다른 객체 리스트의 비교
- 안드로이드 스튜디오 style
- 아파치 엔진엑스
- 아파치란
- 자바 스레드 예제
- java
- 변수
- 이중for문 사용 안하기
- 안드로이드 디자인패턴
- 리사이클러뷰 아이템 재사용
- LifeCycle
- java thread 예제
- dagger error
- apache란
- 안드로이드 스튜디오 tts
- 안드로이드 스튜디오 반복되는 레이아웃 코드
- Kotlin
- 안드로이드 스튜디오 인터넷 연결 확인
- 안드로이드 스튜디오 커스텀 다이얼로그
- AAC
- 객체지향 프로그래밍 5가지 원칙
- recyclerview item recycle
- 안드로이드 스튜디오 custom dialog
- Today
- Total
Sam Story
레트로핏 (Retrofit) 본문
오늘은 안드로이드 스튜디오에서 서버와 통신하기 위해 사용하는 통신 라이브러리
레트로핏에 대해서 포스팅 해보려 한다.
기존 통신라이브러리인 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 |