콘텐츠 대표 이미지 - 유대류의 출현: 최초의 태반 포유류 🦘🦁🐒

유대류의 출현: 최초의 태반 포유류 🦘🦁🐒

안녕, 친구들! 오늘은 정말 흥미진진한 이야기를 들려줄 거야. 바로 유대류라고 불리는 동물 그룹에 대한 거지. 이 녀석들이 어떻게 지구상에 나타났는지, 그리고 왜 그렇게 특별한지 함께 알아보자고! 🕵️‍♀️🔍

잠깐! 혹시 '유대류'라는 말이 좀 낯설게 들리나요? 걱정 마세요. 우리가 잘 아는 동물들 중에서도 유대류가 많답니다. 예를 들면 사자🦁, 코끼리🐘, 원숭이🐒, 그리고 우리 인간👨‍👩‍👧‍👦도 유대류에 속해요!

유대류란 뭘까? 🤔

유대류는 태반을 가진 포유류를 말해. 태반이 뭐냐고? 음... 엄마 뱃속에서 아기가 자라날 때 아기와 엄마를 연결해주는 특별한 기관이야. 이 태반 덕분에 아기는 엄마로부터 영양분과 산소를 받을 수 있지. 정말 대단하지 않아? 🤰👶

유대류가 등장하기 전에는 알을 낳는 단공류(오리너구리 같은)와 새끼를 낳긴 하지만 태반 없이 육아주머니에서 키우는 유대류(캥거루 같은)만 있었어. 그런데 유대류의 등장으로 포유류 진화의 새로운 장이 열린 거지! 🎉

재미있는 사실: 유대류라는 이름은 '태반'을 뜻하는 라틴어 'placenta'에서 왔어. 그래서 영어로는 'placental mammals'이라고 불러. 우리말로 하면 '태반 포유류'인 셈이지!

유대류의 등장: 시간 여행을 떠나볼까? ⏰🚀

자, 이제 시간 여행을 떠나볼 거야. 목적지는 약 1억 6천만 년 전! 그때 지구는 어땠을까? 🌍

  • 공룡들이 지구를 활보하던 시기 🦕🦖
  • 대륙들이 지금과는 완전히 다른 모습으로 붙어있었어 🗺️
  • 기후는 지금보다 훨씬 더 덥고 습했지 🌡️💧

바로 이런 환경에서 최초의 유대류가 등장했어. 어떤 모습이었을까? 🤔

최초의 유대류 상상도 최초의 유대류: 작고 귀여운 쥐 같은 모습?

사실 정확한 모습은 아무도 모르지만, 과학자들은 아주 작은 쥐처럼 생겼을 거라고 추측해. 왜 그럴까?

  1. 화석 증거: 발견된 가장 오래된 유대류 화석들이 작은 크기의 동물이었어 🦴
  2. 생존 전략: 작은 몸집은 숨기 쉽고, 먹이도 적게 필요해서 생존에 유리했을 거야 🐁
  3. 진화 이론: 새로운 그룹은 보통 작은 크기에서 시작해 점점 다양해진대 📏➡️📐

이 작은 조상으로부터 시작해서 오늘날 우리가 보는 다양한 유대류들이 진화했다니, 정말 놀랍지 않아? 🐘🦒🐅🐒

태반: 유대류의 슈퍼 파워! 💪✨

자, 이제 유대류의 가장 큰 특징인 태반에 대해 자세히 알아볼 시간이야. 태반이 왜 그렇게 대단한 걸까?

태반의 슈퍼 능력들:

  • 영양분 공급소: 엄마가 먹은 영양분을 아기에게 전달해줘 🍎➡️👶
  • 산소 배달부: 엄마의 혈액에서 산소를 받아 아기에게 전해줘 💨➡️🫁
  • 쓰레기 처리장: 아기의 몸에서 나온 노폐물을 처리해 💩➡️🚽
  • 면역 시스템 부스터: 엄마의 항체를 아기에게 전달해 면역력을 높여줘 🛡️💉
  • 호르몬 공장: 임신 유지에 필요한 호르몬을 만들어내 🏭

와, 대단하지 않아? 이 모든 일을 태반 하나가 다 해내는 거야. 그야말로 생명의 연결 다리라고 할 수 있지!

이런 태반 덕분에 유대류는 다른 동물들과는 다르게 발전할 수 있었어. 어떻게? 🤔

  • 더 오래 임신할 수 있게 됐어 👉 아기가 더 발달된 상태로 태어날 수 있지
  • 엄마의 몸에서 직접 영양을 받으니까 알에 의존하지 않아도 돼 👉 다양한 환경에 적응 가능
  • 아기의 뇌가 더 크게 자랄 수 있어 👉 더 똑똑한 동물로 진화할 수 있었지

이런 이유로 유대류는 빠르게 진화하고 다양해질 수 있었던 거야. 그 결과가 바로 오늘날 우리가 보는 수많은 종류의 포유류들이지! 🐯🦁🐻🐨🐵

유대류의 다양성: 작은 시작, 큰 변화 🌈🐾

최초의 작은 쥐 같은 모습에서 시작해서 유대류는 어떻게 이렇게 다양해졌을까? 그 비결은 바로 적응력이야!

유대류의 적응 전략:

  1. 다양한 서식지 개척: 땅, 나무, 물, 심지어 하늘까지! 🏞️🌳🌊🌤️
  2. 다양한 먹이 활용: 풀, 과일, 고기, 곤충 등 가리지 않고 🥗🍖🐛
  3. 체온 조절 능력: 추위와 더위를 이겨낼 수 있는 털과 체지방 🌡️
  4. 사회성 발달: 무리 생활로 협력과 보호 강화 👨‍👩‍👧‍👦
  5. 학습 능력: 큰 뇌로 환경 변화에 빠르게 대응 🧠

이런 전략들 덕분에 유대류는 정말 다양한 모습으로 진화할 수 있었어. 어떤 모습들이 있는지 한번 볼까?

다양한 유대류의 모습 육지 동물 나무 동물 물 동물 하늘 동물 다양한 환경에 적응한 유대류들

와! 정말 다양하지? 이렇게 다양한 모습으로 진화한 유대류들, 몇 가지 재미있는 예를 들어볼게:

  • 🐘 코끼리: 거대한 몸집과 긴 코로 아프리카와 아시아의 초원과 숲을 누비는 대형 초식동물
  • 🦇 박쥐: 하늘을 나는 유일한 포유류! 초음파로 길을 찾는 특별한 능력까지 갖췄어
  • 🐳 고래: 육지에서 살던 조상에서 완전히 수중 생활에 적응한 거대한 해양 포유류
  • 🦥 나무늘보: 나무에 거꾸로 매달려 살면서 느릿느릿 움직이는 특이한 생활 방식을 가진 동물
  • 🦔 고슴도치: 뾰족한 가시로 몸을 감싸 포식자로부터 자신을 보호하는 작은 육상 동물

이렇게 다양한 유대류들이 지구 곳곳에서 살아가고 있어. 그리고 우리 인간도 이 유대류 가족의 일원이라는 거, 잊지 마! 👨‍👩‍👧‍👦

유대류의 진화: 시간 여행 계속! ⏳🔍

자, 이제 유대류가 어떻게 진화해왔는지 좀 더 자세히 알아볼까? 시간 여행을 계속해보자고! 🚀

유대류 진화의 주요 사건들:

  1. 약 1억 6천만 년 전: 최초의 유대류 등장 🐁
  2. 약 6천 6백만 년 전: 공룡 멸종, 유대류의 대폭발적 진화 시작 💥
  3. 약 5천 5백만 년 전: 현대적 유대류 그룹들의 출현 🦁🐘🐒
  4. 약 20만 년 전: 현생 인류(호모 사피엔스)의 등장 👨‍👩‍👧‍👦

와, 정말 긴 시간이지? 그동안 유대류는 정말 많은 변화를 겪었어. 특히 공룡이 멸종한 후에 유대류가 폭발적으로 진화했다는 게 흥미롭지 않아? 🤔

공룡이 사라지자 유대류에게 새로운 기회가 열린 거야. 빈 자리를 차지하기 위해 빠르게 진화하면서 다양한 모습으로 변해갔지. 이때 유대류의 특징인 태반과 큰 뇌가 큰 도움이 됐어!

유대류 진화의 타임라인 1억 6천만 년 전 6천 6백만 년 전 5천 5백만 년 전 20만 년 전 유대류 진화의 주요 사건들

이 긴 여정 동안 유대류는 정말 다양한 모습으로 진화했어. 그 과정에서 몇 가지 중요한 특징들이 발달했지:

  • 🧠 큰 뇌: 복잡한 행동과 학습 능력 발달
  • 🦷 다양한 치아: 여러 종류의 음식을 먹을 수 있게 됨
  • 🦶 발달된 사지: 달리기, 나무 타기, 수영 등 다양한 이동 방식 가능
  • 👁️ 발달된 감각: 특히 시각과 청각이 뛰어나짐
  • 🌡️ 체온 조절: 항온 동물로 진화해 다양한 환경에 적응

이런 특징들 덕분에 유대류는 지구 곳곳을 자신의 보금자리로 만들 수 있었어. 북극의 얼음 위에서 살아가는 북극곰🐻‍❄️부터 아프리카 사바나를 누비는 사자🦁, 남미의 열대우림에 사는 나무늘보🦥까지... 정말 다양하지?

인간: 특별한 유대류 🧑‍🤝‍🧑

자, 이제 우리 이야기를 해볼까? 그래, 바로 인간 말이야. 우리도 유대류 중 하나라는 거 알고 있었지? 🤓

인간을 특별하게 만드는 특징들:

  • 🧠 매우 큰 뇌: 체중 대비 뇌 크기가 가장 큰 동물이야
  • 🦿 직립 보행: 두 발로 걸을 수 있어 손을 자유롭게 사용할 수 있지
  • 👍 발달된 손: 정교한 도구를 만들고 사용할 수 있어
  • 🗣️ 복잡한 언어: 추상적인 개념도 표현할 수 있는 언어 능력
  • 🎨 문화와 예술: 상징적 사고와 창의성 발달

이런 특징들 덕분에 인간은 지구 생태계에서 독특한 위치를 차지하게 됐어. 우리는 자연을 이용하고 변화시키는 능력이 뛰어나지. 하지만 그만큼 책임도 크다는 걸 잊지 말아야 해! 🌍

그런데 말이야, 우리 인간도 결국은 다른 동물들과 마찬가지로 긴 진화의 과정을 거쳐 지금의 모습이 된 거야. 우리의 조상들은 어떤 모습이었을까? 🤔

인류 진화의 간단한 도식 초기 영장류 오스트랄로피테쿠스 호모 에렉투스 호모 사피엔스 인류 진화의 주요 단계

우와, 정말 긴 여정이지? 우리의 조상들은 점점 더 똑똑해지고, 도구를 사용하게 되고, 마침내 현대 인류의 모습에 도달했어. 그 과정에서 우리의 뇌는 점점 더 커졌고, 사회성도 발달했지. 🧠👥

그런데 여기서 재미있는 사실! 우리 인간만이 유일하게 살아남은 '호모' 속은 아니야. 과거에는 네안데르탈인이나 데니소바인 같은 다른 인류 종들도 있었거든. 그들과 우리 호모 사피엔스는 한동안 같은 시기에 살기도 했어. 심지어 서로 교배도 했다고 해! 😮

알고 계셨나요? 현대 인류의 DNA에는 네안데르탈인이나 데니소바인의 유전자가 일부 남아있대요. 특히 유럽인들은 네안데르탈인의 유전자를, 동아시아인들은 데니소바인의 유전자를 더 많이 가지고 있다고 해요!

이렇게 우리 인간도 다른 모든 생명체들처럼 긴 진화의 과정을 거쳐 지금의 모습이 됐어. 그리고 지금도 계속 진화하고 있겠지? 미래의 인류는 어떤 모습일지 상상해보면 정말 재미있을 것 같아! 🚀👽

유대류와 생태계: 우리의 역할 🌳🐾

자, 이제 우리가 살고 있는 이 멋진 지구 생태계 속에서 유대류가 어떤 역할을 하는지 알아볼까? 🌍

유대류의 생태계 역할:

  • 🥩 포식자: 상위 포식자로서 생태계 균형 유지 (예: 사자, 호랑이)
  • 🌱 초식 동물: 식물의 번식과 분포에 영향 (예: 코끼리, 기린)
  • 🍎 씨앗 분산자: 과일을 먹고 씨앗을 퍼뜨림 (예: 원숭이, 박쥐)
  • 🏠 생태계 엔지니어: 환경을 변화시킴 (예: 비버, 두더지)
  • 🦠 숙주: 다양한 미생물의 서식처 제공

와, 정말 다양한 역할을 하고 있지? 유대류는 생태계의 중요한 구성원으로, 다른 생물들과 복잡하게 얽혀있어. 그래서 한 종이 사라지면 전체 생태계에 큰 영향을 미칠 수 있어. 😟

예를 들어볼까? 아프리카의 사자가 사라진다고 생각해봐. 🦁

사자가 사라졌을 때의 생태계 변화</desc> <rect width="100%" height="100%" fill="#f0f0f0"/> <circle cx="400" cy="200" r="150" fill="#f39c12" opacity="0.3"/> <path d="M 250 200 Q 400 50 550 200 Q 400 350 250 200" fill="#27ae60" opacity="0.3"/> <text x="400" y="100" text-anchor="middle" font-size="20" fill="#e74c3c">사자 사라짐</text> <text x="300" y="200" text-anchor="middle" font-size="16" fill="#2980b9">초식동물 증가</text> <text x="500" y="200" text-anchor="middle" font-size="16" fill="#8e44ad">식물 감소</text> <text x="400" y="300" text-anchor="middle" font-size="16" fill="#c0392b">생태계 불균형</text> <text x="400" y="380" text-anchor="middle" font-size="20" fill="#333">사자 없는 생태계의 변화</text> </svg> <p>사자가 사라지면 어떤 일이 일어날까?</p> <ol style="background-color: #fef9e7; padding: 20px; border-radius: 10px;"> <li>🦌 초식동물(영양, 얼룩말 등)의 수가 급증해</li> <li>🌿 그 결과, 식물들이 과도하게 먹혀 줄어들지</li> <li>🐦 식물이 줄어들면 다른 동물들의 서식지도 사라져</li> <li>🦗 결국 전체 생태계가 불균형해지고 많은 종들이 위험에 처해</li> </ol> <p>이렇게 유대류를 포함한 모든 생물은 서로 연결되어 있어. 그래서 우리는 모든 생물의 중요성을 인식하고 보호해야 해. 특히 우리 인간은 가장 큰 영향력을 가진 유대류로서 더 큰 책임이 있지! 🌍💚</p> <h2 style="text-align: center; background-color: #d35400; color: white; padding: 10px; border-radius: 5px;">유대류의 미래: 우리의 선택 🔮🤔</h2> <p>자, 이제 우리의 여정이 거의 끝나가고 있어. 마지막으로 유대류의 미래에 대해 생각해볼까? 🚀</p> <div style="background-color: #fdebd0; border-left: 5px solid #f39c12; padding: 10px; margin: 20px 0;"> <p><b>유대류가 직면한 위기:</b></p> <ul> <li>🏭 서식지 파괴: 숲이 사라지고 도시가 늘어나면서 살 곳을 잃고 있어</li> <li>🌡️ 기후 변화: 지구 온난화로 생활 환경이 급격히 변하고 있지</li> <li>🦠 질병: 새로운 질병들이 유대류를 위협하고 있어</li> <li>🚯 환경오염: 플라스틱, 화학물질 등이 건강을 해치고 있어</li> <li>🏹 밀렵: 불법적인 사냥으로 많은 종들이 위험에 처해있어</li> </ul> </div> <p>이런 위기들 때문에 많은 유대류들이 멸종 위기에 처해있어. 하지만 우리에겐 아직 희망이 있어! 우리가 노력한다면 이 상황을 바꿀 수 있지. 어떻게 할 수 있을까? 🤔</p> <ul style="background-color: #e9f7ef; padding: 20px; border-radius: 10px;"> <li>🌳 숲을 보호하고 나무 심기</li> <li>♻️ 재활용하고 쓰레기 줄이기</li> <li>🚲 친환경 교통수단 이용하기</li> <li>🍽️ 지속 가능한 식품 선택하기</li> <li>📚 환경과 동물 보호에 대해 배우고 알리기</li> </ul> <p>이런 작은 노력들이 모여 큰 변화를 만들 수 있어. 우리 모두가 지구의 주인이자 관리인이라는 걸 기억하자! 🌍👨‍👩‍👧‍👦</p> <h2 style="text-align: center; background-color: #2980b9; color: white; padding: 10px; border-radius: 5px;">마무리: 유대류와 함께하는 미래 🌈🐾</h2> <p>자, 이제 우리의 긴 여정이 끝났어. 유대류의 탄생부터 현재, 그리고 미래까지 함께 살펴봤지? 정말 놀랍고 신기한 이야기였어! 🤩</p> <p>우리는 이제 알게 됐어:</p> <ul style="background-color: #eaf2f8; padding: 20px; border-radius: 10px;"> <li>유대류가 얼마나 다양하고 특별한 동물 그룹인지</li> <li>태반이라는 놀라운 특징이 어떻게 유대류의 성공을 이끌었는지</li> <li>인간을 포함한 유대류가 생태계에서 얼마나 중요한 역할을 하는지</li> <li>우리가 유대류와 지구 환경을 지키기 위해 무엇을 할 수 있는지</li> </ul> <p>이 모든 것을 기억하면서, 우리는 더 나은 미래를 만들어갈 수 있을 거야. 유대류와 함께 공존하는 아름다운 지구를 상상해봐. 그 꿈을 현실로 만드는 건 바로 우리 손에 달려있어! 🌟</p> <p>자, 이제 밖으로 나가 세상을 새로운 눈으로 바라볼 준비가 됐나요? 당신 주변의 유대류들에게 관심을 가져보세요. 길고양이 한 마리, 공원의 다람쥐, 혹은 거울 속의 당신 자신까지. 우리 모두가 이 놀라운 이야기의 한 부분이라는 걸 기억하세요! 🐱🐿️👤</p> <p>함께 노력한다면, 우리는 유대류와 모든 생명체들이 조화롭게 살아가는 밝은 미래를 만들 수 있을 거예요. 그 여정에 여러분 모두가 함께해주길 바랍니다! 🌈🌍💖</p> <p>이것으로 유대류에 대한 우리의 흥미진진한 탐험을 마칩니다. 새로운 지식과 함께 세상을 바라보는 새로운 시각을 가지게 되셨길 바랍니다. 앞으로도 계속해서 배우고, 관찰하고, 사랑하세요. 우리 모두가 이 놀라운 지구 생태계의 중요한 일원이니까요! 👋😊</p></section> </div> </div> <div id="content-end"></div> <div class="show-keywords mx-2 jn-reader-keywords"> <h3> <svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"> <circle cx="9" cy="9" r="7" stroke="#7dc98f" stroke-width="1.5" fill="none"/> <line x1="9" y1="5" x2="9" y2="13" stroke="#7dc98f" stroke-width="1.5" stroke-linecap="round"/> <line x1="5" y1="9" x2="13" y2="9" stroke="#7dc98f" stroke-width="1.5" stroke-linecap="round"/> </svg> 관련 키워드 </h3> <div class="d-flex flex-wrap gap-2"> <a href="/iFoestSearch?searchKeyword=%EC%9C%A0%EB%8C%80%EB%A5%98" class="show-keyword-tag" rel="nofollow"> 유대류 </a> <a href="/iFoestSearch?searchKeyword=%ED%83%9C%EB%B0%98" class="show-keyword-tag" rel="nofollow"> 태반 </a> <a href="/iFoestSearch?searchKeyword=%EC%A7%84%ED%99%94" class="show-keyword-tag" rel="nofollow"> 진화 </a> <a href="/iFoestSearch?searchKeyword=%ED%8F%AC%EC%9C%A0%EB%A5%98" class="show-keyword-tag" rel="nofollow"> 포유류 </a> <a href="/iFoestSearch?searchKeyword=%EC%83%9D%ED%83%9C%EA%B3%84" class="show-keyword-tag" rel="nofollow"> 생태계 </a> <a href="/iFoestSearch?searchKeyword=%EC%A0%81%EC%9D%91" class="show-keyword-tag" rel="nofollow"> 적응 </a> <a href="/iFoestSearch?searchKeyword=%EC%9D%B8%EB%A5%98" class="show-keyword-tag" rel="nofollow"> 인류 </a> <a href="/iFoestSearch?searchKeyword=%ED%99%98%EA%B2%BD%EB%B3%B4%ED%98%B8" class="show-keyword-tag" rel="nofollow"> 환경보호 </a> <a href="/iFoestSearch?searchKeyword=%EC%83%9D%EB%AC%BC%EB%8B%A4%EC%96%91%EC%84%B1" class="show-keyword-tag" rel="nofollow"> 생물다양성 </a> <a href="/iFoestSearch?searchKeyword=%EC%A7%80%EC%86%8D%EA%B0%80%EB%8A%A5%EC%84%B1" class="show-keyword-tag" rel="nofollow"> 지속가능성 </a> </div> </div> <section class="mx-2 mx-md-3 mt-5 mb-5 jn-reader-comments" id="comments-section"> <div class="comment-write-container"> <div class="comment-section-header"> <img class="jn-reader-comment-art" src="https://static.jaenung.net/asset/img_new/mypage/icons/snow-chat-bubbles.webp" alt="" width="159" height="127" loading="lazy" decoding="async"> <div><h5>댓글 작성</h5><p>이 글에 대한 여러분의 생각을 들려주세요</p></div> </div> <div class="comment-form-area"> <div class="login-prompt"> <i class="bi bi-lock-fill"></i> <h6>로그인이 필요합니다</h6> <p>댓글을 작성하려면 먼저 로그인해주세요.</p> <button type="button" class="login-btn" onclick="openLoginModal()"> 로그인하기 </button> </div> </div> </div> <div class="comments-list-section"> <div class="comments-list-header"> <h5 id="comment-totalcount"> 댓글 <span class="comment-count">0</span> </h5> </div> <div id="comment-list"> </div> </div> </section> </div> <div class="jn-reader-policy-wrap"> <details class="show-ipr-container jn-reader-policy" open> <summary class="show-ipr-header"> <h3 class="show-ipr-title">지식인의 숲 - 지적 재산권 보호 고지</h3><i class="bi bi-chevron-down" aria-hidden="true"></i> </summary> <div class="show-ipr-body"> <h4> <svg width="20" height="20" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M11 2 L19 6.5 L19 13 C19 17.5 15.5 20.5 11 21.5 C6.5 20.5 3 17.5 3 13 L3 6.5 Z" stroke="#d9534f" stroke-width="1.5" fill="#fff0f0"/> <path d="M8 11.5 L10 13.5 L14.5 8.5" stroke="#d9534f" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" fill="none"/> </svg> 지적 재산권 보호 고지 </h4> <ol> <li><strong>저작권 및 소유권:</strong> 본 컨텐츠는 <u>재능넷의 독점 AI 기술로 생성</u>되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.</li> <li><strong>AI 생성 컨텐츠의 법적 지위:</strong> 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, <u>관련 법규에 따라 저작권 보호</u>를 받습니다.</li> <li><strong>사용 제한:</strong> 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.</li> <li><strong>데이터 수집 금지:</strong> 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 <mark class="ipr-mark">법적 제재의 대상</mark>이 됩니다.</li> <li><strong>AI 학습 제한:</strong> 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.</li> </ol> </div> <div class="show-ipr-footer"> <p>재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,<br> 무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.</p> <p class="ipr-copyright"> © 2026 재능넷 | All rights reserved. </p> </div> </details> </div> </article> <nav class="jn-reader-next" aria-label="다음 읽을거리 찾기"> <div class="jn-reader-next-art" aria-hidden="true"> <img src="https://static.jaenung.net/build/assets/reading-explorer-4234e9b9.webp" width="480" height="502" alt="" loading="lazy" decoding="async"> </div> <div class="jn-reader-next-copy"> <span class="jn-reader-next-title">다음 지식을 찾아볼까요?</span> <p>관심 있는 분야에서 읽을거리를 이어가세요.</p> </div> <a href="https://www.jaenung.net/iForest/history/ze02">생명의 시대 더 둘러보기 <i class="bi bi-arrow-right" aria-hidden="true"></i></a> </nav> </div> </div> </div> </div> </div> <form method="post" name="myform"> <input type="hidden" name="tree_number" value="9508"> <input type="hidden" name="orderType" value="image"> <input type="hidden" name="hiddentotal" value=0> <input type="hidden" name="hiddenpriorradio" value=0> </form> <script> document.addEventListener('DOMContentLoaded', function() { document.querySelectorAll('pre > code').forEach((code) => { const pre = code.parentElement; if (pre.querySelector('.copy-btn')) return; const btn = document.createElement('button'); btn.type = 'button'; btn.className = 'copy-btn'; btn.setAttribute('aria-label', '코드 복사'); btn.textContent = '복사'; pre.appendChild(btn); btn.addEventListener('click', async () => { let text = code.innerText; text = text.replace(/\s+$/,'\n'); try { if (navigator.clipboard && window.isSecureContext) { await navigator.clipboard.writeText(text); } else { throw new Error('no-clipboard'); } btn.dataset.copied = '1'; btn.textContent = '복사됨'; } catch (e) { const ta = document.createElement('textarea'); ta.value = text; ta.style.position = 'fixed'; ta.style.top = '-1000px'; document.body.appendChild(ta); ta.focus(); ta.select(); try { document.execCommand('copy'); btn.dataset.copied = '1'; btn.textContent = '복사됨'; } finally { document.body.removeChild(ta); } } setTimeout(() => { btn.dataset.copied = '0'; btn.textContent = '복사'; }, 1200); }); }); const contentDiv = document.getElementById('content'); const images = contentDiv.querySelectorAll('img:not([class*="emoji"]):not([class*="icon"]):not(.no-purchase)'); images.forEach(function(img) { if (img.width < 100 || img.height < 100) return; const parent = img.parentNode; const container = document.createElement('div'); container.className = 'image-purchase-container'; container.style.cursor = 'pointer'; const imgClone = img.cloneNode(true); const overlay = document.createElement('div'); overlay.className = 'image-overlay'; const watermarkPattern = document.createElement('div'); watermarkPattern.className = 'watermark-pattern'; const positions = ['bottom', 'right']; positions.forEach(position => { const watermarkLogo = document.createElement('div'); watermarkLogo.className = `watermark-logo watermark-${position}`; watermarkLogo.textContent = ''; container.appendChild(watermarkLogo); }); const button = document.createElement('button'); button.className = 'image-purchase-btn'; button.innerHTML = ` <i class="bi bi-cart-check me-2"></i> <span class="d-none d-md-inline">원본이미지 구매하기</span> <span class="d-inline d-md-none">원본이미지 구매</span> `; const handleClick = function(e) { e.preventDefault(); if (typeof window.dcOpenImageGuestModal === 'function') { window.dcOpenImageGuestModal(); } else { openLoginModal(); } }; button.onclick = handleClick; container.onclick = handleClick; container.appendChild(imgClone); container.appendChild(overlay); container.appendChild(watermarkPattern); container.appendChild(button); parent.replaceChild(container, img); }); }); </script> <script> function getPageInfo() { return { url: window.location.href, title: document.title }; } function openPopup(url, type) { let width, height; switch(type) { case 'facebookShare': width = 670; height = 450; break; default: width = 600; height = 600; } const left = (window.innerWidth - width) / 2; const top = (window.innerHeight - height) / 2; return window.open( url, type, `width=${width},height=${height},left=${left},top=${top},location=no,menubar=no,toolbar=no,status=no,scrollbars=yes,resizable=yes` ); } function shareNaverBlog() { const pageInfo = getPageInfo(); const shareUrl = encodeURIComponent(pageInfo.url); const title = encodeURIComponent(pageInfo.title); openPopup( `https://share.naver.com/web/shareView.nhn?url=${shareUrl}&title=${title}`, 'naverShare' ); } function shareFacebook() { const pageInfo = getPageInfo(); const shareUrl = encodeURIComponent(pageInfo.url); openPopup( `https://www.facebook.com/sharer/sharer.php?u=${shareUrl}`, 'facebookShare' ); } function shareTwitter() { const pageInfo = getPageInfo(); const shareUrl = encodeURIComponent(pageInfo.url); const text = encodeURIComponent(pageInfo.title); openPopup( `https://twitter.com/intent/tweet?url=${shareUrl}&text=${text}`, 'twitterShare' ); } function shareLinkedIn() { const pageInfo = getPageInfo(); const shareUrl = encodeURIComponent(pageInfo.url); const title = encodeURIComponent(pageInfo.title); openPopup( `https://www.linkedin.com/sharing/share-offsite/?url=${shareUrl}`, 'linkedinShare' ); } function shareLine() { const pageInfo = getPageInfo(); const shareUrl = encodeURIComponent(pageInfo.url); const text = encodeURIComponent(pageInfo.title); openPopup( `https://social-plugins.line.me/lineit/share?url=${shareUrl}`, 'lineShare' ); } function shareUrlCopy() { const pageInfo = getPageInfo(); navigator.clipboard.writeText(pageInfo.url) .then(() => { alertModal('URL 주소가 복사되었습니다.'); }) .catch(() => { alertModal('URL 주소 복사에 실패했습니다.'); }); } document.addEventListener('DOMContentLoaded', function() { const tooltips = document.querySelectorAll('[data-bs-toggle="tooltip"]'); tooltips.forEach(element => { const tooltip = new bootstrap.Tooltip(element, { trigger: 'hover' }); element.addEventListener('click', () => { tooltip.hide(); }); }); initSvgZoom(); }); function initSvgZoom() { const svgElements = document.querySelectorAll('.custom-content svg'); svgElements.forEach((svg, index) => { if (svg.dataset.icon === 'true') return; const svgString = svg.outerHTML; const svgLength = svgString.length; if (svgLength < 1300) { return; } const pathCount = svg.querySelectorAll('path').length; const textCount = svg.querySelectorAll('text').length; const totalElements = svg.querySelectorAll('*').length; const originalParent = svg.parentNode; const svgContainer = document.createElement('div'); svgContainer.className = 'svg-container'; svgContainer.id = `svg-container-${index}`; const svgWrapper = document.createElement('div'); svgWrapper.className = 'svg-wrapper'; svgWrapper.id = `svg-wrapper-${index}`; const infoBadge = document.createElement('div'); infoBadge.className = 'svg-info-badge'; infoBadge.id = `svg-info-${index}`; infoBadge.textContent = ''; const controls = document.createElement('div'); controls.className = 'svg-controls'; controls.setAttribute('role', 'group'); controls.setAttribute('aria-label', '도표 확대 및 축소'); controls.innerHTML = ` <button type="button" class="svg-control-btn zoom-in-btn" onclick="zoomSvg(${index}, 'in')" aria-label="도표 확대" title="확대"> <svg data-icon="true" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5v14M5 12h14"/></svg> </button> <button type="button" class="svg-control-btn zoom-out-btn" onclick="zoomSvg(${index}, 'out')" aria-label="도표 축소" title="축소"> <svg data-icon="true" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/></svg> </button> <span class="svg-controls-divider" aria-hidden="true"></span> <button type="button" class="svg-control-btn svg-reset-btn" onclick="resetSvg(${index})" aria-label="도표 크기와 위치 초기화" title="크기와 위치 초기화"> <svg data-icon="true" aria-hidden="true" focusable="false" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><path d="M3 11a9 9 0 1 1 2.64 6.36M3 4v7h7"/></svg> <span>초기화</span> </button> `; originalParent.replaceChild(svgContainer, svg); svgContainer.appendChild(svgWrapper); svgWrapper.appendChild(svg); svgContainer.appendChild(infoBadge); svgContainer.appendChild(controls); setupDragForSvg(svgWrapper, index); setupTouchEvents(svgWrapper, index); }); } function zoomSvg(index, direction) { const svgWrapper = document.getElementById(`svg-wrapper-${index}`); const currentScale = getComputedStyle(svgWrapper).transform; let scale = 1; if (currentScale !== 'none') { const matrix = new DOMMatrix(currentScale); scale = matrix.a; } if (direction === 'in') { scale = Math.min(scale + 0.2, 3); } else { scale = Math.max(scale - 0.2, 0.5); } svgWrapper.style.transform = `scale(${scale})`; const infoBadge = document.getElementById(`svg-info-${index}`); infoBadge.textContent = `확대/축소: ${Math.round(scale * 100)}%`; infoBadge.style.display = 'block'; setTimeout(() => { infoBadge.style.display = 'none'; }, 2000); } function resetSvg(index) { const svgWrapper = document.getElementById(`svg-wrapper-${index}`); svgWrapper.style.transform = 'scale(1)'; svgWrapper.style.left = '0px'; svgWrapper.style.top = '0px'; const infoBadge = document.getElementById(`svg-info-${index}`); infoBadge.textContent = '초기화됨'; infoBadge.style.display = 'block'; setTimeout(() => { infoBadge.style.display = 'none'; }, 2000); } function setupDragForSvg(element, index) { let isDragging = false; let startX, startY, initialLeft, initialTop; element.addEventListener('mousedown', startDrag); document.addEventListener('mousemove', drag); document.addEventListener('mouseup', endDrag); function startDrag(e) { const transform = getComputedStyle(element).transform; if (transform === 'none' || new DOMMatrix(transform).a <= 1) return; isDragging = true; startX = e.clientX; startY = e.clientY; initialLeft = parseInt(element.style.left || '0'); initialTop = parseInt(element.style.top || '0'); e.preventDefault(); } function drag(e) { if (!isDragging) return; const dx = e.clientX - startX; const dy = e.clientY - startY; element.style.left = `${initialLeft + dx}px`; element.style.top = `${initialTop + dy}px`; } function endDrag() { isDragging = false; } } function setupTouchEvents(element, index) { let lastTouchX, lastTouchY; let startDistance = 0; let initialScale = 1; let isScaling = false; element.addEventListener('touchstart', handleTouchStart, { passive: false }); element.addEventListener('touchmove', handleTouchMove, { passive: false }); element.addEventListener('touchend', handleTouchEnd, { passive: true }); function handleTouchStart(e) { const currentScale = getScale(element); if (e.touches.length === 1) { if (currentScale > 1.05) { lastTouchX = e.touches[0].clientX; lastTouchY = e.touches[0].clientY; e.preventDefault(); } } else if (e.touches.length === 2) { e.preventDefault(); startDistance = getDistance( e.touches[0].clientX, e.touches[0].clientY, e.touches[1].clientX, e.touches[1].clientY ); initialScale = currentScale; isScaling = true; } } function handleTouchMove(e) { const currentScale = getScale(element); if (e.touches.length === 1) { if (currentScale > 1.05) { const currentX = e.touches[0].clientX; const currentY = e.touches[0].clientY; const dx = currentX - lastTouchX; const dy = currentY - lastTouchY; const currentLeft = parseInt(element.style.left || '0'); const currentTop = parseInt(element.style.top || '0'); element.style.left = `${currentLeft + dx}px`; element.style.top = `${currentTop + dy}px`; lastTouchX = currentX; lastTouchY = currentY; e.preventDefault(); } } else if (e.touches.length === 2 && isScaling) { e.preventDefault(); const currentDistance = getDistance( e.touches[0].clientX, e.touches[0].clientY, e.touches[1].clientX, e.touches[1].clientY ); const scaleRatio = currentDistance / startDistance; const newScale = initialScale * scaleRatio; const limitedScale = Math.min(Math.max(newScale, 0.5), 5); element.style.transform = `scale(${limitedScale})`; const infoBadge = document.getElementById(`svg-info-${index}`); if (infoBadge) { infoBadge.textContent = `확대/축소: ${Math.round(limitedScale * 100)}%`; infoBadge.style.display = 'block'; } } } function handleTouchEnd(e) { if (e.touches.length < 2) { isScaling = false; const infoBadge = document.getElementById(`svg-info-${index}`); if (infoBadge) { clearTimeout(element.infoTimeout); element.infoTimeout = setTimeout(() => { infoBadge.style.display = 'none'; }, 2000); } } } function getDistance(x1, y1, x2, y2) { return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); } function getScale(element) { const transform = getComputedStyle(element).transform; if (transform === 'none') return 1; const matrix = new DOMMatrix(transform); return matrix.a; } } document.addEventListener('click', function(event) { const actionButtonsList = document.querySelectorAll('.action-buttons'); actionButtonsList.forEach(function(actionButtons) { if (!actionButtons.contains(event.target) && !event.target.classList.contains('btn-options')) { actionButtons.style.display = 'none'; const btnOptions = actionButtons.closest('.comment-actions').querySelector('.btn-options'); btnOptions.style.display = 'block'; } }); }); </script> <script> function order_go() { window.location.href = '/design-center/checkout?item=9508'; } document.querySelectorAll('.custom-content svg[width]').forEach(svg => { const width = parseInt(svg.getAttribute('width')); if (width < 50) { svg.dataset.icon = 'true'; } }); </script> <div class="modal fade" id="loginRequiredModal" tabindex="-1" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content" style="border-radius:14px;border:none;box-shadow:0 20px 60px rgba(0,0,0,0.18);"> <div class="modal-body p-4 text-center"> <div style="font-size:48px;line-height:1;margin-bottom:14px;">🔒</div> <div style="font-size:16px; line-height:1.7; color:#333;"> 계속해서 <strong style="color:#e53e3e;">더보기</strong> 기능은 <strong>로그인</strong>이 필요합니다 😊<br> <span style="color:#555;">로그인 하신 후, 아래 <strong style="color:#2b6cb0;">댓글</strong>도 남기시고<br><strong style="color:#2b6cb0;">지식 커뮤니티 활동</strong>에 참여해보세요! 💬</span> </div> </div> <div class="d-flex justify-content-center gap-2 pb-4 px-4"> <button type="button" class="btn px-4" onclick="openLoginFromAlert()" style="min-width:120px;background:linear-gradient(135deg,#4e54c8,#8f94fb);color:#fff;border:none;font-weight:700;box-shadow:0 4px 12px rgba(78,84,200,0.35);">🔐 로그인</button> <button type="button" class="btn btn-secondary px-4" data-bs-dismiss="modal" style="min-width:120px;font-weight:600;">닫기</button> </div> </div> </div> </div> <div id="dcPurchaseModalRoot" style="display:none;"> <div class="dc-pm-backdrop" onclick="dcClosePurchaseModal()"></div> <div class="dc-pm-dialog" role="dialog" aria-modal="true" aria-labelledby="dcPmTitle"> <button type="button" class="dc-pm-close" onclick="dcClosePurchaseModal()" aria-label="닫기"> <i class="bi bi-x-lg"></i> </button> <div class="dc-pm-body"> <div class="dc-pm-image-wrap"> <img id="dcPmImg" src="" alt="" /> </div> <div class="dc-pm-info"> <div class="dc-pm-badge"><i class="bi bi-image"></i> 디자인센터 이미지</div> <h5 id="dcPmTitle" class="dc-pm-title"></h5> <div class="dc-pm-price-box"> <div class="dc-pm-price-label">이미지 가격</div> <div class="dc-pm-price">5,000<span>원</span></div> </div> <div class="dc-pm-actions"> <button type="button" id="dcPmCartBtn" class="dc-pm-btn dc-pm-btn-cart" onclick="dcAddToCartFromModal()"> <i class="bi bi-cart-plus"></i> <span>디자인센터 장바구니에 담기</span> </button> <button type="button" id="dcPmBuyBtn" class="dc-pm-btn dc-pm-btn-buy" onclick="dcBuyNowFromModal()"> <i class="bi bi-credit-card"></i> <span>바로 구매하기</span> </button> </div> <div id="dcPmCartHint" class="dc-pm-cart-hint" style="display:none;"> <div class="dc-pm-cart-hint-text"> <i class="bi bi-info-circle-fill"></i> <span>현재 디자인센터 장바구니에 <strong id="dcPmCartCountText">0</strong>건 담겨 있어요.<br> <small>10개 이상 묶어 결제 시 최대 30% 할인!</small></span> </div> <a href="/design-center" class="dc-pm-cart-hint-link"> 장바구니 보러가기 <i class="bi bi-arrow-right"></i> </a> </div> <div class="dc-pm-notice"> <i class="bi bi-info-circle"></i> 구매 시 고해상도 PNG 원본을 다운로드 받을 수 있으며, 상업적 이용이 가능합니다. 한 번 구매 시 영구 사용! </div> <a href="/design-center" class="dc-pm-more"> 디자인센터에서 더 많은 이미지 보기 <i class="bi bi-arrow-right"></i> </a> </div> </div> </div> </div> <div class="modal fade" id="dcImageGuestModal" tabindex="-1" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content" style="border-radius:14px;border:none;box-shadow:0 20px 60px rgba(0,0,0,0.18);"> <div class="modal-body p-4 text-center"> <div style="font-size:48px;line-height:1;margin-bottom:14px;">🎨</div> <div style="font-size:16px; line-height:1.7; color:#333;"> <strong style="color:#f59e0b;">디자인센터 이미지 구매</strong> 기능은 <strong>로그인</strong>이 필요합니다 😊<br> <span style="color:#555;">로그인 후 <strong style="color:#92400e;">고해상도 PNG 원본</strong>을 다운로드 받고<br><strong style="color:#92400e;">상업적 이용</strong>까지 가능한 이미지를 만나보세요! 🖼️</span> </div> </div> <div class="d-flex justify-content-center gap-2 pb-4 px-4"> <button type="button" class="btn px-4" onclick="dcImageGuestLogin()" style="min-width:120px;background:linear-gradient(135deg,#f59e0b,#f97316);color:#fff;border:none;font-weight:700;box-shadow:0 4px 12px rgba(245,158,11,0.35);">🔐 로그인</button> <button type="button" class="btn btn-secondary px-4" data-bs-dismiss="modal" style="min-width:120px;font-weight:600;">닫기</button> </div> </div> </div> </div> <div id="dcPmToast" class="dc-pm-toast"></div> <style> .dc-pm-backdrop { position: fixed; inset: 0; background: rgba(0,0,0,0.55); z-index: 11000; animation: dcPmFade .2s ease; } .dc-pm-dialog { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 92vw; max-width: 880px; max-height: 92vh; background: #fff; border-radius: 18px; z-index: 11001; overflow: hidden; box-shadow: 0 25px 60px rgba(0,0,0,0.3); animation: dcPmPop .25s cubic-bezier(.34,1.56,.64,1); } .dc-pm-close { position: absolute; top: 14px; right: 14px; width: 36px; height: 36px; border-radius: 50%; border: none; background: rgba(0,0,0,0.55); color: #fff; cursor: pointer; z-index: 5; display: flex; align-items: center; justify-content: center; } .dc-pm-close:hover { background: rgba(0,0,0,0.75); } .dc-pm-body { display: grid; grid-template-columns: 1.1fr 1fr; max-height: 92vh; } .dc-pm-image-wrap { position: relative; background: #f5f5f7; display: flex; align-items: center; justify-content: center; min-height: 320px; max-height: 92vh; overflow: hidden; } .dc-pm-image-wrap img { max-width: 100%; max-height: 92vh; object-fit: contain; } .dc-pm-info { padding: 28px 26px; display: flex; flex-direction: column; gap: 14px; overflow-y: auto; } .dc-pm-badge { display: inline-flex; align-items: center; gap: 6px; align-self: flex-start; background: #fef3c7; color: #92400e; padding: 5px 11px; border-radius: 999px; font-size: 12px; font-weight: 600; } .dc-pm-title { font-size: 17px; font-weight: 700; line-height: 1.5; color: #1f2937; margin: 0; word-break: keep-all; } .dc-pm-price-box { background: linear-gradient(135deg, #fff7ed 0%, #fef3c7 100%); border-radius: 12px; padding: 14px 16px; } .dc-pm-price-label { font-size: 12px; color: #92400e; font-weight: 600; margin-bottom: 4px; } .dc-pm-price { font-size: 30px; font-weight: 800; color: #1f2937; line-height: 1; } .dc-pm-price span { font-size: 15px; font-weight: 600; margin-left: 3px; color: #4b5563; } .dc-pm-actions { display: flex; flex-direction: column; gap: 8px; margin-top: 4px; } .dc-pm-btn { display: inline-flex; align-items: center; justify-content: center; gap: 8px; width: 100%; padding: 13px 16px; border-radius: 12px; border: none; font-size: 15px; font-weight: 700; cursor: pointer; transition: transform .1s ease, box-shadow .15s ease; } .dc-pm-btn:hover { transform: translateY(-1px); } .dc-pm-btn:active { transform: translateY(0); } .dc-pm-btn:disabled { opacity: .65; cursor: not-allowed; transform: none; } .dc-pm-btn-cart { background: #fff; color: #1f2937; border: 1.5px solid #e5e7eb; } .dc-pm-btn-cart:hover { border-color: #f59e0b; color: #92400e; } .dc-pm-btn-cart.in-cart { background: #ecfdf5; border-color: #10b981; color: #047857; } .dc-pm-btn-buy { background: linear-gradient(135deg, #f59e0b 0%, #f97316 100%); color: #fff; box-shadow: 0 6px 16px rgba(245,158,11,0.35); } .dc-pm-notice { background: #fffbeb; border: 1px solid #fde68a; color: #92400e; border-radius: 10px; padding: 10px 12px; font-size: 12.5px; line-height: 1.55; display: flex; gap: 6px; } .dc-pm-notice i { flex-shrink: 0; margin-top: 2px; } .dc-pm-more { font-size: 13px; color: #6366f1; text-decoration: none; align-self: flex-start; font-weight: 600; } .dc-pm-more:hover { color: #4f46e5; text-decoration: underline; } .dc-pm-cart-hint { background: #ecfdf5; border: 1px solid #a7f3d0; border-radius: 10px; padding: 10px 12px; display: flex; align-items: center; justify-content: space-between; gap: 10px; animation: dcPmHintIn .3s ease; } .dc-pm-cart-hint-text { font-size: 12.5px; color: #065f46; line-height: 1.5; display: flex; gap: 6px; align-items: flex-start; } .dc-pm-cart-hint-text i { color: #10b981; flex-shrink: 0; margin-top: 3px; } .dc-pm-cart-hint-text small { color: #047857; font-size: 11.5px; } .dc-pm-cart-hint-link { white-space: nowrap; font-size: 12.5px; color: #047857; text-decoration: none; font-weight: 700; padding: 6px 10px; background: #fff; border-radius: 8px; border: 1px solid #a7f3d0; flex-shrink: 0; } .dc-pm-cart-hint-link:hover { background: #d1fae5; color: #065f46; } @keyframes dcPmHintIn { from { opacity: 0; transform: translateY(-4px) } to { opacity: 1; transform: translateY(0) } } .dc-pm-toast { position: fixed; bottom: 80px; left: 50%; transform: translateX(-50%) translateY(20px); background: #1f2937; color: #fff; padding: 12px 18px; border-radius: 999px; font-size: 14px; font-weight: 600; z-index: 12000; opacity: 0; pointer-events: none; transition: all .25s ease; box-shadow: 0 10px 30px rgba(0,0,0,0.25); display: inline-flex; align-items: center; gap: 10px; max-width: 92vw; } .dc-pm-toast.show { opacity: 1; transform: translateX(-50%) translateY(0); pointer-events: auto; } .dc-pm-toast.error { background: #b91c1c; } .dc-pm-toast.success { background: #047857; } .dc-pm-toast a { color: #fff; text-decoration: underline; font-weight: 800; padding-left: 6px; border-left: 1px solid rgba(255,255,255,0.4); margin-left: 2px; } .dc-pm-toast a:hover { color: #fef3c7; } @keyframes dcPmFade { from { opacity: 0 } to { opacity: 1 } } @keyframes dcPmPop { from { opacity: 0; transform: translate(-50%, -50%) scale(.92) } to { opacity: 1; transform: translate(-50%, -50%) scale(1) } } @media (max-width: 720px) { .dc-pm-dialog { width: 100%; max-width: 100%; height: 100%; max-height: 100%; border-radius: 0; top: 0; left: 0; transform: none; animation: dcPmFade .2s ease; } .dc-pm-body { grid-template-columns: 1fr; grid-template-rows: 45vh 1fr; max-height: 100vh; } .dc-pm-image-wrap { max-height: 45vh; } .dc-pm-image-wrap img { max-height: 45vh; } .dc-pm-info { padding: 20px 18px; } .dc-pm-toast { bottom: 24px; } } </style> <script> (function(){ const root = document.getElementById('dcPurchaseModalRoot'); const imgEl = document.getElementById('dcPmImg'); const titleEl = document.getElementById('dcPmTitle'); const cartBtn = document.getElementById('dcPmCartBtn'); const buyBtn = document.getElementById('dcPmBuyBtn'); const toastEl = document.getElementById('dcPmToast'); let currentSrl = null; function showToast(msg, type, opts) { toastEl.className = 'dc-pm-toast'; if (type) toastEl.classList.add(type); const icon = (type === 'error' ? '<i class="bi bi-exclamation-circle"></i>' : '<i class="bi bi-check-circle"></i>'); const link = (opts && opts.link) ? ` <a href="${opts.link.href}">${opts.link.text} <i class="bi bi-arrow-right"></i></a>` : ''; toastEl.innerHTML = icon + ' <span>' + msg + '</span>' + link; requestAnimationFrame(() => toastEl.classList.add('show')); clearTimeout(toastEl._t); const ttl = (opts && opts.link) ? 4500 : 2200; toastEl._t = setTimeout(() => toastEl.classList.remove('show'), ttl); } window.dcOpenPurchaseModal = function(opts) { const { srl, title, src } = opts || {}; if (!srl || !src) return; currentSrl = srl; imgEl.src = src; imgEl.alt = title || ''; titleEl.textContent = title || '디자인센터 이미지'; cartBtn.disabled = false; cartBtn.classList.remove('in-cart'); cartBtn.querySelector('span').textContent = '디자인센터 장바구니에 담기'; const hint = document.getElementById('dcPmCartHint'); if (hint) hint.style.display = 'none'; root.style.display = 'block'; document.body.style.overflow = 'hidden'; }; window.dcClosePurchaseModal = function() { root.style.display = 'none'; document.body.style.overflow = ''; currentSrl = null; }; window.dcBuyNowFromModal = function() { if (!currentSrl) return; window.dcClosePurchaseModal(); window.dcOpenImageGuestModal(); }; window.dcOpenImageGuestModal = function() { const el = document.getElementById('dcImageGuestModal'); if (el && window.bootstrap && bootstrap.Modal) { bootstrap.Modal.getOrCreateInstance(el).show(); return; } if (typeof openLoginModal === 'function') openLoginModal(); else window.location.href = '/login'; }; window.dcImageGuestLogin = function() { const el = document.getElementById('dcImageGuestModal'); if (el && window.bootstrap && bootstrap.Modal) { bootstrap.Modal.getOrCreateInstance(el).hide(); } setTimeout(() => { if (typeof openLoginModal === 'function') openLoginModal(); else window.location.href = '/login'; }, 250); }; window.dcAddToCartFromModal = function() { if (!currentSrl) return; cartBtn.disabled = true; const fd = new FormData(); fd.append('document_srl', currentSrl); fd.append('_token', 'rOY58jTkyhygZqmxttb5QgdjPjk0reyK7KTf2J0o'); fetch('https://www.jaenung.net/design-center/cart/add', { method: 'POST', headers: { 'X-CSRF-TOKEN': 'rOY58jTkyhygZqmxttb5QgdjPjk0reyK7KTf2J0o', 'Accept': 'application/json' }, body: fd, credentials: 'same-origin', }) .then(r => r.json().then(j => ({ ok: r.ok, data: j }))) .then(({ ok, data }) => { if (data.status === 'success' || data.status === 'already_in_cart') { cartBtn.classList.add('in-cart'); cartBtn.querySelector('span').textContent = '디자인센터 장바구니에 담김'; const hint = document.getElementById('dcPmCartHint'); const countEl = document.getElementById('dcPmCartCountText'); if (hint && countEl) { countEl.textContent = (typeof data.cartCount === 'number') ? data.cartCount : '여러'; hint.style.display = 'flex'; } showToast(data.message || '디자인센터 장바구니에 담았어요.', 'success', { link: { href: '/design-center', text: '장바구니 보러가기' } }); } else if (data.status === 'already_purchased') { showToast(data.message || '이미 구매한 이미지입니다.', 'success'); } else { showToast(data.message || '오류가 발생했습니다.', 'error'); cartBtn.disabled = false; } }) .catch(() => { showToast('네트워크 오류가 발생했습니다.', 'error'); cartBtn.disabled = false; }); }; document.addEventListener('keydown', function(e) { if (e.key === 'Escape' && root.style.display === 'block') window.dcClosePurchaseModal(); }); })(); </script> </main> <div class="jn-site-footer"><footer id="site-footer" class="jn-footer pretendard-500"> <div class="container position-relative"> <div class="d-none d-lg-block"> <div class="jn-footer-directory"> <div class="jn-footer-directory-brand"> <a class="BarLink jn-footer-brand-lockup" href="/" aria-label="재능넷 홈"> <span class="jn-footer-logo-core"> <span class="jn-footer-mascot" aria-hidden="true"><img src="https://static.jaenung.net/build/assets/footer-grand-mascot-0fe523bb.webp" width="264" height="371" alt="" loading="lazy" decoding="async" /></span> <span class="jn-footer-wordmark">재능<span>넷</span></span> </span> <span class="jn-footer-logo-guides" aria-hidden="true"></span> </a> <p>좋은 재능이 만드는,<br><strong>더 좋은 일상.</strong></p> </div> <nav class="jn-footer-directory-nav" aria-label="푸터 메뉴"> <div class="jn-footer-directory-group jn-footer-tone--violet"> <div class="jn-footer-directory-heading"> <span class="jn-footer-directory-icon" aria-hidden="true"><i class="bi bi-grid-1x2-fill"></i></span> <h3>재능넷</h3> </div> <p class="jn-footer-directory-description">재능과 사람을 연결하는 곳</p> <ul class="jn-footer-directory-links"> <li><a class="BarLink" href="/">홈<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/login">로그인/회원가입<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/findAccount">아이디/비밀번호 찾기<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice">공지사항<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/mypage">마이페이지<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/iForest">지식인의 숲<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> </ul> </div> <div class="jn-footer-directory-group jn-footer-tone--teal"> <div class="jn-footer-directory-heading"> <span class="jn-footer-directory-icon" aria-hidden="true"><i class="bi bi-headset"></i></span> <h3>고객센터</h3> </div> <p class="jn-footer-directory-description">궁금한 점을 해결해 보세요</p> <ul class="jn-footer-directory-links"> <li><a class="BarLink" href="/posts/notice/465">이용 가이드<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/customer/faq">자주 묻는 질문<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/inquiry">1:1 문의<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/2285443">안전거래TIP<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/2125427">부분 취소(특허등록)<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> </ul> </div> <div class="jn-footer-directory-group jn-footer-tone--orange"> <div class="jn-footer-directory-heading"> <span class="jn-footer-directory-icon" aria-hidden="true"><i class="bi bi-shop"></i></span> <h3>판매센터</h3> </div> <p class="jn-footer-directory-description">내 재능의 가치를 더 크게</p> <ul class="jn-footer-directory-links"> <li><a class="BarLink" href="/declare">재능등록<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/4605914">재능 등록 기준<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/18768">판매 수수료 안내<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/11960468">유료 광고 안내<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/1368646">재능인 인증서<i class="bi bi-arrow-up-right" aria-hidden="true"></i></a></li> </ul> </div> </nav> </div> <div class="jn-footer-divider"></div> <div class="jn-footer-policy-row"> <a class="BarLink jn-footer-policy-link" href="/agreement">서비스 이용약관</a> <a class="BarLink jn-footer-policy-link is-emphasis" href="/privacy">개인정보 처리방침</a> <a class="BarLink jn-footer-policy-link" href="/automation">사이트 자동화 운영안내</a> <a class="BarLink jn-footer-policy-link" href="/ai-green">AI 그린 리포트</a> <a class="BarLink jn-footer-policy-link" href="/sitemap">사이트맵</a> </div> <div class="jn-footer-platform-notice"><i class="bi bi-megaphone"></i><strong>재능넷은 다양한 재능을 연결하는 중개 플랫폼입니다. 서비스 상담과 의뢰 문의는 각 판매회원과 직접 진행해 주세요.</strong></div> <div class="row g-3 align-items-start"> <div class="col-xxl-9 col-xl-9"> <div class="jn-footer-company-card"> <div class="jn-footer-company-grid"> <div class="jn-footer-company-item"><span class="jn-footer-company-key">대표</span><span class="jn-footer-company-val">강정수</span></div> <div class="jn-footer-company-item is-wide"><span class="jn-footer-company-key">주소</span><span class="jn-footer-company-val">경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동)</span></div> <div class="jn-footer-company-item"><span class="jn-footer-company-key">사업자등록번호</span><span class="jn-footer-company-val">131-86-65451</span></div> <div class="jn-footer-company-item"><span class="jn-footer-company-key">통신판매업신고</span><span class="jn-footer-company-val">2018-수원영통-0307</span></div> <div class="jn-footer-company-item"><span class="jn-footer-company-key">이메일</span><span class="jn-footer-company-val">jaenung@jaenung.net</span></div> </div> <div class="jn-footer-bottom-meta"> <div class="jn-footer-meta-links"> <a class="BarLink jn-footer-meta-chip is-link" href="https://www.ftc.go.kr/bizCommPop.do?wrkr_no=1318665451" target="_blank" rel="noopener noreferrer"><i class="bi bi-box-arrow-up-right"></i><span>사업자 정보확인</span></a> <span class="jn-footer-meta-chip"><i class="bi bi-cloud-check"></i><span>호스팅 사업자 <strong>Amazon Web Service(AWS)</strong></span></span> </div> <div class="jn-footer-channel-links"> <a class="BarLink jn-footer-meta-chip is-link" href="https://play.google.com/store/apps/details?id=net.jaenung.myapp" target="_blank" rel="noopener noreferrer"><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 512 512" style="vertical-align:-2px;margin-right:3px"><path fill="#4285F4" d="M325.3 234.3L23.9 1.5C16.8-3.2 8.9.5 8.9 9.2v493.6c0 8.7 7.9 12.4 15 7.7l301.4-232.8c6.2-4.8 6.2-14.6 0-19.4z" transform="translate(80,0) scale(0.7)"/><path fill="#34A853" d="M325.3 253.7l-76.4-59L23.9 510.8c3.5 2.7 8.5 2.7 12.2-.1l289.2-223.1z" transform="translate(80,0) scale(0.7)"/><path fill="#FBBC04" d="M325.3 234.3L36.1 11.2C32.4 8.4 27.4 8.4 23.9 11.1l225 183.9 76.4-60.7z" transform="translate(80,0) scale(0.7)"/><path fill="#EA4335" d="M325.3 234.3l76.4 59c6.2 4.8 6.2 14.6 0 19.4l-76.4 59L248.9 312V194.7l76.4 39.6z" transform="translate(80,0) scale(0.7)"/></svg><span>Google Play</span></a> <a class="BarLink jn-footer-meta-chip is-link" href="https://www.mrkang.net" target="_blank" rel="noopener noreferrer"><i class="bi bi-person-workspace"></i><span>SNS · 미스터강</span></a> </div> </div> <div class="jn-footer-note-list"> <p>(주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.</p> <p>(주)재능넷은 통신판매중개자이며 통신판매의 당사자가 아닙니다. 상품, 상품정보, 거래에 관한 의무와 책임은 판매회원에게 있습니다.</p> </div> </div> <p class="jn-footer-copyright">Copyright © 2026 재능넷 Inc. All rights reserved.</p> </div> <div class="col-xxl-3 col-xl-3"> <div class="jn-footer-side-stack"> <a class="BarLink jn-footer-side-card jn-footer-side-card--automation" href="/automation"><span class="jn-footer-side-kicker"><i class="bi bi-cpu"></i> Automated Operation</span><h3 class="jn-footer-side-title">사이트 자동화 운영안내</h3><span class="jn-footer-side-cta">자세히 보기 <i class="bi bi-arrow-right"></i></span></a> <div class="jn-footer-toss-button"><img src="https://static.jaenung.net/asset/img/tosspayments_logo.png" width="116" height="44" alt="토스페이먼츠 로고" /><span>토스 안전결제</span></div> <a href="/ai-green" style="display:flex;align-items:center;gap:11px;padding:12px 14px;border-radius:8px;text-decoration:none;background:linear-gradient(135deg,#eaf9ef,#dff5ea);border:1px solid #bfe8d0;color:#0d4c3a;transition:transform .2s ease, box-shadow .2s ease;" onmouseover="this.style.transform='translateY(-1px)';this.style.boxShadow='0 8px 18px rgba(31,122,87,0.18)';" onmouseout="this.style.transform='translateY(0)';this.style.boxShadow='none';"> <svg viewBox="0 0 32 32" width="30" height="30" fill="none" xmlns="http://www.w3.org/2000/svg" style="flex-shrink:0;"> <path d="M27.5 4.5 C 17.5 4.5, 7.5 10, 6 21 C 5.4 26.5, 8 28, 11.5 27 C 15 26, 19 22, 22 17 C 25 12, 27.5 8, 27.5 4.5 Z" fill="#1f7a57"/> </svg> <div style="display:flex;flex-direction:column;gap:2px;line-height:1.3;"> <strong style="font-size:13.5px;font-weight:850;color:#0d4c3a;">AI 그린 리포트</strong> <span style="font-size:11px;color:#1f7a57;font-weight:700;letter-spacing:.02em;">한 번 만들고 함께 쓰는 운영</span> </div> </a> </div> </div> </div> </div> <div class="jn-footer-awards d-none d-lg-block"> <div class="jn-footer-awards-head"><h3><span style="position:relative;display:inline-block;vertical-align:-4px;margin-right:6px;width:28px;height:28px"><svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="url(#trophyGold)" stroke="url(#trophyGold)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><defs><linearGradient id="trophyGold" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" stop-color="#FFD700"/><stop offset="40%" stop-color="#FFC200"/><stop offset="60%" stop-color="#FFEC80"/><stop offset="100%" stop-color="#FFD700"/></linearGradient></defs><path d="M6 9H4.5a2.5 2.5 0 0 1 0-5H6"/><path d="M18 9h1.5a2.5 2.5 0 0 0 0-5H18"/><path d="M4 22h16"/><path d="M10 14.66V17c0 .55-.47.98-.97 1.21C7.85 18.75 7 20.24 7 22"/><path d="M14 14.66V17c0 .55.47.98.97 1.21C16.15 18.75 17 20.24 17 22"/><path d="M18 2H6v7a6 6 0 0 0 12 0V2Z"/></svg><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="#FFD700" style="position:absolute;top:-4px;right:-6px;animation:jnSparkle 1.5s ease-in-out infinite"><path d="M12 2l2.1 6.5H21l-5.5 4 2.1 6.5L12 15l-5.6 4 2.1-6.5L3 8.5h6.9z"/></svg><svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 24 24" fill="#FFEC80" style="position:absolute;top:2px;right:-10px;animation:jnSparkle 1.5s ease-in-out .5s infinite"><path d="M12 2l2.1 6.5H21l-5.5 4 2.1 6.5L12 15l-5.6 4 2.1-6.5L3 8.5h6.9z"/></svg><svg xmlns="http://www.w3.org/2000/svg" width="10" height="10" viewBox="0 0 24 24" fill="#FFC200" style="position:absolute;bottom:0;right:-8px;animation:jnSparkle 1.5s ease-in-out 1s infinite"><path d="M12 2l2.1 6.5H21l-5.5 4 2.1 6.5L12 15l-5.6 4 2.1-6.5L3 8.5h6.9z"/></svg></span>주요 인증 및 수상</h3><p>재능넷이 쌓아온 신뢰와 운영 이력을 한눈에 확인할 수 있습니다.</p></div> <div class="jn-award-slider" data-autoplay="true"> <button class="jn-award-slider-btn jn-award-slider-prev" aria-label="이전"><i class="bi bi-chevron-left"></i></button> <div class="jn-award-slider-track"> <div class="jn-award-slider-item"><div class="jn-footer-award-card">ICT Innovation 대상<br>미래창조과학부장관 표창</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">서울특별시<br>공유기업 지정</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">한국데이터베이스진흥원<br>콘텐츠 제공서비스 품질인증</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">대한민국 중소 중견기업<br>혁신대상 중소기업청장상</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">인터넷에코어워드<br>일자리창출 분야 대상</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">웹어워드코리아<br>인터넷 서비스분야 우수상</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">정보통신산업진흥원장<br>정부유공 표창장</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">미래창조과학부<br>ICT지원사업 선정</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">기술혁신<br>벤처기업 확인</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">기술개발<br>기업부설 연구소 인정</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">마이크로소프트<br>BizsPark 스타트업</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">대한민국 미래경영대상<br>재능마켓 부문 수상</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">대한민국 중소기업인 대회<br>중소기업중앙회장 표창</div></div> <div class="jn-award-slider-item"><div class="jn-footer-award-card">국회 중소벤처기업위원회<br>위원장 표창</div></div> </div> <button class="jn-award-slider-btn jn-award-slider-next" aria-label="다음"><i class="bi bi-chevron-right"></i></button> </div> </div> <div class="jn-footer-compact d-lg-none"> <div class="jn-footer-compact-brand"> <a class="BarLink jn-footer-brand-lockup" href="/" aria-label="재능넷 홈"> <span class="jn-footer-logo-core"> <span class="jn-footer-mascot" aria-hidden="true"><img src="https://static.jaenung.net/build/assets/footer-grand-mascot-0fe523bb.webp" width="264" height="371" alt="" loading="lazy" decoding="async" /></span> <span class="jn-footer-wordmark">재능<span>넷</span></span> </span> <span class="jn-footer-logo-guides" aria-hidden="true"></span> </a> </div> <p class="jn-footer-compact-tagline">좋은 재능이 만드는, <strong>더 좋은 일상.</strong></p> <nav class="jn-footer-accordion" aria-label="푸터 메뉴"> <details class="jn-footer-fold jn-footer-tone--violet"> <summary><span class="jn-footer-directory-icon" aria-hidden="true"><i class="bi bi-grid-1x2-fill"></i></span><span>재능넷</span><i class="bi bi-chevron-down jn-footer-fold-chevron" aria-hidden="true"></i></summary> <ul class="jn-footer-fold-links"> <li><a class="BarLink" href="/">홈<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/login">로그인/회원가입<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/findAccount">아이디/비밀번호 찾기<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice">공지사항<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/mypage">마이페이지<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/iForest">지식인의 숲<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> </ul> </details> <details class="jn-footer-fold jn-footer-tone--teal"> <summary><span class="jn-footer-directory-icon" aria-hidden="true"><i class="bi bi-headset"></i></span><span>고객센터</span><i class="bi bi-chevron-down jn-footer-fold-chevron" aria-hidden="true"></i></summary> <ul class="jn-footer-fold-links"> <li><a class="BarLink" href="/posts/notice/465">이용 가이드<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/customer/faq">자주 묻는 질문<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/inquiry">1:1 문의<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/2285443">안전거래TIP<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/2125427">부분 취소(특허등록)<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> </ul> </details> <details class="jn-footer-fold jn-footer-tone--orange"> <summary><span class="jn-footer-directory-icon" aria-hidden="true"><i class="bi bi-shop"></i></span><span>판매센터</span><i class="bi bi-chevron-down jn-footer-fold-chevron" aria-hidden="true"></i></summary> <ul class="jn-footer-fold-links"> <li><a class="BarLink" href="/declare">재능등록<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/4605914">재능 등록 기준<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/18768">판매 수수료 안내<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/11960468">유료 광고 안내<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> <li><a class="BarLink" href="/posts/notice/1368646">재능인 인증서<i class="bi bi-chevron-right" aria-hidden="true"></i></a></li> </ul> </details> </nav> <nav class="jn-footer-compact-policy" aria-label="약관 및 운영정책"> <a class="BarLink" href="/agreement">서비스 이용약관</a> <a class="BarLink is-emphasis" href="/privacy">개인정보 처리방침</a> <a class="BarLink" href="/automation">사이트 자동화 운영안내</a> <a class="BarLink" href="/ai-green">AI 그린 리포트</a> <a class="BarLink" href="/sitemap">사이트맵</a> </nav> <div class="jn-footer-compact-notice"><i class="bi bi-megaphone" aria-hidden="true"></i><p><strong>재능넷은 다양한 재능을 연결하는 중개 플랫폼입니다.</strong> 서비스 상담과 의뢰 문의는 각 판매회원과 직접 진행해 주세요.</p></div> <div class="jn-footer-compact-company"> <div class="jn-footer-compact-company-heading"><h3>(주)재능넷</h3><a class="BarLink" href="https://www.ftc.go.kr/bizCommPop.do?wrkr_no=1318665451" target="_blank" rel="noopener noreferrer">사업자 정보확인<i class="bi bi-box-arrow-up-right" aria-hidden="true"></i></a></div> <dl> <div><dt>대표</dt><dd>강정수</dd></div> <div><dt>사업자등록번호</dt><dd>131-86-65451</dd></div> <div><dt>통신판매업신고</dt><dd>2018-수원영통-0307</dd></div> <div><dt>주소</dt><dd>경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동)</dd></div> <div><dt>이메일</dt><dd>jaenung@jaenung.net</dd></div> <div><dt>호스팅 사업자</dt><dd>Amazon Web Service(AWS)</dd></div> </dl> </div> <div class="jn-footer-compact-channels"> <a class="BarLink" href="/automation"><i class="bi bi-cpu" aria-hidden="true"></i><span>자동화 안내</span></a> <span class="jn-footer-compact-payment"><img src="https://static.jaenung.net/asset/img/tosspayments_logo.png" width="48" height="18" alt="토스페이먼츠 로고" /><span>토스 안전결제</span></span> <a class="BarLink" href="https://play.google.com/store/apps/details?id=net.jaenung.myapp" target="_blank" rel="noopener noreferrer"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 512 512" style="vertical-align:-2px;margin-right:2px"><path fill="#4285F4" d="M325.3 234.3L23.9 1.5C16.8-3.2 8.9.5 8.9 9.2v493.6c0 8.7 7.9 12.4 15 7.7l301.4-232.8c6.2-4.8 6.2-14.6 0-19.4z" transform="translate(80,0) scale(0.7)"/><path fill="#34A853" d="M325.3 253.7l-76.4-59L23.9 510.8c3.5 2.7 8.5 2.7 12.2-.1l289.2-223.1z" transform="translate(80,0) scale(0.7)"/><path fill="#FBBC04" d="M325.3 234.3L36.1 11.2C32.4 8.4 27.4 8.4 23.9 11.1l225 183.9 76.4-60.7z" transform="translate(80,0) scale(0.7)"/><path fill="#EA4335" d="M325.3 234.3l76.4 59c6.2 4.8 6.2 14.6 0 19.4l-76.4 59L248.9 312V194.7l76.4 39.6z" transform="translate(80,0) scale(0.7)"/></svg><span>Google Play</span></a> <a class="BarLink" href="https://www.mrkang.net" target="_blank" rel="noopener noreferrer"><i class="bi bi-person-workspace" aria-hidden="true"></i><span>SNS · 미스터강</span></a> </div> <div class="jn-footer-compact-legal"> <p>(주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.</p> <p>(주)재능넷은 통신판매중개자이며 통신판매의 당사자가 아닙니다. 상품, 상품정보, 거래에 관한 의무와 책임은 판매회원에게 있습니다.</p> </div> <p class="jn-footer-compact-copy">Copyright © 2026 재능넷 Inc. All rights reserved.</p> </div> </div> </footer> </div> </div> </div> <div id="jnShellBackdrop" class="jn-shell-backdrop" hidden aria-hidden="true"></div> <div class="back-top"><i class="bi bi-arrow-up-short position-absolute top-50 start-50 translate-middle"></i></div> <div class="modal fade" id="generalConfirmModal" tabindex="-1" aria-labelledby="generalConfirmModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><h4 class="modal-title" id="generalConfirmModalLabel"><i class="bi bi-check-lg"></i> 확인</h4><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body"><div id="confirmMessage" class="pretendard-500 text-dark text-center fs-5"></div></div><div class="modal-footer"><button type="button" class="px-4 btn btn-secondary pretendard-600 fs-5" data-bs-dismiss="modal" id="cancelButton">취소</button><button type="button" class="px-4 btn btn-warning pretendard-600 fs-5" id="confirmButton">확인</button></div></div></div></div> <div class="modal fade" id="generalAlrimModal" tabindex="-1" aria-labelledby="generalAlrimModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content pt-4 pb-4"><div class="modal-body"><div class="text-center"><i class="bi bi-patch-exclamation text-danger fs-1"></i></div><div id="alrimMessage" class="pretendard-500 text-dark text-center fs-5"></div></div><div class="text-center pb-3 pt-2"><button type="button" class="px-4 btn btn-warning pretendard-600 fs-5" data-bs-dismiss="modal">확인</button></div></div></div></div> <div id="spinnerOverlay" class="jn-spinner-overlay"><div class="spinner-border jn-spinner" role="status"><span class="visually-hidden">Loading...</span></div></div> <dialog class="login-modal-backdrop" id="loginModalBackdrop" aria-labelledby="loginModalTitle"> <div class="login-container" id="loginContainer"> <button type="button" class="login-close" id="closeLoginModal" aria-label="로그인 창 닫기" autofocus>×</button> <header class="login-ticket-header"> <img class="login-mascot" src="https://static.jaenung.net/asset/img_new/brand/login-ticket-header.webp" width="880" height="440" alt="" aria-hidden="true" decoding="async"> <span class="login-brand-tag">재능넷</span> <h2 id="loginModalTitle">모든 재능이<br>모이는 곳<span class="visually-hidden"> — 로그인</span></h2> <p class="login-welcome-benefit"> <svg width="26" height="26" viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M4 10h16v11H4z" fill="#ff7857"/><path d="M3 7h18v5H3z" fill="#ff9c38"/><path d="M10.5 7h3v14h-3z" fill="#ffdc5f"/><path d="M12 7C4 7 6 1 9 3l3 4Zm0 0c8 0 6-6 3-4l-3 4Z" stroke="#ad6221" stroke-width="1.8" stroke-linejoin="round"/></svg> <span>가입인사 남기면 잔고 <strong>1,000원!</strong></span> </p> </header> <div class="login-ticket-seam" aria-hidden="true"></div> <div class="login-loginForm"> <form id="loginForm" action="https://www.jaenung.net/loginModal" method="post"> <input type="hidden" name="_token" value="rOY58jTkyhygZqmxttb5QgdjPjk0reyK7KTf2J0o" autocomplete="off"> <div class="login-field"> <label for="identifierInput" class="visually-hidden">아이디 또는 이메일 주소</label> <input type="text" class="form-control" id="identifierInput" name="identifier" placeholder="아이디 또는 이메일 주소" value="" autocomplete="username" autocapitalize="none" spellcheck="false" required> </div> <div class="login-field"> <label for="passwordInput" class="visually-hidden">비밀번호</label> <input type="password" class="form-control" id="passwordInput" name="password" placeholder="비밀번호" autocomplete="current-password" required> <button type="button" class="login-password-toggle" id="passwordToggle" aria-label="비밀번호 보기" aria-pressed="false"><svg width="21" height="21" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12Z"/><circle cx="12" cy="12" r="3"/><path class="login-eye-slash" d="m3 3 18 18"/></svg></button> </div> <div class="login-utilities"> <label class="login-remember" for="rememberCheck"><input class="form-check-input" type="checkbox" id="rememberCheck" name="remember" checked>로그인 상태 유지</label> <a href="/findAccount">아이디/비밀번호 찾기</a> </div> <button type="submit" class="btn btn-dark login-submit" id="loginBtn">로그인</button> <div id="loginFeedback" role="status" aria-live="polite" hidden></div> <a class="login-naver" href="https://www.jaenung.net/auth/naver"><img src="https://static.jaenung.net/asset/img/naver_login_icon1.png" alt="" width="26" height="26">네이버로 간편 로그인</a> <p class="login-join">재능넷이 처음이라면? <a href="/joinUs">회원가입 <span aria-hidden="true">›</span></a></p> </form> </div> </div> </dialog> <script> let loginModalBackdrop, loginBodyStyles, loginReturnUrl; let loginModalState = 'idle'; // 기존 헤더·찜·문의 버튼이 호출하는 전역 진입점은 유지합니다. function openLoginModal() { if (!loginModalBackdrop || loginModalBackdrop.open) return; // 모달은 같은 문서 안에서 끝나므로 저장소 접근에 로그인 이동을 의존시키지 않습니다. loginReturnUrl = window.location.href; const form = loginModalBackdrop.querySelector('#loginForm'); if (form && loginModalState === 'idle') { form.reset(); form.querySelector('#identifierInput').value = ''; const password = form.querySelector('#passwordInput'); password.value = ''; password.type = 'password'; form.querySelectorAll('.is-invalid').forEach(input => input.classList.remove('is-invalid')); const toggle = form.querySelector('#passwordToggle'); toggle.setAttribute('aria-label', '비밀번호 보기'); toggle.setAttribute('aria-pressed', 'false'); form.querySelector('#loginFeedback').hidden = true; } const body = document.body; const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth; loginBodyStyles = { overflow: body.style.overflow, paddingRight: body.style.paddingRight }; if (scrollbarWidth > 0) body.style.paddingRight = (parseFloat(getComputedStyle(body).paddingRight) + scrollbarWidth) + 'px'; body.style.overflow = 'hidden'; loginModalBackdrop.showModal(); } function closeLoginModal() { if (loginModalBackdrop?.open) loginModalBackdrop.close(); } function initLoginModal() { loginModalBackdrop = document.getElementById('loginModalBackdrop'); if (!loginModalBackdrop) return; document.getElementById('openLoginModal')?.addEventListener('click', openLoginModal); document.getElementById('closeLoginModal').addEventListener('click', closeLoginModal); // 배경 격리·Escape·닫은 뒤 포커스 복귀는 표준 dialog가 처리합니다. loginModalBackdrop.addEventListener('close', () => { if (loginBodyStyles) Object.assign(document.body.style, loginBodyStyles); }); // 첫 항목과 마지막 항목에서는 브라우저 주소창으로 빠지지 않고 이어집니다. loginModalBackdrop.addEventListener('keydown', event => { if (event.key !== 'Tab') return; const items = loginModalBackdrop.querySelectorAll('button:not([disabled]), a[href], input:not([type="hidden"]):not([disabled])'); const first = items[0], last = items[items.length - 1]; if ((event.shiftKey && document.activeElement === first) || (!event.shiftKey && document.activeElement === last)) { event.preventDefault(); (event.shiftKey ? last : first).focus(); } }); const isBackdrop = event => { const rect = loginModalBackdrop.getBoundingClientRect(); return event.target === loginModalBackdrop && (event.clientX < rect.left || event.clientX > rect.right || event.clientY < rect.top || event.clientY > rect.bottom); }; let pressedBackdrop = false; loginModalBackdrop.addEventListener('pointerdown', event => { pressedBackdrop = isBackdrop(event); }); loginModalBackdrop.addEventListener('pointerup', event => { if (pressedBackdrop && isBackdrop(event)) closeLoginModal(); pressedBackdrop = false; }); const form = document.getElementById('loginForm'); if (form) { const password = document.getElementById('passwordInput'); const toggle = document.getElementById('passwordToggle'); const button = document.getElementById('loginBtn'); const feedback = document.getElementById('loginFeedback'); toggle.addEventListener('click', () => { const visible = password.type === 'password'; password.type = visible ? 'text' : 'password'; toggle.setAttribute('aria-label', visible ? '비밀번호 숨기기' : '비밀번호 보기'); toggle.setAttribute('aria-pressed', String(visible)); }); const showFeedback = (message, success = false) => { feedback.textContent = message; feedback.className = 'alert alert-' + (success ? 'success' : 'danger') + ' mt-2 mb-0'; feedback.hidden = false; }; let navigationTimer; const offerReload = (message, authenticated = false) => { clearTimeout(navigationTimer); loginModalState = authenticated ? 'authenticated' : 'reload'; showFeedback(message, authenticated); button.disabled = false; button.formNoValidate = true; button.textContent = '새로고침'; form.setAttribute('aria-busy', 'false'); }; const refreshPage = () => { const authenticated = loginModalState === 'authenticated'; button.disabled = true; button.textContent = '화면 불러오는 중...'; form.setAttribute('aria-busy', 'true'); clearTimeout(navigationTimer); navigationTimer = setTimeout(() => { offerReload('화면 전환이 지연되고 있습니다. 새로고침을 눌러 주세요.', authenticated); }, 8000); try { const target = new URL(loginReturnUrl || window.location.href); if (target.searchParams.get('login') === 'show') target.searchParams.delete('login'); // 같은 주소의 #fragment 이동은 문서를 갱신하지 않아 비회원 화면이 남을 수 있습니다. if (target.pathname === window.location.pathname && target.search === window.location.search) { window.location.reload(); } else { window.location.replace(target.href); } } catch (error) { offerReload('화면을 불러오지 못했습니다. 새로고침을 눌러 주세요.', authenticated); } }; form.addEventListener('submit', async event => { event.preventDefault(); if (button.disabled) return; // 성공 또는 결과 불명 상태에서는 비밀번호를 다시 보내지 않고 화면만 갱신합니다. if (loginModalState === 'authenticated' || loginModalState === 'reload') { refreshPage(); return; } loginModalState = 'submitting'; button.formNoValidate = false; button.disabled = true; button.textContent = '로그인 중...'; form.setAttribute('aria-busy', 'true'); feedback.hidden = true; const controller = new AbortController(); const requestTimer = setTimeout(() => controller.abort(), 15000); try { const response = await fetch(form.action, { method: 'POST', body: new FormData(form), credentials: 'same-origin', headers: { 'X-CSRF-TOKEN': form.querySelector('[name="_token"]').value, 'Accept': 'application/json' }, signal: controller.signal }); if (response.status === 419) { offerReload('로그인 화면이 만료되었습니다. 새로고침 후 다시 로그인해 주세요.'); return; } if (!response.ok) throw new Error('Login response failed'); const data = await response.json(); if (data.success === true) { loginModalState = 'authenticated'; password.value = ''; showFeedback('로그인되었습니다. 화면을 불러옵니다.', true); refreshPage(); } else if (data.success === false) { loginModalState = 'idle'; showFeedback(data.message || '로그인에 실패했습니다. 아이디와 비밀번호를 확인해주세요.'); } else { throw new Error('Unexpected login response'); } } catch (error) { // 타임아웃/통신 실패여도 서버에서는 로그인이 끝났을 수 있어 자동 재전송하지 않습니다. offerReload(error.name === 'AbortError' ? '응답이 지연되고 있습니다. 새로고침해 로그인 상태를 확인해 주세요.' : '서버 응답을 확인하지 못했습니다. 새로고침해 로그인 상태를 확인해 주세요.'); } finally { clearTimeout(requestTimer); if (loginModalState === 'idle') { button.disabled = false; button.textContent = '로그인'; form.setAttribute('aria-busy', 'false'); } } }); } if (new URLSearchParams(window.location.search).get('login') === 'show') openLoginModal(); } document.addEventListener('DOMContentLoaded', initLoginModal); </script> <script> window.currentUserID = null; window.currentMemberSrl = null; const favoriteRequests = new Map(); function restoreFavoriteHover(event) { const control = event.currentTarget; control.classList.remove('is-just-unfavorited'); control.removeEventListener('pointerleave', restoreFavoriteHover); control.removeEventListener('blur', restoreFavoriteHover); } function favoriteControls(productId, element) { const controls = Array.from(document.querySelectorAll('.badge-heart, .badge-heart2, .jn-home-favorite, [data-home-favorite]')) .filter(control => control.getAttribute('data-jaenung-number') === productId || control.getAttribute('data-jaenung-number-normal') === productId); if (element instanceof Element && !controls.includes(element)) controls.push(element); return controls; } function toggleFavorite(srl, jaenung_number, seller_nick_name, type, element, page) { if (!window.currentMemberSrl || !srl) { if (typeof window.openLoginModal === 'function') window.openLoginModal(); else if (typeof window.alertModal === 'function') window.alertModal('로그인 후 이용이 가능합니다.'); return Promise.resolve(false); } const productId = String(jaenung_number ?? '').trim(); if (!productId) return Promise.resolve(false); if (favoriteRequests.has(productId)) return favoriteRequests.get(productId); const controls = favoriteControls(productId, element); const previous = controls.map(control => ({ control, disabled: 'disabled' in control ? control.disabled : null, busy: control.getAttribute('aria-busy') })); controls.forEach(control => { control.setAttribute('aria-busy', 'true'); if ('disabled' in control) control.disabled = true; }); const request = Promise.resolve().then(() => fetch('https://www.jaenung.net/favorite', { method: 'POST', headers: { 'X-CSRF-TOKEN': "rOY58jTkyhygZqmxttb5QgdjPjk0reyK7KTf2J0o", 'Content-Type': 'application/json' }, body: JSON.stringify({ member_srl: srl, jaenung_number: jaenung_number }) })) .then(response => response.json()) .then(data => { if (data.status !== 'success' || typeof data.favorited !== 'boolean') { if (typeof window.alertModal === 'function') window.alertModal(data.message || '찜 상태를 변경하지 못했습니다. 다시 시도해 주세요.'); return false; } const currentControls = favoriteControls(productId, element); const countElements = new Set(); currentControls.forEach(control => { control.setAttribute('aria-pressed', String(data.favorited)); control.classList.toggle('is-favorited', data.favorited); // 해제 직후에는 실제 상태를 보이고, 포인터/포커스가 떠나면 채워지는 호버를 복원한다. const justRemoved = !data.favorited && control.matches(':hover, :focus-visible'); control.classList.toggle('is-just-unfavorited', justRemoved); if (justRemoved) { control.addEventListener('pointerleave', restoreFavoriteHover); control.addEventListener('blur', restoreFavoriteHover); } control.querySelectorAll('.favorited-count').forEach(count => countElements.add(count)); control.querySelectorAll('svg').forEach(svg => { svg.style.fill = data.favorited ? '#f05518' : 'rgba(50, 50, 50, 0.2)'; svg.style.stroke = '#fff'; svg.style.strokeWidth = '2px'; }); }); countElements.forEach(count => { const oldCount = Number.parseInt(count.textContent.replace(/,/g, ''), 10); if (Number.isFinite(oldCount)) count.textContent = Math.max(0, oldCount + (data.favorited ? 1 : -1)); }); document.dispatchEvent(new CustomEvent('jn:favorite-changed', { detail: { favorited: data.favorited, control: element instanceof Element ? element : (currentControls.length === 1 ? currentControls[0] : null) } })); if (!data.favorited && page === 'favorite_list') { const items = new Set(currentControls.map(control => control.closest('.favorite-item, .col-md-4')).filter(Boolean)); const firstItem = items.values().next().value; if (firstItem) { const mainType = firstItem.getAttribute('data-main-type'); items.forEach(item => item.remove()); if (typeof window.updateFavoriteItemCount === 'function') window.updateFavoriteItemCount(mainType, -1); } } if (typeof window.showToastMessage === 'function') { if (data.favorited) window.showToastMessage('찜했어요', '<a href="/favorite-list">찜 목록 보기 →</a>', 'success'); else window.showToastMessage('찜 목록에서 삭제되었습니다.', '해당 재능이 찜 목록에서 삭제 되었습니다.', 'error'); } return data; }) .catch(error => { console.error('Favorite request failed:', error); if (typeof window.alertModal === 'function') window.alertModal('찜 처리 중 오류가 발생했습니다. 잠시 후 다시 시도해 주세요.'); return false; }) .finally(() => { favoriteRequests.delete(productId); previous.forEach(({control, disabled, busy}) => { if (disabled !== null) control.disabled = disabled; if (busy === null) control.removeAttribute('aria-busy'); else control.setAttribute('aria-busy', busy); }); }); favoriteRequests.set(productId, request); return request; } </script> <script type="text/javascript">if(!window.wcs_add) var wcs_add = {};wcs_add["wa"] = "c4a1311abe6560";</script> <script type="text/javascript" src="//wcs.naver.net/wcslog.js" async onload="if(window.wcs){wcs_do();}"></script> <div id="jnMobileMenu" class="jn-mobile-menu-overlay" role="dialog" aria-modal="true" aria-labelledby="jnMobileSearchTitle" aria-hidden="true" inert> <div class="jn-mobile-menu-panel jn-shell-search-panel"> <button class="jn-mobile-menu-close" type="button" aria-label="검색 닫기">×</button> <div class="jn-shell-search-content"> <h2 class="jn-shell-search-title" id="jnMobileSearchTitle">지식인의숲 검색</h2> <form class="jn-mobile-search-form" action="/iFoestSearch" method="get" name="searchform" data-mode="forest" onsubmit="const v=this.querySelector('input[type=search]').value.trim(); if(!v){alertModal('검색어를 입력해주세요.'); return false;} if(v.length>40){alertModal('검색어는 40자를 초과할 수 없습니다.'); return false;}"> <label class="jn-search-scope" for="jnMobileSearchInput">지식</label> <input id="jnMobileSearchInput" class="jn-mobile-search-input" type="search" maxlength="40" placeholder="어떤 지식이 궁금하세요?" name="searchKeyword" aria-label="검색어" /> <button class="jn-mobile-search-submit" type="submit" aria-label="검색"><i class="bi bi-search"></i></button> </form> </div> <nav class="jn-shell-search-links" aria-label="재능마켓 둘러보기"> <h3>재능마켓 둘러보기</h3> <div> <a href="/category/design">디자인</a> <a href="/category/music_image">음악/영상</a> <a href="/category/document">문서작성</a> <a href="/category/program">프로그램개발</a> <a href="/category/translation">번역/외국어</a> <a href="/category/marketing">마케팅/비즈니스</a> <a href="/category/oracle">사주/운세/타로</a> <a href="/category/service">생활서비스</a> </div> </nav> </div> </div> </body> </html>