[SpringBoot] ๐ก JSON์ ์ด์ฉํ ๋ฐ์ดํฐ ์ก์์ ?
๐ ์ฌ์ ์ค๋น
postMan
์ด๋ผ๋ API๋ฅผ ๋์์ธํ๊ณ ๋น๋ํ๊ณ ํ
์คํธํ๊ธฐ ์ํ API ํ๋ซํผ์ ๊น์์ค๋ค.
๋ค์์ผ๋ก IntelliJ
๋ฅผ ์ค์นํด์ค๋ค.
์ดํ Spring initializr
๋ฅผ ์ด์ฉํ์ฌ ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํด์ค๋ค.
์ด๋ ๋ค์๊ณผ ๊ฐ์ด Spring Boot DevTools
, Lombok
๊ณผ Spring Web
์ ์ฒดํฌํด์ค๋ค.
์ดํ, ์ ๋ํฐ ์ค์น ๋ฐฉ๋ฒ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ์, ์ ๋ํฐ๋ฅผ ์ค์นํ๋ค.
๐ PostMapping์ ์ฌ์ฉํ๊ธฐ
๋ค์๊ณผ ๊ฐ์ด main/java/com.example.(ํ์ผ์ด๋ฆ)
์๋์ Controller
๋ผ๋ ํจํค์ง๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ํด๋ ์์ PostController
๋ผ๋ ์ด๋ฆ์ผ๋ก ์๋ฐ ์คํฌ๋ฆฝํธ๋ฅผ ํ๋ ์์ฑํด์ค๋ค.
์ดํ ์์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ค๋ค.
package com.example.imsgame.Controller;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class asd {
@PostMapping("/postMethod")
public ResponseEntity<String> processData(@RequestBody UnityData unityData, @RequestHeader("Content-Type") String contentType) {
if ("application/json".equals(contentType)) {
String result = "์์ ๋ ๋ฐ์ดํฐ: " + unityData.toString();
return ResponseEntity.ok(result);
} else {
return ResponseEntity.badRequest().body("Invalid Content-Type");
}
}
@JsonAutoDetect
public static class UnityData {
private String id;
private String password;
public UnityData(String id, String password) {
this.id = id;
this.password = password;
}
public String getId() {
return id;
}
public String getPassword() {
return password;
}
public void setId(String id) {
this.id = id;
}
public void setPassword(String password) {
this.password = password;
}
//toString ์ค๋ฒ๋ผ์ด๋
@Override
public String toString() {
return "์ ๋ํฐ ๋ฐ์ดํฐ{" +
"์ด๋ฆ ='" + id + "'" +
", password =" + password +
'}';
}
}
}
์ ์ฝ๋์์ @ ๋ผ๋ ํน์ดํ ๊ธฐํธ๊ฐ ๋ณด์ธ๋ค.
์ด๋ Annotation
์ด๊ณ ์ด๋ Annotation ์ด๋ ๋ฌด์์ธ๊ฐ ์์ ํ์ธํ ์ ์๋ค.
์ด๋ ResponseEntity<String> processData()
ํจ์์์ /postMethod
๋ผ๋ ์ฃผ์๋ก ์จ ๋ฐ์ดํฐ์ ๋ค์ด์๋ body
๋ฅผ ํ์ฑํด์ ์ฒ๋ฆฌํ๋ค.
์ด๋ ์ด ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ UnityData
๋ผ๋ DTO
๋ฅผ ํ๋ ๋ง๋ค์ด์ฃผ๊ณ , ์์ String
ํ์์ผ๋ก id
์ password
๋ฅผ ์์ฑํด์ค๋ค.
์ฌ๊ธฐ์ getter, setter
๋ฅผ ์ ์ธํด ์ค์ผ ํ๋๋ฐ, IntelliJ
์์ ์ด๋ฅผ ์ง์ํ๋ ๊ฐ๋จํ ๋ช
๋ น์ด๊ฐ ์๋ค.
์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ ๊ณณ์ ์ปค์๋ฅผ ๋ ๋ค, alt + insert
ํค๋ฅผ ๋๋ฌ์ค ํ, getter, setter
๋ฅผ ์ถ๊ฐํด์ค๋ค.
์ด์ (ํ์ผ์ด๋ฆ)Application
์ ์คํ์ํค๋ฉด ๋ค์ ํ๋ฉด๊ณผ ๊ฐ์ด ์ ์์ ์ผ๋ก ์ฝ๋๊ฐ ์๋์ด ๋๋ค.
์ดํ postMan
์์ ํ์์ post
๋ก ๋ณ๊ฒฝํด์ค๋ค, http://localhost:8080/postMethod
๋ฅผ ์
๋ ฅํด์ฃผ๊ณ , body
๋ถ๋ถ์ raw
๋ฐ์ดํฐ ํ์์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์
๋ ฅํด์ค๋ค Send
๋ฅผ ๋๋ฅด๋ฉด ์ด๋ ๊ฒ ๋ต๋ณ์ด ์ค๊ฒ ๋๋ค.
๐ ๋ก๊ทธ์ธ ์ฒดํฌํ๊ธฐ
postMapping
์ผ๋ก ๋ฐ์์จ ๋ฐ์ดํฐ๊ฐ UnityData
์ ์์ด๋์ ๋น๋ฐ๋ฒํธ๊ฐ ๊ฐ์์ง ํ์ธํ๊ธฐ ์ํ์ฌ, UnityData
class ์์ ๋ค์ ์ฝ๋๋ฅผ ๋ฃ์ด์ค๋ค.
public boolean isExist() {
if (id.equals(id2) && password.equals(password2)) {
return true;
} else {
return false;
}
}
์ดํ ์์๋ก ์ ํ ์์ด๋, ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฃ์ด์ฃผ๊ณ , ๋ฐ์๊ฒ๊ณผ ์ฒดํฌํด์ ๊ฐ์์ง ํ์ธํ๊ธฐ ์ํด ๋ณธ๋ฌธ์ ๋ฐ๊ฟ์ค๋ค.
final static String id2 = "123";
final static String password2 = "456";
@PostMapping("/postMethod")
public ResponseEntity<String> processData(@RequestBody UnityData unityData, @RequestHeader("Content-Type") String contentType) {
if ("application/json".equals(contentType)) {
String result = "์์ ๋ ๋ฐ์ดํฐ: " + unityData.toString();
String result2;
if (unityData.isExist()) {
System.out.println("๋ง๋ค");
result2 = "ok";
} else {
System.out.println("ํ๋ฆฌ๋ค");
result2 = "no";
}
return ResponseEntity.ok(result);
} else {
return ResponseEntity.badRequest().body("Invalid Content-Type");
}
}
๐ Unity ์ฐ๋ํ๊ธฐ
์ดํ ์ ๋ํฐ์ ๋ค์ด๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด UI
๋ฅผ ๋ง๋ค์ด์ค๋ค.
์ดํ ์๋์ ๊ฐ์ Script
ํ์ผ์ ๋ง๋ค์ด์ค๋ค, ์ค์ ํด์ฃผ๋ฉด Unity
์ชฝ์ ์์ฑ๋๋ค.
์ด ์ ๋ํฐ ์ฐ๋ ๋ถ๋ถ์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ ์ ๋ํฐ์์ ๋ณด๋ด๋ ๋ฐ์ดํฐ์ ๋ณ์๋ช
๊ณผ ์๋ฒ์ชฝ์์ ๋ฐ๋ ๋ฐ์ดํฐ์ ๋ณ์๋ช
์ด ๋๊ฐ์์ผํ๋ค.
์ด ์ค๋ฅ๋ฅผ ์ฐพ์๋ด๋๋ฐ ๊ฝค๋ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
using UnityEngine.Networking;
using System.Text;
public class UI_Manage : MonoBehaviour
{
public Text id;
public Text password;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
IEnumerator SendJsonData(){
MyData data = new MyData();
data.id = id.text.ToString();
data.password = password.text.ToString();
String url = "http://localhost:8080/postMethod"; // ์ํฉ์ ๋ง๋ api ํธ์ถ -> ๋งคํ๋ url์ ํธ์ถํ๋ค.
String json = JsonUtility.ToJson(data);
UnityWebRequest request = UnityWebRequest.Post(url, json);
request.SetRequestHeader("Content-Type", "application/json");
//==============์ค์============
byte[] jsonToSend = new UTF8Encoding().GetBytes(json);
request.uploadHandler = new UploadHandlerRaw(jsonToSend);
yield return request.SendWebRequest();
if(request.isNetworkError || request.isHttpError){
Debug.LogError(request.error);
}else{
Debug.Log(request.downloadHandler.text);
}
}
public void OnClick2(){
Debug.Log(id.text + " " + password.text);
StartCoroutine(SendJsonData());
}
}
[System.Serializable]
public class MyData{
public string id;
public string password;
}
์ดํ ๋ค์๊ณผ ๊ฐ์ด ํ๋ ธ์ ๋๋ ์๋ฒ์ชฝ์์ ํ๋ฆฌ๋ค๊ณ ํ๊ณ ,
์ณ๋ฐ๋ฅด๊ฒ ํ์์, ๋ง๋ค๊ณ ์์ฒญ์ด ๋์ค๊ฒ ๋๋ค.
๊ฐ์ธ ๊ณต๋ถ ๊ธฐ๋ก์ฉ ๋ธ๋ก๊ทธ์
๋๋ค.
ํ๋ฆฌ๊ฑฐ๋ ์ค๋ฅ๊ฐ ์์ ๊ฒฝ์ฐ ์ ๋ณดํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.๐