CINXE.COM

INSIDE NHN | NHN 공식 뉴스룸

<!DOCTYPE html> <html lang="ko"> <head> <!-- Open Graph --> <meta name="twitter:image" content="https://inside.nhn.com/connect/img/NHN.png"> <meta property="og:title" content="INSIDE NHN | NHN 공식 뉴스룸"> <meta property="og:image" content="https://inside.nhn.com/connect/img/NHN.png"> <meta property="og:url" content="https://inside.nhn.com"> <meta property="og:site_name" content="INSIDE NHN"> <meta property="og:keywords" content="INSIDE NHN, 인사이드 NHN, NHN, 엔에이치엔"> <meta property="og:description" content="NHN의 사람, 기술, 문화 이야기, NHN 그룹사의 생생한 이야기를 만나보세요."> <link rel="canoncial" href="https://inside.nhn.com"> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="naver-site-verification" content="36b152b4c322c7115c911959c0e6e2e8591186a9" /> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"> <meta name="keywords" content="INSIDE NHN, 인사이드 NHN, NHN, 엔에이치엔, NHN 그룹사 뉴스룸, NHN 공식 뉴스룸, NHN채용, NHN Careers"> <meta name="description" content="NHN의 사람, 기술, 문화 이야기, NHN 그룹사의 생생한 이야기를 만나보세요."> <meta name="robots" content="ALL"> <meta name="robots" content="index,follow"> <!-- // Open Graph --> <meta name="msapplication-TileColor" content="#191919"> <meta name="theme-color" content="#ffffff"> <link rel="apple-touch-icon" size="180x180" href="/connect/img/apple-touch-icon.png"> <link rel="apple-touch-icon" size="180x180" href="/connect/img/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="/connect/img/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/connect/img/favicon-16x16.png"> <link rel="manifest" href="/connect/site.webmanifest"> <link rel="mask-icon" href="/connect/img/favicon.svg" color="#191919"/> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""> <link href="https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&amp;display=swap" rel="stylesheet"> <link rel="stylesheet" as="style" crossorigin="" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css"> <title>INSIDE NHN | NHN 공식 뉴스룸</title> <link rel="stylesheet" href="/connect/css/min/libs.min.css"> <link rel="stylesheet" href="/connect/css/inside.css"> <script src="https://developers.kakao.com/sdk/js/kakao.min.js"></script> <script src="/connect/js/min/libs.min.js"></script> <script src="/connect/js/acecounter/ace-counter.js"></script> <style>@import url("https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css");</style> <script async src="https://www.googletagmanager.com/gtag/js?id=AW-10812519724"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'AW-10812519724'); </script> <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "Person", "name": "INSIDE NHN", "url": "https://inside.nhn.com", "sameAs": [ "https://www.youtube.com/@NHNofficial", "https://www.instagram.com/nhn_corp/" ] } </script> <script type="application/ld+json"> { "@context":"http://schema.org", "@type":"ItemList", "itemListElement":[ { "@type": "ListItem", "name": "사람&문화", "image": "https://inside.nhn.com/brand_/storyboard/2024/202412241753251.jpg", "url": "https://inside.nhn.com/peoplenculture", "position": 1 }, { "@type": "ListItem", "name": "기술", "image": "https://inside.nhn.com/brand_/storyboard/2024/202410161531001.jpg", "url": "https://inside.nhn.com/tech", "position": 2 }, { "@type": "ListItem", "name": "서비스", "image": "https://inside.nhn.com/brand_/storyboard/2025/202503071711051.jpg", "url": "https://inside.nhn.com/service", "position": 3 }, { "@type": "ListItem", "name": "기업", "image": "https://inside.nhn.com/brand_/storyboard/2025/202501171421091.jpg", "url": "https://inside.nhn.com/corp", "position": 4 }, { "@type": "ListItem", "name": "뉴스", "image": "https://inside.nhn.com/ko_/pr/boardImage/2025/202503140915321.jpg", "url": "https://inside.nhn.com/news", "position": 5 } ] } </script> </head> <!-- [D] 모바일, 테블릿에 해당하는 뷰포트의 경우, .side-menu 활성화 시 body에 is--gnb-active, is--hidden 클래스 추가(데스크탑에 해당하는 뷰포트의 경우, is--gnb-active, is--hidden 클래스 제거) --> <!-- [D] 모바일, 테블릿에 해당하는 뷰포트의 경우, .layer-search 활성화 시 body에 is--search-active, is--hidden 클래스 추가 --> <!-- [D] 스크롤 방향에 따라 is--scroll-down, is--scroll-up 클래스 추가 --> <body data-pagestatus="new : 24.05.10 : update : 24.06.07"> <div class="page-overlay-transition"> <i class="icon__logo--white">INSIDE NHN</i> </div> <script> function moveBannerPage(bannerUrl) { window.location.href = bannerUrl; } </script> <div id="skip-navi" class="skip-navi"> <a class="skip-navi__item" href="#container">본문 바로가기</a> </div> <div class="wrap"> <header class="header"> <div class="header__inner"> <script> const bodyEl = document.querySelector('body'); const transitionOverlayDuration = 1; const transitionOverlay = document.querySelector('.page-overlay-transition'); const tansitionLetter = document.querySelector('.page-overlay-transition .icon__logo--white'); const tl = gsap.timeline({}) function getUrl(href) { const asArr = href.split('/'); for (let i = 0; i < asArr.length; i++) { if (asArr[i].match('.html')) { const prevUrlArr = asArr[i].split('.'); return prevUrlArr[0] } } } function setUrl(currentPage) { if (currentPage === null) return history.replaceState(null, null, window.location.href); if (currentPage !== null) { let prevUrl = getUrl(location.href); history.pushState({ 'prevUrl': prevUrl, 'currentUrl': currentPage }, '', currentPage); } } function handlePageTransitionIn() { transitionOverlay.setAttribute('style', '--page-overlay-transY: 0'); tl.fromTo(transitionOverlay, { '--page-overlay-transition-clip-path': '100% 0% 0% 0%' }, { '--page-overlay-transition-clip-path': '0% 0% 0% 0%', duration: transitionOverlayDuration * .7, ease: 'power3.out', }) } function handlePageTransitionOut() { tl.fromTo(transitionOverlay, { '--page-overlay-transition-clip-path': '0% 0% 0% 0%' }, { '--page-overlay-transition-clip-path': '0% 0% 100% 0%', duration: transitionOverlayDuration * .7, delay: transitionOverlayDuration * .15, ease: 'power3.out', onComplete: function () { tl.set(tansitionLetter, { yPercent: 0, }) } }) tl.to(tansitionLetter, { yPercent: -100, duration: transitionOverlayDuration * .35, delay: transitionOverlayDuration * .15, ease: 'power3.out', onComplete: function () { bodyEl.classList.remove('is--transitioning') }, }, 0) } function loadContent(currentPage) { setUrl(currentPage); let timer; clearTimeout(timer); timer = setTimeout(() => { location.href = currentPage; }, transitionOverlayDuration * 670); if (history.state === null || history.state.prevUrl === history.state.currentUrl) return; if (history.state !== null && history.state.prevUrl !== history.state.currentUrl) { handlePageTransitionIn(); } } if (history.state !== null && history.state.prevUrl !== history.state.currentUrl) { bodyEl.classList.add('is--transitioning'); handlePageTransitionOut() setUrl(null); } let isPopstateHandled = false; window.addEventListener('popstate', function (event) { if (!isPopstateHandled) { isPopstateHandled = true; window.location.reload(); } }); </script> <h1 class="logo"> <a href="javascript:void(0)" onclick="loadContent('/')"> INSIDE NHN </a> </h1> <div class="side-menu"> <div class="side-menu__top--sm"> <h2 class="logo"> <a href="javascript:void(0)" onclick="loadContent('/')"> INSIDE NHN </a> </h2> <!-- [D] 클릭 시 .side-menu 활성화/비활성화 --> <button type="button" class="button__icon-only--md button__sidemenu-control">메뉴</button> </div> <nav class="gnb"> <ul class="gnb__list"> <li class="gnb__item is--active"> <a href="javascript:void(0)" onclick="loadContent('/peoplenculture')">사람&amp;문화</a> </li> <li class="gnb__item is--active"> <a href="javascript:void(0)" onclick="loadContent('/tech')">기술</a> </li> <li class="gnb__item is--active"> <a href="javascript:void(0)" onclick="loadContent('/service')">서비스</a> </li> <li class="gnb__item is--active"> <a href="javascript:void(0)" onclick="loadContent('/corp')">기업</a> </li> <li class="gnb__item is--active"> <a href="javascript:void(0)" onclick="loadContent('/news')">뉴스</a> </li> </ul> </nav> <div class="rolling-banner"> <div class="rolling-banner__inner swiper"> <ul class="rolling-banner__list swiper-wrapper"> <li class="rolling-banner__item swiper-slide"> <a href="javascript:void(0)" onclick="loadContent('/company')"> <span class="rolling-banner__txt">우리의 연결로 만드는 새로운 내일</span> </a> </li> <li class="rolling-banner__item swiper-slide"> <a href="javascript:void(0)" onclick="loadContent('/company')"> <span class="rolling-banner__txt">Weaving New Play. NHN</span> </a> </li> <li class="rolling-banner__item swiper-slide"> <a href="javascript:void(0)" onclick="loadContent('/company')"> <span class="rolling-banner__txt">우리의 연결로 만드는 새로운 내일</span> </a> </li> <li class="rolling-banner__item swiper-slide"> <a href="javascript:void(0)" onclick="loadContent('/company')"> <span class="rolling-banner__txt">Weaving New Play. NHN</span> </a> </li> </ul> </div> </div> </div> <div class="layer-search"> <script> $(document).ready(function() { $('#searchForm').submit(function(event) { event.preventDefault(); const searchText = $('#searchInput').val(); const url = '/search?keyword=' + encodeURIComponent(searchText); window.location.href = url; }) }); function searchByHashtag(element) { setUrl('/'); let url = '/search?keyword=' + encodeURIComponent(element.textContent); window.location.href = url; } document.querySelectorAll('.hash').forEach(function(element) { element.addEventListener('click', function(event) { event.preventDefault(); searchByHashtag(element); }); }); </script> <div class="layer-search__inner"> <div class="layer-search__content"> <form role="search" id="searchForm"> <div class="search-inputs"> <!-- [D] 타이핑할 때 .button__reset style="--layer-search-button-clip-path: 0% 0% 0% 0%" 추가되며 타이핑된 텍스트 없을 때 style="--layer-search-button-clip-path: 100% 0% 0% 0%" 추가 --> <input type="search" id="searchInput" placeholder="검색어를 입력하세요" autocomplete="off"> <input type="reset" class="button__icon-only--xsm button__reset"> <input type="submit" id="searchsubmit" class="button__icon-only--md button__search"> </div> </form> <div class="hashes"> <a href="javascript:void(0)" class="hash" onclick="searchByHashtag(this)">NHN</a> <a href="javascript:void(0)" class="hash" onclick="searchByHashtag(this)">소셜비즈</a> <a href="javascript:void(0)" class="hash" onclick="searchByHashtag(this)">워크인NHN</a> <a href="javascript:void(0)" class="hash" onclick="searchByHashtag(this)">두레이</a> <a href="javascript:void(0)" class="hash" onclick="searchByHashtag(this)">ESG</a> <a href="javascript:void(0)" class="hash" onclick="searchByHashtag(this)">다키스트데이즈</a> <a href="javascript:void(0)" class="hash" onclick="searchByHashtag(this)">클라우드</a> </div> </div> <!-- [D] 클릭 시 .layer-search 비활성화, 모바일에서 display: none --> <button type="button" class="button__search-close"><i class="button__icon-only--md icon__search-close--black">닫기</i></button> </div> </div> <!-- [D] 클릭 시 .layer-search 활성화/모바일에서 비활성화 --> <button type="button" class="button__icon-only--md button__search-control">검색</button> <!-- [D] 클릭 시 .side-menu 활성화/비활성화 --> <button type="button" class="button__icon-only--md button__sidemenu-control">메뉴</button> </div> </header> <main id="container" class="container"> <div class="sec-content"> <!-- [D] 메인 배너 --> <div class="main-banner swiper"> <div class="swiper-wrapper"> <div class="swiper-slide" onclick="moveBannerPage('https://inside.nhn.com/service/253')"> <picture class="main-banner__visual large-content"> <!-- [D] mobile, tablet, pc용 이미지 삽입 --> <source media="(max-width:673px)" srcset="/brand_/bigBanner/2025/PC/202503101431391.jpg"> <source media="(max-width:1199px)" srcset="/brand_/bigBanner/2025/PC/202503101431391.jpg"> <img draggable="false" fetchpriority="high" loading="eager" decoding="async" src="/brand_/bigBanner/2025/PC/202503101431391.jpg" alt="일본 잘파세대가 게임을 즐기는 방법🎮<br>#콤파스 매력 대해부"> </picture> <div class="main-banner__content"> <h2 class="main-banner__tit">일본 잘파세대가 게임을 즐기는 방법🎮<br>#콤파스 매력 대해부</h2> </div> </div> <div class="swiper-slide" onclick="moveBannerPage('https://inside.nhn.com/corp/250')"> <picture class="main-banner__visual large-content"> <!-- [D] mobile, tablet, pc용 이미지 삽입 --> <source media="(max-width:673px)" srcset="/brand_/bigBanner/2025/PC/202501171522351.jpg"> <source media="(max-width:1199px)" srcset="/brand_/bigBanner/2025/PC/202501171522351.jpg"> <img draggable="false" fetchpriority="high" loading="eager" decoding="async" src="/brand_/bigBanner/2025/PC/202501171522351.jpg" alt="지구를 지키는 기술<br>NHN의 ESG 환경 스토리"> </picture> <div class="main-banner__content"> <h2 class="main-banner__tit">지구를 지키는 기술<br>NHN의 ESG 환경 스토리</h2> </div> </div> <div class="swiper-slide" onclick="moveBannerPage('https://inside.nhn.com/service/249')"> <picture class="main-banner__visual large-content"> <!-- [D] mobile, tablet, pc용 이미지 삽입 --> <source media="(max-width:673px)" srcset="/brand_/bigBanner/2025/PC/202501171519021.jpg"> <source media="(max-width:1199px)" srcset="/brand_/bigBanner/2025/PC/202501171519021.jpg"> <img draggable="false" fetchpriority="high" loading="eager" decoding="async" src="/brand_/bigBanner/2025/PC/202501171519021.jpg" alt="오픈런 필수<br>#콤파스 페스티벌 현장"> </picture> <div class="main-banner__content"> <h2 class="main-banner__tit">오픈런 필수<br>#콤파스 페스티벌 현장</h2> </div> </div> </div> <div class="main-banner__control"> <button type="button" class="button__icon-only--md icon__chev-prev--white">이전</button> <div class="main-banner__pagination"></div> <button type="button" class="button__icon-only--md icon__chev-next--white">다음</button> </div> </div> <!-- // [D] 메인 배너 --> <!-- [D] 추천 아티클 --> <section id="main-article" class="sec main-sec-article"> <div class="sec__head"> <h3 class="sec__title">추천 아티클</h3> </div> <div class="sec__body"> <div class="card card-article"> <a href="/service/254"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">기술</span> <span class="card__label">인터뷰</span> </div> <div class="card__img-box"> <!-- [D] 이미지 lazy loading시 src에 placeholder 이미지, data-src에 이미지 추가 --> <img draggable="false" decoding="async" src="/connect/img/placeholder.png" data-src="/brand_/storyboard/2025/202503071711051.jpg" alt="NHN 컨택센터의 새로운 이름, 'Contiple'을 소개합니다!"> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">NHN 컨택센터의 새로운 이름, 'Contiple'을 소개합니다!</strong> <span class="card__desc">NHN</span> </div> </a> </div> <div class="card card-article"> <a href="/service/253"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">게임</span> </div> <div class="card__img-box"> <!-- [D] 이미지 lazy loading시 src에 placeholder 이미지, data-src에 이미지 추가 --> <img draggable="false" decoding="async" src="/connect/img/placeholder.png" data-src="/brand_/storyboard/2025/202503041547411.jpg" alt="일본 잘파세대가 게임을 즐기는 방법! 🎮 #콤파스 매력 대해부 영상 3종 세트 "> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">일본 잘파세대가 게임을 즐기는 방법! 🎮 #콤파스 매력 대해부 영상 3종 세트 </strong> <span class="card__desc">NHN</span> </div> </a> </div> <div class="card card-article"> <a href="/service/252"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">기술</span> </div> <div class="card__img-box"> <!-- [D] 이미지 lazy loading시 src에 placeholder 이미지, data-src에 이미지 추가 --> <img draggable="false" decoding="async" src="/connect/img/placeholder.png" data-src="/brand_/storyboard/2025/202502261513161.jpg" alt="NHN DATA 소셜비즈가 내놓은 인스타그램 마케팅의 성공 방정식"> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">NHN DATA 소셜비즈가 내놓은 인스타그램 마케팅의 성공 방정식</strong> <span class="card__desc">NHN DATA</span> </div> </a> </div> <div class="card card-article"> <a href="/service/251"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">결제·광고</span> </div> <div class="card__img-box"> <!-- [D] 이미지 lazy loading시 src에 placeholder 이미지, data-src에 이미지 추가 --> <img draggable="false" decoding="async" src="/connect/img/placeholder.png" data-src="/brand_/storyboard/2025/202502071723081.jpg" alt="[2024 연말결산 리포트] 요노족이 가장 사랑한 PAYCO 요모조모"> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">[2024 연말결산 리포트] 요노족이 가장 사랑한 PAYCO 요모조모</strong> <span class="card__desc">NHN PAYCO</span> </div> </a> </div> <div class="card card-article"> <a href="/corp/250"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">지속가능경영</span> </div> <div class="card__img-box"> <!-- [D] 이미지 lazy loading시 src에 placeholder 이미지, data-src에 이미지 추가 --> <img draggable="false" decoding="async" src="/connect/img/placeholder.png" data-src="/brand_/storyboard/2025/202501171421091.jpg" alt="지구를 지키는 기술, NHN의 ESG 환경 스토리"> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">지구를 지키는 기술, NHN의 ESG 환경 스토리</strong> <span class="card__desc">NHN</span> </div> </a> </div> <div class="card card-article"> <a href="/service/249"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">게임</span> </div> <div class="card__img-box"> <!-- [D] 이미지 lazy loading시 src에 placeholder 이미지, data-src에 이미지 추가 --> <img draggable="false" decoding="async" src="/connect/img/placeholder.png" data-src="/brand_/storyboard/2025/202501131045051.jpg" alt="[INSIDE NHN] ‘오픈런 필수’…NHN의 일본 게임 행사 ‘#콤파스 페스티벌’ 현장 "> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">[INSIDE NHN] ‘오픈런 필수’…NHN의 일본 게임 행사 ‘#콤파스 페스티벌’ 현장 </strong> <span class="card__desc">NHN</span> </div> </a> </div> <div class="card card-article"> <a href="/peoplenculture/248"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">리틀액션</span> </div> <div class="card__img-box"> <!-- [D] 이미지 lazy loading시 src에 placeholder 이미지, data-src에 이미지 추가 --> <img draggable="false" decoding="async" src="/connect/img/placeholder.png" data-src="/brand_/storyboard/2024/202412241753251.jpg" alt="굿바이마켓이 활짝 열렸습니다 "> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">굿바이마켓이 활짝 열렸습니다 </strong> <span class="card__desc">NHN</span> </div> </a> </div> <div class="card card-article"> <a href="/service/247"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">게임</span> </div> <div class="card__img-box"> <!-- [D] 이미지 lazy loading시 src에 placeholder 이미지, data-src에 이미지 추가 --> <img draggable="false" decoding="async" src="/connect/img/placeholder.png" data-src="/brand_/storyboard/2024/202412241456251.jpg" alt="PLAY the MUSEUM! 다시 돌아온 ‘NHN 게임스 위크’ 스케치!"> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">PLAY the MUSEUM! 다시 돌아온 ‘NHN 게임스 위크’ 스케치!</strong> <span class="card__desc">NHN</span> </div> </a> </div> <div class="card card-article"> <a href="/service/246"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">커머스</span> </div> <div class="card__img-box"> <!-- [D] 이미지 lazy loading시 src에 placeholder 이미지, data-src에 이미지 추가 --> <img draggable="false" decoding="async" src="/connect/img/placeholder.png" data-src="/brand_/storyboard/2024/202412181433531.png" alt="파트너사와 고객사를 연결하는 박은혜 팀장, 이진성 매니저의 이야기"> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">파트너사와 고객사를 연결하는 박은혜 팀장, 이진성 매니저의 이야기</strong> <span class="card__desc">NHN COMMERCE</span> </div> </a> </div> <div class="card card-article"> <a href="/corp/245"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">브랜딩</span> </div> <div class="card__img-box"> <!-- [D] 이미지 lazy loading시 src에 placeholder 이미지, data-src에 이미지 추가 --> <img draggable="false" decoding="async" src="/connect/img/placeholder.png" data-src="/brand_/storyboard/2024/202412190940241.jpg" alt="[리브랜딩 스토리 4] 우리의 현재와 미래를 닮은 새로운 CI"> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">[리브랜딩 스토리 4] 우리의 현재와 미래를 닮은 새로운 CI</strong> <span class="card__desc">NHN</span> </div> </a> </div> </div> </section> <!-- // [D] 추천 아티클 --> <!-- [D] 새로운 내일을 만드는 우리들의 이야기 --> <section id="main-story" class="sec main-sec-story"> <div class="sec__head"> <h3 class="sec__title">새로운 내일을 만드는 <br class="d-block--sm-only">우리들의 이야기</h3> <a href="https://www.youtube.com/@NHNofficial" target="_blank" class="button__text-icon--md icon__outlink--black hover__underline--black">공식유튜브</a> </div> <div class="sec__body"> <div class="story__content swiper"> <div class="swiper-wrapper"> <div class="card swiper-slide" data-youtubeid="GSD9KHrrCjE?si=cZN4KW7CqARGmCGj?si=9LyX-tx_VCdJof50"> <div class="card__youtube"> <div class="card-visual__wrapper"> <div class="card__youtube-box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/brand_/mainYoutube/2025/202503041535241.jpg" alt="일본 잘파세대가 게임을 즐기는 방법! #콤파스 페스티벌 1일 체험기"> <button type="button" class="button__icon-only button__card-control">재생</button> <!-- [D]활성화 시 iframe(loop모드 사용으로 동적 추가되는 요소)에 is--active 클래스 추가 --> </div> </div> <div class="card-content__wrapper"> <a href="javascript:void(0)"> <strong class="card__tit">일본 잘파세대가 게임을 즐기는 방법! #콤파스 페스티벌 1일 체험기</strong> <span class="card__desc">NHN플레이아트가 만든 일본의 장수 게임 '#콤파스'. 팬덤문화의 중심인 #콤파스 겨울 페스티벌의 현장을 함께 즐겨 보아요!</span> </a> </div> </div> </div> <div class="card swiper-slide" data-youtubeid="PD_ex3XSJck?si=q37m9hFcmAgJtFZZ?si=9LyX-tx_VCdJof50"> <div class="card__youtube"> <div class="card-visual__wrapper"> <div class="card__youtube-box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/brand_/mainYoutube/2025/202503061503301.jpg" alt="겜덕후라면 지나칠 수 없는 도쿄의 #콤파스 카페"> <button type="button" class="button__icon-only button__card-control">재생</button> <!-- [D]활성화 시 iframe(loop모드 사용으로 동적 추가되는 요소)에 is--active 클래스 추가 --> </div> </div> <div class="card-content__wrapper"> <a href="javascript:void(0)"> <strong class="card__tit">겜덕후라면 지나칠 수 없는 도쿄의 #콤파스 카페</strong> <span class="card__desc">#콤파스 유저들이 성지순례처럼 찾는 #콤파스 카페&#44; 도쿄 한 복판에서 외치는 3! 2! 1! #Compass!</span> </a> </div> </div> </div> <div class="card swiper-slide" data-youtubeid="P-E5qbo31yY?si=3BGTIU0QhF97PH8X?si=9LyX-tx_VCdJof50"> <div class="card__youtube"> <div class="card-visual__wrapper"> <div class="card__youtube-box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/brand_/mainYoutube/2024/202411051732261.jpg" alt="[워크인NHN] 대한민국 AI 경쟁력&#44; 국가 AI데이터센터가 책임진다! IDC 엔지니어의 하루"> <button type="button" class="button__icon-only button__card-control">재생</button> <!-- [D]활성화 시 iframe(loop모드 사용으로 동적 추가되는 요소)에 is--active 클래스 추가 --> </div> </div> <div class="card-content__wrapper"> <a href="javascript:void(0)"> <strong class="card__tit">[워크인NHN] 대한민국 AI 경쟁력&#44; 국가 AI데이터센터가 책임진다! IDC 엔지니어의 하루</strong> <span class="card__desc">국가 AI데이터센터 IDC엔지니어는 어떻게 일할까? 끊김없는 운영을 지원하는 광주AI센터운영파트 정현중 선임님의 하루를 따라가보았습니다.</span> </a> </div> </div> </div> <div class="card swiper-slide" data-youtubeid="wPOYnjX5BE0?si=kT7MralPuUc540AJ?si=9LyX-tx_VCdJof50"> <div class="card__youtube"> <div class="card-visual__wrapper"> <div class="card__youtube-box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/brand_/mainYoutube/2024/202408011446391.jpg" alt="[워크인NHN] 놀러오세요&#44; 플레이뮤지엄에! NHN 컬처팀 조직문화 담당자의 하루"> <button type="button" class="button__icon-only button__card-control">재생</button> <!-- [D]활성화 시 iframe(loop모드 사용으로 동적 추가되는 요소)에 is--active 클래스 추가 --> </div> </div> <div class="card-content__wrapper"> <a href="javascript:void(0)"> <strong class="card__tit">[워크인NHN] 놀러오세요&#44; 플레이뮤지엄에! NHN 컬처팀 조직문화 담당자의 하루</strong> <span class="card__desc">NHN 컬처팀은 어떻게 일할까? NHN의 대표 임직원 가족 초청행사 WE! FAMILY 담당자 컬처팀 권해정 팀장의 하루를 따라가보았습니다.</span> </a> </div> </div> </div> <div class="card swiper-slide" data-youtubeid="V5fF6Ths5gM?si=Jkk0uKVzeALcu-Zm?si=9LyX-tx_VCdJof50"> <div class="card__youtube"> <div class="card-visual__wrapper"> <div class="card__youtube-box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/brand_/mainYoutube/2024/202408011446501.jpg" alt="[워크인NHN] FashionGo is bucking the norm! 미국 패션고 서비스 기획자의 글로벌한 하루"> <button type="button" class="button__icon-only button__card-control">재생</button> <!-- [D]활성화 시 iframe(loop모드 사용으로 동적 추가되는 요소)에 is--active 클래스 추가 --> </div> </div> <div class="card-content__wrapper"> <a href="javascript:void(0)"> <strong class="card__tit">[워크인NHN] FashionGo is bucking the norm! 미국 패션고 서비스 기획자의 글로벌한 하루</strong> <span class="card__desc">NHN 패션고코리아 서비스기획자는 어떻게 일할까? FashionGo is bucking the norm. 패션고는 식상함을 거부합니다 - WWD 미국 1위 B2B 패션플랫폼 #패션고(Fashiongo)의 서비스기획 업무를 맡고 있는 신태하 팀장의 일과를 함께 보시죠.</span> </a> </div> </div> </div> </div> <div class="story__control"> <!-- [D] 비활성화 시 disabled 혹은 is--disabled 클래스 추가 --> <button type="button" class="story__button-prev"><i class="button__icon-only--md icon__chev-prev--black">이전</i></button> <button type="button" class="story__button-next"><i class="button__icon-only--md icon__chev-next--black">다음</i></button> </div> </div> <div class="story__thumb swiper"> <div class="swiper-wrapper"> <div class="swiper-slide"> <div class="img__box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/brand_/mainYoutube/2025/202503041535241.jpg" alt="일본 잘파세대가 게임을 즐기는 방법! #콤파스 페스티벌 1일 체험기"> </div> </div> <div class="swiper-slide"> <div class="img__box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/brand_/mainYoutube/2025/202503061503301.jpg" alt="겜덕후라면 지나칠 수 없는 도쿄의 #콤파스 카페"> </div> </div> <div class="swiper-slide"> <div class="img__box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/brand_/mainYoutube/2024/202411051732261.jpg" alt="[워크인NHN] 대한민국 AI 경쟁력&#44; 국가 AI데이터센터가 책임진다! IDC 엔지니어의 하루"> </div> </div> <div class="swiper-slide"> <div class="img__box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/brand_/mainYoutube/2024/202408011446391.jpg" alt="[워크인NHN] 놀러오세요&#44; 플레이뮤지엄에! NHN 컬처팀 조직문화 담당자의 하루"> </div> </div> <div class="swiper-slide"> <div class="img__box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/brand_/mainYoutube/2024/202408011446501.jpg" alt="[워크인NHN] FashionGo is bucking the norm! 미국 패션고 서비스 기획자의 글로벌한 하루"> </div> </div> </div> </div> </div> </section> <!-- // [D] 새로운 내일을 만드는 우리들의 이야기 --> <!-- [D] 최근 뉴스 --> <section id="main-news" class="sec main-sec-news"> <div class="sec__head"> <h3 class="sec__title">최근 뉴스</h3> <a href="/news" class="button__text-icon--md icon__arr-next--black hover__underline--black">전체보기</a> </div> <div class="sec__body"> <div class="swiper"> <div class="swiper-wrapper"> <div class="card swiper-slide"> <a href="/news/731"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">게임</span> </div> <div class="card__img-box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/ko_/pr/boardImage/2025/202503140915321.jpg" alt="NHN, ‘다키스트 데이즈’ 글로벌 테스트 107개 국가와 함께 성료…OBT 4월 말 확정"> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">NHN, ‘다키스트 데이즈’ 글로벌 테스트 107개 국가와 함께 성료…OBT 4월 말 확정</strong> <span class="card__desc"></span> </div> </a> </div> <div class="card swiper-slide"> <a href="/news/730"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">기술</span> </div> <div class="card__img-box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/ko_/pr/boardImage/2025/202503130836161.jpg" alt="NHN 클라우드, ‘금융 클라우드 지원 사업’ 5년 연속 공급 기업으로 참여 "> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">NHN 클라우드, ‘금융 클라우드 지원 사업’ 5년 연속 공급 기업으로 참여 </strong> <span class="card__desc"></span> </div> </a> </div> <div class="card swiper-slide"> <a href="/news/729"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">커머스</span> </div> <div class="card__img-box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/ko_/pr/boardImage/2025/202503120951551.png" alt="NHN커머스, 10년 연속 정보보호 관리체계(ISMS) 인증 획득"> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">NHN커머스, 10년 연속 정보보호 관리체계(ISMS) 인증 획득</strong> <span class="card__desc"></span> </div> </a> </div> <div class="card swiper-slide"> <a href="/news/728"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">결제·광고</span> </div> <div class="card__img-box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/ko_/pr/boardImage/2025/202503100951051.jpg" alt="NHN AD, 시니어 대상 ‘오다시영’ 가요제 성료…5월 여가·교류 플랫폼 론칭"> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">NHN AD, 시니어 대상 ‘오다시영’ 가요제 성료…5월 여가·교류 플랫폼 론칭</strong> <span class="card__desc"></span> </div> </a> </div> <div class="card swiper-slide"> <a href="/news/727"> <div class="card-visual__wrapper"> <div class="card__labels"> <span class="card__label">결제·광고</span> </div> <div class="card__img-box"> <!-- [D] swiper slide내 이미지 lazy loading시 img에 data-srcset 이미지 추가 --> <img class="swiper-lazy" draggable="false" src="/connect/img/placeholder.png" data-srcset="/ko_/pr/boardImage/2025/202503070939251.png" alt="NHN AD 오픈애즈, 서은아 작가와 함께하는 ‘매일의 영감 수집’ 북파티 개최"> </div> </div> <div class="card-content__wrapper"> <strong class="card__tit">NHN AD 오픈애즈, 서은아 작가와 함께하는 ‘매일의 영감 수집’ 북파티 개최</strong> <span class="card__desc"></span> </div> </a> </div> </div> </div> </div> </section> <!-- // [D] 최근 뉴스 --> </div> </main> <div class="main-footer"> <div class="main-footer__fixed"> <div class="main-footer__box"> <h2 class="main-footer__tit">Start your PLAY, <br class="d-block--sm-only">NHN</h2> <a href="https://careers.nhn.com/" target="_blank" class="button__text-icon--md icon__outlink--white hover__underline--white">지원하러 가기</a> <div class="main-footer__visual"> <!-- [D] 3배수 적용: 낮은 dpi 모니터에서 곡선 구현이 일부 제대로 적용되지 않는 부분 개선 --> <svg class="svg" xmlns="http://www.w3.org/2000/svg" width="2481" height="786" viewBox="0 0 2481 786"> <path data-img-name="rounded_square" d="M 1542.567 522.129 L 1386.612 442.779 C 1363.227 430.878 1334.619 440.199 1322.715 463.593 L 1243.383 619.515 C 1231.479 642.909 1240.788 671.52 1264.173 683.421 L 1420.128 762.771 C 1443.513 774.669 1472.121 765.351 1484.025 741.954 L 1563.357 586.032 C 1575.261 562.638 1565.955 534.027 1542.567 522.129 Z" fill="#21BEE8" style="mix-blend-mode:multiply"></path> <path data-img-name="triangle" d="M 293.4528 399.684 L 215.5503 788.652 L 681.567 481.743 L 293.4528 399.684 Z" fill="#C99681" style="mix-blend-mode:multiply"></path> <path data-img-name="triangle_sm" d="M 2285.448 596.733 L 2090.448 788.733 L 2480.448 788.733 L 2285.448 596.733 Z" fill="#C99681" style="mix-blend-mode:multiply"></path> <path data-img-name="circular_sector" d="M 934.242 498.393 C 933.927 498.324 933.63 498.258 933.315 498.189 L 990.753 235.9644 C 991.065 236.0331 991.365 236.0985 991.677 236.1672 C 1054.278 249.8787 1118.463 238.4577 1172.4 203.9991 C 1226.34 169.5405 1263.579 116.1777 1277.259 53.7318 C 1277.418 53.0058 1277.565 52.2624 1277.709 51.5334 L 1540.596 109.1142 C 1540.437 109.8402 1540.308 110.5725 1540.146 111.3126 C 1480.146 385.239 1208.871 558.546 934.242 498.393 Z" fill="#79D8C5" style="mix-blend-mode:multiply"></path> <path data-img-name="rectangle" d="M 1223.166 530.277 H 704.562 V 788.277 H 1223.166 V 530.277 Z" fill="#164072" style="mix-blend-mode:multiply"></path> <path data-img-name="donut" d="M 1699.506 221.6538 C 1771.965 221.6538 1830.906 280.596 1830.906 353.055 C 1830.906 425.511 1771.965 484.455 1699.506 484.455 C 1627.047 484.455 1568.106 425.511 1568.106 353.055 C 1568.106 280.596 1627.047 221.6538 1699.506 221.6538 Z M 1699.506 134.0538 C 1578.555 134.0538 1480.506 232.1031 1480.506 353.055 C 1480.506 474.003 1578.555 572.055 1699.506 572.055 C 1820.457 572.055 1918.506 474.003 1918.506 353.055 C 1918.506 232.1031 1820.457 134.0538 1698 134 Z" fill="#FC5442" style="mix-blend-mode:multiply"></path> <path data-img-name="circle_sm" d="M 446.562 789.237 C 481.353 789.237 509.562 761.031 509.562 726.237 C 509.562 691.443 481.353 663.237 446.562 663.237 C 411.768 663.237 383.562 691.443 383.562 726.237 C 383.562 761.031 411.768 789.237 446.562 789.237 Z" fill="#FC5442" style="mix-blend-mode:multiply"></path> <path data-img-name="circle" d="M 1601.052 787.644 C 1644.129 787.644 1679.052 752.721 1679.052 709.644 C 1679.052 666.564 1644.129 631.644 1601.052 631.644 C 1557.972 631.644 1523.052 666.564 1523.052 709.644 C 1523.052 752.721 1557.972 787.644 1601.052 787.644 Z" fill="#21BEE8" style="mix-blend-mode:multiply"></path> <path data-img-name="semicircle" d="M 2166.015 211.8624 L 1690.839 687.039 C 1822.668 818.865 2034.798 818.253 2166.015 687.039 C 2297.232 555.822 2297.844 343.689 2166.015 211.8624 Z" fill="#164072" style="mix-blend-mode:multiply"></path> <path data-img-name="octagon" d="M 22.0168 689.805 L 53.1486 760.275 L 124.9983 788.094 L 195.4665 756.96 L 223.2855 685.113 L 192.1539 614.643 L 120.3039 586.824 L 49.8357 617.955 L 22.0168 689.805 Z" fill="#21BEE8" style="mix-blend-mode:multiply"></path> <path data-img-name="clover" d="M 855.138 401.973 C 848.535 377.331 824.454 362.058 799.875 365.979 C 791.421 341.865 765.747 327.945 740.733 334.647 C 715.722 341.349 700.425 366.246 705.189 391.374 C 682.041 400.314 668.907 425.517 675.495 450.108 C 682.086 474.699 706.044 489.939 730.545 486.126 C 740.019 508.35 764.571 520.821 788.514 514.404 C 812.46 507.99 827.457 484.974 824.589 461.013 C 848.268 452.37 861.825 426.846 855.156 401.958 L 855.138 401.973 Z" fill="#21BEE8" style="mix-blend-mode:multiply"></path> </svg> </div> </div> <footer class="footer"> <script> function openProposalPopup() { window.open( 'https://nhn.com/proposal', '제휴 제안', 'width=800,height=840,left=100,top=100,resizable=yes,scrollbars=yes,menubar=no,toolbar=no' ) } </script> <div class="footer__inner"> <ul class="footer-link__list"> <li class="footer-link__item"> <a href="javascript:void(0)" onclick="loadContent('/company')">회사소개</a> </li> <li class="footer-link__item d-none--md"> <a href="https://www.nhn.com/ko-KR/services?tab=game" target="_blank">전체서비스</a> </li> <li class="footer-link__item"> <a href="https://careers.nhn.com/" target="_blank">인재채용</a> </li> <li class="footer-link__item d-none--md"> <a href="javascript:void(0)" onclick="openProposalPopup()">제휴제안</a> </li> </ul> <p class="footer-copyright">©NHN Corp. All rights reserved.</p> <div class="footer-outer-links"> <div class="footer-site-boxes"> <div class="footer-site-box"> <button type="button" class="button__footer-more">국내법인<i class="button__icon-only--lg icon__footer-more--black"></i></button> <div class="footer-site" data-name="국내법인"> <ul class="footer-site__list"> <li class="footer-site__item"> <a href="https://company.payco.com" target="_blank">NHN PAYCO</a> </li> <li class="footer-site__item"> <a href="https://www.kcp.co.kr" target="_blank">NHN KCP</a> </li> <li class="footer-site__item"> <a href="https://www.nhnad.com" target="_blank">NHN AD</a> </li> <li class="footer-site__item"> <a href="https://nhnace.com" target="_blank">NHN ACE</a> </li> <li class="footer-site__item"> <a href="https://www.nhn-commerce.com" target="_blank">NHN COMMERCE</a> </li> <li class="footer-site__item"> <a href="https://www.nhnwetoo.com" target="_blank">NHN WETOO</a> </li> <li class="footer-site__item"> <a href="https://www.nhnfashiongo.com" target="_blank">NHN FASHIONGO KOREA</a> </li> <li class="footer-site__item"> <a href="https://company.nhncloud.com" target="_blank">NHN Cloud</a> </li> <li class="footer-site__item"> <a href="https://dooray.com" target="_blank">NHN DOORAY</a> </li> <li class="footer-site__item"> <a href="https://nhndata.com" target="_blank">NHN DATA</a> </li> <li class="footer-site__item"> <a href="https://www.nhnenterprise.com" target="_blank">NHN ENTERPRISE</a> </li> <li class="footer-site__item"> <a href="https://www.injeinc.co.kr" target="_blank">NHN INJEINC</a> </li> <li class="footer-site__item"> <a href="https://crossent.com" target="_blank">NHN CROSSENT</a> </li> <li class="footer-site__item"> <a href="https://nhnacademy.github.io" target="_blank">NHN ACADEMY</a> </li> <li class="footer-site__item"> <a href="https://www.ticketlink.co.kr" target="_blank">NHN LINK</a> </li> <li class="footer-site__item"> <a href="https://www.bugscorp.co.kr" target="_blank">NHN Bugs</a> </li> <li class="footer-site__item"> <a href="https://www.comico.kr" target="_blank">NHN comico Korea</a> </li> <li class="footer-site__item"> <a href="https://corp.drtour.com" target="_blank">NHN DOCTORTOUR</a> </li> <li class="footer-site__item"> <a href="https://www.nhnedu.com" target="_blank">NHN EDU</a> </li> <li class="footer-site__item"> <a href="https://www.nhnservice.com" target="_blank">NHN SERVICE</a> </li> <li class="footer-site__item"> <a href="https://www.wisdomhouse.co.kr" target="_blank">WISDOM HOUSE</a> </li> <li class="footer-site__item"> <a href="https://www.doppelsoft.net" target="_blank">DOPPELSOFT</a> </li> </ul> </div> </div> <div class="footer-site-box"> <button type="button" class="button__footer-more">해외법인<i class="button__icon-only--lg icon__footer-more--black"></i></button> <div class="footer-site" data-name="해외법인"> <ul class="footer-site__list"> <li class="footer-site__item"> <a href="https://www.nhn-japan.com/" target="_blank">NHN JAPAN</a> </li> <li class="footer-site__item"> <a href="https://www.nhn-playart.com/" target="_blank">NHN PlayArt</a> </li> <li class="footer-site__item"> <a href="https://nhn-techorus.com/" target="_blank">NHN TECHORUS</a> </li> <li class="footer-site__item"> <a href="https://www.nhn-comico.com/" target="_blank">NHN comico</a> </li> <li class="footer-site__item"> <a href="https://www.nhnglobal.com/usa/index.nhn" target="_blank">NHN GLOBAL</a> </li> <li class="footer-site__item"> <a href="http://www.accommate.com/" target="_blank">IBT</a> </li> <li class="footer-site__item"> <a href="https://www.coltortiboutique.com/" target="_blank">IKONIC</a> </li> </ul> </div> </div> </div> <div class="footer-sns"> <a href="https://www.nhn.com" class="button__icon-only--xxlg icon__home--white" target="_blank">NHN 기업 홈페이지 바로가기</a> <a href="https://www.youtube.com/channel/UCMEfq7bqJwujrM5oEEhhmYw" class="button__icon-only--xxlg icon__youtube--white" target="_blank">NHN 유튜브 바로가기</a> <a href="https://www.instagram.com/nhn_corp/" class="button__icon-only--xxlg icon__instagram--white" target="_blank">NHN 인스타그램 바로가기</a> <a href="https://www.linkedin.com/company/nhncorp/mycompany/" class="button__icon-only--xxlg icon__linkedin--white" target="_blank">NHN 링크드인 바로가기</a> </div> </div> </div> </footer> </div> </div> </div> <script src="/connect/js/inside.js"></script> <!-- [D] caseview button style --> <style> .caseview { position: fixed; bottom: 0; right: 0; background: rgba(0, 0, 0, .8); padding: 10px; z-index: 10; font-size: 14px } .caseview button { display: block; width: 100%; color: #fff; font-weight: bold; } .caseview .btn_close { background: #fff; padding: 2px 5px; color: #000; margin-bottom: 8px } </style> <!-- // [D] caseview button style --> <script> /* banner section variables */ let mainBanner; /* article section variables */ const articleClassName = 'main-sec-article'; /* story section variables */ const players = {}; let videoId; let playerDiv; let sectionStory = { thumb: null, content: null } const storyButtons = document.querySelectorAll('[class*=story__button]'); let realIndex; let activeIndex; const storyDuration = 400; const storyClassName = { activeYoutube: 'is--active', content: 'story__content', contentWrapper: 'card-content__wrapper', activeSlide: 'swiper-slide-active' } /* news section variables */ let sectionNews; /* footer canvas animation variables */ const mainFooterVisual = document.querySelector('.main-footer__visual'); const { Engine, Render, Composite, Body, Bodies, Svg, Vertices } = Matter; const engine = Engine.create({ gravity: { y: 0.5, }, positionIterations: 8 }); let render; let footerVisualSize = { w: mainFooterVisual.clientWidth, h: mainFooterVisual.clientHeight, prevW: mainFooterVisual.clientWidth, prevH: mainFooterVisual.clientHeight } let ratio = { arr: [1, .795, .392], prevNum: '' } let shapes = { bodies: [], walls: [], size: 100 } const multiples = 3; let prevBodyArr = []; let winWidth = { prev: window.innerWidth, current: window.innerWidth } let resizeTimer; const paths = document.querySelectorAll('.svg path'); function handleSecTitleReveal() { const sections = document.querySelectorAll('.sec'); const sectionHeades = document.querySelectorAll('.sec .sec__head'); sections.forEach((section, i) => { const checkingSecArticle = section.classList.contains(articleClassName); const delayObj = checkingSecArticle === true && { delay: defaultDuration * .3 }; gsap.timeline({ scrollTrigger: { trigger: section, ...topBottomObj, } }) .from(sectionHeades[i], { ...titleRevealObj, ...delayObj }); }) } function handleArticleReveal() { gsap.registerPlugin(ScrollTrigger); const secArticle = document.querySelector(`.${articleClassName}`); const articleCards = document.querySelectorAll(`.${articleClassName} .card-article`); let numArr; let standard = 0; const halfLen = Math.floor((articleCards.length - 1) / 2); checkWidth( window, () => { numArr = [defaultDuration * .6, defaultDuration * .9]; }, () => { numArr = [.1, .2]; }, () => { numArr = 0; }, null ) articleCards.forEach((articleCard, i) => { if (viewport === 'desktop') i > halfLen ? (standard = 1) : (standard = 0); if (viewport === 'tablet') i % numArr.length === 0 ? (standard = 0) : standard++; gsap.timeline({ scrollTrigger: { trigger: viewport === 'desktop' && i > halfLen ? articleCards[halfLen] : viewport !== 'desktop' ? articleCard : secArticle, ...topBottomObj } }) .from(articleCard, { ...transyOpacityDurationObj, delay: typeof numArr !== 'number' ? numArr[standard] : numArr }, ); }) } function createYoutubePlayer(playerDiv, videoId, activeYoutube) { const player = new YT.Player(playerDiv, { height: '560', width: '315', videoId: videoId, playerVars: { 'autoplay': 0, enablejsapi: 1, 'mute': 1, playsinline: 0, rel: 0 }, events: { 'onStateChange': (e) => { // 0 = 종료됨 e.target.getPlayerState() == 0 && e.target.g.classList.remove(activeYoutube); } } }) players[`player-${realIndex}-${activeIndex}`] = player; } function stopPlayingYoutube() { if (players[`player-${realIndex}-${activeIndex}`] === 'undefined') return; if (!players[`player-${realIndex}-${activeIndex}`].g.classList.contains(storyClassName.activeYoutube)) return; players[`player-${realIndex}-${activeIndex}`].stopVideo(); players[`player-${realIndex}-${activeIndex}`].g.classList.remove(storyClassName.activeYoutube); } function showStoryCardContentWrapper() { let delay = storyDuration; let timer = null; clearTimeout(timer); timer = setTimeout(() => { const storyContentActiveSlide = document.querySelector(`.${storyClassName.content} .${storyClassName.activeSlide}`); const { children: storyContentSlides } = storyContentActiveSlide.parentElement; for (let i = 0; i < storyContentSlides.length; i++) { if (storyContentSlides[i].classList.contains(storyClassName.activeSlide) !== true) document.querySelectorAll(`.${storyClassName.content} .${storyClassName.contentWrapper}`)[i].removeAttribute('style'); } gsap.fromTo( storyContentActiveSlide.querySelector(`.${storyClassName.contentWrapper}`), { x: 100, opacity: 0, duration: storyDuration * 0.001, }, { x: 0, opacity: 1 }, ) }, delay); } storyButtons.forEach((storyButton, i) => { storyButton.addEventListener('click', () => { if (storyButton.classList.contains('story__button-next')) { stopPlayingYoutube(); showStoryCardContentWrapper(); } else { stopPlayingYoutube(); showStoryCardContentWrapper(); } }) }); document.querySelector(`.${storyClassName.content}`).addEventListener('click', (e) => { if (e.target.classList.contains('button__card-control')) { const control = e.target; control.nextElementSibling.classList.add(storyClassName.activeYoutube); players[`player-${realIndex}-${activeIndex}`].playVideo(); players[`player-${realIndex}-${activeIndex}`].unMute(); } else { return; } }) function handleStoryReveal() { const secBody = document.querySelector('.main-sec-story .sec__body'); const activeCardContent = document.querySelector(`.${storyClassName.content} .${storyClassName.activeSlide} .${storyClassName.contentWrapper}`); const storyControl = document.querySelector(`.${storyClassName.content} .story__control`); gsap.timeline({ scrollTrigger: { trigger: secBody, ...topBottomObj } }) .from(secBody, { ...transyOpacityDurationObj }) const contentControlObj = { y: 40, opacity: 0, duration: .5, } const tl = gsap.timeline({ scrollTrigger: { trigger: activeCardContent.children[0], ...topBottomObj } }) tl.fromTo( activeCardContent, { ...contentControlObj }, { y: 0, opacity: 1 } ); tl.from(storyControl, { ...contentControlObj }, '<'); } function handleNewsReveal() { const secBody = document.querySelector('.main-sec-news .sec__body'); const newsCards = document.querySelectorAll('.main-sec-news .card'); newsCards.forEach((newsCard, i) => { const delay = .1 * (1 + i); gsap.timeline({ scrollTrigger: { trigger: newsCard, ...topBottomObj } }) .from(newsCard.children[0], { ...transyOpacityDurationObj, delay: delay.toFixed(1) }, ) }) } function setShapes(ratioNum, obj) { const arr = { x: [], y: [] } const { width: svgW, height: svgH } = document.querySelector('.svg'); const svg = { w: svgW.baseVal.value / multiples, h: svgH.baseVal.value / multiples } const distance = viewport !== 'mobile' ? 100 : 50; // 물체의 떨어지는 속도는 거리(distance)와 중력(engine.gravity.y)으로 조절 shapes.bodies = [...paths].map((path, i) => { const bbox = path.getBBox(); const width = bbox.width; const height = bbox.height; const x = ((bbox.x + (width / 2)) / multiples) * ratioNum; const y = ((bbox.y + (height / 2)) / multiples) * ratioNum; // 렌더링된 path 간격 수정 let extraNum = { x: 0, y: 0 }; if (path.dataset.imgName === 'semicircle') extraNum.x = x / 50; if (path.dataset.imgName === 'semicircle') extraNum.y = y / 20; if (path.dataset.imgName === 'triangle') extraNum.x = (x * -1) / 10; if (path.dataset.imgName === 'circle_sm') extraNum.x = x / 5; if (path.dataset.imgName === 'circular_sector') extraNum.x = (x * -1) / 20; if (path.dataset.imgName === 'donut') extraNum.y = (y * -1) / 5; arr.x.push(x + extraNum.x); arr.y.push(y + extraNum.y); const body = Bodies.fromVertices( obj.mobile !== true ? arr.x[i] : prevBodyArr[i].position.x + ((winWidth.prev - winWidth.current) * -1), obj.mobile !== true ? ( obj.resize !== true ? arr.y[i] + (i * (distance * -1)) : arr.y[i] ) : prevBodyArr[i].position.y, Svg.pathToVertices(path), { label: path.dataset.imgName, render: { fillStyle: path.getAttribute('fill'), strokeStyle: path.getAttribute('fill'), lineWidth: .3 }, } ) Body.scale(body, ratioNum / multiples, ratioNum / multiples); Body.translate( body, { x: obj.mobile !== true ? (footerVisualSize.w - (svg.w * ratioNum)) : 0, y: obj.resize !== true ? svg.h * -1 : ( obj.mobile !== true ? footerVisualSize.h - ((svg.h * ratioNum) + svg.h / 8) : 0 ) } ) obj.mobile === true && Body.setAngle(body, Number(prevBodyArr[i].angle)); return body; }) const ground = Bodies.rectangle(0, footerVisualSize.h + (shapes.size / 2) - 2, footerVisualSize.w * 2, shapes.size, { isStatic: true, label: 'ground', render: { visible: false } }) const leftWall = Bodies.rectangle(((shapes.size / 2) * -1 + 1), footerVisualSize.h, shapes.size, footerVisualSize.h * 2, { isStatic: true, label: 'left_wall', render: { visible: false } }) const rightWall = Bodies.rectangle(footerVisualSize.w - ((shapes.size / 2) * -1 + 1), footerVisualSize.h, shapes.size, footerVisualSize.h * 2, { isStatic: true, label: 'right_wall', render: { visible: false } }) shapes.walls = [ground, leftWall, rightWall]; Composite.add(engine.world, [...shapes.walls, ...shapes.bodies]); } function animateFooterCanvas(width, height, ratio, func) { const windowWidth = window.innerWidth; footerVisualSize.w = width; footerVisualSize.h = height; setShapes(ratio, { resize: false }); func !== null && func(mainFooterVisual, footerVisualSize.w, footerVisualSize.h) Engine.run(engine); Render.run(render); }; function setRatio() { return checkWidth(window, null, null, null, { desktop: ratio.arr[0], tablet: ratio.arr[1], mobile: ratio.arr[2] }) } function setMainFooterHeight() { const mainFooter = document.querySelector('.main-footer'); const mainFooterFixed = mainFooter.querySelector('.main-footer__fixed'); const mainFooterFixedHeight = mainFooterFixed.clientHeight; const clientHeight = document.documentElement.clientHeight; mainFooter.style.height = `${mainFooterFixedHeight}px`; }; function handleFooterSvgReveal() { const wrap = document.querySelector('.wrap'); const mainFooter = document.querySelector('.main-footer'); const mainFooterScrollTop = mainFooter.offsetTop; const start = Math.ceil((mainFooterScrollTop / wrap.scrollHeight) * 100); ScrollTrigger.create({ trigger: mainFooter, start: `0% ${start}%`, end: `${start}% 100%`, once: true, onEnter: () => { ratio.prevNum = setRatio(); if (viewport !== 'mobile') engine.gravity.y = 1.5; animateFooterCanvas( mainFooterVisual.clientWidth, mainFooterVisual.clientHeight, setRatio(), () => { render = Render.create({ element: mainFooterVisual, engine: engine, options: { pixelRatio: window.devicePixelRatio * multiples, // 3배수 적용: 낮은 dpi 모니터에서 곡선 구현이 일부 제대로 적용되지 않는 부분 개선 width: footerVisualSize.w, height: footerVisualSize.h, background: 'transparent', wireframes: false, } }); } ); } }); } document.addEventListener('DOMContentLoaded', () => { const tag = document.createElement('script'); tag.src = 'https://www.youtube.com/iframe_api'; const firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); mainBanner = new Swiper('.main-banner', { slidesPerView: 1, spaceBetween: 0, loop: true, allowTouchMove: true, speed: 700, pagination: { el: '.main-banner__pagination', type: 'fraction', }, navigation: { nextEl: '.main-banner__control .icon__chev-next--white', prevEl: '.main-banner__control .icon__chev-prev--white', }, on: { slideChangeTransitionEnd: function() { document.querySelectorAll('.main-banner__content').forEach((content, i) => { i !== this.activeIndex ? content.removeAttribute('style') : gsap.fromTo( content, { ...titleRevealObj }, { y: 0, opacity: 1 } ) }) } } }); sectionStory.thumb = new Swiper('.story__thumb', { effect: 'fade', slidesPerView: 1, spaceBetween: 0, fadeEffect: { crossFade: true }, allowTouchMove: false, lazy: true, loop: true, freeMode: true, forceLoop: true, observer: true, initialSlide: 0, loopAdditionalSlides: 2, speed: storyDuration, on: { slideChange: function() { this.lazy.load(); showStoryCardContentWrapper(); } } }); sectionStory.content = new Swiper(`.${storyClassName.content}`, { slidesPerView: 1, effect: 'fade', fadeEffect: { crossFade: true }, lazy: true, loop: true, freeMode: true, forceLoop: true, observer: true, initialSlide: 0, loopAdditionalSlides: 1, allowTouchMove: false, speed: storyDuration, navigation: { nextEl: '.story__button-next', prevEl: '.story__button-prev', }, thumbs: { swiper: sectionStory.thumb }, on: { resize: function() { sectionStory.thumb.slideTo(this.activeIndex + 2); sectionStory.thumb.lazy.loadInSlide(this.activeIndex + 3); }, slideChange: function() { this.lazy.load(); realIndex = this.realIndex; activeIndex = this.activeIndex; const currentSlide = this.slides[activeIndex]; videoId = currentSlide.dataset.youtubeid; const playerContainer = currentSlide.querySelector('.card__youtube-box'); const prevPlayer = currentSlide.querySelector('iframe'); sectionStory.thumb.slideTo(activeIndex + 2); sectionStory.thumb.lazy.loadInSlide(activeIndex + 3); prevPlayer && prevPlayer.parentNode.removeChild(prevPlayer); playerContainer.insertAdjacentHTML('beforeend', `<div id="player-${realIndex}-${activeIndex}" class="card__youtube-iframe"></div>`); playerDiv = document.getElementById(`player-${realIndex}-${activeIndex}`); if (typeof YT === 'undefined') return; createYoutubePlayer(playerDiv, videoId, storyClassName.activeYoutube); } } }); sectionNews = new Swiper('.main-sec-news .swiper', { ...swiperObj, on: { ...swiperFuncObj } }); handleSecTitleReveal(); handleArticleReveal(); handleStoryReveal(); handleNewsReveal(); setMainFooterHeight(); handleFooterSvgReveal(); }); window.onYouTubeIframeAPIReady = () => { createYoutubePlayer(playerDiv, videoId, storyClassName.activeYoutube); }; window.addEventListener('resize', () => { footerVisualSize.w = mainFooterVisual.clientWidth; footerVisualSize.h = mainFooterVisual.clientHeight; if (prevViewport !== viewport) { checkWidth( window, setMainFooterHeight, setMainFooterHeight, setMainFooterHeight, null ) } let resizingMobile; function reCreateShapes(resizingMobile) { if (typeof render !== 'object') return; render.bounds.max.x = footerVisualSize.w; render.bounds.max.y = footerVisualSize.h; render.options.width = footerVisualSize.w; render.options.height = footerVisualSize.h; render.canvas.width = footerVisualSize.w; render.canvas.height = footerVisualSize.h; Render.setPixelRatio(render, window.devicePixelRatio * multiples); if (resizingMobile === true) { prevBodyArr = []; const allBodies = Composite.allBodies(engine.world, [...shapes.walls, ...shapes.bodies]); allBodies.forEach(body => { if (body.label !== 'ground' && body.label !== 'left_wall' && body.label !== 'right_wall') { prevBodyArr.length < paths.length && prevBodyArr.push(body) } }) } winWidth.current = window.innerWidth; Composite.remove(engine.world, [...shapes.walls, ...shapes.bodies]); setShapes(setRatio(), { resize: true, mobile: resizingMobile }); } if (prevViewport !== viewport) { resizingMobile = false; clearTimeout(resizeTimer); resizeTimer = setTimeout(() => { reCreateShapes(resizingMobile); }, 100); } else { if (prevViewport === 'mobile' && viewport === 'mobile') { resizingMobile = true; winWidth.current = window.innerWidth; reCreateShapes(resizingMobile); winWidth.prev = winWidth.current; } } prevViewport = viewport; ratio.prevNum = setRatio(); }); </script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10