asp.net core를 활용하여 모바일 게임 만들기 (2일차)
어제는 개발 환경 설정을 해봤습니다. 오늘은 본격적으로 asp.net core를 공부해보겠습니다.


보기 -> 터미널에 들어가서 dotnet build를 입력하면 프로젝트를 빌드할 수 있습니다.
잘 빌드가 되었다면 dotnet run을 입력하여 서버를 실행해줍니다.

사진처럼 http://localhost:5098 경로가 나옵니다. 뒤에 포트는 컴퓨터마다 다르기 때문에 이를 확인하고 입력해주셔야 합니다.
저 경로를 인터넷에 입력하면 지금은 404 에러가 나옵니다. 일단은 터미넬에 ctrl c를 입력하여 서버를 종류합니다.
그러면 이제 서버가 클라이언트에게 JSON으로 서버시간과 메세지를 주는 API를 만들어보겠습니다.
먼저 Contracts 폴더를 만듭니다. Contacts 폴더 안에는 클라이언트와 서버과 직접 통신을 주고받을 데이터 형식을 만듭니다.

GameServer 우클릭 -> 추가 -> 새 폴더로 Contacts 폴더를 만들어줍니다.
그리고 폴더 안에 ServerStatusResponse라는 클래스를 추가해줍니다.
namespace GameServer.Contracts
{
public class ServerStatusResponse
{
public string Message { get; init; } = string.Empty;
public DateTimeOffset ServerTimeUtc { get; init; }
}
}
그 후 클래스에 위에처럼 프로퍼티 두개를 추가해줍니다.
마찬가지로 Controllers 폴더 안에다가도 ServerController 클래스를 만들고
using GameServer.Contracts;
using Microsoft.AspNetCore.Mvc;
// asp.net core의 기능들을 쓰기 위한 using (예:ApiController, Route 등)
namespace GameServer.Controllers;
[ApiController]
// asp.net core에게 이 클래스가 API 요청을 처리하는 Controller임을 알려주기 위한 용도
[Route("api/server")]
// 기본 경로 설정
public sealed class ServerController : ControllerBase
{
[HttpGet("ping")]
// GET 요청으로 ping 경로 처리
// 위에 Route와 합쳐서 api/server/ping 경로가 됨
public ActionResult<ServerStatusResponse> Ping() // 메소드로 브라우저에서 api/server/ping을 호출하면 이 메소드가 호출됨
{
var response = new ServerStatusResponse
{
Message = "정상작동",
ServerTimeUtc = DateTimeOffset.UtcNow
};
// 서버가 응답할 객체를 생성함
return Ok(response);
// Ok는 HTTP 상태 코드 200을 반환함
// asp.net core가 response 객체를 JSON으로 변환해줌
}
}
위에 작성된 코드를 입력하면 됩니다.
입력이 끝났다면 다시 터미널에 dotnet run을 입력해줍니다.
그 후 http://localhost:5098/api/server/ping (포트는 터미널에 나온 숫자대로) 경로를 브라우저에 입력하면

사진처럼 JSON 형태로 데이터가 나옵니다.
다음 단계로 넘어가기 전에 Controller 방식의 동작 흐름을 보도록 하겠습니다.
HTTP 요청 -> 라우팅 -> Controller -> Action 메소드 -> HTTP 응답 흐름으로 이루어져 있습니다.
HTTP 요청 - 브라우저에서 서버에 보내는 요청으로 아까 했던 /api/server/ping이 HTTP 요청에 해당합니다.
라우팅 - 요청받은 URL을 통해 어떤 메소드를 실행할지 찾아주는 과정입니다. [Route("api/server")]와 [HttpGet("ping")]를 합치면 Ping 메소드가 찾아졌던게 라우팅입니다.
Controller - 서로 관련되어 있는 API를 묶는 클래스입니다. ServerContoller면 서버 관련된 API들을 만들고, PlayerController면 플레이어 정보 관련된 API를 묶는 방식입니다. 유니티로 치면 매니저와 비슷한것 같습니다.
Action 메소드 - Controller 안에서 HTTP 요청을 처리하는 메소드를 Action이라고 합니다. 아까 만든 Ping()이 Action에 해당합니다.
그리고 추가로 DTO가 뭔지도 알아보겠습니다. DTO는 Data Transfer Object의 약자입니다. 한국말로는 데이터 전달 객체로 서버와 클라이언트 사이에 데이터를 전달하기 위한 객체입니다.
아까 만들었던 ServerStatusResponse가 DTO입니다. asp.net core는 이 DTO를 JSON 형태로 변환시켜 클라이언트에게 전달해줍니다.
DTO는 크게 두가지 형태로 나뉩니다. Request DTO와 Response DTO가 있습니다.
Request DTO - 클라이언트가 서버에게 보내는 데이터
Response DTO - 서버가 클라이언트에게 보내는 데이터
