지금 프로그램을 만들고 있다.
프로그램 기획자의 요청사항중, 유저 회원가입에서 주소를 받아서 저장해야된다고 요청받았다.
일단 가장 큰 문제가 유니티 내부에서 api를 사용하는것이 가장 큰 문제다.
아직 WebRequest에 익숙하지 않아 조사해본 결과 여러 도로명주소api (카카오api, Daum Api 등등)가 있지만, 그냥 행정안전부에서 제공하는 api를 사용하기로 했다.
일단, 행안부의 api를 사용하기 위해서는 키를 발급받아야된다.
API 신청하기
API신청하기
business.juso.go.kr
여기서 필수 입력사항을 입력하고 API키를 발급받자.
참고로 서비스용도를 개발로 하면 본인인증 없이 발급받을 수 있다. URL은 블로그 주소를 입력해도 무방할것 같다.
API키를 발급받아서 잘 저장해두자
UI는 이렇게 구성해줬다.
주소입력쪽에 상단부터
우편번호
검색할 주소
상세주소 이고,
오른쪽 방향키는 페이지이다.
방향키는 perPage, nextPage함수로 구현해뒀다.
페이지 같은 경우에는 응답받는 json데이터를 살펴봐야한다.
검색API
본인인증 사용중인 휴대전화번호로 인증 인증하기 아이핀 인증 본인 명의 아이핀 계정으로 인증 인증하기
business.juso.go.kr
요청 변수를 보면 현재 페이지 번호가 있는데 한 페이지당 출력할 결과 수가 10개이고, 총 검색된 갯수가 100개라면 10개의 페이지가 생성되는것이다.
원래 이 서비스는 웹용 서비스이기때문에 우리가 UnityWebRequest를 사용해 응답을 요청할 때, 몇번째 페이지를 검색할지 보여줘야한다.
이러한 사항을 원래 리스트로 만들려 했는데 아직 안만들었다.
그래서 코드는 다음과 같이 구성했다.
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.Networking;
using System;
using System.Threading;
using Newtonsoft.Json;
public class AddressManager : MonoBehaviour
{
[SerializeField] TMP_InputField postNum;
[SerializeField] TMP_InputField address;
[SerializeField] TMP_InputField detail;
public AddressResponse response;
public int currentPage = 1;
public int totalCount;
string apiKey = "devU01TX0FVVEgyMDI0MDcwMjE1NTk0MzExNDg4MTQ=";
public void OnSearchBtnClick()
{
// 검색할 주소 키워드를 설정합니다.
string keyword = address.text;
currentPage = 1;
// 코루틴을 시작하여 주소 데이터를 검색합니다.
StartCoroutine(SearchAddress(keyword,currentPage));
}
public void PrePage(){
string keyword = address.text;
if(currentPage > 1)
currentPage -= 1;
StartCoroutine(SearchAddress(keyword,currentPage));
}
public void NextPage(){
string keyword = address.text;
if(currentPage <= totalCount/10)
currentPage += 1;
StartCoroutine(SearchAddress(keyword,currentPage));
}
IEnumerator SearchAddress(string keyword, int _currentPage)
{
// 주소 링크 API URL을 설정합니다.
string url = "https://business.juso.go.kr/addrlink/addrLinkApi.do";
url += "?confmKey=" + apiKey;
url += "¤tPage=" + _currentPage.ToString();
url += "&countPerPage=10";
url += "&keyword=" + UnityWebRequest.EscapeURL(keyword);
url += "&resultType=json";
// UnityWebRequest 객체를 생성합니다.
UnityWebRequest request = UnityWebRequest.Get(url);
// 요청을 보내고 응답을 기다립니다.
yield return request.SendWebRequest();
// 요청이 완료된 후의 응답을 처리합니다.
if (request.result == UnityWebRequest.Result.Success)
{
// 응답 데이터를 출력합니다.
Debug.Log("Response: " + request.downloadHandler.text);
// JSON 데이터를 AddressResponse 객체로 변환합니다.
response = JsonConvert.DeserializeObject<AddressResponse>(request.downloadHandler.text);
print("parsing response : " + response);
currentPage = int.Parse(response.results.common.currentPage);
totalCount = int.Parse(response.results.common.totalCount);
}
else
{
Debug.LogError("Error: " + request.error);
}
}
}
#region Public Class
[Serializable]
public class Common
{
public string errorMessage;//에러 메세지
public string countPerPage;//페이지당 출력할 결과 Row수
public string totalCount;//총 검색 데이터 수
public string errorCode;//에러코드
public string currentPage;//페이지 번호
}
[Serializable]
public class Juso
{
public string roadAddr; //전체 도로명 주소
public string roadAddrPart1; //도로명 주소(참고항목제외)
public string roadAddrPart2; //도로명 주소 참고항목
public string jibunAddr; //지번주소
public string engAddr; //도로명 주소 영문
public string jipNo; //우편번호
public string admCd; //행정구역코드
public string rnMgtSn; //도로명 코드
public string bdMgtSn; //건물관리번호
public string detBdNmList; //상세 건물명
public string bdNum; //건물명
public string bdKdcd; //공동주택여부
public string siNm; //시도명
public string sggNm; //시군구명
public string emdNm; // 읍면동명
public string liNm; //법정리명
public string rn; //도로명
public string udrtYn; //지하여부 지상0 지하1
public int buldMnnm; //건물본번
public int buldSlno; //건물부번
public string mtYn; //산여부 대지0 산1
public int lnbrMnnm; //지번본번(번지)
public int lnbrSlno; //지번부번(호)
public string emdNo; //읍면동일렬번호
public string hstryYn; //변동이력여부 현행주소정보0 요청변수의 keyword(검색어)가 변동된 주소정보에서 검색된 정보
public string reljibun; //관련지번
public string hemdNm; //관할주민센터(참고용 실제와 다를수있음)
}
[Serializable]
public class Results
{
public Common common;
public Juso[] juso;
}
[Serializable]
public class AddressResponse
{
public Results results;
}
#endregion
코드가 긴 이유는 클래스가 길어서 그렇다...
하여튼, 위의 검색API 페이지에 들어가보면 리턴하는 파라미터들이 쭉 나온다.
우린 이걸 JsonConvert로 파싱할것이다.
만약 JsonConvert가 안보인다면 유니티 에셋 스토어에서 Json.NET for Unity를 검색해 프로젝트에 추가시켜주자.
Json.NET Converters - Simple compatible solution | 입출력 관리 | Unity Asset Store
Get the Json.NET Converters - Simple compatible solution package from Wanzyee Studio and speed up your game development process. Find this & other 입출력 관리 options on the Unity Asset Store.
assetstore.unity.com
추가 시키면 using NewtonSoft.Json;을 사용할 수 있게 되고, 이 안에 JsonConvert가 있다.
이렇게 해서 실행시키면
이런식으로 잘 검색되는걸 알 수 있다.
다만, 지금은 리스트형식으로 보여지지만, 유저들은 앱에서 이 작업을 수행할것이기 때문에, 리스트를 UI로 변환시켜주면 끝날것 같다.
'Develop > Unity' 카테고리의 다른 글
[Unity] 유니티에서 라디오버튼 구현하기 (Unity RadioButton) (0) | 2024.07.22 |
---|---|
[Unity] 씬을 전환할 때 로딩을 걸어보자 - 씬 비동기 로딩, 로딩창 구현 (0) | 2024.07.03 |
[Unity] C#에서 사용하는 get,set연산자 정리 (=>를 활용한 표현식) (0) | 2024.06.20 |
[Unity] 갑자기 스크립트 리로딩이 안될때 - 스크립트 수정 후 유니티에서 리로딩을 안할때 (0) | 2024.06.20 |
[Unity] 캐스팅이 뭘까? - 유니티에서 활용하는 키워드 'as' (0) | 2024.06.19 |