oat++ 서버. 설치. CmakeLists.txt

6614 단어 cppcmakeoatppbackend
나는 내 프로젝트의 백엔드에 C++를 사용하는 것이 항상 흥미롭다는 것을 알았지만 이를 수행하는 방법에 대한 정보를 함께 모아야 합니다. 또한 대부분의 기사가 숙련된 개발자를 대상으로 하고 개발자가 서버 프로그래밍, C++ 언어 및 빌드 시스템에 매우 익숙할 것이라는 기대로 대부분의 기사가 생략되었다는 사실로 인해 어려움이 추가됩니다.
많은 주제를 처음 접하는 것처럼 "Farm-fellows"(농장 식품 구독 서비스)를 위한 CRUD api 제작에 대한 일련의 기사를 작성해 보겠습니다. 우선 머릿속에서 얻은 지식을 정리하기 위해 이 글을 쓰는데, 서버용으로 C++을 사용하기로 마음먹는 데 도움이 된다면 정말 기쁠 것 같습니다.
서버를 만들기 위해 oat++ 프레임워크를 사용하겠습니다. 내 운영 체제로 우분투 리눅스를 사용할 것입니다. 데이터를 저장하기 위해 먼저 sqlite를 사용하겠습니다. 나중에 나는 또한 mongo와 postgres를 사용하려고 노력할 것입니다.
빌드 시스템으로 Cmake를 사용하겠습니다. 또한 oat++ 및 해당 모듈을 복제하려면 git을 설치해야 합니다.

그럼 시작하겠습니다.
우선 oat++ 자체와 두 개의 oat++ 모듈 oatpp-sqlite 및 oatpp-swagger가 필요합니다(미래의 CRUD api를 보기 좋게 표현하기 위해).
cd "some/temp/path/for/repositories"
git clone https://github.com/oatpp/oatpp.git
cd oatpp
mkdir build && cd build
cmake ..
(sudo) make install
cd ../../ (back to repository root folder)
git clone https://github.com/oatpp/oatpp-sqlite.git
cd oatpp
mkdir build && cd build
cmake ..
(sudo) make install

참고: -DOATPP_SQLITE_AMALGAMATION=ON을 사용하여 SQLite 통합과 함께 oatpp-sqlite를 설치할 수도 있습니다. 이 경우 SQLite를 설치할 필요가 없습니다.
cd ../../ (back to repository root folder)
git clone https://github.com/oatpp/oatpp-swagger.git
cd oatpp
mkdir build && cd build
cmake ..
(sudo) make install
Oat++ 및 해당 모듈은 이제 oatpp, oatpp-swagger, oatpp-sqlite가 포함하는/usr/local/oatpp-1.3.1/폴더에 추가됩니다.

oatpp-sqlite 모듈을 만들 때 amalgamation sqlite 파일을 사용하지 않았다면 sqlite도 추가해야 하므로 설치하자.
sudo apt update
sudo apt install sqlite3
sqlite3 --version
sudo apt install sqlitebrowser

이제 프로젝트 코딩을 시작할 준비가 되었습니다.
cd /some/path/for/projects/root
mkdir farm-fellows
cd farm-fellows
touch CMakeLists.txt
mkdir src
cd src
touch App.cpp
mkdir component
cd component
touch AppComponent.hpp
cd ../../

따라서 처음에는 최소한 두 개의 소스 파일이 필요합니다. 하나는 main() 함수가 포함된 App.cpp이고, http 서버를 실행하는 데 필요한 여러 oatpp 구성 요소가 포함된 AppComponent.hpp입니다.

먼저 AppComponent.hpp를 편집합시다.

#ifndef AppComponent_hpp
#define AppComponent_hpp

#include "oatpp/core/macro/component.hpp"
#include "oatpp/web/server/HttpConnectionHandler.hpp"
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"
#include "oatpp/parser/json/mapping/ObjectMapper.hpp"

class AppComponent {
public:

/**
*  Create ObjectMapper component to serialize/deserialize DTOs in Contoller's API
*/

OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, apiObjectMapper)([] {
        return oatpp::parser::json::mapping::ObjectMapper::createShared();
    }());

/**
*  Create ConnectionProvider component which listens on the port
*/
    OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, serverConnectionProvider)([] {
        return oatpp::network::tcp::server::ConnectionProvider::createShared({SERVER_HOST, SERVER_PORT, oatpp::network::Address::IP_4});
    }());

 /**
 *  Create Router component
 */
    OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::web::server::HttpRouter>, httpRouter)([] {
        return oatpp::web::server::HttpRouter::createShared();
    }());

 /**
 *  Create ConnectionHandler component which uses Router component to route requests
 */
    OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ConnectionHandler>, serverConnectionHandler)([] {
        OATPP_COMPONENT(std::shared_ptr<oatpp::web::server::HttpRouter>, router); // get Router component
            return oatpp::web::server::HttpConnectionHandler::createShared(router);
    }());
};

#endif


매크로 OATPP_CREATE_COMPONENT를 구성 요소 인스턴스의 shared_ptr과 함께 사용하는 Oat++에서는 oatpp가 구성 요소의 새 인스턴스를 선언하기로 결정할 때 콜백 인수로 람다를 사용합니다.

이제 구성 요소를 App(src/App.cpp)에 추가할 수 있습니다.

#include <iostream>

#include "./component/AppComponent.hpp"
#include "oatpp/network/Server.hpp"

void run() {

  AppComponent components; // Create scope Environment components

  /* Get connection handler component */
  OATPP_COMPONENT(std::shared_ptr<oatpp::network::ConnectionHandler>, connectionHandler);

  /* Get connection provider component */
  OATPP_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, connectionProvider);

  /* create server */
  oatpp::network::Server server(connectionProvider,
                                connectionHandler);

  OATPP_LOGD("Server", "Running on port %s...", connectionProvider->getProperty("port").toString()->c_str());

  server.run();

}

/**
 *  main
 */
int main(int argc, const char * argv[]) {

  oatpp::base::Environment::init();

  run();

  oatpp::base::Environment::destroy();

  return 0;
}


이제 CMakeLists.txt를 편집할 수 있습니다.

cmake_minimum_required(VERSION 3.1)
project(farm-fellows)

set(CMAKE_CXX_STANDARD 17)

add_library(farm-fellows-lib
    src/component/AppComponent.hpp)

## include directories

target_include_directories(farm-fellows-lib PUBLIC src)

## link libs

## Oat++

find_package(oatpp          1.3.0 REQUIRED)
find_package(oatpp-swagger  1.3.0 REQUIRED)
find_package(oatpp-sqlite   1.3.0 REQUIRED)

target_link_libraries(farm-fellows-lib
        PUBLIC oatpp::oatpp
        PUBLIC oatpp::oatpp-swagger
        PUBLIC oatpp::oatpp-sqlite
)

## Sqlite3

find_package(SQLite3 REQUIRED)

target_link_libraries(farm-fellows-lib
        PUBLIC SQLite::SQLite3
)

if(CMAKE_SYSTEM_NAME MATCHES Linux)
    find_package(Threads REQUIRED)
    target_link_libraries(farm-fellows-lib INTERFACE Threads::Threads ${CMAKE_DL_LIBS})
endif()



add_definitions(
    # define host
    -DSERVER_HOST="127.0.0.0"

    # define port
    -DSERVER_PORT=8000

)

## add executables

add_executable(farm-fellows-exe src/App.cpp)
target_link_libraries(farm-fellows-exe farm-fellows-lib)



add_definitions에서 ConnectionProvider 인스턴스 초기화에 사용되는 두 개의 상수를 추가했습니다.

이제 매우 기본적인 서버를 만들 수 있습니다.
(프로젝트 루트 경로/farm-fellows에 있어야 함)
mkdir build && cd build
cmake ..
make
./farm-fellows-exe

브라우저에서 127.0.0.0:8000을 엽니다. 아직 응답과 일치하는 컨트롤러가 없기 때문에 응답으로 보아야 합니다.

server=oatpp/1.3.0
code=404
description=Not Found
message=No mapping for HTTP-method: 'GET', URL: '/'

좋은 웹페이지 즐겨찾기