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

🌲 지식인의 숲 🌲

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

 안녕하세요. 안드로이드 기반 개인 앱, 프로젝트용 앱부터 그 이상 기능이 추가된 앱까지 제작해 드립니다.  - 앱 개발 툴: 안드로이드...

안녕하세요.신호처리를 전공한 개발자 입니다. 1. 영상신호처리, 생체신호처리 알고리즘 개발2. 안드로이드 앱 개발 3. 윈도우 프로그램...

소개안드로이드 기반 어플리케이션 개발 후 서비스를 하고 있으며 스타트업 경험을 통한 앱 및 서버, 관리자 페이지 개발 경험을 가지고 있습니다....

# 최초 의뢰시 개발하고 싶으신 앱의 기능 및 화면구성(UI)에 대한 설명을 같이 보내주세요.# 앱스토어 URL 보내고 단순 카피 해달라고 쪽지 보내...

자바스크립트 Custom Elements 만들기

2024-11-26 08:18:43

재능넷
조회수 232 댓글수 0

자바스크립트 Custom Elements 만들기: 웹 개발의 새로운 지평 🚀

 

 

안녕, 친구들! 오늘은 정말 흥미진진한 주제로 찾아왔어. 바로 자바스크립트로 Custom Elements를 만드는 방법에 대해 알아볼 거야. 😎 이 기술은 웹 개발의 판도를 바꿀 수 있는 엄청난 잠재력을 가지고 있어. 마치 우리가 재능넷에서 다양한 재능을 거래하듯이, Custom Elements를 사용하면 웹 개발에서도 우리만의 독특한 '재능'을 만들어 낼 수 있지. 자, 그럼 이 신나는 여정을 함께 떠나볼까?

🎨 Custom Elements란?

Custom Elements는 HTML5의 Web Components 기술 중 하나로, 개발자가 직접 새로운 HTML 요소를 정의하고 사용할 수 있게 해주는 강력한 기능이야. 이를 통해 재사용 가능하고, 캡슐화된 컴포넌트를 만들 수 있어. 마치 레고 블록처럼 웹 페이지를 조립할 수 있게 되는 거지!

왜 Custom Elements를 사용해야 할까? 🤔

Custom Elements를 사용하면 여러 가지 장점이 있어:

  • 재사용성: 한 번 만들어 놓으면 여러 프로젝트에서 쉽게 재사용할 수 있어.
  • 캡슐화: 컴포넌트의 로직과 스타일을 하나의 요소로 묶을 수 있어.
  • 유지보수 용이성: 코드를 모듈화하여 관리하기 쉬워져.
  • 확장성: 기존 HTML 요소를 확장하여 새로운 기능을 추가할 수 있어.

이제 본격적으로 Custom Elements를 만드는 방법을 알아보자! 🕵️‍♂️

Custom Elements 만들기: 기본 단계 🛠️

자, 이제 우리만의 Custom Element를 만들어볼 거야. 마치 재능넷에서 새로운 재능을 등록하는 것처럼 말이야! 😉

1. 클래스 정의하기

먼저, 우리의 Custom Element를 위한 클래스를 만들어야 해. 이 클래스는 HTMLElement를 상속받아야 해.


class MyAwesomeElement extends HTMLElement {
  constructor() {
    super();
    // 여기에 초기화 코드를 작성해
  }
}

2. 생명주기 메서드 구현하기

Custom Elements에는 몇 가지 중요한 생명주기 메서드가 있어. 이 메서드들을 구현하면 요소의 동작을 세밀하게 제어할 수 있지.

  • connectedCallback(): 요소가 DOM에 추가될 때 호출돼.
  • disconnectedCallback(): 요소가 DOM에서 제거될 때 호출돼.
  • attributeChangedCallback(): 요소의 속성이 변경될 때 호출돼.

class MyAwesomeElement extends HTMLElement {
  constructor() {
    super();
  }

  connectedCallback() {
    console.log('MyAwesomeElement가 DOM에 추가됐어!');
  }

  disconnectedCallback() {
    console.log('MyAwesomeElement가 DOM에서 제거됐어!');
  }

  attributeChangedCallback(name, oldValue, newValue) {
    console.log(`속성 ${name}이(가) ${oldValue}에서 ${newValue}로 변경됐어!`);
  }
}

3. 요소 등록하기

클래스를 정의했다면, 이제 이 클래스를 Custom Element로 등록해야 해.


customElements.define('my-awesome-element', MyAwesomeElement);

이렇게 하면 <my-awesome-element>라는 새로운 HTML 태그를 사용할 수 있게 돼!

📌 주의사항

Custom Element의 이름은 반드시 대시(-)를 포함해야 해. 이는 기존 HTML 요소와의 충돌을 방지하기 위한 규칙이야.

여기까지가 Custom Elements를 만드는 기본적인 단계야. 이제 우리만의 요소를 만들 수 있게 됐어! 🎉

Custom Elements 생성 과정 클래스 정의 생명주기 메서드 구현 요소 등록

이 그림을 보면 Custom Elements를 만드는 과정이 한눈에 들어오지? 클래스를 정의하고, 생명주기 메서드를 구현한 다음, 마지막으로 요소를 등록하는 단계를 거치면 돼. 마치 재능넷에서 새로운 재능을 등록하는 과정과 비슷하다고 볼 수 있어. 먼저 재능을 정의하고, 어떻게 활용할지 계획을 세운 다음, 최종적으로 플랫폼에 등록하는 거지. 😊

Custom Elements의 심화 기능 🚀

기본적인 Custom Elements 만들기를 마스터했다면, 이제 더 고급 기능들을 살펴볼 차례야. 이 부분에서는 Shadow DOM, 템플릿, 슬롯 등 더 복잡하지만 강력한 기능들을 다룰 거야. 마치 재능넷에서 초급 재능에서 시작해 전문가 수준의 재능으로 발전하는 것처럼 말이야! 😎

1. Shadow DOM 사용하기

Shadow DOM은 컴포넌트의 내부 구조를 캡슐화하는 강력한 도구야. 이를 통해 스타일과 마크업을 외부로부터 완전히 격리시킬 수 있어.


class MyShadowElement extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({mode: 'open'});
    this.shadowRoot.innerHTML = `
      <style>
        p { color: blue; }
      </style>
      <p>안녕, 나는 Shadow DOM 안에 있어!</p>
    `;
  }
}

customElements.define('my-shadow-element', MyShadowElement);

Shadow DOM을 사용하면 컴포넌트의 스타일이 외부 문서의 스타일과 충돌하지 않아. 이는 대규모 애플리케이션에서 특히 유용해!

2. 템플릿 활용하기

HTML 템플릿을 사용하면 재사용 가능한 마크업 구조를 쉽게 만들 수 있어. <template> 요소를 사용해 보자.


<template id="my-template">
  <style>
    h1 { color: purple; }
  </style>
  <h1>템플릿에서 온 제목이에요!</h1>
</template>

<script>
class MyTemplateElement extends HTMLElement {
  constructor() {
    super();
    let template = document.getElementById('my-template');
    let templateContent = template.content;
    
    this.attachShadow({mode: 'open'})
      .appendChild(templateContent.cloneNode(true));
  }
}

customElements.define('my-template-element', MyTemplateElement);
</script>

템플릿을 사용하면 복잡한 구조를 쉽게 재사용할 수 있어. 재능넷에서 자주 사용하는 재능 설명 템플릿을 만드는 것과 비슷하다고 볼 수 있지!

3. 슬롯(Slot) 활용하기

슬롯을 사용하면 Custom Element 내부에 외부 콘텐츠를 삽입할 수 있어. 이를 통해 더 유연한 컴포넌트를 만들 수 있지.


<template id="my-slot-template">
  <style>
    ::slotted(h2) { color: green; }
  </style>
  <slot name="title">기본 제목</slot>
  <slot>기본 내용</slot>
</template>

<script>
class MySlotElement extends HTMLElement {
  constructor() {
    super();
    let template = document.getElementById('my-slot-template');
    let templateContent = template.content;
    
    this.attachShadow({mode: 'open'})
      .appendChild(templateContent.cloneNode(true));
  }
}

customElements.define('my-slot-element', MySlotElement);
</script>

<my-slot-element>
  <h2 slot="title">커스텀 제목</h2>
  <p>커스텀 내용</p>
</my-slot-element>

슬롯을 사용하면 컴포넌트의 구조를 유지하면서도 내용을 동적으로 변경할 수 있어. 이는 재능넷에서 재능 소개 페이지의 레이아웃은 유지하면서 각 재능의 세부 내용만 바꾸는 것과 비슷해!

Custom Elements의 고급 기능 Shadow DOM 템플릿 슬롯

이 그림은 Custom Elements의 고급 기능들을 시각적으로 표현한 거야. Shadow DOM은 컴포넌트를 캡슐화하는 원 모양으로, 템플릿은 재사용 가능한 구조를 나타내는 사각형으로, 그리고 슬롯은 유연한 콘텐츠 삽입을 의미하는 삼각형으로 표현했어. 이 세 가지 기능을 잘 활용하면 정말 강력한 Custom Elements를 만들 수 있지!

이러한 고급 기능들을 마스터하면, 웹 개발의 새로운 차원을 경험할 수 있어. 마치 재능넷에서 고급 재능을 가진 전문가가 되는 것처럼 말이야. 🌟 자, 이제 이 강력한 도구들을 어떻게 실제로 활용할 수 있는지 더 자세히 알아볼까?

실전 예제: 재능 카드 컴포넌트 만들기 🃏

자, 이제 우리가 배운 모든 것을 활용해서 실제로 쓸모 있는 컴포넌트를 만들어볼 거야. 재능넷에서 영감을 받아 '재능 카드' 컴포넌트를 만들어보자! 이 컴포넌트는 재능의 이름, 설명, 가격 등을 표시할 거야. 😊


<!-- HTML -->
<template id="talent-card-template">
  <style>
    .card {
      border: 1px solid #ddd;
      border-radius: 8px;
      padding: 16px;
      margin: 16px;
      box-shadow: 0 4px 8px rgba(0,0,0,0.1);
    }
    .talent-name {
      font-size: 24px;
      color: #333;
      margin-bottom: 8px;
    }
    .talent-description {
      color: #666;
      margin-bottom: 16px;
    }
    .talent-price {
      font-weight: bold;
      color: #4CAF50;
    }
  </style>
  <div class="card">
    <h2 class="talent-name"><slot name="name">재능 이름</slot></h2>
    <p class="talent-description"><slot name="description">재능 설명</slot></p>
    <p class="talent-price">가격: <slot name="price">0</slot>원</p>
  </div>
</template>

<script>
class TalentCard extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({mode: 'open'});
    const template = document.getElementById('talent-card-template');
    this.shadowRoot.appendChild(template.content.cloneNode(true));
  }
}

customElements.define('talent-card', TalentCard);
</script>

<!-- 사용 예시 -->
<talent-card>
  <span slot="name">웹 개발 마스터 클래스</span>
  <span slot="description">Custom Elements부터 최신 프레임워크까지, 웹 개발의 모든 것을 배워보세요!</span>
  <span slot="price">50,000</span>
</talent-card>

이 예제에서 우리는 Shadow DOM, 템플릿, 그리고 슬롯을 모두 활용했어. Shadow DOM으로 스타일을 캡슐화하고, 템플릿으로 구조를 정의하고, 슬롯으로 유연한 콘텐츠 삽입을 가능하게 했지. 이렇게 만든 컴포넌트는 재사용성이 높고, 유지보수하기 쉬워.

💡 팁

이런 방식으로 컴포넌트를 만들면, 재능넷 같은 플랫폼에서 다양한 재능을 일관된 디자인으로 쉽게 표현할 수 있어. 재능 제공자의 정보를 추가하거나, 리뷰 시스템을 통합하는 등 확장성도 뛰어나지!

컴포넌트 기능 확장하기

우리가 만든 재능 카드 컴포넌트를 더 발전시켜볼까? 예를 들어, 클릭했을 때 상세 정보를 보여주는 기능을 추가해보자.


class TalentCard extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({mode: 'open'});
    const template = document.getElementById('talent-card-template');
    this.shadowRoot.appendChild(template.content.cloneNode(true));
    
    this.addEventListener('click', this.showDetails);
  }

  showDetails() {
    // 상세 정보를 보여주는 로직
    alert('재능 상세 정보: ' + this.querySelector('[slot="description"]').textContent);
  }
}

customElements.define('talent-card', TalentCard);

이렇게 하면 재능 카드를 클릭할 때마다 상세 정보가 알림으로 표시돼. 물론 실제 애플리케이션에서는 모달 창이나 새로운 페이지로 이동하는 등 더 세련된 방식을 사용할 수 있겠지?

반응형 디자인 적용하기

우리의 재능 카드를 다양한 화면 크기에 대응할 수 있게 만들어보자. Shadow DOM 내부의 스타일에 미디어 쿼리를 추가할 수 있어.


<template id="talent-card-template">
  <style>
    .card {
      /* 기존 스타일 */
    }
    @media (max-width: 600px) {
      .card {
        padding: 8px;
        margin: 8px;
      }
      .talent-name {
        font-size: 18px;
      }
    }
  </style>
  <!-- 기존 HTML 구조 -->
</template>

이렇게 하면 화면 크기가 작아졌을 때 카드의 크기와 폰트 크기가 자동으로 조절돼. 재능넷처럼 다양한 기기에서 접속하는 사용자들을 위해 반응형 디자인은 정말 중요하지!

반응형 재능 카드 디자인 데스크톱 뷰 모바일 뷰 반응형

이 그림은 우리가 만든 재능 카드 컴포넌트가 어떻게 반응형으로 동작하는지를 보여줘. 왼쪽의 큰 사각형은 데스크톱 화면에서의 카드 모습이고, 오른쪽의 작은 사각형은 모바일 화면에서의 카드 모습이야. 화면 크기에 따라 자동으로 레이아웃이 조정되는 걸 볼 수 있지!

접근성 고려하기

마지막으로, 우리의 컴포넌트를 모든 사용자가 쉽게 이용할 수 있도록 접근성을 개선해보자.


class TalentCard extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({mode: 'open'});
    const template = document.getElementById('talent-card-template');
    this.shadowRoot.appendChild(template.content.cloneNode(true));
    
    this.setAttribute('tabindex', '0');
    this.setAttribute('role', 'article');
  }

  connectedCallback() {
    this.addEventListener('keydown', (e) => {
      if (e.key === 'Enter') {
        this.showDetails();
      }
    });
  }

  showDetails() {
    // 상세 정보를 보여주는 로직
  }
}

customElements.define('talent-card', TalentCard);

이렇게 하면 키보드 사용자도 우리의 재능 카드에 접근하고 상호작용할 수 있어. 접근성은 웹 개발에서 정말 중요한 부분이야. 재능넷처럼 다양한 사용자가 이용하는 플랫폼에서는 특히 더 그렇지!

자, 여기까지 Custom Elements를 활용해 실제로 쓸모 있는 컴포넌트를 만들어봤어. 이런 방식으로 컴포넌트를 만들면, 재사용성이 높고 유지보수하기 쉬운 웹 애플리케이션을 만들 수 있어. 재능넷 같은 복잡한 플랫폼을 개발할 때 이런 접근 방식이 큰 도움이 될 거야. 😊

Custom Elements의 미래와 발전 방향 🚀

자, 이제 우리는 Custom Elements의 기본부터 실전 활용까지 살펴봤어. 하지만 웹 기술의 세계는 계속해서 발전하고 있지. 그럼 Custom Elements의 미래는 어떨까? 🤔

1. 프레임워크와의 통합

많은 개발자들이 React, Vue, Angular 같은 프레임워크를 사용하고 있어. Custom Elements는 이런 프레임워크들과 점점 더 잘 통합될 거야. 예를 들어, React에서는 이미 Custom Elements를 쉽게 사용할 수 있는 라이브러리들이 나오고 있어.


// React에서 Custom Elements 사용 예시
import React from 'react';

const TalentCardWrapper = props => {
  return (
    <talent-card>
      <span slot="name">{props.name}</span>
      <span slot="description">{props.description}</span>
      <span slot="price">{props.price}</span>
    </talent-card>
  );
};

export default TalentCardWrapper;

2. 성능 최적화

브라우저 벤더들은 Custom Elements의 성능을 지속적으로 개선하고 있어. 미래에는 Custom Elements의 렌더링과 업데이트가 더욱 빨라질 거야. 이는 재능넷 같은 대규모 플랫폼에서 특히 중요한 부분이지!

3. 새로운 API와의 통합

웹 플랫폼은 계속해서 새로운 API를 추가하고 있어. Custom Elements는 이런 새로운 API들과 더욱 긴밀하게 통합될 거야. 예를 들어, WebGL이나 WebAssembly와 결합해 더 강력한 기능을 제공할 수 있겠지.

4. 접근성과 국제화

웹의 미래는 더욱 포용적이고 글로벌해질 거야. Custom Elements도 이런 트렌드에 맞춰 더 나은 접근성과 국제화 지원을 제공할 거야. 재능넷처럼 전 세계 사용자를 대상으로 하는 플랫폼에서는 이 부분이 특히 중요해질 거야.


class InternationalTalentCard extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({mode: 'open'});
  }

  connectedCallback() {
    this.updateLanguage(navigator.language);
  }

  updateLanguage(lang) {
    // 언어에 따라 컴포넌트 내용 업데이트
    this.shadowRoot.innerHTML = `
      <p>${this.getTranslation('talentName', lang)}: ${this.getAttribute('name')}</p>
      <p>${this.getTranslation('price', lang)}: ${this.getAttribute('price')}</p>
    `;
  }

  getTranslation(key, lang) {
    const translations = {
      'en': { 'talentName': 'Talent Name', 'price': 'Price' },
      'ko': { 'talentName': '재능 이름', 'price': '가격' },
      // 다른 언어 추가
    };
    return translations[lang][key] || translations['en'][key];
  }
}

customElements.define('international-talent-card', InternationalTalentCard);

5. 서버 사이드 렌더링 (SSR) 지원

현재 Custom Elements는 주로 클라이언트 사이드에서 동작해. 하지만 미래에는 서버 사이드 렌더링을 더 잘 지원하게 될 거야. 이를 통해 초기 로딩 속도를 개선하고 SEO도 향상시킬 수 있겠지.

Custom Elements의 미래 Custom Elements 프레임워크 통합 성능 최적화 새로운 API 통합 접근성과 국제화 서버 사이드 렌더링

이 그림은 Custom Elements의 미래 발전 방향을 시각화한 거야. 중앙의 큰 원이 Custom Elements를 나타내고, 주변의 작은 원들은 각각의 발전 방향을 보여주고 있어. 이 모든 요소들이 조화롭게 발전하면서 Custom Elements는 더욱 강력하고 유용한 도구가 될 거야!

결론: Custom Elements와 함께 성장하는 웹 개발

Custom Elements는 웹 개발의 미래를 밝게 만들고 있어. 컴포넌트 기반 개발, 재사용성, 캡슐화 등 현대 웹 개발의 핵심 개념들을 Native API로 구현할 수 있게 해주거든. 재능넷 같은 복잡한 웹 애플리케이션을 개발할 때, Custom Elements를 활용하면 코드의 구조와 유지보수성을 크게 개선할 수 있어.

앞으로 Custom Elements를 배우고 사용하는 개발자들이 더 많아질 거야. 그리고 이는 웹 생태계 전체를 더욱 풍부하고 다양하게 만들어줄 거야. 마치 재능넷에서 다양한 재능을 가진 사람들이 모여 서로의 능력을 공유하듯이 말이야. 😊

자, 이제 우리는 Custom Elements의 현재와 미래에 대해 깊이 있게 살펴봤어. 이 강력한 도구를 활용해 더 나은 웹을 만들어나가는 여정에 함께하자! 🚀

관련 키워드

  • Custom Elements
  • 웹 컴포넌트
  • Shadow DOM
  • 템플릿
  • 슬롯
  • 캡슐화
  • 재사용성
  • 프레임워크 통합
  • 성능 최적화
  • 접근성

지식의 가치와 지적 재산권 보호

자유 결제 서비스

'지식인의 숲'은 "이용자 자유 결제 서비스"를 통해 지식의 가치를 공유합니다. 콘텐츠를 경험하신 후, 아래 안내에 따라 자유롭게 결제해 주세요.

자유 결제 : 국민은행 420401-04-167940 (주)재능넷
결제금액: 귀하가 받은 가치만큼 자유롭게 결정해 주세요
결제기간: 기한 없이 언제든 편한 시기에 결제 가능합니다

지적 재산권 보호 고지

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

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

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

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

 [프로젝트 가능 여부를 확인이 가장 우선입니다. 주문 전에 문의 해주세요] ※ 언어에 상관하지 마시고 일단 문의하여주세요!※ 절대 비...

IOS/Android/Win64/32(MFC)/MacOS 어플 제작해드립니다.제공된 앱의 화면은 아이폰,아이패드,안드로이드 모두  정확하게 일치합니...

 안녕하세요 현재 안드로이드 기반 어플리케이션 제작 및 서비스를 하고 있으며,스타트업회사에 재직중입니다.- 개인앱, 프로젝트용 앱 등부...

안녕하세요.2011년 개업하였고, 2013년 벤처 인증 받은 어플 개발 전문 업체입니다.50만 다운로드가 넘는 앱 2개를 직접 개발/운영 중이며,누구보...

📚 생성된 총 지식 9,772 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 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 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창