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

🌲 지식인의 숲 🌲

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

홈페이지 유지보수(수정) 및 제작 해드립니다.ASP, PHP, MSSQL, MYSQL, jQuery, Javascript, 각종 API연동 등홈페이지(웹/모바일) 개발 및 디자인 ...

안녕하세요.자기소개는 아래에 썼으니 참고부탁드리구요.(가끔 개인적 사정으로 인해 연락을 못받거나 답변이 늦어질 수 있습니다. 양해부탁...

안녕하세요.부동산, ​학원, 재고관리, ​기관/관공서, 기업, ERP, 기타 솔루션, 일반 서비스(웹, 모바일) 등다양한 분야에서 개발을 해왔습니...

워드프레스를 설치는 했지만, 그다음 어떻게 해야할지 모르시나요? 혹은 설치가 어렵나요?무료 워드프레스부터 프리미엄 테마까지 설치하여 드립니...

모듈 페더레이션을 활용한 마이크로프론트엔드 구현

2025-01-10 15:36:31

재능넷
조회수 9 댓글수 0

모듈 페더레이션으로 마이크로프론트엔드 구현하기 🚀

콘텐츠 대표 이미지 - 모듈 페더레이션을 활용한 마이크로프론트엔드 구현

 

 

안녕, 친구들! 오늘은 정말 흥미진진한 주제로 찾아왔어. 바로 '모듈 페더레이션을 활용한 마이크로프론트엔드 구현'이야. 뭔가 거창해 보이지? 걱정 마! 내가 쉽고 재미있게 설명해줄게. 마치 레고 블록을 조립하는 것처럼 웹 애플리케이션을 만드는 방법이라고 생각하면 돼. 😊

우리가 이 주제를 파헤치다 보면, 어쩌면 너도 나처럼 웹 개발의 매력에 푹 빠질지도 몰라. 그러다 보면 어느새 재능넷(https://www.jaenung.net)에서 너만의 웹 개발 재능을 공유하고 있을지도? 누가 알겠어, 넌 미래의 웹 개발 고수가 될 수도 있잖아! 🌟

자, 이제 본격적으로 시작해볼까? 준비됐어? 그럼 출발~! 🏁

1. 마이크로프론트엔드란 뭐야? 🤔

먼저 마이크로프론트엔드에 대해 알아보자. 이름부터 뭔가 복잡해 보이지? 하지만 걱정 마! 생각보다 간단한 개념이야.

마이크로프론트엔드는 큰 웹 애플리케이션을 작은 조각들로 나누는 방법이야. 마치 피자를 조각내는 것처럼 말이야. 🍕 각 조각은 독립적으로 개발되고, 배포되고, 운영될 수 있어. 이렇게 하면 여러 팀이 동시에 일할 수 있고, 유지보수도 쉬워지지.

마이크로프론트엔드의 장점:

  • 큰 프로젝트를 작은 단위로 나눠 관리할 수 있어 👍
  • 여러 팀이 독립적으로 일할 수 있어 효율적이야 🏃‍♂️
  • 기술 스택을 자유롭게 선택할 수 있어 유연해 🌈
  • 부분적인 업데이트와 배포가 가능해 빠르게 변화에 대응할 수 있어 🚀

예를 들어볼까? 온라인 쇼핑몰을 만든다고 생각해봐. 상품 목록, 장바구니, 결제 시스템 등 여러 부분으로 나눌 수 있겠지? 이걸 마이크로프론트엔드로 구현하면, 각 부분을 독립적인 애플리케이션으로 만들 수 있어. 그러면 상품 목록 팀, 장바구니 팀, 결제 팀이 각자 개발하고 업데이트할 수 있지. 멋지지 않아? 😎

마이크로프론트엔드 구조 상품 목록 장바구니 결제 시스템 통합 애플리케이션

이 그림을 보면 마이크로프론트엔드의 구조를 한눈에 이해할 수 있어. 각 부분이 독립적이면서도 하나의 큰 애플리케이션으로 통합되는 모습이 보이지? 이게 바로 마이크로프론트엔드의 핵심이야!

하지만 여기서 한 가지 의문이 들 수 있어. "어떻게 이 모든 조각들을 하나로 합칠 수 있을까?" 🤔 바로 이 지점에서 모듈 페더레이션이 등장하는 거야! 모듈 페더레이션은 이 조각들을 효과적으로 연결해주는 강력한 도구야. 마치 레고 블록을 연결하는 돌기와 구멍 같은 역할을 한다고 볼 수 있지.

모듈 페더레이션은 마이크로프론트엔드를 구현하는 데 있어 게임 체인저라고 할 수 있어. 이 기술 덕분에 우리는 더 쉽고 효율적으로 대규모 웹 애플리케이션을 만들 수 있게 됐어. 재능넷 같은 플랫폼에서도 이런 기술을 활용하면 더 유연하고 확장 가능한 시스템을 구축할 수 있겠지?

자, 이제 마이크로프론트엔드의 기본 개념을 알았으니, 다음 섹션에서는 모듈 페더레이션에 대해 더 자세히 알아보자. 준비됐어? 그럼 고고! 🚀

2. 모듈 페더레이션: 웹 개발의 새로운 영웅 🦸‍♂️

자, 이제 우리의 주인공 모듈 페더레이션에 대해 알아볼 차례야. 뭔가 거창한 이름 같지만, 사실 그 개념은 꽤 단순해. 모듈 페더레이션은 여러 개의 독립적인 빌드물(번들)이 서로 의존성을 공유하면서 동적으로 서로를 불러올 수 있게 해주는 웹팩의 기능이야. 음... 뭔가 어려워 보이지? 걱정 마, 쉽게 설명해줄게! 😉

모듈 페더레이션을 이해하기 위해, 우리가 피자 가게를 운영한다고 상상해보자. 🍕

모듈 페더레이션 = 피자 가게 프랜차이즈

  • 각 지점(마이크로프론트엔드)은 독립적으로 운영돼 🏠
  • 하지만 모든 지점은 같은 브랜드 아래에서 일관된 경험을 제공해 🍽️
  • 재료(공통 모듈)를 본사에서 일괄 공급받아 사용할 수 있어 🧀🍅
  • 특별한 메뉴(고유 기능)는 각 지점에서 개발할 수 있어 🍳
  • 손님(사용자)은 어느 지점을 가든 비슷한 경험을 할 수 있지 😊

이제 조금 감이 오지? 모듈 페더레이션은 마치 피자 프랜차이즈처럼 작동해. 각 지점(마이크로프론트엔드)은 독립적으로 운영되지만, 필요할 때 다른 지점의 "레시피"(코드)를 가져와 사용할 수 있어. 이렇게 하면 코드 중복을 줄이고, 효율적으로 개발할 수 있지.

그럼 모듈 페더레이션의 주요 특징들을 좀 더 자세히 살펴볼까?

  1. 동적 원격 로딩 (Dynamic Remote Loading): 필요한 코드만 그때그때 불러올 수 있어. 마치 피자 주문할 때 토핑을 선택하는 것처럼!
  2. 공유 모듈 (Shared Modules): 여러 애플리케이션에서 공통으로 사용하는 라이브러리나 컴포넌트를 공유할 수 있어. 피자 도우나 소스를 본사에서 공급받는 것과 비슷해.
  3. 버전 관리 (Version Control): 각 모듈의 버전을 관리할 수 있어, 호환성 문제를 방지할 수 있지. 레시피 업데이트와 비슷한 개념이야.
  4. 런타임 통합 (Runtime Integration): 애플리케이션이 실행 중일 때 필요한 모듈을 불러올 수 있어. 주문이 들어오면 그때그때 피자를 만드는 것과 같아.

모듈 페더레이션을 사용하면, 마이크로프론트엔드 구현이 한결 수월해져. 각 팀이 독립적으로 개발하면서도, 필요할 때 다른 팀의 코드를 쉽게 가져와 사용할 수 있거든. 이건 마치 재능넷에서 다양한 재능을 가진 사람들이 서로의 능력을 공유하는 것과 비슷해. 협업의 진정한 힘을 보여주는 거지! 💪

모듈 페더레이션 구조 App A App B App C Shared

이 그림을 보면 모듈 페더레이션의 구조를 더 잘 이해할 수 있을 거야. 각 앱(A, B, C)은 독립적이지만, 서로 연결되어 있고 공유 모듈을 함께 사용하고 있어. 이렇게 하면 코드 재사용성도 높아지고, 개발 효율성도 올라가지!

모듈 페더레이션의 또 다른 장점은 점진적인 업그레이드가 가능하다는 거야. 예를 들어, 너희 팀이 React 16을 사용하고 있는데, 새로운 기능을 위해 React 17을 사용해야 한다고 생각해봐. 모듈 페더레이션을 사용하면, 전체 애플리케이션을 한 번에 업그레이드할 필요 없이, 새로운 기능만 React 17로 개발하고 나머지는 그대로 둘 수 있어. cool하지? 😎

하지만 모든 기술이 그렇듯, 모듈 페더레이션도 주의해야 할 점이 있어:

  • 초기 설정이 조금 복잡할 수 있어 🔧
  • 버전 관리에 신경 써야 해 (서로 다른 버전의 라이브러리를 사용하면 문제가 생길 수 있거든) 📚
  • 네트워크 요청이 증가할 수 있어, 성능에 영향을 줄 수 있지 🌐

그래도 이런 단점들은 장점에 비하면 충분히 극복할 만해. 특히 대규모 프로젝트나 여러 팀이 협업하는 환경에서는 모듈 페더레이션의 이점이 훨씬 크거든.

자, 이제 모듈 페더레이션에 대해 어느 정도 감이 왔지? 다음 섹션에서는 이 멋진 기술을 실제로 어떻게 구현하는지 알아볼 거야. 코드를 보면 더 재밌어질 거야, 약속해! 🤓 준비됐어? 그럼 다음 섹션으로 고고! 🚀

3. 모듈 페더레이션 구현하기: 코드로 보는 마법 ✨

자, 이제 진짜 재미있는 부분이 왔어! 모듈 페더레이션을 실제로 어떻게 구현하는지 알아볼 거야. 걱정 마, 어려운 것 같아 보여도 천천히 따라오면 돼. 마치 레고 블록을 조립하는 것처럼, 하나씩 차근차근 해보자고! 🧱

먼저, 우리가 만들 예제 프로젝트의 구조를 살펴볼게:

  • host: 메인 애플리케이션
  • remote1: 원격 모듈 1 (예: 헤더 컴포넌트)
  • remote2: 원격 모듈 2 (예: 푸터 컴포넌트)

이 구조로 간단한 웹 페이지를 만들어볼 거야. host 앱이 remote1과 remote2의 컴포넌트를 불러와서 사용하는 거지. 마치 재능넷에서 여러 사람의 재능을 모아 하나의 멋진 프로젝트를 만드는 것처럼 말이야! 😉

자, 이제 코드를 보면서 하나씩 설명해줄게. 준비됐어? 여기 가봐!

1. 웹팩 설정하기

모듈 페더레이션을 사용하려면 먼저 웹팩 설정을 해야 해. 각 프로젝트(host, remote1, remote2)의 webpack.config.js 파일을 수정해야 하는데, 이게 바로 모듈 페더레이션의 마법이 시작되는 곳이야! ✨

먼저 host의 webpack.config.js 파일을 볼게:


const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");

module.exports = {
  // ... 다른 웹팩 설정들 ...
  plugins: [
    new ModuleFederationPlugin({
      name: "host",
      remotes: {
        remote1: "remote1@http://localhost:3001/remoteEntry.js",
        remote2: "remote2@http://localhost:3002/remoteEntry.js",
      },
      shared: ["react", "react-dom"],
    }),
  ],
};

이 설정을 보면, ModuleFederationPlugin을 사용해서 원격 모듈들을 정의하고 있어. remotes 객체에서 remote1과 remote2의 위치를 지정하고 있지. 그리고 shared 배열에는 공유할 라이브러리들을 명시하고 있어. 이렇게 하면 각 앱에서 React를 중복해서 로드하지 않아도 돼서 효율적이지!

이제 remote1의 webpack.config.js 파일을 볼게:


const ModuleFederationPlugin = require("webpack/lib/container/ModuleFederationPlugin");

module.exports = {
  // ... 다른 웹팩 설정들 ...
  plugins: [
    new ModuleFederationPlugin({
      name: "remote1",
      filename: "remoteEntry.js",
      exposes: {
        "./Header": "./src/Header",
      },
      shared: ["react", "react-dom"],
    }),
  ],
};

여기서 중요한 부분은 exposes 객체야. 이걸 통해 다른 앱에서 사용할 수 있는 모듈을 정의하고 있어. 이 경우에는 Header 컴포넌트를 노출시키고 있지.

remote2의 설정도 비슷해. 다만 Footer 컴포넌트를 노출시키겠지?

이렇게 설정을 마치면, 이제 각 앱은 서로의 모듈을 공유할 준비가 된 거야. 멋지지 않아? 🎉

2. 컴포넌트 만들기

이제 실제로 사용할 컴포넌트를 만들어보자. remote1의 Header 컴포넌트부터 볼게:


// remote1/src/Header.js
import React from 'react';

const Header = () => (
  <header style={{ background: '#61dafb', padding: '10px' }}>
    <h1>This is the Header from Remote 1</h1>
  </header>
);

export default Header;

간단하지? 이 헤더 컴포넌트는 remote1에서 정의되었지만, 곧 host 앱에서 사용될 거야.

remote2의 Footer 컴포넌트도 비슷해:


// remote2/src/Footer.js
import React from 'react';

const Footer = () => (
  <footer style={{ background: '#20232a', color: 'white', padding: '10px' }}>
    <p>This is the Footer from Remote 2</p>
  </footer>
);

export default Footer;

3. Host 앱에서 원격 컴포넌트 사용하기

자, 이제 진짜 마법이 시작될 차례야! host 앱에서 remote1과 remote2의 컴포넌트를 어떻게 사용하는지 보자:


// host/src/App.js
import React, { Suspense } from 'react';

const Header = React.lazy(() => import('remote1/Header'));
const Footer = React.lazy(() => import('remote2/Footer'));

const App = () => (
  <div>
    <Suspense fallback={<div>Loading Header...</div>}>
      <Header />
    </Suspense>
    <h1>Welcome to the Host App!</h1>
    <p>This is the main content of our application.</p>
    <Suspense fallback={<div>Loading Footer...</div>}>
      <Footer />
    </Suspense>
  </div>
);

export default App;

와우! 여기서 정말 멋진 일이 일어나고 있어. React.lazy와 Suspense를 사용해서 원격 컴포넌트를 동적으로 불러오고 있어. 이렇게 하면 필요할 때만 컴포넌트를 로드할 수 있어서 초기 로딩 시간을 줄일 수 있지.

이제 이 앱을 실행하면, host 앱이 remote1의 Header와 remote2의 Footer를 가져와서 표시할 거야. 마치 여러 개의 퍼즐 조각이 하나의 그림을 완성하는 것처럼 말이야! 🧩

🌟 모듈 페더레이션의 마법 포인트:

  • 각 앱은 독립적으로 개발되고 배포될 수 있어 👨‍💻👩‍💻
  • 필요한 컴포넌트만 동적으로 로드돼서 성능이 좋아 🚀
  • 코드 재사용성이 높아져서 개발 효율성이 올라가 📈
  • 큰 프로젝트를 작은 단위로 나눠서 관리할 수 있어 🧩

이렇게 모듈 페더레이션을 사용하면, 마이크로프론트엔드 아키텍처를 쉽게 구현할 수 있어. 각 팀이 독립적으로 개발하면서도, 필요할 때 다른 팀의 컴포넌트를 가져와 사용할 수 있지. 이건 마치 재능넷에서 여러 사람의 재능을 모아 하나의 멋진 프로젝트를 만드는 것과 같아. 협업의 새로운 차원을 열어주는 거지! 🚀

물론, 이건 아주 기본적인 예제야. 실제 프로젝트에서는 더 복잡한 상황들이 있을 수 있어. 예를 들면:

  • 여러 버전의 같은 라이브러리를 어떻게 관리할까? 🤔
  • 원격 모듈 로딩이 실패하면 어떻게 대처해야 할까? 🚨
  • 개발 환경과 프로덕션 환경에서의 설정은 어떻게 다르게 해야 할까? 🛠️

이런 문제들은 실제 프로젝트를 진행하면서 하나씩 해결해 나가야 해. 하지만 걱정 마! 모듈 페더레이션의 기본 개념만 잘 이해하고 있다면, 이런 문제들도 충분히 극복할 수 있을 거야. 😊

4. 실제 운영 시 고려사항

자, 이제 모듈 페더레이션의 기본적인 구현 방법을 알았으니, 실제 운영 시 고려해야 할 몇 가지 사항들을 살펴보자.

  1. 버전 관리: 공유 모듈의 버전을 잘 관리해야 해. 예를 들어, package.json에서 버전 범위를 명시적으로 지정하는 것이 좋아.
  2. 폴백(Fallback) 처리: 원격 모듈 로딩이 실패할 경우를 대비해 폴백 UI나 로직을 준비해두는 게 좋아. 예를 들면:

const Header = React.lazy(() => import('remote1/Header'));

const FallbackHeader = () => (
  <header>
    <h1>Oops! Couldn't load the header. But don't worry, we're still here!</h1>
  </header>
);

const App = () => (
  <div>
    <Suspense fallback={<FallbackHeader />}>
      <Header />
    </Suspense>
    {/* ... 나머지 컴포넌트들 ... */}
  </div>
);
  1. 성능 최적화: 필요한 모듈만 로드하도록 해야 해. 예를 들어, 라우팅을 이용해 필요한 페이지에서만 특정 원격 모듈을 로드하는 방식을 사용할 수 있어.
  2. 보안: 원격 모듈의 출처를 신뢰할 수 있는지 확인해야 해. HTTPS를 사용하고, 필요하다면 컨텐츠 보안 정책(CSP)을 설정하는 것이 좋아.
  3. 모니터링과 에러 추적: 원격 모듈의 로딩 상태와 에러를 모니터링하고 추적할 수 있는 시스템을 구축해야 해. 이를 통해 문제가 발생했을 때 빠르게 대응할 수 있지.

💡 Pro Tip: 개발 환경과 프로덕션 환경의 설정을 분리하는 것이 좋아. 개발 환경에서는 로컬 주소를 사용하고, 프로덕션 환경에서는 실제 배포된 URL을 사용하도록 설정할 수 있어. 환경 변수를 활용하면 이런 설정을 쉽게 관리할 수 있지!

자, 이제 모듈 페더레이션의 기본부터 실제 운영 시 고려사항까지 알아봤어. 어때, 생각보다 재미있지 않아? 🎢

모듈 페더레이션은 마이크로프론트엔드를 구현하는 강력한 도구야. 이를 통해 우리는 대규모 웹 애플리케이션을 더 효율적으로 개발하고 관리할 수 있게 됐어. 마치 재능넷에서 여러 사람의 재능을 모아 하나의 멋진 프로젝트를 만드는 것처럼 말이야. 🌟

하지만 기억해, 모든 기술이 그렇듯 모듈 페더레이션도 만능 해결책은 아니야. 프로젝트의 규모, 팀의 구조, 기술 스택 등을 고려해서 적절히 사용해야 해. 때로는 모놀리식 구조가 더 적합할 수도 있고, 때로는 다른 마이크로프론트엔드 구현 방식이 더 좋을 수도 있어. 중요한 건 프로젝트의 요구사항을 잘 파악하고, 그에 맞는 최선의 선택을 하는 거야. 👍

자, 이제 너도 모듈 페더레이션의 전문가가 된 것 같아! 이 지식을 가지고 더 멋진 웹 애플리케이션을 만들 수 있을 거야. 혹시 재능넷에서 웹 개발 프로젝트를 진행하게 된다면, 이 기술을 적용해볼 수 있겠지? 그럼 더 효율적이고 확장 가능한 시스템을 만들 수 있을 거야. 🚀

코딩의 세계는 정말 무궁무진해. 모듈 페더레이션은 그 중 하나의 멋진 도구일 뿐이야. 앞으로도 계속해서 새로운 기술과 방법들이 나올 거야. 그때마다 호기심을 가지고 배우고 적용해보는 게 중요해. 그게 바로 개발자의 醍醐味(대호미)지! 😉

자, 이제 정말 끝이야. 긴 여정이었지만, 함께 해줘서 고마워. 모듈 페더레이션과 마이크로프론트엔드의 세계로의 여행, 재미있었길 바라! 다음에 또 다른 흥미진진한 주제로 만나자. 그때까지 해피 코딩! 👋👨‍💻👩‍💻

관련 키워드

  • 모듈 페더레이션
  • 마이크로프론트엔드
  • 웹팩
  • React
  • 동적 로딩
  • 원격 모듈
  • 공유 모듈
  • 버전 관리
  • 성능 최적화
  • 협업

지적 재산권 보호

지적 재산권 보호 고지

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

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

© 2025 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

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

JAVA,JSP,PHP,javaScript(jQuery), 등의 개발을 전문적으로 하는 개발자입니다^^보다 저렴한 금액으로, 최고의 퀄리티를 내드릴 것을 자신합니다....

10년차 php 프로그래머 입니다. 그누보드, 영카트 외 php로 된 솔루션들 커스터마이징이나 오류수정 등 유지보수 작업이나신규개발도 가능합...

안녕하세요^^ 저는 12년 경력의 프리랜서 퍼블리셔​&​디자이너 입니다. 반응형 웹표준 웹접근성 모바일 하드코딩 가능합니다....

📚 생성된 총 지식 11,769 개

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

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

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