PageSourceSearch

https://porpoisehead.net/free/314

html porpoisehead.net collected 2026-10-02 10:12:39 UTC 32,388 bytes, 484 lines download raw bytes

1<!doctype html>
2<html lang="ko">
3<head>
4<meta charset="utf-8">
5<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=yes">
6<meta http-equiv="imagetoolbar" content="no">
7<meta http-equiv="X-UA-Compatible" content="IE=edge">
8<title>“단편소설은 반전이 있어야 산다”는 말의 반쪽 > 자유게시판 | Porpoise Head - Creative Writing & Stories</title>
9<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1">
10<meta name="NaverBot" content="All">
11<meta name="Yeti" content="All">
12<meta name="googlebot" content="index, follow, max-image-preview:large, max-snippet:-1">
13<meta name="description" content="반전 결말과 정서적 잔상을 비교해 단편소설에 맞는 결말 전략을 고르는 법을 안내합니다. 창작 글쓰기 관점에서 실전 팁을 담았습니다.">
14<meta name="keywords" content="creative writing,stories,literature,porpoisehead">
15<meta property="og:site_name" content="Porpoise Head" >
16<meta property="og:url" content="https://porpoisehead.net/free/314" >
17<meta property="og:type" content="article" >
18<meta property="og:title" content="“단편소설은 반전이 있어야 산다”는 말의 반쪽 - Porpoise Head" >
19<meta property="og:description" content="반전 결말과 정서적 잔상을 비교해 단편소설에 맞는 결말 전략을 고르는 법을 안내합니다. 창작 글쓰기 관점에서 실전 팁을 담았습니다.">
20<meta property="og:locale" content="ko_KR">
21<meta property="article:published_time" content="2026-10-02T05:09:06+09:00" >
22<meta property="article:modified_time" content="2026-10-02T05:09:06+09:00" ><meta property="article:author" content="서사균형편집자 최은재" >
23<meta property="twitter:title" content="“단편소설은 반전이 있어야 산다”는 말의 반쪽 - Porpoise Head" >
24<meta property="twitter:site" content="Porpoise Head" >
25<meta property="twitter:description" content="반전 결말과 정서적 잔상을 비교해 단편소설에 맞는 결말 전략을 고르는 법을 안내합니다. 창작 글쓰기 관점에서 실전 팁을 담았습니다.">
26<meta property="twitter:card" content="summary_large_image" >
27<link rel="canonical" href="https://porpoisehead.net/free/314" >
28<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Porpoise Head","url":"https://porpoisehead.net"}</script>
vendor: 1 bytes, line 28
28
29<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Porpoise Head","url":"https://porpoisehead.net","potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://porpoisehead.net/bbs/search.php?stx={search_term_string}"},"query-input":"required name=search_term_string"}}</script>
vendor: 1 bytes, line 29
29
30<script type="application/ld+json">{"@context":"https://schema.org","@type":"Article","headline":"“단편소설은 반전이 있어야 산다”는 말의 반쪽","datePublished":"2026-10-02T05:09:06+09:00","dateModified":"2026-10-02T05:09:06+09:00","author":{"@type":"Person","name":"서사균형편집자 최은재"},"publisher":{"@type":"Organization","name":"Porpoise Head","logo":{"@type":"ImageObject","url":"https://porpoisehead.net/img/logo.png"}},"mainEntityOfPage":{"@type":"WebPage","@id":"https://porpoisehead.net/free/314"},"description":"반전 결말과 정서적 잔상을 비교해 단편소설에 맞는 결말 전략을 고르는 법을 안내합니다. 창작 글쓰기 관점에서 실전 팁을 담았습니다."}</script>
vendor: 1 bytes, line 30
30
31<script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"홈","item":"https://porpoisehead.net"},{"@type":"ListItem","position":2,"name":"“단편소설은 반전이 있어야 산다”는 말의 반쪽","item":"https://porpoisehead.net/free/314"}]}</script>
31
32<link rel="stylesheet" href="https://porpoisehead.net/css/fonts.css?ver=062c71be50">
33<link rel="stylesheet" href="https://porpoisehead.net/css/default.css?ver=062c71be50">
34<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous">
35<!--[if lte IE 8]>
36<script src="http://porpoisehead.net/js/html5.js"></script>
36
37<![endif]-->
38<link rel="stylesheet" href="/theme/basic/css/default.css?ver=062c71be50">
39<meta name="naver-site-verification" content="848da2ae4f25035e5e641ae0a63020798d46faf6" />
39<script async src="https://modoo-ads.pub-code.com/page/js/adsbymodoo.js?client=ca-pub-8628168378709823"></script>
39
40<!-- tailwind removed -->
41<link rel="stylesheet" href="/css/basic_style.css?ver=062c71be50">
42
43<link rel="stylesheet" href="https://porpoisehead.net/js/font-awesome/css/font-awesome.min.css?ver=2303229">
44<link rel="stylesheet" href="https://porpoisehead.net/skin/board/basic/style.css?ver=20260207c">
45<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js"></script>
vendor: 1 bytes, line 45
45
46<script src="https://porpoisehead.net/js/jquery-migrate-1.4.1.min.js?ver=2304171"></script>
vendor: 1 bytes, line 46
46
47<script src="https://porpoisehead.net/js/page.js?ver=2304171"></script>
47
48</head>
49<body>
50
51<header class="site-header">
52  <div class="container">
53    <div class="site-header-inner">
54      <div class="site-branding">
55                <div class="site-title"><a href="/">Porpoise Head</a></div>
56              </div>
57      <button class="nav-toggle" id="navToggle" aria-label="메뉴">
58        <span></span><span></span><span></span>
59      </button>
60    </div>
61  </div>
62</header>
63
64<nav class="site-nav" id="siteNav">
65  <div class="container">
66    <ul class="nav-menu">
67      <li><a href="/" class="nav-home">홈</a></li>
68      <li><a href="/free">게시판</a></li>
69    </ul>
70  </div>
71</nav>
72
73<div class="container ad-container">
74  <div class="ad-grid">
75    <div class="ad-item"><ins class="adsbymodoo" data-ad-client="ca-pub-8628168378709823" data-ad-box="rectangle" data-ad-slot="4242115983"></ins>
76    
76<script>(adsbymodoo = window.adsbymodoo || []).push({});</script>
76</div>
77  </div>
78</div>
79
80<div class="container main-container">
81  <div class="main-content-wrap">
82
83<script src="https://porpoisehead.net/js/viewimageresize.js"></script>
83
84
85<article id="bo_v" style="width:100%">
86    <h1 id="bo_v_title">
87                <span class="bo_v_tit">“단편소설은 반전이 있어야 산다”는 말의 반쪽</span>
88    </h1>
89
90    <div id="bo_v_info">
91        <div class="profile_info">
92            <div class="pf_img"><img src="https://porpoisehead.net/img/no_profile.gif" alt="profile_image"></div>
93            <div class="profile_info_ct">
94                <span class="sound_only">작성자</span> <strong><span class="sv_guest">서사균형편집자 최은재</span></strong><br>
95                <span class="sound_only">댓글</span><strong><a href="#bo_vc"> <i class="fa fa-commenting-o" aria-hidden="true"></i> 0건</a></strong>
96                <span class="sound_only">조회</span><strong><i class="fa fa-eye" aria-hidden="true"></i> 5회</strong>
97                <time datetime="2026-10-02T05:09:06+09:00" class="if_date"><i class="fa fa-clock-o" aria-hidden="true"></i> 2026.10.02 05:09</time>
98            </div>
99        </div>
100
101        <div id="bo_v_top">
102                        <ul class="btn_bo_user bo_v_com">
103                <li><a href="/free" class="btn_b01 btn" title="목록"><i class="fa fa-list" aria-hidden="true"></i><span class="sound_only">목록</span></a></li>
104                <li><a href="https://porpoisehead.net/bbs/write.php?w=r&amp;bo_table=free&amp;wr_id=314" class="btn_b01 btn" title="답변"><i class="fa fa-reply" aria-hidden="true"></i><span class="sound_only">답변</span></a></li>                <li><a href="https://porpoisehead.net/bbs/write.php?bo_table=free" class="btn_b01 btn" title="글쓰기"><i class="fa fa-pencil" aria-hidden="true"></i><span class="sound_only">글쓰기</span></a></li>                                <li>
105                    <button type="button" class="btn_more_opt is_view_btn btn_b01 btn"><i class="fa fa-ellipsis-v" aria-hidden="true"></i><span class="sound_only">옵션</span></button>
106                    <ul class="more_opt is_view_btn">
107                        <li><a href="https://porpoisehead.net/bbs/password.php?w=u&amp;bo_table=free&amp;wr_id=314&amp;page=">수정<i class="fa fa-pencil-square-o" aria-hidden="true"></i></a></li>                        <li><a href="https://porpoisehead.net/bbs/password.php?w=d&amp;bo_table=free&amp;wr_id=314&amp;page=" onclick="del(this.href); return false;">삭제<i class="fa fa-trash-o" aria-hidden="true"></i></a></li>                                                                                            </ul>
108                </li>
109                            </ul>
110            
110<script>
111            jQuery(function($){
112                $(".btn_more_opt.is_view_btn").on("click", function(e) {
113                    e.stopPropagation();
114                    $(".more_opt.is_view_btn").toggle();
115                });
116                $(document).on("click", function(e) {
117                    if(!$(e.target).closest('.is_view_btn').length) {
118                        $(".more_opt.is_view_btn").hide();
119                    }
120                });
121            });
122            </script>
122
123                    </div>
124    </div>
125
126    <div id="bo_v_atc">
127        <div id="bo_v_share">
128                                </div>
129
130        <div id="bo_v_img">
131</div>
132
133        <div id="bo_v_con"><h2>반전 결말 vs 정서적 잔상, 독자는 무엇을 더 오래 기억할까요</h2><h3>반전은 빠르게 붙잡고, 잔상은 천천히 따라옵니다</h3><p>단편소설을 쓰다 보면 가장 자주 듣는 조언이 있습니다. <strong>“마지막에 반전이 있어야 독자가 놀란다”</strong>는 말입니다. 틀린 조언은 아닙니다. 다만 이 말을 그대로 믿으면 이야기는 독자를 속이는 장치에만 매달리기 쉽습니다. Porpoise Head가 다루는 <em>creative writing</em>과 stories의 핵심은 놀라움 자체가 아니라, 놀라움 이후에도 남는 감정의 방향입니다.</p><p>반전 결말은 독자의 시선을 강하게 잡아끄는 힘이 있습니다. 짧은 분량 안에서 긴장과 보상을 빠르게 만들 수 있고, 읽고 난 직후 “다시 읽어보고 싶다”는 반응도 얻기 좋습니다. 반대로 정서적 잔상은 사건이 크지 않아도 인물의 선택, 침묵, 반복되는 사소한 행동으로 독자의 마음에 오래 머뭅니다. 창작 글쓰기의 기본 개념을 넓게 보고 싶다면 <a href="https://terms.naver.com/entry.naver?docId=5676063&amp;cid=62841&amp;categoryId=62841" target="_blank" rel="nofollow noreferrer noopener">창조적 글쓰기의 정의</a>를 참고해도 좋습니다.</p><p>문제는 둘 중 하나만 정답처럼 여길 때 생깁니다. 반전만 강하면 독자는 “잘 속았다”고 느끼지만 인물을 잊을 수 있습니다. 잔상만 추구하면 분위기는 좋지만 이야기의 추진력이 약해질 수 있습니다. 그래서 단편소설 쓰는 법에서 중요한 질문은 “반전을 넣을까 말까”가 아니라, <strong>이 이야기가 독자에게 어떤 방식으로 기억되길 원하는가</strong>입니다.</p><ul><li><strong>반전 결말</strong>: 짧은 분량에서 즉각적인 충격과 재독 욕구를 만들기 좋습니다.</li><li><strong>정서적 잔상</strong>: 큰 사건 없이도 인물의 결핍, 선택, 침묵을 오래 남길 수 있습니다.</li><li><strong>혼합형</strong>: 반전은 작게, 감정의 의미는 크게 설계해 독자의 해석을 넓힙니다.</li></ul><blockquote>팁: 반전이 먼저 떠올랐다면 “그래서 인물은 무엇을 잃었나?”를 묻고, 잔상이 먼저 떠올랐다면 “독자는 어느 지점에서 계속 읽게 되나?”를 물어보세요.</blockquote>
134<div class="ad-incontent"><ins class="adsbymodoo" data-ad-client="ca-pub-8628168378709823" data-ad-box="rectangle" data-ad-slot="4242115983"></ins>
134<script>(adsbymodoo = window.adsbymodoo || []).push({});</script>
134</div>
135<h2>강한 반전의 장점과 함정, 조용한 결말의 장점과 위험</h2><h3>반전은 기술이고, 잔상은 신뢰입니다</h3><p>반전 결말은 독자에게 선명한 보상을 줍니다. 앞에서 흘린 단서가 마지막에 하나로 맞물릴 때, 독자는 작가가 치밀하게 설계했다는 인상을 받습니다. 특히 미스터리, 심리극, 우화적 단편에서는 반전이 이야기의 뼈대가 되기도 합니다. 하지만 단서가 부족하면 반전은 ‘속임수’처럼 보이고, 단서가 너무 노골적이면 마지막 문장 전에 이미 들킵니다.</p><p>정서적 잔상은 조금 다릅니다. 마지막에 사실관계를 뒤집지 않아도, 독자가 인물의 마음을 다시 떠올리게 만듭니다. 예를 들어 오래 연락하지 않던 가족에게 문자를 쓰고 지우는 사람, 떠난 연인의 컵을 버리지 못하는 사람, 늘 같은 시간에 불 꺼진 가게 앞을 지나가는 사람은 큰 사건 없이도 이야기가 됩니다. 이런 작품은 <strong>문학</strong>의 힘이 정보가 아니라 감각과 해석에서 온다는 점을 잘 보여줍니다.</p><p>다만 조용한 결말도 위험합니다. 아무 변화 없이 분위기만 이어지면 독자는 “그래서 무엇이 달라졌지?”라고 묻게 됩니다. 조용한 단편소설일수록 변화는 더 정교해야 합니다. 인물이 행동을 바꾸지 않더라도, 독자가 ê·¸ 행동을 다르게 보게 만드는 변화가 있어야 합니다. 음악과 도시의 서사를 함께 떠올리고 싶다면 <a href="https://terms.naver.com/entry.naver?docId=875191&amp;cid=42599&amp;categoryId=42599" target="_blank" rel="nofollow noreferrer noopener">Stories From The City, Stories From The Sea</a>처럼 제목 자체가 이야기를 호출하는 사례도 흥미롭게 ë³¼ 수 있습니다.</p><ol><li><strong>반전형을 고를 때</strong>: 초반 단서, 중반 오해, 후반 재해석의 순서를 설계합니다.</li><li><strong>잔상형을 고를 때</strong>: 인물의 감정 변화가 행동, 사물, 공간 중 하나에 드러나게 합니다.</li><li><strong>둘을 섞을 때</strong>: 사실 반전보다 감정 반전에 집중합니다. 독자가 사건보다 인물을 다시 보게 만드는 방식입니다.</li></ol><h3>비교표로 ë³´ë©´ 선택이 조금 쉬워집니다</h3><p>둘의 차이는 결말의 크기보다 독자와 맺는 약속에서 갈립니다. 반전형은 “끝까지 읽으면 알게 될 것”을 약속합니다. 잔상형은 “읽고 난 뒤에도 생각하게 될 것”을 약속합니다. 어떤 약속이 내 단편소설에 맞는지 확인하면 불필요한 장치를 줄일 수 있습니다.</p><ul><li><strong>독자 반응</strong>: 반전형은 즉각적인 감탄, 잔상형은 늦게 오는 공감이 강합니다.</li><li><strong>문장 운용</strong>: 반전형은 단서의 배치가 중요하고, 잔상형은 이미지와 리듬이 중요합니다.</li><li><strong>실패 양상</strong>: 반전형은 억지 설정으로 무너지고, 잔상형은 모호함으로 흐려질 수 있습니다.</li><li><strong>수정 기준</strong>: 반전형은 복선의 공정성을, 잔상형은 감정선의 누적을 먼저 점검합니다.</li></ul><blockquote>전문가식으로 말하면, 좋은 반전은 독자를 배신하지 않고 독자의 해석을 갱신합니다. 좋은 잔상은 설명을 줄이되 감정의 원인은 흐리지 않습니다.</blockquote><h2>반전 없는 단편도 약하지 않다는 반대편의 주장</h2><h3>사건보다 시선이 바뀌는 이야기도 충분히 강합니다</h3><p>반전이 없는 단편소설은 밋밋하다는 의견이 있습니다. 특히 온라인에서 stories를 빠르게 소비하는 독자에게는 강한 결말이 더 유리해 보입니다. 그러나 모든 이야기가 마지막 한 줄의 충격으로만 평가되는 것은 아닙니다. 어떤 작품은 마지막에 아무 일도 벌어지지 않아서 오히려 더 서늘합니다. 독자가 이미 알고 있던 감정을 피하지 못하게 만들기 때문입니다.</p><p>예를 들어 주인공이 끝내 사과하지 못하는 이야기, 기다리던 사람이 오지 않는다는 사실을 처음부터 알고도 ê
135³„속 기다리는 이야기, 떠나기로 마음먹고도 신발끈을 다시 묶는 이야기에는 대단한 반전이 없습니다. 대신 독자는 ê·¸ 작은 행동을 통해 인물의 세계를 봅니다. 이것이 <strong>문학적 이야기</strong>가 가진 고유한 힘입니다. 삶의 서사를 다루는 방식이 궁금하다면 <a href="https://terms.naver.com/entry.naver?docId=355372&amp;cid=42598&amp;categoryId=42598" target="_blank" rel="nofollow noreferrer noopener">Life Stories</a>라는 표현이 가진 의미도 함께 떠올려볼 만합니다.</p><p>그러니 반전형과 잔상형의 대결에서 승자를 하나로 고를 필요는 없습니다. 중요한 것은 독자를 놀라게 할지, 독자를 머물게 할지 먼저 정하는 일입니다. 지금 쓰는 단편소설이 인물의 비밀을 중심으로 움직인다면 반전이 유리합니다. 반대로 인물이 끝내 말하지 못한 마음, 지나간 시간의 질감, 사소한 선택의 무게를 다룬다면 잔상이 더 어울립니다.</p><ul><li><strong>반전을 덜어내도 되는 경우</strong>: 이미 인물의 감정 변화가 선명하고, 결말의 침묵이 의미를 갖고 있을 때입니다.</li><li><strong>반전을 넣어야 하는 경우</strong>: 이야기의 질문이 사실관계에 걸려 있고, 독자가 진실을 기다리며 읽을 때입니다.</li><li><strong>잔상을 강화하는 방법</strong>: 마지막 문장에서 설명하지 말고, 앞서 반복된 사물이나 행동을 조금 다르게 보여줍니다.</li><li><strong>반전을 공정하게 만드는 방법</strong>: 독자가 다시 읽었을 때 “속았다”가 아니라 “보였는데 놓쳤다”고 느끼게 합니다.</li></ul><h3>초고를 ê³ ì¹  때는 마지막 문장보다 첫 약속을 보세요</h3><p>많은 작가가 결말을 고치면서 마지막 문장만 붙잡습니다. 하지만 반전이든 잔상이든, 결말의 힘은 첫 장면에서 이미 시작됩니다. 첫 장면이 독자에게 범죄의 진실을 기대하게 했는지, 인물의 마음을 따라가게 했는지, 관계의 균열을 보게 했는지에 따라 어울리는 결말이 달라집니다.</p><p>초고를 다시 ë³¼ 때는 원고 옆에 두 문장을 적어보세요. “이 이야기는 독자가 무엇을 궁금해하게 만드는가?” 그리고 “마지막에 독자가 무엇을 다시 보게 되는가?” 두 답이 사실관계에 가깝다면 반전형으로 밀고 가도 좋습니다. 두 답이 감정과 시선에 가깝다면 정서적 잔상 쪽이 더 깊어질 수 있습니다. 반전 없는 단편도 약하지 않습니다. 다만 조용한 작품일수록 더 정확한 선택을 요구합니다.</p><ol><li>초반 3문단에서 독자가 기대하는 장르 신호를 표시합니다.</li><li>중반에서 인물이 피하고 있는 질문을 하나로 좁힙니다.</li><li>마지막 장면에서 사실을 뒤집을지, 감정을 뒤집을지 결정합니다.</li><li>불필요한 설명을 줄이고, 독자가 해석할 여백을 남깁니다.</li></ol></div>
136
137        
138            </div>
139
140    
141    
142    
143            <ul class="bo_v_nb">
144                <li class="btn_next"><span class="nb_tit"><i class="fa fa-chevron-down" aria-hidden="true"></i> 다음글</span><a href="/free/313">AI 시대 창작 글쓰기가 소재에서 독자 경험으로 이동하는 흐름</a> <span class="nb_date">26.10.01</span></li>    </ul>
145    
146    
147<script>
148// 글자수 제한
149var char_min = parseInt(0); // 최소
150var char_max = parseInt(0); // 최대
151</script>
151
152<button type="button" class="cmt_btn"><span class="total"><b>댓글</b> 0</span><span class="cmt_more"></span></button>
153<!-- 댓글 시작 { -->
154<div id="bo_vc">
155    <span class="sound_only">댓글목록</span>
156        <p id="bo_vc_empty">등록된 댓글이 없습니다.</p>
157</div>
158<!-- } 댓글 끝 -->
159
160<!-- 댓글 쓰기 시작 { -->
161<aside id="bo_vc_w" class="bo_vc_w">
162    <span class="sound_only">댓글쓰기</span>
163    <form name="fviewcomment" id="fviewcomment" action="https://porpoisehead.net/bbs/write_comment_update.php" onsubmit="return fviewcomment_submit(this);" method="post" autocomplete="off">
164    <input type="hidden" name="w" value="c" id="w">
165    <input type="hidden" name="bo_table" value="free">
166    <input type="hidden" name="wr_id" value="314">
167    <input type="hidden" name="comment_id" value="" id="comment_id">
168    <input type="hidden" name="sca" value="">
169    <input type="hidden" name="sfl" value="">
170    <input type="hidden" name="stx" value="">
171    <input type="hidden" name="spt" value="">
172    <input type="hidden" name="page" value="">
173    <input type="hidden" name="is_good" value="">
174
175    <span class="sound_only">내용</span>
176        <textarea id="wr_content" name="wr_content" maxlength="10000" required class="required" title="내용" placeholder="댓글내용을 입력해주세요" 
177    ></textarea>
178        
178<script>
179    $(document).on("keyup change", "textarea#wr_content[maxlength]", function() {
180        var str = $(this).val()
181        var mx = parseInt($(this).attr("maxlength"))
182        if (str.length > mx) {
183            $(this).val(str.substr(0, mx));
184            return false;
185        }
186    });
187    </script>
187
188    <div class="bo_vc_w_wr">
189        <div class="bo_vc_w_info">
190                        <label for="wr_name" class="sound_only">이름<strong> 필수</strong></label>
191            <input type="text" name="wr_name" value="" id="wr_name" required class="frm_input required" size="25" placeholder="이름">
192            <label for="wr_password" class="sound_only">비밀번호<strong> 필수</strong></label>
193            <input type="password" name="wr_password" id="wr_password" required class="frm_input required" size="25" placeholder="비밀번호">
194                                                                    <template id="bg_captcha_tpl">
195<script>var g5_captcha_url  = "http://porpoisehead.net/plugin/kcaptcha";</script>
vendor: 1 bytes, line 195
195
196<script src="https://porpoisehead.net/plugin/kcaptcha/kcaptcha.js"></script>
196
197<fieldset id="captcha" class="_comment">
198<legend><label for="captcha_key">자동등록방지</label></legend>
199<img src="https://porpoisehead.net/plugin/kcaptcha/img/dot.gif" alt="" id="captcha_img"><input type="text" name="captcha_key" id="captcha_key" required class="captcha_box required" size="6" maxlength="6">
200<button type="button" id="captcha_mp3"><span></span>숫자음성듣기</button>
201<button type="button" id="captcha_reload"><span></span>새로고침</button>
202<span id="captcha_info">자동등록방지 숫자를 순서대로 입력하세요.</span>
203</fieldset></template>
204                <span id="bg_captcha_slot"></span>
205                
205<script>
206                (function(){
207                    var done = false, form = document.getElementById('fviewcomment');
208                    function mount(){
209                        if (done) return; done = true;
210                        var tpl = document.getElementById('bg_captcha_tpl'),
211                            slot = document.getElementById('bg_captcha_slot');
212                        if (!tpl || !slot || !tpl.content) return;
213                        var frag = tpl.content.cloneNode(true);
214                        var olds = frag.querySelectorAll('script');
215                        for (var i = 0; i < olds.length; i++) {
216                            var o = olds[i], s = document.createElement('script');
217                            if (o.src) s.src = o.src; else s.textContent = o.textContent;
218                            o.parentNode.replaceChild(s, o);
219                        }
220                        slot.appendChild(frag);
221                    }
222                    if (form) {
223                        form.addEventListener('focusin', mount);
224                        form.addEventListener('click', mount);
225                    } else {
226                        mount();   // 폼을 못 찾으면 기존 동작대로 즉시 노출
227                    }
228                })();
229                </script>
229
230                    </div>
231        <div class="btn_confirm">
232        	<span class="secret_cm chk_box">
233	            <input type="checkbox" name="wr_secret" value="secret" id="wr_secret" class="selec_chk">
234	            <label for="wr_secret"><span></span>비밀글</label>
235            </span>
236            <button type="submit" id="btn_submit" class="btn_submit">댓글등록</button>
237        </div>
238    </div>
239    </form>
240</aside>
241
242<script>
243var save_before = '';
244var save_html = document.getElementById('bo_vc_w').innerHTML;
245
246function good_and_write()
247{
248    var f = document.fviewcomment;
249    if (fviewcomment_submit(f)) {
250        f.is_good.value = 1;
251        f.submit();
252    } else {
253        f.is_good.value = 0;
254    }
255}
256
257function fviewcomment_submit(f)
258{
259    var pattern = /(^\s*)|(\s*$)/g; // \s 공백 문자
260
261    f.is_good.value = 0;
262
263    var subject = "";
264    var content = "";
265    $.ajax({
266        url: g5_bbs_url+"/ajax.filter.php",
267        type: "POST",
268        data: {
269            "subject": "",
270            "content": f.wr_content.value
271        },
272        dataType: "json",
273        async: false,
274        cache: false,
275        success: function(data, textStatus) {
276            subject = data.subject;
277            content = data.content;
278        }
279    });
280
281    if (content) {
282        alert("내용에 금지단어('"+content+"')가 포함되어있습니다");
283        f.wr_content.focus();
284        return false;
285    }
286
287    // 양쪽 공백 없애기
288    var pattern = /(^\s*)|(\s*$)/g; // \s 공백 문자
289    document.getElementById('wr_content').value = document.getElementById('wr_content').value.replace(pattern, "");
290    if (char_min > 0 || char_max > 0)
291    {
292        check_byte('wr_content', 'char_count');
293        var cnt = parseInt(document.getElementById('char_count').innerHTML);
294        if (char_min > 0 && char_min > cnt)
295        {
296            alert("댓글은 "+char_min+"글자 이상 쓰셔야 합니다.");
297            return false;
298        } else if (char_max > 0 && char_max < cnt)
299        {
300            alert("댓글은 "+char_max+"글자 이하로 쓰셔야 합니다.");
301            return false;
302        }
303    }
304    else if (!document.getElementById('wr_content').value)
305    {
306        alert("댓글을 입력하여 주십시오.");
307        return false;
308    }
309
310    if (typeof(f.wr_name) != 'undefined')
311    {
312        f.wr_name.value = f.wr_name.value.replace(pattern, "");
313        if (f.wr_name.value == '')
314        {
315            alert('이름이 입력되지 않았습니다.');
316            f.wr_name.focus();
317            return false;
318        }
319    }
320
321    if (typeof(f.wr_password) != 'undefined')
322    {
323        f.wr_password.value = f.wr_password.value.replace(pattern, "");
324        if (f.wr_password.value == '')
325        {
326            alert('비밀번호가 입력되지 않았습니다.');
327            f.wr_password.focus();
328            return false;
329        }
330    }
331
332    if (!chk_captcha()) return false;
333
334    set_comment_token(f);
335
336    document.getElementById("btn_submit").disabled = "disabled";
337
338    return true;
339}
340
341function comment_box(comment_id, work)
342{
343    var el_id,
344        form_el = 'fviewcomment',
345        respond = document.getElementById(form_el);
346
347    // 댓글 아이디가 넘어오면 답변, 수정
348    if (comment_id)
349    {
350        if (work == 'c')
351            el_id = 'reply_' + comment_id;
352        else
353            el_id = 'edit_' + comment_id;
354    }
355    else
356        el_id = 'bo_vc_w';
357
358    if (save_before != el_id)
359    {
360        if (save_before)
361        {
362            document.getElementById(save_before).style.display = 'none';
363        }
364
365        document.getElementById(el_id).style.display = '';
366        document.getElementById(el_id).appendChild(respond);
367        //입력값 초기화
368        document.getElementById('wr_content').value = '';
369        
370        // 댓글 수정
371        if (work == 'cu')
372        {
373            document.getElementById('wr_content').value = document.getElementById('save_comment_' + comment_id).value;
374            if (typeof char_count != 'undefined')
375                check_byte('wr_content', 'char_count');
376            if (document.getElementById('secret_comment_'+comment_id).value)
377                document.getElementById('wr_secret').checked = true;
378            else
379                document.getElementById('wr_secret').checked = false;
380        }
381
382        document.getElementById('comment_id').value = comment_id;
383        document.getElementById('w').value = work;
384
385        if(save_before)
386            $("#captcha_reload").trigger("click");
387
388        save_before = el_id;
389    }
390}
391
392function comment_delete()
393{
394    return confirm("이 댓글을 삭제하시겠습니까?");
395}
396
397comment_box('', 'c'); // 댓글 입력폼이 보이도록 처리하기위해서 추가 (root님)
398
399</script>
399
400<!-- } 댓글 쓰기 끝 -->
401<script>
402jQuery(function($) {            
403    //댓글열기
404    $(".cmt_btn").click(function(e){
405        e.preventDefault();
406        $(this).toggleClass("cmt_btn_op");
407        $("#bo_vc").toggle();
408    });
409});
410</script>
vendor: 2 bytes, line 410
410
411<script src="https://porpoisehead.net/js/md5.js"></script>
411
412</article>
413
414<script>
415
416$(function() {
417    $("a.view_image").click(function() {
418        window.open(this.href, "large_image", "location=yes,links=no,toolbar=no,top=10,left=10,width=10,height=10,resizable=yes,scrollbars=no,status=no");
419        return false;
420    });
421    $("#good_button, #nogood_button").click(function() {
422        var $tx = (this.id == "good_button") ? $("#bo_v_act_good") : $("#bo_v_act_nogood");
423        excute_good(this.href, $(this), $tx);
424        return false;
425    });
426    $("#bo_v_atc").viewimageresize();
427});
428
429function board_move(href) {
430    window.open(href, "boardmove", "left=50,top=50,width=500,height=550,scrollbars=1");
431}
432
433function excute_good(href, $el, $tx) {
434    $.post(href, {js:"on"}, function(data) {
435        if(data.error) { alert(data.error); return; }
436        if(data.count) {
437            $el.find("strong").text(number_format(String(data.count)));
438            $tx.text($tx.attr("id").search("nogood") > -1 ? "이 글을 비추천하셨습니다." : "이 글을 추천하셨습니다.");
439            $tx.fadeIn(200).delay(2500).fadeOut(200);
440        }
441    }, "json");
442}
443</script>
443
444  </div><!-- .main-content-wrap -->
445</div><!-- .main-container -->
446
447
448
449<footer class="site-footer">
450  <div class="container">
451    <div class="footer-inner">
452      <div class="footer-brand">
453        <span class="footer-logo">Porpoise Head</span>
454      </div>
455      <nav class="footer-nav">
456        <a href="/">홈</a>
457        <a href="/free">게시판</a>
458        <a href="/bbs/content.php?co_id=privacy">개인정보처리방침</a>
459      </nav>
460      <div class="footer-copy">
461        &copy; 2026 porpoisehead.net. All rights reserved.
462      </div>
463    </div>
464  </div>
465</footer>
466
467<script>
468// 햄버거 메뉴 토글
469document.getElementById('navToggle').addEventListener('click', function() {
470    this.classList.toggle('active');
471    document.getElementById('siteNav').classList.toggle('open');
472});
473
474$(function() {
475    font_resize("container", get_cookie("ck_font_resize_rmv_class"), get_cookie("ck_font_resize_add_class"));
476});
477</script>
477
478
479
480<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"e2dc84e5d03e45ce9f48aa8d780a0852","r":1,"spa":2}' crossorigin="anonymous"></script>
480
481</body>
482</html>
483
484<!-- 사용스킨 : basic -->

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.