로그인 버튼 클릭 시, 내부 동작 흐름과 결과
이번엔 실제 로그인 버튼을 클릭했을 때
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와 서비스 사이를 분리하는 레이어이다.

'Unity' 카테고리의 다른 글
| [프로그래머스 C#] 기능개발 (0) | 2025.12.22 |
|---|---|
| Unity) async/await/UniTask 비동기/코루틴/스레드 (1) | 2025.12.20 |
| [Unity] VContainer DI와 로그인 흐름 구조화하기 - 2 (0) | 2025.11.12 |
| [Unity] 유저 분산 시스템 구현기 - 유저 몰림 현상 해결하기 (0) | 2025.11.07 |
| unity) Android gradle (0) | 2025.05.16 |
