반응형

boost 16

C++ REST API 사용 강좌 : #2 HTTP POST (boost beast 활용)

이번에는 C++ boost beast를 활용하여 JSON을 인자로 REST API을 호출하여 데이터를 받는 예제를 살펴보도록 하겠습니다. 이 강좌는 C++ REST API 사용 강좌 : #1 HTTP GET (boost beast 활용)에서 이러지는 강좌로 설명 소스가 비슷한 관계로 해당 글에서 설명한 내용(UTF-8, 비동기 처리 등)은 이 글에 없는 관계로 해당 글도 꼭 참고 부탁드립니다. 이번에 살펴볼 소스는 아래와 같습니다. #include #include #include #include #include #include using namespace std; int main(int argc, char* argv[]) { boost::asio::io_context ioc; boost::asio::ip..

강좌 2022.05.12

C++ REST API 사용 강좌 : #1 HTTP GET (boost beast 활용)

근래에는 TCP/IP로 바로 통신하는 프로그램보다는 REST API를 이용하여 통신하는 프로그램이 대세인 듯 보입니다. 여기서는 C++로 REST API를 사용하는 방법을 알아보도록 하겠습니다. 강좌는 boost를 사용하였으며 boost에서 HTTP 통신 관련 상위 라이브러리인 boost beast를 사용합니다. REST API의 기본이 되는 GET 메소드를 이용하여 데이터를 가져오는 방법을 살펴보겠습니다. GET 메소드를 이용하여 데이터를 가져오는 소스는 아래와 같습니다. 소스를 보면서 계속 설명하겠습니다. #include #include #include #include #include #include using namespace std; int main(int argc, char* argv[]) { ..

강좌 2022.05.11

C++ boost json array 생성 및 파싱 예제

boost json라이브러리를 사용할 때 json array를 생성하거나 파싱하는 예제입니다. 사용법은 예제가 간단하게 되어 있는 관계로 예제를 이해하시면 됩니다. #include #include using namespace std; using namespace boost; int main(int argc, char* argv[]) { json::value jv1 = { { "Hello", "World1" } }; json::value jv2 = { { "Hello", "World2" } }; json::object jo1; jo1["test1"] = jv1; jo1["test2"] = jv2; std::string str1 = json::serialize(jo1); cout

C++ boost json 구조체와 json 문자열간 변환 예제

boost json라이브러리를 사용하면 구조체와 json문자열 간의 상호 변환이 간단합니다. 여기서는 간단한 변환 예를 살펴보며 사용법을 알아보겠습니다. 우선 아래와 같은 간단한 예로 살펴보겠습니다. #include #include #include using namespace std; struct user { int id; string name; bool login; }; void tag_invoke(boost::json::value_from_tag, boost::json::value& jv, user const& u) { jv = { {"id", u.id}, {"name", u.name}, {"login", u.login} }; } user tag_invoke(boost::json::value_to_t..

boost locale을 이용한 C++에서의 Multi Byte와 UTF8간의 문자열 변환

영문만 있는 경우는 문자열은 C/C++에서 UTF-8로 별도의 변환을 필요로 하지 않습니다. 하지만 한글과 같이 멀티 바이트를 사용하는 경우는 별도로 UTF-8로 인코딩 및 디코딩을 해주어야 합니다. 이런 경우 사용할 수 있는 라이브러리가 boost local입니다. 간단한 Multi Byte와 UTF8간의 문자열 변환 예제는 아래와 같습니다. #include #include #include using namespace std; int main(int argc, char* argv[]) { string str = "{\"name\": {\"first\":\"그레이스\", \"last\":\"Hopper\"}}"; cout

C++ boost 메모리풀 강좌 #5: boost 메모리풀 할당자를 적용하여 STL 컬렉션의 성능 향상시키기

STL 컬렉션은 템플릿 지정자를 이용하여 메모리 할당자를 설정할 수 있습니다. 참고로 메모리 할당자란 컬렉션에 요소에 대해서 메모리 new / delete하는 객체를 말합니다. STL 컬렉션에 메모리 할당자를 메모리풀을 사용하도록 하여 성능을 향상 시킬 수 있습니다. boost에는 이 STL 컬렉션 관련 메모리 풀 지원 할당자가 pool_allocator와 fast_pool_allocator이 있습니다. 두 할당자 모두 어느 STL 컬렉션에나 사용할 수 있습니다. 특징적으로 pool_allocator는 vector처럼 연속된 메모리 할당 및 해제가 일어나는 STL 컬렉션에서 성능이 좋습니다. fast_pool_allocator는 list처럼 단일 메모리 할당 및 해제가 일어나는 STL 컬렉션에서 성능이 ..

강좌 2021.11.15

C++ boost 메모리풀 강좌 #4: object_pool 클래스를 이용하여 new 재정의 없이 일반 클래스에 메모리풀 적용하기

object_pool은 pool의 클래스 할당 및 해제 버전으로 보면 이해하기 쉽습니다. pool과 사용법이 유사한데 틀린점은 construct와 destory 함수를 이용하여 할당 및 해제를 한다는 점입니다. 또한 construct 함수를 호출할 때 생성 인자를 넣어서 생성할 수도 있습니다. 단, 아쉽게도 생성인자는 3개까지 지원합니다. new 재정의로 메모리 풀을 적용하지 않은 클래스에 대하여 생성시점에서 메모리풀을 사용하기에 좋습니다. 간단한 예를 살펴보도록 하겠습니다. #include #include using namespace std; class test_mpa2 { private: char test_[256]; public: test_mpa2(const char* str) { strcpy_s(..

강좌 2021.11.14

C++ boost 메모리풀 강좌 #3: singleton_pool 클래스를 이용하여 일반 클래스에 메모리풀 적용하기

singleton_pool 클래스도 기본적으로 이전에 설명한 pool과 비슷합니다. 이 클래스는 템플릿 주요 인자로 할당 크기를 구분하는 태그 인자와 할당 크기를 받습니다. 태크 인자와 할당 크기라는 인자 특성 때문에 일반 클래스에 operator new / delete를 재정하여 적용하기에 쉽습니다. 이 외에 singleton_pool은 기본적으로 멀티쓰레드에서 안전합니다. 싱글쓰레드에서 사용할 때는 성능을 올리기 위하여 mutex 인자 부분에 boost::details::pool::null_mutex을 넣어주면 좋습니다. 간단한 사용법 예를 살펴보겠습니다. #include #include using namespace std; template class memory_pool_allo..

강좌 2021.11.13

C++ boost 메모리풀 강좌 #2: pool 클래스를 이용하여 버퍼에 메모리풀 적용하기

boost 메모리풀 관련 클래스 중 pool은 메모리풀을 활용하여 C 스타일로 메모리를 할당 및 해제할 때 사용할 수 있는 클래스입니다. 이런 특성을 가진 관계로 C++에서 C스타일로 메모리를 할당 및 해제하는 버퍼에 적용하기 좋습니다. 이 클래스를 버퍼에 활용하면 메모리풀이 적용되어 성능 향상에 좋습니다. 간단히 아래 예제를 통하여 살펴보겠습니다. #include #include using namespace std; int main(int argc, char* argv[]) { boost::pool pool(sizeof(char) * 32); char* test = (char*)pool.malloc(); strcpy_s(test, sizeof(char) * 32, "test test test test"..

강좌 2021.11.12

C++ boost 메모리풀 강좌 #1: 메모리풀의 개념

메모리 풀은 미리 메모리를 할당하여 놓은 뒤 필요에 따라 할당 및 해제하여 사용하는 기법을 의미합니다. 메모리 풀은 아래와 같은 이점이 있습니다. 첫번째로 할당과 해제에 따른 성능의 향상이 있습니다. 이유는 메모리 할당과 해제 관련 함수는 실제적으로 OS로 부터 메모리를 가져오거나 할당과 해제 관련 메모리 관리처리를 하기 때문에 상대적으로 적은 양이지만 오버헤드가 있기 때문입니다. 두번째로 메모리 단편화가 줄어듭니다. 이유는 미리 상대적으로 큰 메모리를 할당한 뒤 사용하기 때문에 상대적으로 작은 메모리의 할당과 해제에 따른 메모리 단편화가 발생할 가능성이 줄어들기 때문입니다. 메모리 풀은 다음과 같은 단점이 있습니다. 첫번째로 메모리 사용 효율성이 떨어질 수 있습니다. 이유는 미리 상대적으로 큰 메모리를..

강좌 2021.11.11

boost asio io_service(io_context)의 poll과 run의 활용

boost asio io_service(io_context)를 통하여 이벤트를 호출하는 방식은 크게 poll과 run으로 나눈다고 할 수 있습니다. 간단히 두 방식을 살펴보면 아래와 같습니다. poll은 이름 그대로 poll방식으로 이전 poll 호출 후 쌓인 socket 이벤트를 실행하고 제어권을 함수를 호출한 쪽에 넘깁니다. run은 socket 이벤트를 실행하고 제어권을 함수를 호출한 쪽으로 넘기지 않고 다음 이벤트를 기다립니다. poll로 run을 구현한다고 한다면 아마 아래와 같은 코드가 될 것입니다. while(true) { poll(); } 서버에 연결하는 클라이언트에서 사용된다면 아마도 poll이 좋은 선택이 될 것입니다. 문제는 서버와 같은 경우는 이 두가지 중 어느 방식을 사용할지는 서..

boost asio io_service(io_context)의 이해 및 활용

boost asio에서 io_service(io_context)는 객체의 이벤트 처리를 담당합니다. 이 객체는 좀 더 자세히 보면 실제적으로 socket과 바인드 되어 socket의 이벤트 처리를 담당합니다. 이 객체는 OS kqueue, /dev/poo/, epoll, iocp와 같은 비동기 socket IO나 select와 같은 동기 IO를 해당 객체를 호출한 쓰레드에서 이벤트를 처리하도록 직렬화합니다. 이를 활용하는 방법을 살펴보겠습니다. io_service(io_context)는 socket에 바인드 되는 관계로 socket 이벤트 처리 그룹을 만들 수 있습니다. io_service1(io_context)에는 socket1, socket2를 바인드하고 io_service2(io_context)에는..

C++ boost json용 라이브러리(boost.json)

boost 1.75 이전 버전은 json을 사용하기 위하여 property_tree를 사용하였습니다. 1.75 버전부터 json을 전문적으로 지원하는 boost.json라이브러리가 생겼습니다. boost.json을 사용하는 Hello World입니다. #include #include #include using namespace boost; using namespace std; int main(int argc, char* argv[]) { json::value jv = { { "Hello", "World" } }; std::string str = json::serialize(jv); cout

반응형