Boost 30

[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 유틸리티

개요지난 포스트를 통해 소켓 서버의 코어부터 레포지토리까지의 모든 계층에 작성된 로직을 알아보았다.보통 MVC패턴을 지킬 때 DTO, DAO등을 통해 API에 해당하는 요청 및 응답에 사용할 객체를 지정해 주는 편이었지만 소켓 서버에서는 빌드 시간을 고려하여 해당 로직은 제외하고 그냥 때에 따라 response를 제작하는 형식을 취했다. 이로 인해 코드 가독성은 그리 좋은편은 아니다, Session클래스의 process_request메서드에 action에 따른 분기 처리를 해주느라 코드 길이가 매우 길어졌다. 메서드 한개의 길이가 거의 200에 달하니 말할 것도 없다. 따라서 소켓 서버에서 어떤식으로 코드를 작성하면 좋을지에 대해선 더 공부가 필요해 보인다. 각설하고 DB트랜잭션 및 암호화를 진행하는 과..

[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 레포지토리 계층

개요지난 서비스계층에 이어 이번엔 트랜잭션 처리를 통한 DB와의 통신을 담당하는 레포지토리 계층에 대해 작성한 내용을 공유하고자 한다. 현재 서버에서는 회원가입, 로그인 등과 같은 인증과 방 생성, 참가, 퇴장, 조회 등 매칭 관련 트랜잭션, 게임 시작 및 종료 시 방 상태를 업데이트하는 트랜잭션을 수행한다. 데이터베이스는 PostgreSQL을 사용하였으므로 pqxx라이브러리를 사용해 DB서버와 통신하며, 고립성을 보장하여 멀티 플레이 환경에서의 동시성 처리를, 원자성을 보장하여 트랜잭션 도중 한 곳에서 예외가 발생한다면 해당 작업 이전의 작업들을 모두 롤백해 주는 것을 가장 중요시하여 로직을 작성하였다.  user_repository.h// repository/user_repository.h#pragm..

[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 서비스 계층

개요서비스 계층에서는 컨트롤러로 부터 요청 데이터를 받아 해당 데이터가 유효한 데이터인지, 비즈니스 로직을 수행해도 되는지 체크한 후에 서비스 로직을 수행하는 계층이다. 이 과정에서 데이터베이스를 활용한 CRUD가 필요한 경우 레포지토리에 필요한 인자를 매개변수로 전달하여 통신 결과를 토대로 응답을 작성하여 다시 컨트롤러로 리턴해주게 된다. 따라서 현재 내가 개발중인 소켓 서버에서는 서버, 세션 클래스와 같은 코어 계층과 더불어 가장 많은 코드가 작성된 로직이 바로 이 서비스 계층에 존재한다.자세한 구현 내용은 하기에 소스코드를 통해 설명하도록 하겠다.  auth_service.h// service/auth_service.h#pragma once#include #include namespace game_..

[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 컨트롤러 계층

개요클라이언트로 부터 요청이 들어 왔을 때 session.cpp에서 action을 분석하여 알맞은 컨트롤러 핸들러에 request를 할당해 주었었다, 이제 해당 컨트롤러 핸들러로부터 알맞은 서비스 로직으로 요청을 전달하게 된다. 서비스 로직 후 받은 리턴값을 다시 session으로 반환하게 되며, 각 response에 맞게 클라이언트에게 응답을 write하는 작업을 진행하게 된다. 이 과정에서 컨트롤러가 담당하는 부분을 구현한 로직을 공유하도록 하겠다.  controller.h// controller/controller.h#pragma once#include #include namespace game_server { class Controller { public: virtual ~..

[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 코어 계층(서버, 세션)

개요코어 계층에 속하는 서버의 진입점이 되는 main과 실제 서버 로직을 진행하는 server, 클라이언트 관리를 위한 session에 대한 로직을 작성하였다.하기에 코어 로직의 주요 기능에 대한 소스 파일을 설명하고자 한다.  main// main.cpp// 프로그램 진입점 및 서버 실행 파일#include "core/server.h"#include #include #include #include #include #include #include // 시그널 핸들러용 전역 서버 변수std::unique_ptr server;// 시그널 핸들러 함수void signal_handler(int signal){ spdlog::info("시그널 받음 {}, 서버 종료...", signal); if (se..

Boost.asio 실시간 채팅 AWS EC2 서버 구현

개요클라이언트가 채팅 서버에 접속하고, 각자 닉네임을 생성한 후에 실시간으로 다른 클라이언트와 채팅을 통해 소통하는 소켓 통신을 구현해 보자로직은 다음과 같다.클라이언트가 서버로 연결 요청을 한다.서버가 연결 요청을 수락한다.클라이언트가 사용할 닉네임을 설정하고 이를 서버에 쓰기 연산을 한다.서버에서 해당 클라이언트의 닉네임을 읽고 기억한다.클라이언트가 동기 쓰기 연산을 통해 하고싶은 말을 서버로 출력한다.서버가 클라이언트로 부터 받은 데이터를 읽고 현재 연결되어 있는 모든 클라이언트에게 데이터를 보낸 클라이언트의 닉네임을 사용하여 쓰기 작업을 한다.모든 클라이언트에서 서버로 부터 받은 데이터를 읽는다. AWS EC2 서버서버는 Linux 환경에서 구현한다, 물론 클라이언트도 구현 할것이다.AWS EC2..

소켓 통신/Boost 2024.11.24

Boost.asio 비동기 TCP 서버

개요비동기 TCP 서버는 다음과 같은 사항을 만족시키는 분산 어플리케이션이다.클라이언트 서버 통신 모델에서 서버로 동작한다.TCP 프로토콜을 사용해 클라이언트 프로그램과 통신한다.비동기 I/O 및 제어 연산을 한다.한 번에 여러 클라이언트를 처리할 수 있다.일반적인 비동기 TCP 서버는 다음과 같은 알고리즘에 따라 동작한다.수용자 소켓을 할당하고 특정 TCP 포트에 묶는다.비동기 수용 연산을 시작하도록 한다.하나 이상의 스레드를 만들어 Boost.asio 이벤트 루프를 실행시키는 스레드 풀에 추가한다.비동기 수용 연산이 끝나면, 다음 연결 요청을 받아들이는 새로운 연산을 시작하도록 한다.비동기 읽기 연산을 시작시켜 연결된 클라이언트로부터 들어오는 요청을 읽는다.비동기 읽기 연산이 끝나면, 요청을 처리하고..

소켓 통신/Boost 2024.11.20

Boost.asio 병렬 동기 TCP 서버

개요병렬 동기 서버는 다음과 같은 사항을 만족시키는 분산 어플리케이션이다.클라이언트 서버 통신 모델에서 서버로 동작한다.TCP 프로토콜을 사용해 클라이언트 프로그램과 통신한다.I/O 및 제어 연산을 하는 동안에는 연산이 끝나거나 오류가 발생할 때까지 실행 스레드를 멈춘다.클라이언트를 한 번에 하나 이상 처리할 수 있다.일반적인 병렬 동기 TCP 서버는 다음과 같은 알고리즘에 따라 동작한다.수용자 소켓을 할당하고 특정 TCP 포트에 묶는다.서버가 중단될 때까지 루프를 돈다.클라이언트로부터 연결 요청이 오기를 기다린다.연결 요청이 오면 받아들인다.스레드를 새로 생성하고 새 스레드에서 다음과 같은 작업을 한다.클라이언트로부터 요청 메시지가 오기를 기다린다.요청 메시지를 읽는다.요청을 처리한다.클라이언트에게 응..

소켓 통신/Boost 2024.11.20

Boost.asio 반복 동기 TCP 서버

개요반복적 동기 TCP 서버는 다음과 같은 사항을 만족시키는 분산 어플리케이션이다.클라이언트 서버 통신 모델에서 서버로 동작한다.TCP 프로토콜을 사용해 클라이언트 프로그램과 통신한다.I/O 및 제어 연산을 하는 동안에는 연산이 끝나거나 오류가 발생할 때까지 실행 스레드를 멈춘다.클라이언트를 한 번에 하나씩 처리한다.일반적인 동기 TCP 서버는 다음과 같은 알고리즘에 따라 동작한다.수용자 소켓을 할당하고 특정 TCP 포트에 묶는다.서버가 중단될 때까지 루프를 돈다.클라이언트로부터 연결 요청이 오기를 기다린다.연결 요청이 오면 받아들인다.클라이언트로부터 요청 메시지가 오기를 기다린다.요청 메시지를 읽는다.요청을 처리한다.클라이언트에게 응답 메시지를 보낸다.클라이언트와의 연결을 닫고 소켓을 할당 해지한다. ..

소켓 통신/Boost 2024.11.18

Boost.asio 서버 개요

개요서버는 분산 어플리케이션의 반대쪽 부분인 클라이언트에게 받을 서비스를 제공하는 역할을 맡는다.그리고 클라이언트는 서버가 제공하는 서비스를 받기 위해 서버와 통신한다. 일반적으로 서버는 클라이언트-서버 통신 과정에서 수동적인 역할을 한다.서버는 호스트의 포트에 붙고, 그 포트로 클라이언트가 요청을 보내지 않는지 기다린다.요청이 도착하면 서버는 자신이 제공하는 서비스에 맞춰 동작한다. 서버가 제공하는 서비스에 따라 요청 처리 과정도 매우 다르다.예를 들어, HTTP 서버라면 대체로 요청 메시지에서 원한 파일 내용을 읽어 클라이언트로 보낸다.프록시 서버라면 클라이언트의 요청을 실제로 처리할 다른 서버로 전달한다.좀 더 구체적인 서버들이라면 클라이언트가 제공한 데이터에 대해 복잡한 계산을 거쳐 그 결과를 클..

소켓 통신/Boost 2024.11.18
728x90