👏한국 연구 재단에서 지원하는 공동 연구사업에 참여할 기회가 생겼다. 타 대학의 심리학과에서 연구를 진행하는 데 있어 필요한 앱을 우리 학교에 외주 형식으로 맡겼는데, 그 프로젝트의 연구원으로 참여하게 되었다.
앱을 개발하면서 가장 중요한 것은 데이터베이스 구축과 서버와의 연결이라고 생각한다. 약 두달정도 ERD를 그려가며, 최대한 많은 경우의 수와 데이터베이스를 관리하기 쉽게 하기 위한 DB구축을 마치고, 앱의 기능적인 부분 구현을 시작하고 있다 ..
이번에는 가버전을 위해 디자인을 생략하고 기능적인 부분만 구현하는데 있어 가장 많은 시간을 할애했던 xcode(ios)에서 mysql과 요청을 주고받는 방식을 기록하고자 한다.
먼저 서버사이드를 결정해야 하는데, 나는 프로젝트 책임자(교수님)의 강권으로(?) PHP를 사용하기로 했다.
편집기는 선택사항이었는데 나는 terminal에서 vi편집기를 사용하고 있다. 다른 팀원들은 vscode를 사용하는 듯.
서버사이드와 편집기를 결정했으니 바로 코드를 짜러 가본다.
<?
$id = $_POST['id'];
$password = $_POST['pwd'];
//$id = $_GET['username'];
//$password = $_GET['password'];
$host = "localhost";
$user = "root";
$pw = "";
$dbName = "NSSI";
$conn = new mysqli($host, $user, $pw, $dbName);
if(!$conn){
echo "-1";
} else {
// echo "Connection established"."<br>";
}
$sql = "select PKey from SurveyUser where `ID`='$id' and `PWD`='$password';";
$result = mysqli_query($conn, $sql);
$pkey = 0;
while($row = mysqli_fetch_array($result)){
$pkey=$row['PKey'];
}
mysqli_close($conn);
?>
이 코드는 로그인시 사용자의 아이디와 비밀번호를 확인하고, 일치하는 게 있으면 클라이언트에 userpkey를 응답으로 돌려주는 php코드이다.
$id = $_POST['id'];
$password = $_POST['pwd'];
위의 코드는 xcode에서의 코드를 보면 더 쉽게 이해할 수 있다.(아래에서 다시 설명하겠다) 클라이언트인 xcode에서 전달해 준 변수를 POST방식으로 받아오는 코드이다.
그리고 내가 만든 mysql의 user이름이나 비밀번호,데이터베이스 이름 등을 적어 넣는다
$conn = new mysqli($host, $user, $pw, $dbName);
서버에 통신한다.
연결이 잘 되었는지 확인했으면,
sql쿼리문을 넣고 result변수에 응답을 받아온다.
여기서는 해당 user가 있으면 pkey값을 돌려주는데, 값이 0이라면 해당하는 user가 없는 것으로 클라이언트 측에서 이후 알림창을 띄운다던지, 조치를 취하면 된다.👍
그렇다면 xcode(클라이언트)에서는 어떻게 해야 할까?
URLSession.shared.dataTask(with: request){(data,response,error) in
if let error = error{
print(error)
return
}
guard let data=data else{return}
var str = String(data:data, encoding: .utf8) as Any
let str2 = String(decoding: data, as: UTF8.self)
let result:Int = Int(str2) ?? 0
if result > 0 {
UserDefaults.standard.set(str2, forKey: "userpkey")
isActive=true
showAlert=false
}
else{
isActive=false
showAlert=true
}
}.resume()
urlsession을 통해서 서버에 요청을 넣는다. 이 과정에서 서버에 요청을 전달해주는 중간 매개체, 서버사이드 php코드가 필요한 것이다.
따라서 생성한 php파일 링크를 넣어주고, 통신을 요청한다.
guard let url=URL(string: "\(Config.ipAddress)/LoginView.php")
else{
print("url error")
return
}
let body="id=\(id)&password=\(pwd)"
let encodedData=body.data(using: String.Encoding.utf8)
var request=URLRequest(url:url)
request.httpMethod="POST"
request.httpBody=encodedData
앞서 서버사이드에서 클라이언트로부터 변수를 받아오는 코드를 소개했는데, 여기서 전달하는 코드를 볼 수 있다.
💻 let body="id=(id)&password=(pwd)"
이런식으로 원하는 변수를 몇 개든 넘길 수 있다. 다만 괄호 안의 변수 명과 php코드에서 따옴표 내부의 변수 명을 일치시켜주어야 한다!
받은 응답을 가지고 하고 싶은 작업을 진행시키면 된다. 나의 경우에는 pkey값을 받아 surveykey를 가져오는 데 사용하거나, 값이 0인 예외 처리를 진행하였다.
이런식으로 클라이언트와 서버 간의 통신을 주고받을 수 있다. 기본 개념은 클라이언트가 요청하고, 서버가 응답하는 것이지만 그 과정이 복잡하거나 예기치 않은 네트워크 오류 등 발생할 수 있는 변수가 다양하므로 꼭 숙지하기를 바란다.