쪽지발송 성공
Click here
재능넷 이용방법
재능넷 이용방법 동영상편
가입인사 이벤트
판매 수수료 안내
안전거래 TIP
재능인 인증서 발급안내

🌲 지식인의 숲 🌲

🌳 디자인
🌳 음악/영상
🌳 문서작성
🌳 번역/외국어
🌳 프로그램개발
🌳 마케팅/비즈니스
🌳 생활서비스
🌳 철학
🌳 과학
🌳 수학
🌳 역사
해당 지식과 관련있는 인기재능

프로그래밍 15년이상 개발자입니다.(이학사, 공학 석사) ※ 판매자와 상담 후에 구매해주세요. 학습을 위한 코드, 게임, 엑셀 자동화, 업...

AS규정기본적으로 A/S 는 평생 가능합니다. *. 구매자의 요청으로 수정 및 보완이 필요한 경우 일정 금액의 수고비를 상호 협의하에 요청 할수 있...

안녕하세요!!!고객님이 상상하시는 작업물 그 이상을 작업해 드리려 노력합니다.저는 작업물을 완성하여 고객님에게 보내드리는 것으로 거래 완료...

30년간 직장 생활을 하고 정년 퇴직을 하였습니다.퇴직 후 재능넷 수행 내용은 쇼핑몰/학원/판매점 등 관리 프로그램 및 데이터 ...

PHP 메모리 관리와 가비지 컬렉션 이해하기

2024-10-05 17:57:27

재능넷
조회수 661 댓글수 0

PHP 메모리 관리와 가비지 컬렉션 이해하기 🧠💻

 

 

안녕하세요, 여러분! 오늘은 PHP의 숨겨진 영웅들인 메모리 관리와 가비지 컬렉션에 대해 알아볼 거예요. 🦸‍♂️ 이 주제는 조금 복잡할 수 있지만, 걱정 마세요! 우리는 함께 이 여정을 즐겁게 탐험할 거예요. 마치 재능넷에서 새로운 기술을 배우는 것처럼 말이죠! 😉

🎓 학습 목표: 이 글을 다 읽고 나면, 여러분은 PHP의 메모리 관리 방식과 가비지 컬렉션의 작동 원리를 이해하게 될 거예요. 이는 더 효율적인 PHP 코드를 작성하는 데 큰 도움이 될 거예요!

자, 이제 우리의 PHP 메모리 관리 여행을 시작해볼까요? 🚀

1. PHP 메모리 관리의 기초 🏗️

PHP는 동적 타입 언어로, 변수를 선언할 때 메모리 할당을 자동으로 처리합니다. 이는 개발자가 직접 메모리를 관리할 필요가 없다는 뜻이에요. 하지만 이 편리함 뒤에는 복잡한 메커니즘이 숨어있답니다.

PHP의 메모리 관리는 크게 두 가지 영역으로 나눌 수 있어요: 스택(Stack)과 힙(Heap). 이 두 영역은 각각 다른 목적으로 사용되며, PHP 엔진이 효율적으로 관리합니다.

PHP 메모리 구조: 스택과 힙 스택 (Stack) 힙 (Heap) 함수 호출 스택 지역 변수 임시 데이터 동적 할당된 객체들 가비지 컬렉션 대상 영역

1.1 스택 (Stack) 🥞

스택은 함수 호출과 지역 변수를 저장하는 데 사용됩니다. 이름에서 알 수 있듯이, 데이터가 쌓이는 구조를 가지고 있어요.

  • 특징:
    • LIFO (Last In, First Out) 구조
    • 빠른 액세스 속도
    • 함수 호출 시 자동으로 할당되고 반환 시 자동으로 해제

스택은 주로 함수의 실행 컨텍스트를 관리하는 데 사용돼요. 함수가 호출될 때마다 새로운 스택 프레임이 생성되고, 함수의 지역 변수와 매개변수가 여기에 저장됩니다.

1.2 힙 (Heap) 📦

힙은 동적으로 할당되는 메모리를 저장하는 영역입니다. 객체나 배열과 같은 복잡한 데이터 구조가 여기에 저장돼요.

  • 특징:
    • 동적 메모리 할당
    • 더 큰 메모리 공간
    • 가비지 컬렉션의 주요 대상

힙은 스택보다 더 유연하지만, 관리가 더 복잡해요. 이것이 바로 가비지 컬렉션이 필요한 이유입니다!

💡 재능넷 팁: PHP 프로그래밍을 배우고 있다면, 메모리 관리의 기본 개념을 이해하는 것이 중요해요. 이는 더 효율적인 코드를 작성하는 데 도움이 될 뿐만 아니라, 다른 프로그래밍 언어를 배울 때도 유용한 지식이 될 거예요!

1.3 변수와 메모리 할당 🏷️

PHP에서 변수를 선언하면 어떤 일이 일어날까요? 간단한 예제를 통해 살펴봅시다.


$name = "Alice";  // 문자열
$age = 30;        // 정수
$height = 1.65;   // 부동소수점
$fruits = ["apple", "banana", "orange"];  // 배열

이 코드를 실행하면, PHP는 다음과 같은 작업을 수행합니다:

  1. 각 변수에 대한 심볼 테이블 엔트리를 생성합니다.
  2. 각 데이터 타입에 맞는 메모리를 할당합니다.
  3. 할당된 메모리에 값을 저장합니다.
  4. 변수 이름을 해당 메모리 위치와 연결합니다.

문자열, 정수, 부동소수점과 같은 스칼라 타입은 일반적으로 스택에 저장되지만, 배열이나 객체와 같은 복잡한 타입은 힙에 저장됩니다.

PHP 변수 메모리 할당 심볼 테이블 $name $age $height $fruits 메모리 "Alice" 30 1.65 ["apple", "banana", "orange"]

이 그림에서 볼 수 있듯이, 변수 이름은 심볼 테이블에 저장되고, 실제 값은 메모리의 특정 위치에 저장됩니다. 심볼 테이블의 각 엔트리는 해당 값이 저장된 메모리 위치를 가리키고 있어요.

1.4 참조 카운팅 (Reference Counting) 🔢

PHP는 메모리 관리를 위해 참조 카운팅이라는 기법을 사용합니다. 이는 각 변수나 객체가 얼마나 많은 다른 변수에 의해 참조되고 있는지를 추적하는 방법이에요.

참조 카운트가 0이 되면, 즉 어떤 변수도 해당 데이터를 참조하지 않으면, PHP는 그 메모리를 해제합니다. 이것이 PHP의 기본적인 가비지 컬렉션 메커니즘이에요.


$a = "Hello";  // 참조 카운트: 1
$b = $a;       // 참조 카운트: 2
unset($a);     // 참조 카운트: 1
unset($b);     // 참조 카운트: 0, 메모리 해제

이 예제에서, "Hello" 문자열의 참조 카운트는 처음에 1이었다가, $b에 할당되면서 2가 되고, $a가 unset되면서 1이 되었다가, 마지막으로 $b가 unset되면서 0이 되어 메모리에서 해제됩니다.

🌟 성능 팁: 대량의 데이터를 다룰 때는 참조를 사용하여 불필요한 메모리 복사를 줄일 수 있어요. 하지만 순환 참조에 주의해야 합니다!

1.5 변수의 수명주기 ⏳

PHP에서 변수의 수명주기는 그 범위(scope)와 밀접한 관련이 있습니다. 변수의 수명주기를 이해하면 메모리 사용을 최적화하는 데 도움이 됩니다.

  1. 전역 변수: 스크립트가 시작될 때 생성되어 스크립트가 종료될 때까지 존재합니다.
  2. 정적 변수: 함수 내에서 선언되지만, 함수 호출 사이에도 값을 유지합니다.
  3. 지역 변수: 함수나 메서드 내에서 선언되며, 해당 함수의 실행이 끝나면 소멸됩니다.

$global_var = "I'm global";  // 전역 변수

function test() {
    static $static_var = 0;  // 정적 변수
    $static_var++;
    
    $local_var = "I'm local";  // 지역 변수
    
    echo $static_var . "\n";
    echo $local_var . "\n";
}

test();  // 출력: 1, I'm local
test();  // 출력: 2, I'm local

이 예제에서 $global_var는 스크립트 전체에서 접근 가능하고, $static_var는 함수 호출 사이에도 값을 유지하며, $local_var는 매 함수 호출마다 새로 생성되고 함수 종료 시 소멸됩니다.

PHP 변수의 수명주기 스크립트 실행 시간 $global_var (전역 변수) $static_var (정적 변수) $local_var $local_var 첫 번째 test() 호출 두 번째 test() 호출

이 그림은 PHP 스크립트 실행 동안 각 변수 타입의 수명주기를 시각적으로 보여줍니다. 전역 변수는 스크립트 전체에 걸쳐 존재하고, 정적 변수는 첫 번째 함수 호출 이후 계속 유지되며, 지역 변수는 각 함수 호출마다 새로 생성되고 소멸됩니다.

1.6 메모리 누수 (Memory Leaks) 💧

PHP는 자동 메모리 관리를 제공하지만, 여전히 메모리 누수가 발생할 수 있습니다. 메모리 누수는 더 이상 필요하지 않은 객체나 데이터가 메모리에서 해제되지 않고 계속 남아있는 상황을 말해요.

PHP에서 메모리 누수의 주요 원인 중 하나는 순환 참조입니다. 순환 참조는 두 개 이상의 객체가 서로를 참조하여 참조 카운트가 0이 되지 않는 상황을 말합니다.


class Node {
    public $other;
}

$node1 = new Node();
$node2 = new Node();

$node1->other = $node2;  // $node1이 $node2를 참조
$node2->other = $node1;  // $node2가 $node1을 참조

unset($node1);
unset($node2);

이 예제에서, $node1과 $node2를 unset 했지만, 두 객체는 여전히 서로를 참조하고 있어 메모리에서 해제되지 않습니다.

⚠️ 주의: 순환 참조를 피하기 위해서는 객체 간의 관계를 신중히 설계해야 하며, 필요하다면 약한 참조(weak references)를 사용할 수 있습니다.

1.7 메모리 사용량 모니터링 📊

PHP 애플리케이션의 메모리 사용량을 모니터링하는 것은 중요합니다. PHP는 이를 위한 몇 가지 유용한 함수를 제공합니다:

  • memory_get_usage(): 현재 PHP 스크립트가 사용 중인 메모리 양을 반환합니다.
  • memory_get_peak_usage(): 스크립트 실행 중 최대 메모리 사용량을 반환합니다.
  • gc_mem_caches(): 가비지 컬렉터의 내부 캐시를 정리합니다.

echo "Initial memory usage: " . memory_get_usage() . " bytes\n";

$data = range(1, 100000);

echo "Memory usage after creating array: " . memory_get_usage() . " bytes\n";
echo "Peak memory usage: " . memory_get_peak_usage() . " bytes\n";

unset($data);
gc_collect_cycles();

echo "Memory usage after cleanup: " . memory_get_usage() . " bytes\n";

이 코드는 스크립트 실행 중 다양한 시점에서의 메모리 사용량을 보여줍니다. 이를 통해 메모리 집약적인 작업을 식별하고 최적화할 수 있습니다.

PHP 메모리 사용량 그래프 실행 시간 메모리 사용량 (bytes) 시작 배열 생성 최대 사용량 배열 해제 정리 후

이 그래프는 PHP 스크립트 실행 중 메모리 사용량의 변화를 시각적으로 보여줍니다. 초기에는 낮은 메모리 사용량을 보이다가, 큰 배열을 생성할 때 급격히 증가하고, 배열을 해제하고 가비지 컬렉션을 실행한 후에는 다시 감소하는 것을 볼 수 있습니다.

1.8 PHP의 메모리 제한 설정 🔒

PHP는 스크립트가 사용할 수 있는 최대 메모리 양을 제한할 수 있습니다. 이는 서버 리소스를 보호하고 잘못 작성된 스크립트가 서버의 모든 메모리를 소비하는 것을 방지하는 데 도움이 됩니다.

메모리 제한은 php.ini 파일에서 설정하거나 런타임에 변경할 수 있습니다.


// php.ini 파일에서 설정
memory_limit = 128M

// 스크립트 내에서 설정
ini_set('memory_limit', '256M');

// 현재 메모리 제한 확인
echo ini_get('memory_limit');

메모리 제한을 적절히 설정하는 것은 애플리케이션의 안정성과 성능을 위해 중요합니다. 너무 낮게 설정하면 정상적인 스크립트 실행이 중단될 수 있고, 너무 높게 설정하면 서버 리소스를 과도하게 사용할 위험이 있습니다.

💡 팁: 대규모 데이터 처리나 이미지 조작과 같은 메모리 집약적인 작업을 수행할 때는 일시적으로 메모리 제한을 늘릴 수 있습니다. 하지만 작업이 끝난 후에는 다시 원래 값으로 되돌리는 것이 좋습니다.

2. PHP 가비지 컬렉션 심층 탐구 🕵️‍♂️

이제 PHP의 가비지 컬렉션(Garbage Collection, GC) 메커니즘에 대해 더 자세히 알아보겠습니다. 가비지 컬렉션은 더 이상 사용되지 않는 메모리를 자동으로 해제하여 메모리 관리를 돕는 중요한 기능입니다.

2.1 참조 카운팅의 한계 🔢

앞서 언급했듯이, PHP는 기본적으로 참조 카운팅 방식을 사용합니다. 하지만 이 방식에는 한계가 있습니다:

  • 순환 참조 문제를 해결하지 못함
  • 참조 카운트 업데이트에 따른 오버헤드
  • 메모리 단편화 가능성

이러한 한계를 극복하기 위해 PHP 5.3부터는 순환 참조 수집기(Cycle Collector)가 도입되었습니다.

2.2 순환 참조 수집기 작동 원리 🔄

순환 참조 수집기는 다음과 같은 단계로 작동합니다:

  1. 루트 버퍼 수집: 변수의 참조 카운트가 감소하거나 증가할 때 해당 변수를 루트 버퍼에 추가합니다.
  2. 순환 검사: 루트 버퍼가 가득 차면 (기본값 10,000개 항목) 순환 검사를 시작합니다.
  3. 잠재적 가비지 식별: 각 변수에서 시작하여 참조 그래프를 탐색하고 잠재적인 가비지를 식별합니다.
  4. 실제 가비지 수집: 식별된 가비지 중 실제로 접근 불가능한 객체를 메모리에서 해제합니다.
PHP 순환 참조 수집기 작동 원리 루트 버퍼 순환 검사 가비지 수집

이 다이어그램은 PHP의 순환 참조 수집기의 작동 과정을 시각화합니다. 루트 버퍼에서 시작하여 순환 검사를 거쳐 최종적으로 가비지를 수집하는 과정을 보여줍니다.

2.3 가비지 컬렉션 트리거 🔫

PHP의 가비지 컬렉션은 다음과 같은 경우에 트리거됩니다:

  • 루트 버퍼가 가득 찼을 때 (기본값 10,000개 항목)
  • gc_collect_cycles() 함수를 명시적으로 호출할 때
  • 특정 수의 할당/해제 작업이 수행된 후 (PHP 내부 설정에 따라 다름)

// 가비지 컬렉션 수동 트리거
$collectedCycles = gc_collect_cycles();
echo "Collected $collectedCycles cycles\n";

가비지 컬렉션을 너무 자주 트리거하면 성능에 악영향을 줄 수 있으므로, 대규모 메모리 해제가 필요한 경우에만 수동으로 트리거하는 것이 좋습니다.

2.4 가비지 컬렉션 최적화 팁 🚀

PHP의 가비지 컬렉션을 최적화하기 위한 몇 가지 팁을 소개합니다:

  1. 순환 참조 피하기: 가능한 한 순환 참조를 만들지 않도록 설계하세요.
  2. 큰 데이터셋 처리 시 메모리 해제: 대량의 데이터를 처리한 후에는 unset()을 사용하여 명시적으로 메모리를 해제하세요.
  3. 참조 사용 최소화: 불필요한 참조 사용을 줄이면 참조 카운팅 오버헤드를 줄일 수 있습니다.
  4. 적절한 데이터 구조 선택: 메모리 효율적인 데이터 구조를 선택하세요 (예: 큰 배열 대신 Iterator 사용).
  5. 가비지 컬렉션 설정 조정: 애플리케이션의 특성에 맞게 가비지 컬렉션 설정을 조정하세요.

🌟 성능 팁: 대규모 웹 애플리케이션에서는 PHP-FPM (FastCGI Process Manager)을 사용하여 각 요청 후 메모리를 완전히 정리할 수 있습니다. 이는 장기 실행 프로세스에서 발생할 수 있는 메모리 누수를 방지하는 데 도움이 됩니다.

2.5 PHP 7의 가비지 컬렉션 개선사항 🆙

PHP 7에서는 가비지 컬렉션 메커니즘이 크게 개선되었습니다:

  • 지연된 가비지 컬렉션: 가비지 컬렉션 작업을 지연시켜 실행 시간을 최적화했습니다.
  • 개선된 메모리 관리: 내부 메모리 관리가 개선되어 전반적인 성능이 향상되었습니다.
  • 더 효율적인 참조 카운팅: 참조 카운팅 메커니즘이 최적화되어 오버헤드가 감소했습니다.

// PHP 7 이상에서 가비지 컬렉션 통계 확인
$status = gc_status();
print_r($status);

이 코드는 현재 가비지 컬렉션의 상태를 보여줍니다. 여기에는 루트 버퍼의 크기, 수집된 순환 참조의 수 등의 정보가 포함됩니다.

2.6 실제 사례: 메모리 누수 디버깅 🐞

실제 PHP 애플리케이션에서 메모리 누수를 디버깅하는 과정을 살펴보겠습니다:


// 메모리 사용량 로깅 함수
function logMemoryUsage($stage) {
    $memory = memory_get_usage() / 1024 / 1024; // MB로 변환
    error_log("Memory usage at $stage: $memory MB");
}

// 메모리 누수가 의심되는 함수
function leakyFunction() {
    $data = [];
    for ($i = 0; $i < 100000; $i++) {
        $obj = new stdClass();
        $obj->data = str_repeat('x', 1000);
        $data[] = $obj;
    }
    // $data를 반환하거나 해제하지 않음
}

logMemoryUsage('Start');

for ($i = 0; $i < 10; $i++) {
    leakyFunction();
    logMemoryUsage("After iteration $i");
}

logMemoryUsage('End');
gc_collect_cycles();
logMemoryUsage('After GC');

이 예제에서는 leakyFunction()이 대량의 메모리를 할당하지만 해제하지 않아 메모리 누수가 발생합니다. 로그를 분석하면 각 반복마다 메모리 사용량이 증가하는 것을 확인할 수 있습니다.

메모리 누수를 해결하려면 다음과 같이 수정할 수 있습니다:


function fixedFunction() {
    $data = [];
    for ($i = 0; $i < 100000; $i++) {
        $obj = new stdClass();
        $obj->data = str_repeat('x', 1000);
        $data[] = $obj;
    }
    // 함수 종료 전 $data 해제
    unset($data);
}

이렇게 수정하면 함수 종료 시 메모리가 적절히 해제되어 메모리 누수를 방지할 수 있습니다.

2.7 PHP 메모리 관리의 미래 🔮

PHP의 메모리 관리와 가비지 컬렉션은 계속해서 발전하고 있습니다. 향후 버전에서 기대할 수 있는 개선사항은 다음과 같습니다:

  • 더 지능적인 가비지 컬렉션 알고리즘
  • 비동기 가비지 컬렉션 도입 가능성
  • 메모리 할당 및 해제의 추가 최적화
  • 더 세밀한 메모리 프로파일링 도구

이러한 개선사항들은 PHP 애플리케이션의 성능과 안정성을 더욱 향상시킬 것으로 기대됩니다.

⚠️ 주의: PHP의 메모리 관리와 가비지 컬렉션은 대부분의 경우 자동으로 잘 작동합니다. 하지만 대규모 또는 복잡한 애플리케이션에서는 여전히 개발자의 주의와 최적화가 필요할 수 있습니다.

결론 🏁

PHP의 메모리 관리와 가비지 컬렉션은 복잡하지만 흥미로운 주제입니다. 이 시스템을 이해하고 최적화하는 것은 효율적이고 안정적인 PHP 애플리케이션을 개발하는 데 큰 도움이 됩니다.

주요 포인트를 정리해보면:

  • PHP는 참조 카운팅과 순환 참조 수집기를 사용하여 메모리를 관리합니다.
  • 메모리 누수를 방지하기 위해 순환 참조를 피하고 큰 데이터셋을 적절히 해제해야 합니다.
  • PHP 7 이상에서는 가비지 컬렉션 메커니즘이 크게 개선되었습니다.
  • 메모리 사용량을 모니터링하고 필요한 경우 수동으로 가비지 컬렉션을 트리거할 수 있습니다.
  • 효율적인 데이터 구조와 알고리즘을 사용하는 것이 중요합니다.

PHP의 메모리 관리에 대한 이해는 단순히 기술적 지식을 넘어 더 나은 코드를 작성하고 성능 문제를 해결하는 데 필수적입니다. 이는 마치 자동차의 엔진을 이해하는 것과 같아요. 겉으로 보이지 않지만, 전체 시스템의 효율성과 신뢰성에 큰 영향을 미치죠.

여러분의 PHP 여정에서 이 지식이 큰 도움이 되길 바랍니다. 항상 학습하고, 실험하고, 최적화하세요. 그리고 가장 중요한 것은, 코딩을 즐기는 것입니다! 🎉👨‍💻👩‍💻

💡 마지막 팁: PHP의 메모리 관리에 대해 더 깊이 알고 싶다면, PHP 내부 구조와 Zend Engine에 대해 공부해보는 것도 좋습니다. 이는 PHP가 어떻게 작동하는지에 대한 더 깊은 이해를 제공할 것입니다.

여러분의 PHP 개발 여정에 행운이 함께하기를 바랍니다! 🍀

관련 키워드

  • PHP
  • 메모리 관리
  • 가비지 컬렉션
  • 참조 카운팅
  • 순환 참조
  • 메모리 누수
  • 성능 최적화
  • Zend Engine
  • PHP-FPM
  • 메모리 프로파일링

지적 재산권 보호

지적 재산권 보호 고지

  1. 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
  2. AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
  3. 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
  4. 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
  5. AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.

재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

해당 지식과 관련있는 인기재능

 >>>서비스 설명<<<저렴한 가격, 합리적인 가격, 최적의 공수로윈도우 프로그램을 제작해 드립니다고객이 원하는 프로그램...

안녕하세요 응용프로그램 경력 15년이상 / 웹프로그램 경력 12년 이상입니다.맡겨주시면 의뢰인이 생각하시는 그대로 만들어 드리도록 노력하겠습...

  1.엑셀의 기본기능으로 하기 어렵거나 복잡한 내용 VBA로 자동화 2.셀메뉴형태 또는 리본메뉴형태의 프로그램 3.MY-SQ...

📚 생성된 총 지식 10,543 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동) | 사업자등록번호 : 131-86-65451
    통신판매업신고 : 2018-수원영통-0307 | 직업정보제공사업 신고번호 : 중부청 2013-4호 | jaenung@jaenung.net

    (주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.
    (주)재능넷은 통신판매중개자로서 재능넷의 거래당사자가 아니며, 판매자가 등록한 상품정보 및 거래에 대해 재능넷은 일체 책임을 지지 않습니다.

    Copyright © 2024 재능넷 Inc. All rights reserved.
ICT Innovation 대상
미래창조과학부장관 표창
서울특별시
공유기업 지정
한국데이터베이스진흥원
콘텐츠 제공서비스 품질인증
대한민국 중소 중견기업
혁신대상 중소기업청장상
인터넷에코어워드
일자리창출 분야 대상
웹어워드코리아
인터넷 서비스분야 우수상
정보통신산업진흥원장
정부유공 표창장
미래창조과학부
ICT지원사업 선정
기술혁신
벤처기업 확인
기술개발
기업부설 연구소 인정
마이크로소프트
BizsPark 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창