diff --git a/app/build.gradle b/app/build.gradle index e795490..2ff9c71 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' + id 'org.jetbrains.kotlin.plugin.serialization' version '1.8.0' } android { @@ -47,4 +48,10 @@ dependencies { testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + + implementation "com.squareup.retrofit2:retrofit:2.9.0" + implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1' + implementation 'com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0' + implementation(platform("com.squareup.okhttp3:okhttp-bom:4.10.0")) + implementation("com.squareup.okhttp3:okhttp") } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e21cab8..6446ab7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ - + + tools:targetApi="31" + android:usesCleartextTraffic="true" + > @@ -28,9 +30,21 @@ + android:exported="true"> + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/external/ApiPool.kt b/app/src/main/java/org/android/go/sopt/external/ApiPool.kt new file mode 100644 index 0000000..1de8bed --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/external/ApiPool.kt @@ -0,0 +1,70 @@ +package org.android.go.sopt.external + +import kotlinx.serialization.Serializable +import retrofit2.Call +import retrofit2.http.Body +import retrofit2.http.POST + +object ApiPool { + val signUpService: SignUpService = + PreparedRetrofit.apiServerRetrofitForAnonymous.create(SignUpService::class.java) + val signInService: SignInService = + PreparedRetrofit.apiServerRetrofitForAnonymous.create(SignInService::class.java) +} + +interface SignUpService { + @POST("/sign-up") + fun signUp( + @Body request: Request + ): Call + + @Serializable + data class Request( + val id: String, + val password: String, + val name: String, + val skill: String? + ) + + @Serializable + data class Response( + val status: Int, + val message: String, + val data: Data?, + ) { + + @Serializable + data class Data( + val name: String, + val skill: String? + ) + } +} + +interface SignInService { + @POST("/sign-in") + fun signIn( + @Body request: Request + ): Call + + @Serializable + data class Request( + val id: String, + val password: String + ) + + @Serializable + data class Response( + val status: Int, + val message: String, + val data: Data?, + ) { + + @Serializable + data class Data( + val id: String, + val name: String, + val skill: String? + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/external/PreparedRetrofit.kt b/app/src/main/java/org/android/go/sopt/external/PreparedRetrofit.kt new file mode 100644 index 0000000..9d17a99 --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/external/PreparedRetrofit.kt @@ -0,0 +1,25 @@ +package org.android.go.sopt.external + +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import kotlinx.serialization.json.Json +import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import retrofit2.Retrofit +import java.util.concurrent.TimeUnit + +object PreparedRetrofit { + val apiServerRetrofitForAnonymous by lazy { + Retrofit.Builder() + .baseUrl("http://52.78.152.187:8080") + .client( + OkHttpClient.Builder().apply { + connectTimeout(10, TimeUnit.SECONDS) + writeTimeout(5, TimeUnit.SECONDS) + readTimeout(5, TimeUnit.SECONDS) + }.build() + ) + .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) + .build() + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/external/SignInActivity.kt b/app/src/main/java/org/android/go/sopt/external/SignInActivity.kt new file mode 100644 index 0000000..26d1290 --- /dev/null +++ b/app/src/main/java/org/android/go/sopt/external/SignInActivity.kt @@ -0,0 +1,55 @@ +package org.android.go.sopt.external + +import android.content.Intent +import android.os.Bundle +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import org.android.go.sopt.databinding.ActivitySignInBinding +import org.android.go.sopt.toast +import retrofit2.Call +import retrofit2.Response + +class SignInActivity : AppCompatActivity() { + private lateinit var binding: ActivitySignInBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySignInBinding.inflate(layoutInflater) + setContentView(binding.root) + + onClick() + } + + private fun onClick() { + btnSignIn() + } + + private fun btnSignIn() { + binding.btnSignIn.setOnClickListener { + if(binding.tvSignInId.text.isNotBlank() && binding.tvSignInPw.text.isNotBlank()) { + val id = binding.tvSignInId.text.toString() + val pw = binding.tvSignInPw.text.toString() + + ApiPool.signInService.signIn(SignInService.Request(id = id, password = pw)).enqueue(object : retrofit2.Callback { + override fun onResponse( + call: Call, + response: Response + ) { + if(response.isSuccessful) { + Toast.makeText(this@SignInActivity, "로그인이 정상적으로 이루어졌습니다.", Toast.LENGTH_SHORT).show() + + toast("안녕하세요! ${response.body()?.data?.name}") + + } else { + Toast.makeText(this@SignInActivity, "로그인이 정상적으로 처리되지 않았습니다.", Toast.LENGTH_SHORT).show() + } + } + + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText(this@SignInActivity, "네트워크 통신이 원활하지 못합니다.", Toast.LENGTH_SHORT).show() + } + }) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/org/android/go/sopt/external/SignUpActivity.kt b/app/src/main/java/org/android/go/sopt/external/SignUpActivity.kt index 142e0fe..32f62eb 100644 --- a/app/src/main/java/org/android/go/sopt/external/SignUpActivity.kt +++ b/app/src/main/java/org/android/go/sopt/external/SignUpActivity.kt @@ -2,6 +2,7 @@ package org.android.go.sopt.external import android.content.Intent import android.os.Bundle +import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import org.android.go.sopt.databinding.ActivitySignUpBinding import org.android.go.sopt.get @@ -9,6 +10,8 @@ import org.android.go.sopt.idSucceed import org.android.go.sopt.internal.signup.SignUpUser import org.android.go.sopt.pwSucceed import org.android.go.sopt.toast +import retrofit2.Call +import retrofit2.Response class SignUpActivity : AppCompatActivity() { private lateinit var binding: ActivitySignUpBinding @@ -28,19 +31,45 @@ class SignUpActivity : AppCompatActivity() { private fun btnSignIn() { binding.btnSignUp.setOnClickListener { if (binding.idSucceed() && binding.pwSucceed()) { - val toProfile = Intent(this@SignUpActivity, ProfileActivity::class.java) - toProfile.putExtra( - SIGN_UP_USER, - SignUpUser( - id = binding.etId.get(), - password = binding.etPw.get(), - name = binding.etName.get(), - hobby = binding.etHobby.get() - ) - ) - toast("안녕하세요!") - startActivity(toProfile) - finish() + + ApiPool.signUpService.signUp(SignUpService.Request( + id = binding.etId.get(), + password = binding.etPw.get(), + name = binding.etName.get(), + skill = binding.etHobby.get() + )).enqueue(object : retrofit2.Callback { + override fun onResponse( + call: Call, + response: Response + ) { + if(response.isSuccessful) { + Toast.makeText(this@SignUpActivity, "회원가입이 정상적으로 이루어졌습니다.", Toast.LENGTH_SHORT).show() + + val toProfile = Intent(this@SignUpActivity, ProfileActivity::class.java) + toProfile.putExtra( + SIGN_UP_USER, + SignUpUser( + id = binding.etId.get(), + password = binding.etPw.get(), + name = binding.etName.get(), + hobby = binding.etHobby.get() + ) + ) + toast("안녕하세요!") + startActivity(toProfile) + finish() + + } else { + Toast.makeText(this@SignUpActivity, "회원가입이 정상적으로 처리되지 않았습니다.", Toast.LENGTH_SHORT).show() + } + } + + override fun onFailure(call: Call, t: Throwable) { + Toast.makeText(this@SignUpActivity, "네트워크 통신이 원활하지 못합니다.", Toast.LENGTH_SHORT).show() + } + }) + + } else { toast("id 혹은 password 가 정상적으로 입력되지 않았습니다.") } diff --git a/app/src/main/res/layout/activity_sign_in.xml b/app/src/main/res/layout/activity_sign_in.xml new file mode 100644 index 0000000..6a1d888 --- /dev/null +++ b/app/src/main/res/layout/activity_sign_in.xml @@ -0,0 +1,46 @@ + + + + + + + +