코틀린 개인 과제

회원가입 MVVM 과제

songyooho 2024. 7. 14. 13:34

1. Model(Model.kt)

object Model {
    private val users = ArrayList<User>()

    init {
        users+=User("test1","test1","test1")
        users+=User("test2","test2","test2")
    }

    fun AddUser(user: User)=users.add(user)
    fun ReturnIds()=users.map(){it.id} as ArrayList<String>
}

data class User(val name:String, val id:String, val password:String)

-아무곳에서 수정할 수 없게 유저 데이터는 private로 만들었고 ViewModel 생성시 필요한 id목록과 ViewModel에서 Model을 수정할 수 있게 해주는 함수들을 각각 만들었다.

 

2. ViewModel(ViewModel.kt)

class ViewModel {
    private var ids = ArrayList<String>()

    init {
        ids = Model.ReturnIds()
    }

    fun Assign(user: User): String {
        if (user.id.isEmpty() || user.name.isEmpty() || user.password.isEmpty()) {
            return "이름, 아이디, 비밀번호 모두 입력해주세요"
        } else if (ids.contains(user.id)) {
            return "이미 존재하는 아이디입니다."
        } else {
            ids += user.id
            Model.AddUser(user)
            return "이름: ${user.name}, 아이디:${user.id}, 패스워드:${user.password}"
        }
    }
}

-데이터를 가공, 처리하기 위해 Assign 함수 생성

-토스트 메시지를 띄우기 위해서는context가 필요한데 ViewModel이 토스트 메시지를 띄우려고 context를 받아오면 종속성이 생기므로 토스트로 띄워주기위해 가공된 데이터를 View로 보내주기만 한다.

@ViewModel은 View를 몰라야 함!

 

3. View(LoginFragment.kt)

class LoginFragment : Fragment() {

    private var _binding:FragmentLoginBinding? = null
    private val binding get() = _binding!!



    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding=FragmentLoginBinding.inflate(inflater,container,false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.asignButton.setOnClickListener{
            val id=binding.editTextTextId.text.toString()
            val name=binding.editTextTextName.text.toString()
            val pw=binding.editTextTextPw.text.toString()
            Toast.makeText(activity, viewModel.Assign(User(name,id, pw)), Toast.LENGTH_SHORT).show()

            Log.d("data","${Model.ReturnIds()}")
        }
    }

    companion object {

        @JvmStatic
        private val viewModel=ViewModel()

    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding=null
    }
}

-뷰모델과 뷰의 관계는 1대 다수이므로 companion object에 viewModel을 넣어둔다.

- 요청사항인 회원가입을 위해 관련 데이터를 User클래스로 캡슐화시켜 ViewModel로 보내준다.

'코틀린 개인 과제' 카테고리의 다른 글

연락처 리스트앱 구현  (0) 2024.07.18
AppleMarket 구현 과제  (0) 2024.07.15
챌린지반 3주차 첫번째 과제: 디자인 패턴 구현  (0) 2024.07.09
로그인 앱 제작-2  (0) 2024.06.25
로그인 앱 제작  (0) 2024.06.19