<Repository>를 만들때는 EntityManager와 JpaRepository 두 가지 다른 방법이 존재하는데 여기서는 간단한 CRUD연산만 필요 하므로 JpaRepository를 사용하였다.
EntityManager를 사용: EntityManager는 JPA의 핵심 컴포넌트로, 엔티티를 관리하며 데이터베이스와의 모든 상호작용을 처리합니다. EntityManager를 사용하면 직접적으로 데이터베이스 작업을 제어할 수 있습니다. 복잡하고 세밀한 작업이 필요한 상황에서는 EntityManager를 사용하는 것이 좋을 수 있습니다. 하지만 EntityManager를 사용하면 코드가 복잡해질 수 있고, JPA를 깊이 이해해야 할 수 있습니다.
JpaRepository를 상속: JpaRepository를 상속받는 Repository를 사용하면 CRUD 연산을 매우 쉽게 처리할 수 있습니다. JpaRepository는 기본적인 CRUD 메서드를 제공하며, 이를 상속받는 클래스는 이 메서드를 직접 사용할 수 있습니다. 또한, 메서드 이름으로 쿼리를 생성하는 기능을 제공하여 데이터베이스 작업을 매우 쉽게 만들어줍니다. JpaRepository를 사용하면 보일러플레이트 코드를 크게 줄일 수 있지만, 복잡한 쿼리나 특정 데이터베이스 작업을 처리하기 어려울 수 있습니다.
주의!: 서버를 우리가 사용하는 컴퓨터에서 직접 실행할 때 사용하는 http://localhost:포트번호(http://127.0.0.1:포트번호)를 사용하지 않고 특별한 url인 http://10.0.2.2:포트번호 을 사용해야 한다.
이유는 안드로이드 에뮬레이터는 본인의 컴퓨터와는 별도의 컴퓨터로 동작하기 때문이다.
그렇기에 본인의 컴퓨터를 가르키는 url을 사용하면 애뮬레이터에 접근 할 수 없기 때문에 우리는 안드로이드 애뮬레이터에서만 사용되는 특별한 주소 http://10.0.2.2:포트번호를 사용해야 한다.
+우리는 Spring-Boot 안에 내장되어 있는 톰캣 서버를 사용하기 때문에 8080 포트를 사용한다.
package com.example.restapi
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
class MainActivity : AppCompatActivity() {
// url 정보 세팅
private val api = Retrofit.Builder()
.baseUrl("http://10.0.2.2:8080")
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(MyApi::class.java)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 버튼을 클릭하면 editTextSelectId에 입력된 정수를 id로 사용하여 fectchData()함수를 사용한다.
var button = findViewById<Button>(R.id.button).setOnClickListener {
val id = findViewById<EditText>(R.id.editTextSelectId).text.toString().toInt()
fetchData(id)
}
}
// 서버를 통해 해당 id에 대응 하는 데이터베이스 스키마의 값을 가지고 온다.
private fun fetchData(id:Int) {
var textViewMedication = findViewById<TextView>(R.id.textViewMedicationId)
var textViewName = findViewById<TextView>(R.id.textViewName)
CoroutineScope(Dispatchers.IO).launch {
val response = api.getMedication(id).execute()
withContext(Dispatchers.Main) {
if (response.isSuccessful) {
val medication = response.body()
if (medication != null) {
textViewMedication.setText(medication.getMedicationId())
textViewName.setText(medication.getName())
}
} else {
// TODO: Handle error
}
}
}
}
}
5. network_security_config.xml 작성
안드로이드 9(Pie) 이후 버전에서는 암호화되지 않은 네트워크 트래픽이 중간에서 가로채어질 수 있는 위험성을 줄이기 위해 HTTP 트래픽에 대한 접근을 기본적으로 차단한다.
따라서 개발자는 서버와 안드로이드 앱 간의 통신에 HTTPS를 사용해야 하는데 지금 개발 과정에서는 HTTPS를 설정하지 않은 로컬 서버를 사용하기 때문에 별도의 설정 파일로 HTTP 트래픽을 허용하도록 해야 한다.