안드로이드/개발관련(Kotlin)

retrofit을 사용한 안드로이드와 Node.js간 통신

닉네임못짓는사람 2023. 2. 28. 00:07
반응형

안드로이드에서 retrofit을 사용해서 Node.js와 통신을 해보자.

 

안드로이드에서 서버와 통신하는 방법은 retrofit과 volley를 사용하는 방법의 두 가지를 꼽을 수 있다.

기존의 httpconnection은 자유도는 높지만 직접 구현해야 하는 것들이 많아 난이도가 높다는 단점이 있다.

그에 비해 위의 둘은 구현하기가 매우 쉽기 때문에 사용하기 편리하다.

 

또한 둘 중에서는 retrofit이 속도 면에서 더 빠르다는 장점이 있다고 한다.

square.github.io/retrofit/

 

Retrofit

A type-safe HTTP client for Android and Java

square.github.io

retrofit API문서는 위의 주소를 참고하자.

    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.8.2'

가장 먼저, android studio의 gradle에 위와 같이 retrofit과 JSON파일을

GSON파일로 변환하기 위해서 converter를 함께 추가해주도록 하자.

그런 다음 mainactivity에 각각 명령을 호출할 버튼을 총 네 개 추가해주도록 한다.

 

우리가 Node.JS와 통신할 때 사용할 명령은 GET, POST, UPDATE, DELETE의 네 가지이다.

각각의 명령이 어떤 용도로 사용되는지는 REST API에 대해서 알아보도록 하자.

 

이 명령들이 정의된 API interface를 프로그램 어디서든 호출할 수 있도록 하나의 파일에 정의해 주도록 하자.

package com.myproject.exam2

import retrofit2.Call
import retrofit2.http.*

data class ResponseDC(var result:String? = null)

interface APIInterface {
    @GET("/")
    fun getRequest(@Query("name") name: String): Call<ResponseDC>

    @FormUrlEncoded
    @POST("/")
    fun postRequest(@Field("id")id: String,
                    @Field("password")password: String):Call<ResponseDC>

    @FormUrlEncoded
    @PUT("/{id}")
    fun putRequest(@Path("id")id: String,
                   @Field("content")content: String): Call<ResponseDC>

    @DELETE("/{id}")
    fun deleteRequest(@Path("id")id: String): Call<ResponseDC>
}

이 파일에 APIInterface를 생성하여 이곳에 네 가지 명령어들을 정의했다.

또한 서버로부터 response를 받을 데이터 클래스 ResponseDC를 정의했다.

POST와 PUT를 보면, 전송할 데이터에 Field가 있을 경우 @FormUrlEncoded를 추가해주어야 한다.

 

파일을 모두 작성했으면 MainActivity로 넘어가도록 하자.

val url = "서버 주소"

val retrofit = Retrofit.Builder()
        .baseUrl(url)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
var server = retrofit.create(APIInterface::class.java)

가장 먼저 사용할 서버의 주소를 지정해주어야 한다.

그리고 retrofit과 위에서 정의한 APIInterface를 결합해주도록 하자.

 

 

이 작업들이 끝낫다면 실제로 버튼을 눌럿을 때 이벤트가 발생하도록 코드를 작성해보도록 하자.

binding.btnGet.setOnClickListener {
            server.getRequest("name").enqueue(object:Callback<ResponseDC>{
                override fun onFailure(call: Call<ResponseDTO>, t: Throwable) {

                }

                override fun onResponse(call: Call<ResponseDTO>, response: Response<ResponseDC>) {
                    Log.d("response : ", response?.body().toString())
                }

            })
        }
        binding.btnPost.setOnClickListener {
            server.postRequest("id", "password").enqueue((object:Callback<ResponseDC>{
                override fun onFailure(call: Call<ResponseDTO>, t: Throwable) {

                }
                override fun onResponse(call: Call<ResponseDTO>, response: Response<ResponseDC>) {
                    Log.d("response : ", response?.body().toString())
                }
            }))
        }
        binding.btnUpdate.setOnClickListener {
            server.putRequest("board", "내용").enqueue((object:Callback<ResponseDC>{
                override fun onFailure(call: Call<ResponseDTO>, t: Throwable) {

                }
                override fun onResponse(call: Call<ResponseDTO>, response: Response<ResponseDC>) {
                    Log.d("response : ", response?.body().toString())
                }
            }))
        }
        binding.btnDelete.setOnClickListener {
            server.deleteRequest("board").enqueue((object:Callback<ResponseDC>{
                override fun onFailure(call: Call<ResponseDTO>, t: Throwable) {

                }
                override fun onResponse(call: Call<ResponseDTO>, response: Response<ResponseDC>) {
                    Log.d("response : ", response?.body().toString())
                }
            }))
        }

작성이 끝났다면 이를 받아서 처리할 Node.js코드를 작성해주자.

var express = require('express')
var http = require('http');
var app = express();
var bodyParser = require('body-parser')

app.use(bodyParser.urlencoded({extended: false}))
app.get(`/`, (req, res) => {
  console.log(req.query);
  res.send({"result": "GET 호출"});
})

app.post(`/`, (req, res) => {
  console.log(req.body);
  res.send({"result": "POST 호출"});
})

app.put(`/:id`, (req, res) => {
  console.log(`내용 PrimaryKey : ${req.params.id}`)
  console.log(req.body);
  res.send({"result": "UPDATE 호출"});
})

app.delete(`/:id`, (req, res) => {
  console.log(req.params.id);
  console.log(req.path)
  res.send({"result": "DELETE 호출"});
})

app.listen(3000, () => {
  console.log(`서버 실행, 포트 번호 3000`);
});

이제 프로그램을 실행시켜서 서버와 실제로 통신을 진행해보도록 하자.

전송한 데이터가 서버와 Log에 정상적으로 찍히는 것을 볼 수 있다.

 

반응형