우편번호 검색 소스를 공개하고자 한다.

우편번호 검색은 data.go.kr에서 제공하는 openapi를 이용하여 제작하였다

사용된 언어는 ASP와 자바스크립트로 구성되어 있다

먼저 asp소스를 공개한다.

 

 

 

<% @CodePage = "65001" %>
<%
'************************************************************************************
' 단위업무명 : 우편번호 검색화면
' 작  성  자 : 가치노을(pobiplus@gmail.com) http://www.newnnow.co.kr
' 작  성  일  : 2011-12-01
' 수  정  자  :
' 수  정  일 :
' 내   용 : data.go.kr에서 우편번호 API를 이용한 우편번호 검색화면
' 주의  사항 :
'************************************************************************************
response.buffer = True
Response.Charset = "UTF-8"
%>
<%
 gubun = request("gubun") 'road - 도로명과 건물번호로 검색 dong- 동(읍/면/리)명과 지번으로 검색 , oldpost-구 지번 검색
 if (IsNULL(gubun) OR len(gubun) < 1) then
  gubun = "road"
 end if

 searchKey = trim(request("searchKey")) '도로명
 MainNo = trim(request("MainNo")) '건물 주번호
 SubNo = trim(request("SubNo")) '건물 부번호
 inSearch = searchKey
 if len(MainNo) > 0 then
  inSearch = inSearch & " " & MainNo
 end if
 if len(SubNo) > 0 then
  inSearch = inSearch & "-" & SubNo
 end if
 
 rows = 0

 if not IsNULL(inSearch) and len(inSearch) then
  '도로명 주소 중 한글 처리를 위한 변환 루틴
  Session.CodePage=949
  Response.CharSet = "euc-kr"
  
  cngSearch = server.URLEncode(inSearch)
  
  Session.CodePage=28591
  Response.CharSet = "ISO-8859-1"
  
  cngSearch = URLDecode(cngSearch)
  
  Session.CodePage=65001
  Response.CharSet = "utf-8"
  
  cngSearch = server.URLEncode(cngSearch)
  
  '주소 정보 가져오기
  if gubun = "oldpost" then
   sPath ="http://openapi.epost.go.kr/postal/retrieveLotNumberAdressService/retrieveLotNumberAdressService/getDetailList?searchSe=dong&srchwrd="&cngSearch&"&serviceKey="&server.URLEncode("인증키")&""
  else
   sPath = "http://openapi.epost.go.kr/postal/retrieveNewAdressService/retrieveNewAdressService/getNewAddressList?searchSe="&gubun&"&srchwrd="&cngSearch&"&serviceKey=인증키"
  end if

  Set oDOM = Server.CreateObject("Microsoft.XMLDOM")
  with oDOM
      .async = False ' 동기식 호출
      .setProperty "ServerHTTPRequest", True ' HTTP로 XML 데이터 가져옴
      .Load(sPath)
  end with  
    
  successYN = "Y"
  
  Set ResultNodes = oDOM.selectNodes("//cmmMsgHeader")
  
  if ResultNodes.Length > 0 then
   For each ResultSubNodes in ResultNodes
    successYN = ResultSubNodes.getElementsByTagName("successYN")(0).Text
   next
  end if
  Set ResultNodes = nothing
  
  ' XML 에서 반복적인 상위키를 기준으로 가져옵니다.
  if successYN = "Y" then
   if gubun = "oldpost" then
    Set Nodes = oDOM.selectNodes("//detailList")
   else
    Set Nodes = oDOM.selectNodes("//newAddressList")
   end if
   
   rows = Nodes.Length
  else
   rows = 0
  end if
  
 end if

 

'특수문자 변환작업
 Function URLDecode(sConvert)
     Dim aSplit
     Dim sOutput
     Dim I
     If IsNull(sConvert) Then
        URLDecode = ""
        Exit Function
     End If
 
     ' convert all pluses to spaces
     sOutput = REPLACE(sConvert, "+", " ")
 
     ' next convert %hexdigits to the character
     aSplit = Split(sOutput, "%")
 
     If IsArray(aSplit) Then
       sOutput = aSplit(0)
       For I = 0 to UBound(aSplit) - 1
         sOutput = sOutput & _
           Chr("&H" & Left(aSplit(i + 1), 2)) &_
           Right(aSplit(i + 1), Len(aSplit(i + 1)) - 2)
       Next
     End If
 
     URLDecode = sOutput
 End Function

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 
<title>우편번호 검색</title>
<link rel="stylesheet" type="text/css" href="/css/__style.css" />
<link type="text/css" rel="stylesheet" href="/css/__post.css" />
<script type="text/javascript" language="javascript" charset="utf-8" src="postxml.js"></script>

</head>
<body onload="fnInit('<%=gubun%>')">
 
<div id="wrap_pop">
 <h1><img src="/images/tit_post.jpg" alt="우편번호 검색" /></h1>
 <p id="btnClose"><a href="javascript:self.close();" title="팝업창 닫기"><img src="/images/close.gif" alt="CLOSE" /></a></p>
 
 <div id="popBox" class="pd-inF">
     <!-- contents --> 
  
  <fieldset>
   <div class="zip_srchbox" id="srch1">
          <form action="zipcode.asp" method="post" class="zip_w" name="srch_f" onsubmit="return fnCheckForm(this);">
     <input type="hidden" name="searchKey" value="" />
     <input type="hidden" name="MainNo" value="" />
     <input type="hidden" name="SubNo" value="" />
    <legend>우편번호 상세검색</legend>
    <!-- 검색구분 선택 -->
     <dl class="dlline">
      <dt><strong><label for="sido">검색 구분</label></strong></dt>
      <dd>
       <select id="gubun" title="검색 구분" name="gubun" onchange="fnGubun(this)">
        <option value="road">도로명+건물번호</option>
        <option value="dong">동(읍/면/리)명+지번</option>
        <option value="oldpost">구 지번</option>
       </select>
      </dd>
 
      <dt><strong><label for="gugun">검색어</label></strong></dt>
      <dd>
       <input id="keyword" type="text" class="srch_btn" title="검색어를 입력하세요!" style="IME-MODE:active;" value="<%=inSearch%>"  onclick="this.style.backgroundImage='';" onkeydown="this.style.backgroundImage='';" onblur="eventonblur(this);" size="25" name="keyword" />
       <input type="image" alt="검색" src="/images/zip_srch.gif" />
      </dd>
     </dl>
          </form>

   </div>
   
   <!-- 검색안내 -->
   <div class="zip_info">
    <p id="notitab3_list"><span class="first">*</span> 검색방법 : 도로명(~로,~길)+건물번호<br />
     ☞ 서울시 중구 <em>소공로  70</em>일 경우<br />
       예) <em>소공로</em>(도로명)&nbsp;<em>70</em>(건물번호)
    </p>
    <p id="notitab4_list">
    <span class="first">※</span> 도로명인 "성남대로997번길"인 경우 한 단어이므로 다음과 같이 띄워쓰기 없이 쓰셔야 합니다. <br />
       ☞성남대로, 성남대로997번, 성남대로997번길
    </p>
    
    <p id="notitab5_list" style="display:none"><span class="first">*</span> 검색방법 : 도로명(~로,~길)+건물번호<br />
     ☞ 서울시 중구 <em>충무로1가 20-1</em> 일 경우<br />
      예) <em>충무로1가</em>(동명)&nbsp;<em>20-1</em>(지번)
    </p>

    <p id="notitab6_list" style="display:none"><span class="first">*</span> 검색방법 : 읍/면/동/건물명 등 검색어 입력<br />
     ☞ 서울시 중구 <em>충무로1가</em> 일 경우<br />
      예) <em>충무로1가</em>(검색어)
    </p>

    <p>
    <span class="first">※</span> 도로명주소가 검색되지 않는 경우는 <strong>행정안전부 새주소 안내시스템 (<a href="http://juso.go.kr" target="_blank" title="새창열림">http://juso.go.kr</a>) 에서 <br />
     확인</strong>하시기 바랍니다
    </p>
   </div>
   <!-- //검색안내 -->

   <!-- 검색결과 -->
   <div class="srch_result">
    <table class="zip_t" summary="우편번호, 도로명주소, 지번주소">
     <caption>우편번호 검색결과</caption>
     <colgroup>
      <col width="14%"></col>
      <col width="86%"></col>
     </colgroup>
     <thead>
      <tr>
       <th>우편번호</th>
       <th>주소</th>
      </tr>
     </thead>
     <tbody>
   <%
   if rows > 0 then
    For each SubNodes in Nodes
     if gubun = "oldpost" then
      zipcode = SubNodes.getElementsByTagName("zipNo")(0).Text
      post_address = SubNodes.getElementsByTagName("adres")(0).Text
      strPostAddr = post_address
     else
      zipcode = SubNodes.getElementsByTagName("zipNo")(0).Text
      post_address = SubNodes.getElementsByTagName("lnmAdres")(0).Text
      dong_address = SubNodes.getElementsByTagName("rnAdres")(0).Text
      strPostAddr = post_address & "<BR />(" & dong_address & ")"
     end if
   %>
      <tr>
       <td><strong><a href="#" onclick="use_post('<%=zipcode%>','<%=post_address%>');"><%=zipcode%></a></strong></td>
       <td style="text-align:left;"><%=strPostAddr%></td>
      </tr> 
    <%Next%>
   <%Else%>
      <tr>
       <td colspan="2" class="none"><strong>- 검색결과가 없습니다. -</strong></td>
      </tr>
   <%End If%>
     </tbody>
    </table>
   </div>
   <!-- //검색결과 -->

  </fieldset>
  
        <!-- // contents -->
    </div>
</div>
<%
set oDOM = nothing
set Nodes = nothing
%>
</body>
</html>
 

top


WCMS는 (주)워드앤코드에서 제공하는 콘텐츠 관리 솔루션이다

================================================================================

 

이제부터 게시판 필드정보 설정에 대한 부분을 살펴보자

먼저 게시판필드는 기본필드가 존재하고 추가할수 있는 구조로 만들어져있다.

기본 필드를 살펴보자

 

[TITLE] [nvarchar](500) NOT NULL     --제목
[LINKURL] [nvarchar](500) NULL     --링크주소
[LINKURL_FL] [nchar](1) NOT NULL DEFAULT (N''N'') --링크주소 사용여부
[CONTENTS] [nvarchar](max) NULL     --내용
[DESCRIPTION] [nvarchar](max) NULL    --소개글
[USER_ID] [nvarchar](200) NULL     --사용자아이디
[USER_PWD] [varbinary](500) NULL     --사용자비밀번호
[USER_NM] [nvarchar](200) NULL     --사용자명
[USER_EMAIL] [nvarchar](400) NULL     --사용자이메일
[HOMEPAGE] [nvarchar](500) NULL     --홈페이지
[MAINIMG] [nvarchar](500) NULL     --메인이미지
[MAINIMG_CAPTION] [nvarchar](500) NULL   --메인이미지캡션
[MAINIMG_SIZE] [float] NULL DEFAULT ((0))   --메인이미지사이즈
[LISTIMG] [nvarchar](500) NULL     --리스트이미지
[LISTIMG_OVER] [nvarchar](500) NULL    --리스트이미지 오버
[LISTIMG_CAPTION] [nvarchar](500) NULL   --리스트이미지 캡션
[LISTIMG_SIZE] [float] NOT NULL DEFAULT ((0))  --리스트이미지 크기
[TARGET_NM] [nvarchar](20) NULL DEFAULT (N''_self'') --창 타켓
[NTC_OPT] [nchar](1) NULL DEFAULT (N''N'')  --공지여부
[SECRET_OPT] [nchar](1) NULL DEFAULT (N''N'')  --비밀글여부
[OPEN_OPT] [nchar](1) NULL DEFAULT (N''Y'')  --오픈글여부
[SDATE] [datetime] NULL       --시작일
[EDATE] [datetime] NULL       --종료일
[READ_CNT] [int] NOT NULL DEFAULT ((1))   --조회수
[IPADDR] [nvarchar](30) NOT NULL     --아이피
[POSTDATE] [nvarchar](20) NULL     --게시일
[REGDATE] [datetime] NOT NULL DEFAULT (getdate()) --등록일
[DEL_FLAG] [nchar](1) NOT NULL DEFAULT (N''N'') --삭제여부
[DEL_DATE] [datetime] NULL      --삭제일자
[ANSWER_FL] [nchar](1) NOT NULL DEFAULT (N''N'') --답변여부
[ANSWER] [nvarchar](max) NULL      --답변내용
[ANS_ID] [nvarchar](50) NULL      --답변자아이디
[ANS_NM] [nvarchar](50) NULL      --답변자이름
[ANS_DATE] [datetime] NULL      --답변일
[ANSIP] [nvarchar](30) NULL      --답변자IP

 

다양한 게시판의 요구를 모두 충족할수 있는 구조로 기본 테이블이 구성된다.

 

물론 여기서 추가를 하고 싶은 경우 추가할 수 있도록 구성되어있다

 

그래서 프로시저도

테이블 생성 프로시저, 테이블 필드추가프로시저 이렇게 2개로 구성된다

기본적으로 필드는 한번 생성되면 삭제는 되지 않게 했다.

왜냐하면 필드에 글이 있는 경우 다른 필드에 영향을 미칠수 있기 때문이다

단지 비활성화로 사용하지않게 하는 기능을 추가 하였다

필드 구성에 대한 사이트 이미지를 보자

 

 

 

필드 구성에서는 이전 포스트에서 설명한 기능이나 옵션에 따라 보이는 것을 다르다.

 

초기 필드 구성에 대한 소스를 한번 살펴보자

 

call xmlItemMake(oDom, "idx","40px", "번호", "int", "", "", "자동증가", "input", "", "E", "Y", "Y", "N","Y", "N", "N", "N", "1")
i = 2
if mainimg_opt = "Y" then
 call xmlItemMake(oDom, "mainimg","100px", "매인이미지", "short", "250", "", "", "input", "", "E", "Y", "Y", "N","Y", "N", "Y", "Y", i)
 i = i + 1
end if
call xmlItemMake(oDom, "title","*", "제목", "short", "250", "", "", "input", "", "C", "Y", "Y", "Y","Y", "Y", "Y", "Y", i)

i = i+1
call xmlItemMake(oDom, "linkurl","50px", "관련URL", "short", "350", "", "", "input", "", "C", "Y", "Y", "N","N", "Y", "Y", "Y", i)
 
if write_right > 1 then '회원제일경우
 call xmlItemMake(oDom, "user_id","70px", "아이디", "short", "100", "", "", "input", "", "D", "Y", "Y", "N","N", "N", "N", "N", i+1)
 call xmlItemMake(oDom, "user_nm","70px", "작성자", "short", "20", "", "", "input", "", "A", "Y", "Y", "N","Y", "Y", "Y", "N", i+2)
 call xmlItemMake(oDom, "user_email","50px", "이메일", "short", "200", "", "", "input", "", "E", "N", "N", "N","N", "N", "N", "N", i+3)
 call xmlItemMake(oDom, "homepage","50px", "홈페이지", "short", "250", "", "", "input", "", "C", "N", "N", "N","N", "N", "N", "N", i+4)
 i = i + 5
else
 call xmlItemMake(oDom, "user_nm","70px", "작성자", "short", "20", "", "", "input", "", "A", "Y", "Y", "N","Y", "Y", "Y", "N", i+1)
 call xmlItemMake(oDom, "user_email","50px", "이메일", "short", "200", "", "", "input", "", "E", "Y", "Y", "N","N", "Y", "Y", "Y", i+2)
 call xmlItemMake(oDom, "homepage","50px", "홈페이지", "short", "250", "", "", "input", "", "C", "N", "N", "N","N", "N", "N", "N", i+3)
 i = i + 4
end if
call xmlItemMake(oDom, "postdate","70px", "게시일", "datetime", "", "", "", "input", "", "A", "N", "N", "N","N", "N", "N", "N", i)
call xmlItemMake(oDom, "regdate","70px", "등록일", "datetime", "", "", "", "input", "", "D", "Y", "Y", "N","Y", "N", "N", "N", i+1)
call xmlItemMake(oDom, "read_cnt","50px", "조회수", "int", "", "1", "", "input", "", "D", "Y", "Y", "N","Y", "N", "N", "N", i+2)
call xmlItemMake(oDom, "contents","*", "내용", "long", "", "", "", "input", "", "C", "Y", "Y", "Y","N", "Y", "Y", "Y", i+3)
i = i + 4

if descript_opt = "Y" then
 call xmlItemMake(oDom, "description","*", "소개글", "long", "", "", "", "input", "", "A", "Y", "Y", "N","Y", "Y", "Y", "Y", i)
 i = i + 1
end if

if master_reply = "Y" then
 call xmlItemMake(oDom, "answer_fl","70px", "답변상태", "short", "2", "N", "", "input", "", "E", "Y", "Y", "N","Y", "N", "N", "N", i)
 i = i + 1
end if

if term_opt = "TY" OR term_opt = "TI" then
 call xmlItemMake(oDom, "period","70px", "게시기간", "short", "2", "", "", "input", "", "E", "Y", "Y", "N","N", "Y", "Y", "Y", i)
 i = i + 1
end if

if file_use = "FY" OR file_use = "FM" then
 call xmlItemMake(oDom, "filename","60px", "첨부파일", "short", "250", "", "", "input", "", "E", "Y", "N", "N","N", "N", "Y", "Y", i)
 i = i + 1
end if

if board_style <> 2 then
 if write_right = 1 then '비회원제일경우
  call xmlItemMake(oDom, "user_pwd","70px", "비밀번호", "short", "15", "", "", "input", "", "E", "Y", "Y", "N","N", "N", "Y", "Y", i)
  i = i + 1
 end if
end if
if listimg_opt = "Y" then
 call xmlItemMake(oDom, "listimg","100px", "목록이미지", "short", "250", "", "", "input", "", "E", "Y", "Y", "N","Y", "N", "Y", "Y", i)
 i = i + 1
end if

if topimg_opt = "Y" then
 call xmlItemMake(oDom, "topimg","100px", "대표이미지", "short", "250", "", "", "input", "", "E", "Y", "Y", "N","N", "N", "Y", "Y", i)
 i = i + 1
end if

 

소스에 보듯이 기능에 따른 필드 구성이 조금 달라진다.

추후 소스에 대한 분석 설명때 다시 다루기로 하자

 

오늘은 필드정보 구성화면을 살펴봤다.

다음에는 필드 구성 후 옵션에 대한 기본 생성된 XSL파일에 대해서 살펴보기로 하자

top


WCMS는 (주)워드앤코드에서 제공하는 콘텐츠 관리 솔루션이다

================================================================================

 

게시판 설정은 일반형에서 조금씩 변형되는 것이기 때문에 특이한 것은 없다...

그래서 간략하게 설명하고자 한다.

 

먼저 옵션설정부터 보자

 

- 컨텐츠형 게시판

 

컨텐츠형은 파일 첨부 이외의 기능은 특별히 요구되지 않기 때문에 간략하다.

컨텐츠형은 목록화면이 사용자에서는 필요하지 않기 때문에 읽기 화면에 대한 부분만 정의를 하면 된다.

 

- 문의형 게시판

 

문의형에서는 관리자 답변기능이 있는 것과 목록 화면에 대한 내용이 존재한다

 

- 링크형 게시판

 

링크형 게시판은 제목과 URL만 필요로 하기 때문에 글목록,쓰기  화면만 존재한다.

글읽기 화면은 존재할 이유가 없기 때문에 옵션은 굉장히 간단하다

 

- 웹진형, 갤러리형 게시판

 

웹진형과 갤러리형게시판은 메인 이미지노출부분이 추가 된다.

또한 목록에 이미지 사용여부가 추가된다.

그리고 웹진형과 갤러리형게시판은 내용 상단에 이미지가 노출되는 경우가 발생할때가 있다.

이럴경우를 대비해서 본문 상단 이미지를 최대 5개까지 입력이 가능하도록하였다.

그외는 일반형게시판과 대동소이하다.

 

 

그럼 기능옵션에 대한 부분도 살펴보자

 

- 컨텐츠형 게시판

 

컨텐츠형 게시판의 기능은 본문에 대한 기능만 정의하면 되기 때문에 에디터 사용여부와 SNS, 복사, 프린터 등에 대한 기능만 존재한다.

 

- 문의형 게시판

 

문의형은 목록에 대한 기능과 관리자의 답변이 있을 경우 사용자에게 메일을 발송하는 부분과 문의가 발생했을때 관리자에게 메일을 발송하는 부분이 추가 되어 있다.

SMS기능을 추가하고자 한다면 별도의 기능으로 첨가하면 좋을 듯하다.

 

- 링크형 게시판

 

링크형은 게시물 목록에 대한 기능 옵션이 전부다.

특이할 점은 링크 주소만 보여주고 연결을 막는 경우가 있어 링크주소 바로가기가 추가 되어 새창으로 연결되는 옵션을 추가하였다

 

- 웹진형 게시판

 

웹진형 게시판은 리스트에 어떤 모양으로 보여줄것인가를 결정하는 부분이 추가 되어 있다.

게시물 표시갯수가 5개, 10개, 20개가 일단형인지 2단형인지 선택하도록 옵션이 주어진다.

도한 목록에 요약글이 나올수 있도록 요약글에 대한 옵션을 추가해줬다..

 

- 갤러리형 게시판

 

갤러리형은 웹진형과 유사하지만 하가지 차이점은 갤러리형은 사진만 나오기 때문에 2단구성, 3단 구성, 4단구성, 5단 구성으로 나누어지는 부분을 제외하고는 웹진형과 대동소이하다.

 

이상으로 게시판에 대한 설정부분은 마치고자 한다.

게시판의 설정부분에 대한 XML포맷에 대한 것은 다음 포스트에서 다루고자 한다...

 

 

 

top