'retrofit login mvvm'에 해당되는 글 1건

728x90

Retrofit 라이브러리를 사용하면 Session 처리 OK이고, 코드가 심플한 점도 장점이다.

MVVM 적용한 코드로 된 강좌들을 접하다보니 안할 수가 없어 기존 코드를 MVVM 코드로 정리를 해 볼 필요성이 있어 코드를 수정하여 구현해 보고 나서 동작에 대한 개념이 이해되었다.

 

디자인 패턴은 최고의 개발자들이 만들어낸 솔루션이다. 또한, 오랫동안 사용되어 오면서 안정성 검증이 완료된 솔루션으로 심지어 디자인 패턴은 문서화도 잘 되어있다.

 

MVVM 패턴
MVVM 패턴은 마틴 파울러의 Presentation 모델 패턴에서 파생된 디자인 패턴이다. 
MVVM 패턴의 목표는 비즈니스 로직과 프레젠테이션 로직을 UI로부터 분리하는 것이다. 
비즈니스 로직과 프레젠테이션 로직을 UI로부터 분리하게 되면, 테스트, 유지 보수, 재사용이 쉬워진다. 

- Model : 어플리케이션에서 사용되는 데이터와 그 데이터를 처리하는 부분.
- View : 사용자에서 보여지는 UI 부분.
- View Model : View를 표현하기 위해 만들어진 View를 위한 Model.

  View와는 Binding을 하여 연결후 View에게서 액션을 받고 또한 View를 업데이트한다.

 

1. View에 입력이 들어오면 ViewModel에게 명령을 한다.
2. ViewModel은 필요한 데이터를 Model에게 요청한다.
3. Model은 ViewModel에게 요청된 데이터를 응답한다.
4. ViewModel은 응답 받은 데이터를 가공해서 저장한다.
5. View는 ViewModel과의 Data Binding으로 인해 자동으로 갱신된다.

 

 

Retrofit 라이브러리를 활용한 MVVM 적용 Login 샘플 코드 예제이다.

 

public class LoginActivity extends AppCompatActivity {
    private final String TAG = this.getClass().getSimpleName();
    Context mContext;
    private ActivityLoginBinding binding;
 
    private BackPressHandler backPressHandler;
    private AuthViewModel viewModel;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_login);
        binding = ActivityLoginBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);
 
        backPressHandler = new BackPressHandler(this);
        mContext = LoginActivity.this;
 
        Utils.viewShowHide(binding.btnLogin, false);
        initView();
    }
 
    private void initView() {
        // viewModel init
        viewModel = new ViewModelProvider(this).get(AuthViewModel.class);
 
        // viewModel observe
        viewModel.getLoginResultLiveData().observe(thisnew Observer<LoginResult>() {
            @Override
            public void onChanged(LoginResult loginResult) {
                if(loginResult.getStatus().contains("success")){
                    Utils.goNextActivity(mContext,MainActivity.class);
                    finish();
                } else {
                    Utils.showAlert(mContext, loginResult.getStatus(), loginResult.getMessage());
                }
            }
        });
 
        // addTextChangedListener
        binding.etPw.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
 
            }
 
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
 
            }
 
            @Override
            public void afterTextChanged(Editable editable) {
                String userID = binding.etId.getText().toString().trim();
                String password = binding.etPw.getText().toString().trim();
                if (!userID.isEmpty() && !password.isEmpty())
                    Utils.viewShowHide(binding.btnLogin, true);
                // userID 와 패스워드 모두 입력하면 로그인 버튼이 활성화된다.
            }
        });
 
        // button setOnClickListener
        binding.btnLogin.setOnClickListener(view -> {
            login();
        });
 
    }
 
    private void login() {
        String userID = binding.etId.getText().toString().trim();
        String password = binding.etPw.getText().toString().trim();
        String uID = Utils.getDeviceId(mContext); // 스마트폰 고유장치번호
        String mfoneNO = Utils.getPhoneNumber(mContext); // 스마트폰 전화번호
        viewModel.login(userID, password,uID,mfoneNO);
        /*
        로그인 전달 변수 수정 시
        AutoViewModel.java 와 AutoRepository.java 파일 모두 수정
        */
    }
 
 
    @Override
    public void onBackPressed() {
        //super.onBackPressed();
        backPressHandler.onBackPressed();
    }
}

 

 

public class AuthViewModel extends ViewModel {
    private AuthRepository repository;
    private LiveData<LoginResult> _liveData;
 
    public AuthViewModel() {
    }
 
    public void login(String userID, String password, String uID, String mfoneNO) {
        repository.loginRepo(userID, password, uID, mfoneNO);
    }
 
    public LiveData<LoginResult> getLoginResultLiveData() {
        if (_liveData == null) {
            repository = new AuthRepository();
            _liveData = repository.getLoginResultLiveData();
        }
        return _liveData;
    }
 
}
 

 

 

 

public class AuthRepository {
    private RetrofitService loginService;
    private MutableLiveData<LoginResult> loginResultLiveData;
 
    public AuthRepository() {
        loginResultLiveData = new MutableLiveData<>();
        loginService = RetrofitAdapter.getClient(RetrofitURL.BaseUrl).create(RetrofitService.class);
    }
 
    public void loginRepo(String userID, String password, String uID, String mfoneNO){
        loginService.Login(userID,password,uID,mfoneNO)
                .enqueue(new Callback<LoginResult>() {
                    @Override
                    public void onResponse(Call<LoginResult> call, Response<LoginResult> response) {
                        loginResultLiveData.postValue(response.body());
                    }
 
                    @Override
                    public void onFailure(Call<LoginResult> call, Throwable t) {
                        loginResultLiveData.postValue(null);
                    }
                });
    }
 
    public LiveData<LoginResult> getLoginResultLiveData() {
        return loginResultLiveData;
    }
}

 

MVVM 기반 코드는 위 3개의 파일이 핵심인 거 같다.

전체 소스 코드는 Github 에 올려 두었다.

https://github.com/jsk005/JavaProjects/tree/master/retrofit_mvvm_login

 

GitHub - jsk005/JavaProjects: 자바 기능 테스트

자바 기능 테스트. Contribute to jsk005/JavaProjects development by creating an account on GitHub.

github.com

 

 

아래 GitHub를 참고하면 유용한 자료들이 많다.

https://github.com/probelalkhan?tab=repositories 

 

probelalkhan - Overview

probelalkhan has 147 repositories available. Follow their code on GitHub.

github.com

 

블로그 이미지

Link2Me

,