3차 과제를 올릴 때 깃을 잘못 건드려서 fix라는 브랜치로 다시 업로드 했습니다.
이 때 4차 세미나과제까지 같이 올라가서 fix 브랜치를 확인해주시면 감사하겠습니다.
SignIn은 세미나시간에 했기 때문에 이번 리드미는 SignUp을 기준으로 적겠습니다.
data class ResponseSignUp(
val status: Int,
val message: String,
val data: Data
){
data class Data(
val name: String,
val email: String
)
}
data class RequestSignUp(
val name: String,
@SerializedName("email")
val id: String,
val password: String
)
Json 객체의 키 값과 타입을 각각 데이터 클래스의 변수명과 타입에 일치시켜주었습니다.
Json의 키값(email)과 클래스의 변수명(id)이 다르기 때문에 @SerializedName으로 이름표를 붙여줬습니다.
interface SoptService {
@POST("auth/signin")
fun postLogin(
@Body body: RequestSignIn
): Call<ResponseSignIn>
@POST("auth/signup")
fun postSignUp(
@Body body: RequestSignUp
): Call<ResponseSignUp>
}
@POST에는 HTTP 메소드를 설정해줍니다.
@Body에는 RequestBody데이터를 넣어줍니다.
Call<>은 동기적 또는 비동기적으로 Type을 받아오는 객체입니다.
object ServiceCreator {
private const val BASE_URL = "http://13.124.62.236/"
private val retrofit: Retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
val soptService: SoptService = retrofit.create(SoptService::class.java)
}
메인 서버 도메인을 초기화해주고 Retrofit 객체를 생성해줍니다.
그리고 인터페이스 객체를 creat에 넘겨 실제 구현체를 생성합니다.
Retrofit 객체는 서버 호출이기 때문에 꾸준히 필요합니다. 따라서 싱글톤(Object)로 제작했습니다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivitySignupBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.btnJoin2.setOnClickListener {
val name = binding.etName.text.toString()
val id = binding.etJoinid.text.toString()
val pwd = binding.etJoinpwd.text.toString()
emptyCheck = name.isEmpty() || id.isEmpty() || pwd.isEmpty()
if (!emptyCheck) {
joinNetwork()
} else {
Toast.makeText(this, "입력되지 않은 정보가 있습니다.", Toast.LENGTH_SHORT).show()
}
}
}
emptyCheck를 해보고 비어있는 칸이 있다면 토스트를 띄우고 없다면 joinNetwork()를 실행해줍니다.
private fun joinNetwork() {
val intent = Intent(this, SignInActivity::class.java)
intent.putExtra("userId", binding.etJoinid.text.toString())
intent.putExtra("userPwd", binding.etJoinpwd.text.toString())
val requestSignUp = RequestSignUp(
name = binding.etName.text.toString(),
id = binding.etJoinid.text.toString(),
password = binding.etJoinpwd.text.toString()
)
val call: Call<ResponseSignUp> = ServiceCreator.soptService.postSignUp(requestSignUp)
call.enqueue(object : Callback<ResponseSignUp> {
override fun onResponse(
call: Call<ResponseSignUp>,
response: Response<ResponseSignUp>
) {
if (response.isSuccessful) {
val data = response.body()?.data
Toast.makeText(this@SignUpActivity, "회원가입 완료!", Toast.LENGTH_SHORT).show()
setResult(RESULT_OK, intent)
finish()
} else Toast.makeText(this@SignUpActivity, "이미 존재하는 아이디입니다!", Toast.LENGTH_SHORT).show()
}
override fun onFailure(call: Call<ResponseSignUp>, t: Throwable) {
Log.e("NetworkTest", "Error:$t")
}
})
}
SignUp을 한 후에는 화면 전환을 한 후 로그인을 한 정보를 SignInActivity에 넘긴 후 Finish()를 통해 화면을 죽여야합니다.
따라서 intent.putExtra를 이 함수 안으로 가져왔습니다.
서버에 요청을 보내기 위한 RequestData를 생성합니다.
아까 만든 object 객체를 통해 retrofit이 만들어준 interface에 접근하여 call 객체를 받아옵니다.
call 객체에 enqueue를 호출하여 실제 서버 통신을 비동기적으로 요청했습니다.
Status Code가 200-300 사이일 때 response.isSuccessful은 true를 반환합니다.
-
서버 통신 하는 방법
-
@Body, @POST, @GET 역할
-
Request, Response