UI

이메일, 비밀번호, 닉네임을 작성을 통해 회원가입을 수행한다.
회원가입 구현
(Firebase Realtime DB 사용 방법 참고)
SignUpActivity.kt
private var auth : FirebaseAuth = FirebaseAuth.getInstance()
private var database : DatabaseReference = FirebaseDatabase.getInstance().reference
FirebaseAuth 인스턴스와 DatabaseReference 인스턴스를 전역변수로 선언해 준다.
val userTypeShared = getSharedPreferences("userType", Context.MODE_PRIVATE)!!
userType = userTypeShared.getString("userType", null).toString()
SharedPreferences객체의 getString()을 통해 key인 userType의 value를 받아온다.
// DB에 회원을 작성하는 함수
private fun writeNewUser(uid: String, name: String, email: String, userType : String){
val userInfo = UserInfo(name, email, userType)
database.child("users").child(uid).setValue(userInfo)
}
UserInfo라는 data class를 통해서 사용자의 정보를 저장하고 이를 database에 저장한다.
DatabaseReference의 child 기능을 통해 경로를 지정하고 setValue 기능을 통해 데이터를 수정한다.
// UserInfo 데이터 클래스
data class UserInfo (
var name: String? = null,
var email: String? = null,
var userType: String? = null,
var profile: String? = null
)
DatabaseReference의 setValue()는 데이터 1개가 계속 수정되는 방식이며, push().setValue()는 데이터가 계속 쌓이는 방식이다.
private fun signup(){ // 회원가입하는 함수
if(signup_email_et.text.toString().isEmpty() ||
signup_pw_et.text.toString().isEmpty() ||
signup_pw2_et.text.toString().isEmpty()
) {
Toast.makeText(this, "아이디와 비밀번호를 채워주세요.", Toast.LENGTH_LONG).show()
}else if(signup_name_et.text.toString().isEmpty()) {
Toast.makeText(this, "닉네임을 입력해주세요.", Toast.LENGTH_LONG).show()
}else if (signup_pw_et.text.toString() != signup_pw2_et.text.toString()) {
Toast.makeText(this, "비밀번호가 일치하지 않습니다. ", Toast.LENGTH_LONG).show()
}else {
auth.createUserWithEmailAndPassword(
signup_email_et.text.toString(),
signup_pw_et.text.toString()
).addOnCompleteListener { task ->
if (task.isSuccessful) {
// 계정(아이디) 생성 성공
// 사용자 정보 저장
writeNewUser(
task.result.user?.uid.toString(),
signup_name_et.text.toString(),
task.result.user?.email.toString(),
userType
)
Toast.makeText(this, "회원가입이 완료되었습니다.", Toast.LENGTH_LONG).show()
moveLoginPage(this)
} else {
if(!loginActivity.isEmail(signup_email_et.text.toString())){
Toast.makeText(this,"이메일 형식으로 입력해주세요.", Toast.LENGTH_LONG).show()
}else if (task.exception?.message.equals("The email address is already in use by another account.")) { // 이미 이메일을 사용한 계정이 존재하는 경우
Toast.makeText(this, "이미 존재하는 이메일입니다.", Toast.LENGTH_LONG).show()
}else if(signup_pw_et.length() < 6){
Toast.makeText(this, "비밀번호는 6자리 이상이어야 합니다.", Toast.LENGTH_LONG).show()
}else {
Toast.makeText(this, task.exception?.message, Toast.LENGTH_LONG).show()
}
}
}
}
}
private fun moveLoginPage(context: Context){ // 로그인 페이지로 이동하는 함수
val intent = Intent(context, LoginActivity::class.java)
finishAffinity() // 액티비티 스택을 비움
startActivity(intent)
}
auth의 CreateUserWithEmailAndPassword 기능을 이용하여 firebase Authentication에 계정을 생성하고, writeNewUser() 메서드를 통해 사용자 정보를 RealTime Database에 저장한다. 만약, 회원가입 양식이 잘못되었다면 경고 문구를 출력한다.
<전체 코드>
class SignupActivity : AppCompatActivity() {
private var auth : FirebaseAuth = FirebaseAuth.getInstance()
private var database : DatabaseReference = FirebaseDatabase.getInstance().reference
lateinit var userType: String
var loginActivity = LoginActivity()
override fun onCreate(savedInstanceState: Bundle?) {
val userTypeShared = getSharedPreferences("userType", Context.MODE_PRIVATE)!!
userType = userTypeShared.getString("userType", null).toString()
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_signup)
signup_btn.setOnClickListener {
signup()
}
}
private fun signup(){ // 회원가입하는 함수
if(signup_email_et.text.toString().isEmpty() ||
signup_pw_et.text.toString().isEmpty() ||
signup_pw2_et.text.toString().isEmpty()
) {
Toast.makeText(this, "아이디와 비밀번호를 채워주세요.", Toast.LENGTH_LONG).show()
}else if(signup_name_et.text.toString().isEmpty())
{
Toast.makeText(this, "닉네임을 입력해주세요.", Toast.LENGTH_LONG).show()
}else if (signup_pw_et.text.toString() != signup_pw2_et.text.toString()) {
Toast.makeText(this, "비밀번호가 일치하지 않습니다. ", Toast.LENGTH_LONG).show()
}else {
auth.createUserWithEmailAndPassword(
signup_email_et.text.toString(),
signup_pw_et.text.toString()
).addOnCompleteListener { task ->
if (task.isSuccessful) {
// 계정(아이디) 생성 성공
writeNewUser(
task.result.user?.uid.toString(),
signup_name_et.text.toString(),
task.result.user?.email.toString(),
userType
)
Toast.makeText(this, "회원가입이 완료되었습니다.", Toast.LENGTH_LONG).show()
moveLoginPage(this)
} else {
if(!loginActivity.isEmail(signup_email_et.text.toString())){
Toast.makeText(this,"이메일 형식으로 입력해주세요.", Toast.LENGTH_LONG).show()
}else if (task.exception?.message.equals("The email address is already in use by another account.")) { // 이미 이메일을 사용한 계정이 존재하는 경우
Toast.makeText(this, "이미 존재하는 이메일입니다.", Toast.LENGTH_LONG).show()
}else if(signup_pw_et.length() < 6){
Toast.makeText(this, "비밀번호는 6자리 이상이어야 합니다.", Toast.LENGTH_LONG).show()
}else {
Toast.makeText(this, task.exception?.message, Toast.LENGTH_LONG).show()
}
}
}
}
}
private fun moveLoginPage(context: Context){ // 로그인 페이지로 이동하는 함수
val intent = Intent(context, LoginActivity::class.java)
finishAffinity() // 액티비티 스택을 비움
startActivity(intent)
}
private fun writeNewUser(uid: String, name: String, email: String, userType : String){ // DB에 회원을 작성하는 함수
val userInfo = UserInfo(name, email, userType)
database.child("users").child(uid).setValue(userInfo)
}
}