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

🌲 지식인의 숲 🌲

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

 안녕하세요. 개발자 GP 입니다. 모든 사이트 개발은 웹사이트 제작시 웹표준을 준수하여 진행합니다.웹표준이란 국제표준화 단체...

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

○ 2009년부터 개발을 시작하여 현재까지 다양한 언어와 기술을 활용해 왔습니다. 특히 2012년부터는 자바를 중심으로 JSP, 서블릿, 스프링, ...

웹 애플리케이션 오프라인 지원: Service Workers 활용

2024-09-26 20:48:31

재능넷
조회수 5 댓글수 0

🚀 웹 애플리케이션 오프라인 지원: Service Workers 활용 🚀

 

 

안녕하세요, 여러분! 오늘은 정말 흥미진진한 주제로 찾아왔어요. 바로 "웹 애플리케이션 오프라인 지원"에 대해 얘기해볼 건데요. 특히 Service Workers를 어떻게 활용하는지 알아볼 거예요. 이거 진짜 대박이에요! 😎

요즘 시대에 인터넷 없이 살 수 있나요? ㅋㅋㅋ 근데 가끔 와이파이가 끊기거나 데이터가 바닥날 때 있잖아요. 그럴 때 우리가 사용하는 웹 앱이 오프라인에서도 작동한다면? 와, 상상만 해도 미쳤다!!

자, 이제부터 Service Workers의 세계로 여러분을 초대할게요. 준비되셨나요? 고고씽~ 🏄‍♂️

Service Workers 소개 Service Workers: 오프라인의 영웅

Service Workers가 뭐야? 🤔

Service Workers는 브라우저가 백그라운드에서 실행하는 스크립트예요. 웹 페이지와는 별도로 돌아가면서 네트워크 요청을 가로채고, 캐시를 관리하고, 푸시 알림도 보낼 수 있어요. 완전 만능이죠?

꿀팁: Service Workers는 보안상의 이유로 HTTPS에서만 작동해요. 로컬 개발 환경에서는 localhost에서도 돌아가니까 걱정 마세요!

Service Workers로 뭘 할 수 있을까? 🛠️

  • 오프라인 경험 제공
  • 네트워크 요청 가로채기 및 수정
  • 리소스 및 API 응답 캐싱
  • 백그라운드 동기화
  • 푸시 알림

와, 이 정도면 진짜 대박이지 않나요? 😲

Service Worker 생명주기 💫

Service Worker의 생명주기는 좀 특이해요. 한번 살펴볼까요?

  1. 등록 (Registration): "야호, 내가 왔다!"
  2. 설치 (Installation): "짐 풀고 정착 중..."
  3. 활성화 (Activation): "자, 이제 일할 준비 됐어!"
Service Worker 생명주기 등록 설치 활성화

이렇게 세 단계를 거치면서 Service Worker가 우리 웹 앱의 든든한 지원군이 되는 거예요. 완전 쩐다! 👍

🛠️ Service Worker 구현하기 🛠️

자, 이제 실제로 Service Worker를 구현해볼 거예요. 긴장되죠? ㅋㅋㅋ 근데 걱정 마세요. 생각보다 어렵지 않아요!

1. Service Worker 등록하기 📝

먼저 우리의 웹 앱에 Service Worker를 등록해야 해요. 이건 메인 JavaScript 파일에서 해줄 거예요.


if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
    navigator.serviceWorker.register('/sw.js').then(function(registration) {
      console.log('서비스 워커 등록 성공:', registration.scope);
    }, function(err) {
      console.log('서비스 워커 등록 실패:', err);
    });
  });
}

이 코드는 뭘 하는 걸까요? 간단히 말하면, "야, 브라우저야! 서비스 워커 지원해? 그럼 이거 등록해줘!"라고 하는 거예요. 😄

2. Service Worker 스크립트 작성하기 ✍️

이제 'sw.js'라는 파일을 만들어서 실제 Service Worker 코드를 작성할 거예요.


const CACHE_NAME = 'my-site-cache-v1';
const urlsToCache = [
  '/',
  '/styles/main.css',
  '/script/main.js'
];

self.addEventListener('install', function(event) {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(function(cache) {
        console.log('캐시 열림');
        return cache.addAll(urlsToCache);
      })
  );
});

self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.match(event.request)
      .then(function(response) {
        if (response) {
          return response;
        }
        return fetch(event.request);
      }
    )
  );
});

우와, 이게 뭐냐고요? 차근차근 설명해드릴게요! 😊

  • CACHE_NAME: 우리 캐시의 이름이에요. 버전 관리할 때 유용해요.
  • urlsToCache: 캐시에 저장할 파일 목록이에요.
  • install 이벤트: Service Worker가 설치될 때 실행돼요. 여기서 캐시를 만들고 파일을 저장해요.
  • fetch 이벤트: 네트워크 요청이 있을 때마다 실행돼요. 캐시에 있으면 캐시에서, 없으면 네트워크에서 가져와요.

주의: Service Worker는 처음 등록 후 다음 페이지 로드부터 동작해요. 그래서 테스트할 때 새로고침을 한 번 더 해주세요!

3. 오프라인 경험 만들기 🏝️

이제 우리 웹 앱이 오프라인에서도 동작할 수 있어요. 와이파이가 끊겨도, 데이터가 떨어져도 걱정 없어요! ㅋㅋㅋ

오프라인 웹 경험 🏝️ 오프라인에서도 끄떡없어! 🏝️

이렇게 하면 기본적인 오프라인 지원이 가능해져요. 하지만 여기서 멈추면 재미없잖아요? 더 나아가볼까요? 😎

🚀 Service Workers 고급 기능 🚀

자, 이제 Service Workers의 더 쩌는 기능들을 알아볼 거예요. 준비되셨나요? Let's go! 🏃‍♂️💨

1. 동적 캐싱 🔄

지금까지는 미리 정해진 파일만 캐시했어요. 근데 사용자가 방문한 페이지를 자동으로 캐시하면 어떨까요?


self.addEventListener('fetch', function(event) {
  event.respondWith(
    caches.match(event.request)
      .then(function(response) {
        if (response) {
          return response;
        }
        
        return fetch(event.request).then(
          function(response) {
            if(!response || response.status !== 200 || response.type !== 'basic') {
              return response;
            }

            var responseToCache = response.clone();

            caches.open(CACHE_NAME)
              .then(function(cache) {
                cache.put(event.request, responseToCache);
              });

            return response;
          }
        );
      })
  );
});

이 코드는 뭘 하는 걸까요? 간단히 말하면, "어? 이 페이지 처음 봤네? 그럼 캐시에 저장해둘게!"라고 하는 거예요. 완전 똑똑하죠? 👨‍🎓

2. 백그라운드 동기화 🔁

오프라인에서 작업하다가 온라인이 되면 자동으로 서버와 동기화하는 기능이에요. 예를 들어, 오프라인에서 글을 쓰다가 온라인이 되면 자동으로 업로드되는 거죠!


self.addEventListener('sync', function(event) {
  if (event.tag == 'myFirstSync') {
    event.waitUntil(doSomeStuff());
  }
});

function doSomeStuff() {
  // 여기에 동기화할 작업을 넣어요
  return fetch('/api/update');
}

이렇게 하면 네트워크가 불안정해도 사용자 경험이 끊기지 않아요. 완전 smooth하죠? 😎

백그라운드 동기화 🔄 온라인? 오프라인? 걱정 마세요! 🔄

3. 푸시 알림 📢

Service Worker를 사용하면 웹 앱에서도 네이티브 앱처럼 푸시 알림을 보낼 수 있어요. 완전 꿀기능 아닌가요?


self.addEventListener('push', function(event) {
  const title = '새로운 메시지가 도착했어요!';
  const options = {
    body: event.data.text(),
    icon: '/images/icon.png',
    badge: '/images/badge.png'
  };

  event.waitUntil(self.registration.showNotification(title, options));
});

이 코드로 우리 웹 앱은 사용자에게 "야호~ 새 소식이야!"라고 알려줄 수 있어요. 근데 너무 자주 보내면 짜증날 수 있으니 적당히! ㅋㅋㅋ 😅

팁: 푸시 알림은 사용자의 동의가 필요해요. 동의를 구하는 UI도 잘 만들어야 해요!

4. 네트워크 우선 전략 🌐

지금까지는 캐시를 먼저 확인하고, 없으면 네트워크로 갔어요. 근데 항상 최신 데이터가 필요한 경우엔 어떻게 할까요?


self.addEventListener('fetch', function(event) {
  event.respondWith(
    fetch(event.request).catch(function() {
      return caches.match(event.request);
    })
  );
});

이 코드는 "일단 네트워크로 가보고, 안 되면 캐시를 볼게~"라고 하는 거예요. 최신 정보가 중요한 뉴스 앱 같은 데 좋겠죠? 📰

5. 캐시 관리하기 🧹

캐시가 너무 커지면 안 좋겠죠? 주기적으로 청소를 해줘야 해요.


self.addEventListener('activate', function(event) {
  var cacheWhitelist = ['my-site-cache-v2'];

  event.waitUntil(
    caches.keys().then(function(cacheNames) {
      return Promise.all(
        cacheNames.map(function(cacheName) {
          if (cacheWhitelist.indexOf(cacheName) === -1) {
            return caches.delete(cacheName);
          }
        })
      );
    })
  );
});

이 코드는 "오래된 캐시는 안녕~👋"이라고 하는 거예요. 깔끔하고 효율적이죠? 😊

🎨 Service Workers 활용 사례 🎨

자, 이제 이론은 충분히 배웠어요. 그럼 실제로 어디서 쓸 수 있을까요? 몇 가지 재미있는 예를 들어볼게요!

1. 오프라인 첫 화면 📱

네트워크가 없을 때 보여줄 멋진 오프라인 페이지를 만들어보는 건 어떨까요?


self.addEventListener('fetch', function(event) {
  event.respondWith(
    fetch(event.request).catch(function() {
      return caches.match('/offline.html');
    })
  );
});

이렇게 하면 인터넷이 끊겼을 때 "앗, 미안해요! 인터넷이 없어요. 😢" 같은 귀여운 메시지를 보여줄 수 있어요.

오프라인 첫 화면 📵 오프라인이어도 괜찮아요! 📵

2. 게임 앱 🎮

Service Worker를 이용하면 웹 게임을 오프라인에서도 즐길 수 있어요. 예를 들어, 간단한 퍼즐 게임을 만들어볼까요?


const CACHE_NAME = 'puzzle-game-v1';
const urlsToCache = [
  '/',
  '/styles/game.css',
  '/scripts/game.js',
  '/images/puzzle-pieces.png'
];

self.addEventListener('install', function(event) {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(function(cache) {
        return cache.addAll(urlsToCache);
      })
  );
});

이렇게 하면 지하철에서도, 비행기에서도 게임을 즐길 수 있어요. 심심할 틈이 없겠죠? ㅋㅋㅋ 😆

3. 뉴스 앱 📰

최신 뉴스는 온라인에서 가져오고, 오프라인일 때는 캐시된 뉴스를 보여주는 앱을 만들어볼까요?


self.addEventListener('fetch', function(event) {
  if (event.request.url.includes('/api/news')) {
    event.respondWith(
      fetch(event.request).then(function(response) {
        var responseToCache = response.clone();
        caches.open(CACHE_NAME).then(function(cache) {
          cache.put(event.request, responseToCache);
        });
        return response;
      }).catch(function() {
        return caches.match(event.request);
      })
    );
  }
});

이렇게 하면 항상 최신 뉴스를 볼 수 있고, 오프라인일 때도 뭔가 읽을 거리가 있겠죠? 📚

4. 재능넷 활용 사례 🌟

우리 재능넷에서도 Service Worker를 활용할 수 있어요. 예를 들어, 사용자가 자주 보는 재능 목록을 캐시해두면 어떨까요?


self.addEventListener('fetch', function(event) {
  if (event.request.url.includes('/api/talents')) {
    event.respondWith(
      caches.open('talents-cache').then(function(cache) {
        return cache.match(event.request).then(function(response) {
          var fetchPromise = fetch(event.request).then(function(networkResponse) {
            cache.put(event.request, networkResponse.clone());
            return networkResponse;
          });
          return response || fetchPromise;
        });
      })
    );
  }
});

이렇게 하면 재능넷 사용자들이 오프라인에서도 자주 보는 재능 목록을 볼 수 있어요. 편리하죠? 😊

아이디어: 재능넷에서 Service Worker를 활용하면 오프라인에서도 재능 정보를 볼 수 있고, 나중에 온라인이 되면 자동으로 관심 재능에 '좋아요'를 누를 수 있게 할 수도 있어요!

🎓 Service Workers 최적화 팁 🎓

자, 이제 Service Workers를 어떻게 더 잘 쓸 수 있는지 알아볼까요? 여기 몇 가지 꿀팁을 준비했어요! 🍯

1. 캐시 전략 선택하기 🤔

상황에 따라 다른 캐시 전략을 사용하면 좋아요. 몇 가지 예를 들어볼게요:

  • Cache First: 캐시를 먼저 확인하고, 없으면 네트워크로 가요. 자주 변하지 않는 리소스에 좋아요.
  • Network First: 네트워크를 먼저 시도하고, 실패하면 캐시를 사용해요. 최신 데이터가 중요할 때 좋아요.
  • Stale While Revalidate: 캐시된 버전을 먼저 보여주고, 백그라운드에서 업데이트해요. 빠른 응답과 최신 데이터를 모두 원할 때 좋아요.
캐시 전략 Cache First Network First Stale While Revalidate

이렇게 상황에 맞는 전략을 선택하면 사용자 경험이 훨씬 좋아져요. 완전 프로 개발자 느낌 아니에요? 😎

2. 버전 관리하기 📊

Service Worker를 업데이트할 때마다 캐시 이름을 변경하는 게 좋아요. 이렇게요:


const CACHE_VERSION = 'v2';
const CACHE_NAME = `my-site-cache-${CACHE_VERSION}`;

이렇게 하면 새로운 버전의 Service Worker가 설치될 때 이전 캐시를 지우고 새로운 캐시를 만들 수 있어요. 깔끔하죠? ✨

3. 디버깅하기 🐛

Service Worker 디버깅은 좀 까다로울 수 있어요. 하지만 Chrome DevTools를 사용하면 쉽게 할 수 있어요!

  1. Chrome에서 개발자 도구를 열어요 (F12 키)
  2. Application 탭으로 가요
  3. 왼쪽 사이드바에서 Service Workers를 클릭해요

여기서 Service Worker의 상태를 확인하고, 업데이트하고, 삭제할 수 있어요. 완전 편리하죠? 👨‍💻

팁: console.log()를 Service Worker 코드에 넣어서 로그를 확인할 수 있어요. 개발할 때 정말 유용해요!

4. 성능 최적화 🚀

Service Worker로 웹 앱의 성능을 크게 향상시킬 수 있어요. 여기 몇 가지 팁이 있어요:

  • 중요한 리소스만 미리 캐시하세요. 모든 걸 캐시하면 저장 공간을 너무 많이 차지해요.
  • 네트워크 요청을 최소화하세요. 여러 개의 작은 파일보다 하나의 큰 파일을 요청하는 게 더 효율적일 수 있어요.
  • 이미지는 WebP 형식을 사용하세요. 더 작고 빠르거든요!

이렇게 하면 여러분의 웹 앱이 로켓처럼 빨라질 거예요! 🚀

🌈 Service Workers의 미래 🌈

자, 이제 Service Workers의 현재를 충분히 알아봤으니 미래도 한번 살펴볼까요? 어떤 멋진 일들이 기다리고 있을지 정말 궁금하지 않나요? 😃

1. 더 강력한 오프라인 기능 💪

앞으로 Service Workers는 더 복잡하고 강력한 오프라인 기능을 제공할 거예요. 예를 들어, 전체 데이터베이스를 오프라 인에서 동기화하고 관리할 수 있게 될 거예요. 이렇게 되면 웹 앱과 네이티브 앱의 경계가 더욱 모호해질 거예요. 와, 상상만 해도 신나지 않나요? 🤩

2. 머신러닝과의 결합 🤖

Service Workers와 머신러닝이 만나면 어떻게 될까요? 예를 들어, 사용자의 행동 패턴을 학습해서 자주 사용하는 기능을 미리 캐시해둘 수 있어요. 완전 스마트하죠?


// 미래의 Service Worker 코드 예시
self.addEventListener('predict', async function(event) {
  const userBehavior = await ml.analyzeUserBehavior();
  const predictedResources = ml.predictNextResources(userBehavior);
  
  event.waitUntil(
    caches.open('predicted-cache').then(function(cache) {
      return cache.addAll(predictedResources);
    })
  );
});

이런 코드가 실제로 동작하는 날이 올지도 몰라요. 그날이 오면 우리 웹 앱은 마치 미래를 예측하는 것처럼 빠르게 동작할 거예요! 🔮

3. 증강현실(AR)과 가상현실(VR) 지원 👓

웹에서도 AR과 VR이 점점 중요해지고 있죠? Service Workers가 이런 기술들과 결합하면 정말 흥미로운 일이 벌어질 거예요. 예를 들어, AR 콘텐츠를 미리 캐시해두고 오프라인에서도 볼 수 있게 만들 수 있어요.

AR/VR과 Service Workers 🕶️ AR/VR + Service Workers = 미래 🕶️

이렇게 되면 인터넷이 없는 곳에서도 가상 박물관을 관람하거나 AR 게임을 즐길 수 있게 될 거예요. 완전 미쳤다! 👏

4. 더 스마트한 푸시 알림 📱

현재의 푸시 알림도 꽤 유용하지만, 미래에는 더 스마트해질 거예요. 사용자의 상황과 선호도를 고려해서 가장 적절한 시점에 가장 관련성 높은 알림만 보내는 거죠.


// 미래의 스마트 푸시 알림 코드
self.addEventListener('smartpush', async function(event) {
  const userContext = await getUserContext();
  const relevantNotifications = await getRelevantNotifications(userContext);
  
  if (shouldSendNotification(relevantNotifications, userContext)) {
    self.registration.showNotification(relevantNotifications[0].title, {
      body: relevantNotifications[0].body,
      icon: relevantNotifications[0].icon
    });
  }
});

이런 식으로 동작하면 사용자들이 "또 알림이야?" 하면서 짜증내는 일은 없어질 거예요. 대신 "와, 이거 지금 딱 필요했는데!" 하면서 좋아할 거예요. 😊

5. 웹 어셈블리(WebAssembly)와의 통합 🔧

웹 어셈블리는 웹에서 고성능 코드를 실행할 수 있게 해주는 기술이에요. 이게 Service Workers와 만나면 어떻게 될까요? 예를 들어, 복잡한 데이터 처리나 암호화를 Service Worker 내에서 웹 어셈블리로 처리할 수 있을 거예요.


// 미래의 Service Worker + WebAssembly 코드
importScripts('wasm-module.js');

self.addEventListener('fetch', async function(event) {
  if (event.request.url.includes('/api/data')) {
    const response = await fetch(event.request);
    const data = await response.json();
    
    // WebAssembly를 사용한 고속 데이터 처리
    const processedData = await wasmModule.processData(data);
    
    event.respondWith(new Response(JSON.stringify(processedData)));
  }
});

이렇게 되면 웹 앱의 성능이 네이티브 앱 수준으로 올라갈 수 있어요. 완전 대박이죠? 🎉

미래 전망: Service Workers는 계속 발전할 거예요. 웹의 미래를 만드는 핵심 기술 중 하나가 될 거라고 확신해요!

관련 키워드

  • Service Workers
  • 오프라인 지원
  • 웹 애플리케이션
  • 캐시 전략
  • 푸시 알림
  • 백그라운드 동기화
  • 성능 최적화
  • 웹 어셈블리
  • 증강현실
  • 머신러닝

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

자유 결제 서비스

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

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

지적 재산권 보호 고지

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

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

© 2024 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

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

 기본 작업은 사이트의 기능수정입니다.호스팅에 보드 설치 및 셋팅. (그누, 제로, 워드, 기타 cafe24,고도몰 등)그리고 각 보드의 대표적인 ...

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

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

주된 경력은 php기반 업무용 웹프로그램 개발입니다.웹프로그램과 연계되는 윈도우용 응용프로그램도 가능합니다. 학사관리시스템,리스업무관...

📚 생성된 총 지식 3,369 개

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