[재난알림앱Beacon8] 백엔드와의 API 협업

Boknami·2023년 8월 25일
0

프로젝트_비콘

목록 보기
8/10

백엔드와의 협업 자체가 처음은 아니지만..스웨거를 사용해서 협업을 하는 것은 처음이었다. 이 전의 프로젝트에서는 이러한 형식으로 백엔드쪽 지식이 없어도? 보기 쉬운 형태로 노션에 정리되어 있었다.

사실 스웨거가 알아먹기 어려운 점은 전혀 없다. 내가 처음으로 보니까 좀 겁을 먹고 이해하기 어렵다고 생각한 것 같다.

통신방법

가장 일반적인 통신방법으로는 HTTP 통신을 사용한다. 해당 경우에도 HTTP를 사용해서 통신을 구현하였지만..애초에 오고 가는 데이터가 JSON형식이기도 하고 속도도 더 빠른 retrofit을 사용하는 것이 좋았다.

하지만 성격상 항상 정상 작동을 하나 만들고 나서 새로운 것을 적용하는 것을 선호하기에 일단 OkHttp를 사용하여 API 테스트를 진행하였다.

로그인

private fun loginUser(userId: String, userPw: String) {
        Log.d("로그인", "로그인을 시도합니다 ID: $userId PW: $userPw Email: $userPw")

        val client = OkHttpClient()
        val url = BASE_URL + "api/v1/members/login"

        val json = JSONObject().apply {
            put("userId", userId)
            put("password", userPw)
        }

        val mediaType = MediaType.parse("application/json")
        val requestBody = RequestBody.create(mediaType, json.toString())
        val request = Request.Builder()
            .url(url)
            .post(requestBody)
            .build()

        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                Log.d("로그인", "Failed.\nReason: ${e}")
            }

            override fun onResponse(call: Call, response: Response) {
                val responseBody = response.body()?.string()

                if (response.isSuccessful) {
                    //성공 로그인
                } else {
                    //실패 로그인
                }
            }
        })
    }

JSON통신을 위해 JSON형태의 변수로 만들어주고 파라미터로 입력 받은 ID,PW를 put해주었다.

그 후 request를 위한 준비를 하고 통신을 시작했다.

회원가입

이메일 체크

private fun checkDuplicate(userId: String, userPw: String, userEmail: String) {
        Log.d("회원가입", "이메일 중복여부 ${userEmail}")

        val client = OkHttpClient()
        val url_checkEmail = "http://43.202.105.197:8080/api/v1/members/duplicated/" + userId

        //요청에는 url주소 넣고
        val request = Request.Builder()
            .url(url_checkEmail)
            .get()
            .build()

        //요청을 큐에 넣자
        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                Log.d("회원가입", "실패했습니다.\n원인 : ${e}")
            }

            override fun onResponse(call: Call, response: Response) {
                //Log.d("회원가입", "응답이 존재합니다.\n응답 : ${response}")
                val responseBody = response.body()?.string()

                // 서버 응답에 따른 처리
                if (response.isSuccessful) {
                    runOnUiThread {
                        Log.d("회원가입", "이메일 : 가입 가능\n응답 : ${response}")
                        signUp(userId,userPw,userEmail)
                    }
                } else {
                    // 실패한 응답 처리
                    runOnUiThread {
                        val alertDialog = AlertDialog.Builder(this@signUpActivity)
                            .setTitle("이메일 중복")
                            .setMessage("이메일이 중복됩니다. 다른 이메일을 사용해주세요")
                            .setPositiveButton("확인") { dialog, _ -> dialog.dismiss() }
                            .create()
                        alertDialog.show()
                    }
                }
            }
        })
    }

이메일 체크의 경우 url에 값을 넣어서 테스트하는 get방식을 통해서 이루어졌다.
이메일이 중복되는 경우에는 다이얼로그로 이메일 중복이 되었다고 알려준다.
이메일 중복이 문제없는 경우에 바로 회원가입을 시작하는데 음..이러한 방식이 맞는 지 정확하게 모르겠다. 안전상으로 이메일 체크가 성공했을 때 일단 회원가입 성공 메서드를 실행하게 했다.

회원가입

private fun signUp(userId: String, userPw: String, userEmail: String) {
        Log.d("회원가입", "================================================")
        Log.d("회원가입", "ID: $userId PW: $userPw Email: $userEmail")

        val client = OkHttpClient()

        val url = "http://43.202.105.197:8080/api/v1/members"

        val json = JSONObject().apply {
            put("userId", userId)
            put("password", userPw)
            put("email", userEmail)
        }

        val mediaType = MediaType.parse("application/json")
        val requestBody = RequestBody.create(mediaType, json.toString())
        val request = Request.Builder()
            .url(url)
            .post(requestBody)
            .build()

        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                Log.d("회원가입", "실패: 반응없음.\nReason: ${e}")
            }

            override fun onResponse(call: Call, response: Response) {
                val responseBody = response.body()?.string()

                if (response.isSuccessful) {
                    runOnUiThread {
                        Log.d("회원가입", "반응 존재 : 성공.\nResponse: ${response}")
                        // Handle successful sign-up response
                    }
                }
                else {
                    runOnUiThread {
                        val alertDialog = AlertDialog.Builder(this@signUpActivity)
                            .setTitle("회원가입 실패")
                            .setMessage("이미 존재하는 ID 입니다.")
                            .setPositiveButton("확인") { dialog, _ -> dialog.dismiss() }
                            .create()
                        alertDialog.show()
                    }
                }
            }
        })
    }

로그인과 마찬가지로 JSON형태를 만들고 통신을 했다. 특이점은 없다.

결과

정상적으로 잘 동작한다!
이 후 retrofit을 통해서 리팩토링을 하자!!!

0개의 댓글