Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] WEEK6 - xml 필수과제 #11

Open
wants to merge 16 commits into
base: develop-xml
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'org.jetbrains.kotlin.plugin.serialization' version '1.9.0'
}

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

android {
namespace 'com.sopt.now'
compileSdk 34
Expand All @@ -15,6 +19,7 @@ android {
versionName "1.0"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
buildConfigField "String", "AUTH_BASE_URL", properties["base.url"]
}

buildTypes {
Expand All @@ -32,9 +37,8 @@ android {
}
buildFeatures {
viewBinding true
}
buildFeatures {
dataBinding true
buildConfig true
}
}

Expand All @@ -45,7 +49,23 @@ dependencies {
implementation 'com.google.android.material:material:1.11.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.activity:activity:1.8.0'
// 서버통신을 위한 retrofit + retrofit에서 serialization 사용
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:1.0.0'
// json 직렬화
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1'
// OkHttp 버전 관리및 로깅 인터셉터
implementation(platform("com.squareup.okhttp3:okhttp-bom:4.10.0"))
implementation("com.squareup.okhttp3:okhttp")
implementation("com.squareup.okhttp3:logging-interceptor")
// navigation 구성 요소에서 fragment / ui 사용
implementation("androidx.navigation:navigation-fragment-ktx:2.7.7")
implementation("androidx.navigation:navigation-ui-ktx:2.7.7")
// 단위 테스트
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
// ui 테스트
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
// coroutine
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9")
}
8 changes: 5 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
Expand All @@ -11,9 +12,10 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.NOWSOPTAndroid"
android:usesCleartextTraffic="true"
tools:targetApi="31">
<activity
android:name=".LoginActivity"
android:name=".presentation.auth.login.LoginActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand All @@ -22,10 +24,10 @@
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:name=".presentation.main.MainActivity"
android:exported="false"></activity>
<activity
android:name=".SignupActivity"
android:name=".presentation.auth.signup.SignupActivity"
android:exported="false"></activity>
</application>

Expand Down
69 changes: 0 additions & 69 deletions app/src/main/java/com/sopt/now/LoginActivity.kt

This file was deleted.

64 changes: 0 additions & 64 deletions app/src/main/java/com/sopt/now/SignupActivity.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.sopt.now.presentation.auth.login

import android.content.Intent
import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import com.sopt.now.databinding.ActivityLoginBinding
import com.sopt.now.presentation.data.model.dto.RequestLoginDto
import com.sopt.now.presentation.auth.signup.SignupActivity

class LoginActivity : AppCompatActivity() {
private val binding by lazy { ActivityLoginBinding.inflate(layoutInflater) }
private val viewModel by viewModels<LoginViewModel>()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
clickButtonListener()
}

private fun clickButtonListener() {
// 로그인 버튼 클릭
binding.btnLogin.setOnClickListener {
viewModel.login(getLoginRequestDto())
}
// 회원가입 버튼 클릭
binding.btnSignup.setOnClickListener {
Intent(this@LoginActivity, SignupActivity::class.java).let {
startActivity(it)
}
}
}

private fun getLoginRequestDto(): RequestLoginDto {
val id = binding.edtLoginId.text.toString()
val password = binding.edtLoginPassword.text.toString()
return RequestLoginDto(
authenticationId = id,
password = password,
)
}
companion object {
var memberId = "1"
}
Comment on lines +42 to +44
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
companion object {
var memberId = "1"
}
companion object {
const val MEMBER_ID = "1"
}

상수화하려면 const val로 바꿔줘야 할 것 같아요! 그리고 저는 보통 변하지 않는 값을 강조하기 위해 대문자로 표시해줍니다!

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.sopt.now.presentation.auth.login

data class LoginState(
val isSuccess: Boolean,
val message: String,
val memberId: String = ""
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.sopt.now.presentation.auth.login

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sopt.now.presentation.data.model.dto.RequestLoginDto
import com.sopt.now.presentation.data.model.dto.ResponseUserInfoDto
import com.sopt.now.presentation.data.ServicePool
import kotlinx.coroutines.launch
import retrofit2.HttpException

class LoginViewModel : ViewModel() {
private val authService by lazy { ServicePool.authService }
private val _loginStateLiveData = MutableLiveData<LoginState>()

Comment on lines +11 to +15
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

뷰모델 따로 분리한 거 넘 좋아요!!!

fun login(request: RequestLoginDto) {
viewModelScope.launch {
try {
val response = authService.login(request)
_loginStateLiveData.value = LoginState(true, "로그인 성공")

} catch (e: HttpException) {
_loginStateLiveData.value = LoginState(false, "로그인 실패 ${e.code()}")
Comment on lines +17 to +23
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

세미나에서 runCathcing에 대해서 배웠으니까 활용해보면 좋을 것 같네요!

}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.sopt.now.presentation.auth.signup

import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import com.sopt.now.databinding.ActivitySignupBinding
import com.sopt.now.presentation.data.model.dto.RequestSignUpDto
import com.sopt.now.presentation.auth.login.LoginActivity

class SignupActivity : AppCompatActivity() {
private val binding by lazy { ActivitySignupBinding.inflate(layoutInflater) }
private val viewModel by viewModels<SignUpViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
SignupButtonClickListener()
Comment on lines +17 to +18
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
setContentView(binding.root)
SignupButtonClickListener()
setContentView(binding.root)
signupButtonClickListener()

사소한 디테일!

observeSignupState()
}

private fun SignupButtonClickListener() {
binding.btnSignup.setOnClickListener {
viewModel.signUp(getSignUpRequestDto())
}
}

private fun observeSignupState() {
viewModel.liveData.observe(this) { SignUpState ->
if (SignUpState.isSuccess) {
startActivity(Intent(this, LoginActivity::class.java))
finish()
Toast.makeText(
this@SignupActivity,
SignUpState.message,
Toast.LENGTH_SHORT
).show()
}
}
}
private fun getSignUpRequestDto(): RequestSignUpDto {
val id = binding.edtSignupId.text.toString()
val password = binding.edtSignupPassword.text.toString()
val nickname = binding.edtSignupNickname.text.toString()
val phoneNumber = binding.edtSignupPhonenumber.text.toString()
return RequestSignUpDto(
authenticationId = id,
password = password,
nickname = nickname,
phone = phoneNumber
)
}
Comment on lines +41 to +52
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
private fun getSignUpRequestDto(): RequestSignUpDto {
val id = binding.edtSignupId.text.toString()
val password = binding.edtSignupPassword.text.toString()
val nickname = binding.edtSignupNickname.text.toString()
val phoneNumber = binding.edtSignupPhonenumber.text.toString()
return RequestSignUpDto(
authenticationId = id,
password = password,
nickname = nickname,
phone = phoneNumber
)
}
private fun getSignUpRequestDto(): RequestSignUpDto =
with(binding) {
RequestSignUpDto(
authenticationId = edtSignupId.text.toString(),
password = edtSignupPassword.text.toString(),
nickname = edtSignupNickname.text.toString(),
phone = edtSignupPhonenumber.text.toString()
)
}

이렇게 바꿔줄 수 도 있을 것 같아요!

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.sopt.now.presentation.auth.signup

data class SignUpState(
val isSuccess: Boolean,
val message: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.sopt.now.presentation.auth.signup

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.sopt.now.presentation.data.model.dto.RequestSignUpDto
import com.sopt.now.presentation.data.ServicePool
import kotlinx.coroutines.launch
import retrofit2.HttpException

class SignUpViewModel : ViewModel() {
private val authService by lazy { ServicePool.authService }
val liveData = MutableLiveData<SignUpState>()
Comment on lines +12 to +13
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

배킹 프로퍼티 사용해주세욤 ㅜㅜ

fun signUp(request: RequestSignUpDto) {
viewModelScope.launch {
try {
val response = authService.signUp(request)
liveData.value = SignUpState(true, "회원가입 성공")
} catch (e: HttpException) {
liveData.value = SignUpState(false, "회원가입 실패 ${e.code()}")
}
}
}
}
Loading