Replicated

[Drag Down] Spring Boot 서버와 연동 - register/login 본문

언리얼 엔진/Drag Down (캡스톤 디자인)

[Drag Down] Spring Boot 서버와 연동 - register/login

라구넹 2025. 4. 14. 01:28

https://github.com/Coffeecaat/DragDown

 

GitHub - Coffeecaat/DragDown

Contribute to Coffeecaat/DragDown development by creating an account on GitHub.

github.com

 

GameInstanceSubsystem 기반으로 만들자

빌드 파일에 HTTP, Json 등 추가

 

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "Interfaces/IHttpRequest.h"
#include "Interfaces/IHttpResponse.h"
#include "DDHttpApiSubsystem.generated.h"

/**
 * 
 */
UCLASS()
class DRAGDOWN_API UDDHttpApiSubsystem : public UGameInstanceSubsystem
{
	GENERATED_BODY()
	
public:
	UFUNCTION(BlueprintCallable, Category = "HTTP API")
	void SendRegisterRequest(const FString& Username, const FString& Email, const FString& Password);

	UFUNCTION(BlueprintCallable, Category = "HTTP API")
	void SendLoginRequest(const FString& Username, const FString& Password);

protected:
	void OnResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
};

void OnResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);

이건 인자 형식 고정이다. 리스폰스 저렇게 받아야 함

 

// Fill out your copyright notice in the Description page of Project Settings.


#include "Subsystem/DDHttpApiSubsystem.h"
#include "HttpModule.h"
#include "Http.h"
#include "Json.h"
#include "JsonUtilities.h"
#include "DragDown.h"

void UDDHttpApiSubsystem::SendRegisterRequest(const FString& Username, const FString& Email, const FString& Password)
{
	FString Url = TEXT("http://localhost:8080/api/auth/register");

	TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());
	JsonObject->SetStringField(TEXT("username"), Username);
	JsonObject->SetStringField(TEXT("email"), Email);
	JsonObject->SetStringField(TEXT("password"), Password);

	FString OutputString;
	TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutputString); 
	FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer); 

	TSharedRef<IHttpRequest, ESPMode::ThreadSafe> Request = FHttpModule::Get().CreateRequest();
	Request->SetURL(Url);
	Request->SetVerb("POST");
	Request->SetHeader("Content-Type", "application/json");
	Request->SetContentAsString(OutputString);
	Request->OnProcessRequestComplete().BindUObject(this, &UDDHttpApiSubsystem::OnResponseReceived);
	Request->ProcessRequest();
}

void UDDHttpApiSubsystem::SendLoginRequest(const FString& Username, const FString& Password)
{
	FString Url = TEXT("http://localhost:8080/api/auth/login");

	TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());
	JsonObject->SetStringField(TEXT("username"), Username);
	JsonObject->SetStringField(TEXT("password"), Password);

	FString OutputString;
	TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutputString);
	FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);

	TSharedRef<IHttpRequest, ESPMode::ThreadSafe> Request = FHttpModule::Get().CreateRequest();
	Request->SetURL(Url);
	Request->SetVerb("POST");
	Request->SetHeader("Content-Type", "application/json");
	Request->SetContentAsString(OutputString);
	Request->OnProcessRequestComplete().BindUObject(this, &UDDHttpApiSubsystem::OnResponseReceived);
	Request->ProcessRequest();
}

void UDDHttpApiSubsystem::OnResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
	if (bWasSuccessful && Response.IsValid())
	{
		int32 ResponseCode = Response->GetResponseCode();
		FString ResponseContent = Response->GetContentAsString();

		UE_LOG(LogDD, Log, TEXT("ResponseCode: %d"), ResponseCode);
		UE_LOG(LogDD, Log, TEXT("ResponseContent: %s"), *ResponseContent);
	}
	else
	{
		UE_LOG(LogDD, Error, TEXT("Request Failed"));
	}
}

토큰 털리기 싫으면 https 써야 하긴 하는데 어차피 테스트용 로컬이라 http로 했다

(아직 클라우드에 배포하진 않아서 그냥 로컬에 세팅하고 진행)

Json 만들고 OutputString에 직렬화

 

서버는 스프링부트, 데베는 PostgreSQL 쓰고 나중에 Redis 추가될 예정이라 한다

일단 백엔드 뭐가 쓰든 별 상관없이 작동하도록 만들어놔서 이름은 DDHttpApiSubsystem이라 했다

 

FHttpModule으로 리퀘스트 만들어서 회원가입/로그인 요청을 한다

 

나중에 디자인하고 일단 기능 구현

 

레지스터 성공

 

로그인 및 토큰 받기도 성공