TIL(Today I Learned)

[Unity] ATM기 모방하기 - TIL#33

Najdorf 2024. 2. 7. 22:35
728x90

 

(구현한 ATM기의 모습이다.)


구현한 요구사항

 

필수요구사항

  1. ATM 화면 구성
  2. 입금 기능
  3. 출금 기능

선택요구사항

  1. 통화 단위 적용
  2. 금액 입력 시 숫자만 입력
  3. 로그인 기능
  4. 회원가입
  5. 송금 기능

그 외 추가로 시도한 기능

  1. 비밀번호 MD5로 해시해서 저장

 


알게된 점 & 느낀 점

 

 

어제 TIL에 작성했듯이 C#에서 해시 알고리즘을 사용하는 방법을 알아봤었다.

항상 개념으로만 인지하고 있다가 언젠가는 실사용을 꼭 해보고 싶었는데,

실제로 코드를 작성해서 내 프로젝트에 적용을 하니 원리도 이해가면서 익숙해졌다.

 

 

시도를 해본 것은 그래도 명색이 은행 ATM기를 모방한건데...

데이터베이스 하나 털어서 비밀번호를 바로 알게 된다면 그것만큼 허무한 게 없지 않을까 하는 생각 때문이었다.

그래서 간단한 보안 조치를 한 것이다. 

(사진 속 Test의 비밀번호는 "1234", Test2는 "1q2w3e4r"이다. MD5로 해시된 것을 확인할 수 있다.)

 

아래에서 구현한 코드를 확인해 볼 수 있다.

더보기
using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;

public class Hasher : MonoBehaviour
{
    byte[] tmpSource;
    byte[] tmpHash;

    public string HashData(string sourceData)
    {
        tmpSource = ASCIIEncoding.ASCII.GetBytes(sourceData);
        tmpHash = new MD5CryptoServiceProvider().ComputeHash(tmpSource);
        return ByteArrayToString(tmpHash);
    }

    public string ByteArrayToString(byte[] arrInput)
    {
        int i;
        StringBuilder sOutput = new StringBuilder(arrInput.Length);
        for (i = 0; i < arrInput.Length; i++)
        {
            sOutput.Append(arrInput[i].ToString("X2"));
        }
        return sOutput.ToString();
    }
}

 

 

그리고 역시나 회원 가입과 json을 이용한 저장 기능이 시간을 많이 잡아먹었는데,

정말 다행인 건(?) 저번 팀 프로젝트 때 저장 기능을 알아가는데만 하루를 까먹은 덕분에

이번에는 비교적 에러도 없이 빠르게 구현을 하게 되었다.

 

코드도 개인적으로 느끼기에는 저번보다 깔끔해진 것 같다.

더보기
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class SaveData : MonoBehaviour
{

    public SaveUserData saveUserData;

    private void Awake()
    {
        LoadUserData();
        DontDestroyOnLoad(this);
    }

    [ContextMenu("To Json Data")]
    public void SaveUserData()
    {
        string jsonData = JsonUtility.ToJson(saveUserData, true);
        string path = Path.Combine(Application.dataPath, "UserData.json");
        File.WriteAllText(path, jsonData);
        Debug.Log("데이터 저장했음");
    }

    [ContextMenu("From Json Data")]
    public void LoadUserData()
    {
        string path = Path.Combine(Application.dataPath, "UserData.json");
        if (!File.Exists(path))
        {
            Debug.Log("No File");
            saveUserData = new SaveUserData();
            return;
        }
        string jsonData = File.ReadAllText(path);

        saveUserData = JsonUtility.FromJson<SaveUserData>(jsonData);
        Debug.Log("데이터 불러왔음");
    }

}

[System.Serializable]
public class SaveUserData
{
    public List<UserData> user = new List<UserData>();
}

[System.Serializable]
public class UserData
{
    public string id;
    public string password;
    public string name;
    public int balance;
    public int cash;
    public bool isLogined;
}

 

전체적으로 아쉬운 점은, 스크립트를 좀 더 체계적으로 분류할 수 있지 않았을까 하는 것이다.

너무 GameManager 파일 하나에 많은 기능들은 전체적으로 몰아준게 아닌가... 하는 생각이 든다.

 

이번 개인 과제에서 굳이 '난이도[하]' 짜리를 선택했던 건,

언젠가는 ATM기 같은 보안 기능을 요구하는 UI가 주가 되는 프로젝트를 해보고 싶었는데,

이게 마침 내 니즈에 맞을 것 같아서 선택하게 되었던 것이다.

 

결과적으로 만족한다.

 

 

https://github.com/cn7249/ATM

 

GitHub - cn7249/ATM: Init

Init. Contribute to cn7249/ATM development by creating an account on GitHub.

github.com

 

728x90