로그인 버튼 클릭 시, 내부 동작 흐름과 결과

이번엔 실제 로그인 버튼을 클릭했을 때

VContainer가 주입한 객체들이 어떻게 연결되어 동작하는지 살펴보자

 

1. LoginPanel(UI진입점)

로그인 시작은 OnLogin()부터

private void OnLoginButtonClick()
{
    onLogin();
}

 

2. Onlogin() 입력 검증과 로그인 시도

private async UniTask onLogin()
{
    if (_isLoggingIn)
    {
        ToastMsg.Show("로그인 처리 중입니다.");
        return;
    }

    string id = usernameInput.text;
    string pw = passwordInput.text;

    if (string.IsNullOrWhiteSpace(id))
    {
        ToastMsg.Show("아이디를 입력해 주세요.");
        return;
    }
    if (string.IsNullOrWhiteSpace(pw))
    {
        ToastMsg.Show("비밀번호를 입력해 주세요.");
        return;
    }

    _isLoggingIn = true;

    var loginParam = new LoginParam { UserID = id, Password = pw };
    var result = await _loginWork.ExecuteWorkAsync(loginParam);

 

샘플프로젝트이기에 간단한 입력공백만 체크하고

LoginParm을 통해 로그인에 필요한 정보를 넘기면서 로그인을 시도한다.

3. LoginWork 주입된 서비스 호출(비동기)

public class LoginWork : IWork<LoginParam, LoginResult>
{
    private readonly IAuthService _authService;
    private readonly IUserService _userService;
    private LoginResult _loginResult;

    public LoginWork(IAuthService authService, IUserService userService)
    {
        _authService = authService;
        _userService = userService;
    }

    public async UniTask<LoginResult> ExecuteWorkAsync(LoginParam param)
    {
        Debug.Log("로그인 시작");

        string token = await _authService.LoginAsync(param.UserID, param.Password);
        if (token == null)
        {
            return new LoginResult(null, LoginErrorCode.InvalidToken, "Invalid Token");
        }

        UserData user = await _userService.LoadUserDataAsync(param.UserID, token);
        if (user == null)
        {
            return new LoginResult(null, LoginErrorCode.InvalidUserData,"Invalid UserData" );
        }
        
        await UniTask.Delay(500);
        
        Debug.Log($"로그인 성공 : {user.NickName}, {user.Level}");
        return _loginResult = new LoginResult(user, LoginErrorCode.None,"Success" );
    }
}

 

- IAuthService.LoginAsync() : 주입받은 Srvice로 로그인을 시도한다.

LoginAsync() 내부에서는 현재 세팅한 서버주소로 접속하여 Token을 확인하고 리턴한다.

- IUserService.LoadUserDataAsync() : 유저정보를 로드한다. 

 

여기서 샘플코드이기에 정해놓은 딜레이 시간을 넣었지만 실제 로그인은 네트워크 통신이 포함되고 여러 작업들이 동반되기에, 스레드를 막지 않도록 비동기(UniTask)사용했다. 이 구조를 사용하면 중복 클릭 방지·로딩 표시 같은 UI 제어가 자연스럽고, 타임아웃, 취소, 재시도 같은 확장도 쉽게 적용할 수 있다.

 

4. loginResult  결과 반환

return _loginResult = new LoginResult(user, LoginErrorCode.None, "Success");

 

UI는 내부 복잡한 로직을 몰라도된다. LoginResult.IsSuccess만 보고 처리하면된다.

로그인에 성공여부를 사용자에게 보여주면된다.

var result = await _loginWork.ExecuteWorkAsync(loginParam);

if (result.IsSuccess)
{
    // 성공 처리 → LogoutScene 로드
}
else
{
    // 실패 Toast 표시
}

 

정리하자면 아래 표와 같다.

UI(LoginPanel) 버튼 클릭, 입력값 수집, Work 실행만 담당
LoginWork 로그인 로직 핵심을 담당하는 “도메인 작업 단위”
IAuthService 로그인 요청을 라우팅
IUserService 유저 데이터 로딩 담당
VContainer LoginWork, AuthServiceRouter, UserService 생성·주입

 

LoginWork는 "하나의 로그인 시나리오(Work)"를 책임지는 객체이고

DI + VContainer구조에서 UI와 서비스 사이를 분리하는 레이어이다.

 

+ Recent posts