posted by 구름너머 2006. 7. 21. 09:31
posted by 구름너머 2006. 7. 21. 09:20
jsp page 작성 요령 | Java/Jsp 2006/06/13 14:27
http://blog.naver.com/perker/25261313

Articles Index

Code Conventions for the

JavaServer PagesTM Version 1.x Language


JavaServer PagesTM (JSPTM)가 점점 널리 웹기반 어플리케이션으로 자리잡아가면서, 개발과 유지보수에 종사하는 많은 JSP 프로그래머들과 웹 개발자들은, 예전에 자바프로그래머들이 겪었던 것과 같은 딜레마에 직면했다. "어떻게 JSP 코드를 짜면 읽기, 쓰기, 유지보수하기를 일관적으로 쉽게 할 수 있을까?"

이 글은, 웹 컴포넌트를 사용하는 전형적인 소프트웨어 프로젝트에서 준수해야 할JSP(1.1 과 1.2버전) 표준 작성요령을 제안한다. 이 문서의 모체는 자바 언어 코드 작성요령이다. (JSP 와 관련된) 코드 작성 방법 스펙에 소개된 다양하고 중요한 요소들을 확인할 수 있는 템플릿으로 삼았다. 특히, 파일명, 구성, 들여쓰기, 주석, 지시자, 선언문, 스크립틀릿, 표현식, 공백, 명명법(이름 짓는 법), 프로그래밍 습관 등을 소개한다. 처음으로 시도되는 JSP 코드 작성요령이기 때문에, 이 권고 문서에 대한 여러분들의 관심과 피드백을 기다린다. 연락처는 jsp-codeconv-comments@sun.com이다.

JSP 2.0 스펙에서는 1.2 버전을 모두 포용하지만, 스크립트가 없는 프로그래밍 스타일(선언문, 스크립틀릿, 표현식이 없는)을 지향하고, 수많은 새 특징들을 갖고 있어서, 이 작성요령을 더 진보시켜야 될 필요가 있다. 가능한 한, 이 문서는 새로운 JSP 2.0 특징에 도움을 주는 작성방식을 선택했다.

마지막으로, 이 글을 읽는 수준은 JSP, Java, 자바 코드 작성요령에 익숙해야 하고, 이미 프로젝트를 수행하는 팀에 적용이 되어 있어야 된다. 그렇지 않다면, 이 링크를 읽어 보기를 추천한다. Java 링크 JSP 링크.

 

왜 코드 작성요령이 필요한가?

Why Have Code Conventions?

코드 작성요령은 프로그래머와 웹 컨텐츠 개발자에게 여러 가지 이유로 중요하다:

  1. 소프트웨어 산출물의 가독성을 향상시킨다.
  2. 견습 관리와 노력을 경감한다.
  3. 표준화에 대한 조직적 참여도를 배가시킨다.

파일 이름과 위치

File Names and Locations

파일 이름짓기는 툴 벤더와 웹 컨테이너로 하여금 파일 타입을 인식하고, 각각에 맞게 해석할 수 있는 방법을 제공한다. 다음 테이블은 추천하는 방식의 파일 확장자와 위치 목록이다.

File Type

File

확장자

추천 위치
JSP .jsp<context root>/<subsystem path>/
JSP fragment .jsp<context root>/<subsystem path>/
.jspf<context root>/WEB-INF/jspf/<subsystem path>/
cascading style sheet .css<context root>/css/
javascript .js<context root>/js/
HTML page .html<context root>/<subsystem path>/
web resource .gif, .jpg, etc. <context root>/images/
tag library descriptor .tld<context root>/WEB-INF/tld/

위 테이블을 볼 때 몇 가지 유념할 것이 있다. 우선, <context root> 는 웹 어플리케이션(.war 파일 내의 루트 디렉토리) 컨텍스트의 루트이다. 둘째로, <subsystem path> 는 동적, 정적 웹페이지 컨텐츠의 논리적인 그룹으로 나누도록 한다. 작은 웹 어플리케이션일 경우, 이게 필요하지 않을 수도 있다. (한 곳에 모두 놓아도 된다.)

세째로, 다른 JSP 파일에 포함되는 JSP 를 언급할 때 JSP fragment (JSP 프래그먼트 조각)라는 용어를 사용한다. 주의할 것은 JSP 2.0 에서는 "JSP fragment" 용어가 겹치기 때문에 "JSP 세그먼트(JSP segment)" 용어가 대신 사용된다. JSP fragment 는 확장자로 .jsp 또는 .jspf 를 사용하고, /WEB-INF/jspf나 다른 정적인 컨텐츠와 함께 각각 위치하면 된다. 불완전한 JSP fragment는 언제나 .jspf 확장자를 사용하고, /WEB-INF/jspf에 위치해야 된다. 네째로, JSP 스펙에서는 JSP fragment 확장자로 .jspf.jsp 양쪽 모두를 권장하지만, 추천하는 것은 .jspf 인데, .jsfJavaServer Faces™ 스펙에서 사용될 것이기 때문이다.

끝으로, 태그 라이브러리 디스크립터 파일이나 다른 비공개적인 컨텐츠는 WEB-INF/ 또는 이 하위 디렉토리에 놓아두는 것은 보편적으로 좋은 습관이다. 웹 컨테이너는 WEB-INF/ 아래 있는 어떤 파일도 송출하지 않기 때문에, 이 방법을 사용하면, 클라이언트가 접근하거나 볼 수 없게 된다.

배치 설명자(web.xml)의 welcome-file 엘리먼트에 선언되어 있는 웰컴 파일의 이름은 동적인 컨텐츠를 생성하려면, index.jsp 가 되어야 되고, 정적인 웰컴 페이지라면 index.html 로 해야 한다.

JSP 파일을 다국어로 작성할 때, 로케일에 따라 디렉토리를 나누어 그룹 짓기를 추천한다. 예를 들어서 index.jsp 의 US English 버전은 /en_US/index.jsp 에, 같은 파일의 일본어판은 /ja_JP/index.jsp 에 있게 한다. 일반적으로 자바 코드의 국제화에 관한 추가적인 정보는 Java Tutorial 에 있고, 웹 어플리케이션의 국제화에 대한 정보는 Designing Enterprise Applications with the J2EETM Platform 책에 나와있다.

파일 구조

File Organization

구조가 잘 갖춰진 소스 코드 파일은 읽기 쉽고, 파일 사이에 정보를 더 빨리 놓아둘 수 있다. 이 섹션에서, JSP와 태그 라이브러리 디스크립터 파일 모두를 위한 구조를 소개하려한다.

JSP 파일 / JSP Fragment 파일

JSP 파일은 다음의 섹션들이 나열한 순서대로 구성된다:

  1. 도입 주석
  2. JSP 페이지 지시자(directive)
  3. 선택적 태그 라이브러리 지시자
  4. 선택적 JSP 선언문
  5. HTML 과 JSP 코드

도입 주석

Opening Comments

JSP 파일 또는 프래그먼트 파일은 서버측 주석으로 시작한다:

<%--
- 작성자:
- 일자:
- 저작권 표시:
- @(#)
- 설명:
--%>

이 주석은 서버측에서만 볼 수 있다. JSP 변환 과정에서 제거되기 때문이다. 여기에는 웹 개발자를 위한 JSP에 대한 작성자, 일자, 개정판의 저작권, 증명과 설명이 포함된다. "@(#) " 문자 조합은 증명의 시작을 지시하는 것으로 어떤 프로그램에서 인식된다. 이런 표식을 사용하는 프로그램들은 많이 사용되지 않지만, 있어도 해가 될 것은 없다. 추가로, 이 조합은 때때로 "$Id$" 를 덧붙여서, 어떤 종류의 버전 관리 프로그램에서는 자동으로 증명 정보를 JSP에 기록하도록 한다. 설명 부분은 JSP의 목적에 관한 축약된 정보를 제공한다. 한 문단 이상 넘어가지 않도록 한다.

어떤 상황에서는, 도입 주석이 JSP 변환과정을 지나서 출처가 확실하다는 뜻과 법적인 목적으로 클라이언트의 브라우저에 보여질 필요가 있다. 이럴 경우 주석 부분을 두개로 나눠서 우선 클라이언트측 스타일의 주석을 단다:

<!--
- Author(s):
- Date:
- Copyright Notice:
--%>

그리고 나서 짧아진 나머지 서버측 스타일의 주석을 단다:

<%--
- @(#)
- Description:
--%>

JSP 페이지 지시자

JSP Page Directive(s)

JSP 페이지 지시자는 JSP 변환 시점에 관련된 속성을 정의한다. JSP 스펙은 같은 페이지에 JSP 페이지 지시자의 수량을 제한하지 않는다. 그래서 다음 두 개의 코드 예제는 똑같다.(다른 점이 있는데, 첫 예제는 출력시에 맨 위에 두 개의 빈 줄이 포함된다):

코드 예제 1:

<%@ page session="false" %>
<%@ page import="java.util.*" %>
<%@ page errorPage="/common/errorPage.jsp" %>

페이지 지시자 같이 지시자의 길이가 일반적인 JSP 폭(80 문자)을 넘어갈 경우 여러 줄로 나눠진다:

코드 예제 2:

<%@ page session="false"
import="java.util.*"
errorPage="/common/errorPage.jsp"
%>

일반적으로, 코드 예제 2는 코드 예제 1보다 즐겨 사용된다. 예외가 있는데, 매우 긴 import 속성을 쓰게 되는, 여러 개의 자바 패키지가 JSP페이지에서 필요할 경우이다:

<%@ page session="false"
import="java.util.*,java.text.*,
com.mycorp.myapp.taglib.*,
com.mycorp.myapp.sql.*, ..."
...
%>

이런 경우, 페이지 지시자를 다음과 같이 나누는 것이 즐겨사용된다:

<%-- import를 제외한 모든 속성 --%>
<%@ page
...
%>
<%-- import 속성들은 여기부터 시작 --%>
<%@ page import="java.util.*" %>
<%@ page import="java.text.*" %>
...

주의할 점은, 일반적으로 import문은 자바의 지역 코드 작성요령을 준수한다. 예를 들어, 같은 패키지에서 세 개의 클래스까지만 사용되면, import 는 패키지를 선언하기 보다는, 클래스를 일일이 선언한다. 세 개를 넘어가면, 클래스를 일일이 지정할 것인지 아니면, ".*" 표시를 사용할 것인지는 웹 개발자 마음이다. 전자의 경우, 외부 클래스가 무엇이 사용되는지를 쉽게 알수 있다. 특히 버그가 많은 클래스를 위치시키려고 하거나, JSP 가 자바 코드와 어떻게 상호작용하는지를 이해하려할 경우에 유용하다. 예를 들어서, 아래처럼 임포트한 자바 패키지들에 관해 알지 못하면, 웹 개발자는 Customer 클래스를 찾기 위해서 이 모든 패키지들을 검색해봐야 된다:

<%@ page import="com.mycorp.bank.savings.*" %>
<%@ page import="com.thirdpartycorp.cashmanagement.*" %>
<%@ page import="com.mycorp.bank.foreignexchange.*" %>
...

후자의 경우, 작성된 JSP 가 깔끔하지만, 사용한 클래스가 무엇인지 아는 것은 어려워진다. 일반적으로, JSP 에 임포트 지시자가 너무 많으면, 자바 코드가 너무 많이 들어가 있기 쉽다. 보다 나은 선택은 JSP 태그를 더 사용하는 것이다.(후에 언급하겠다).

선택적 태그 라이브러리 지시자

Optional Tag Library Directive(s)

태그 라이브러리 지시자는 JSP 에서 사용하는 커스텀 태그 라이브러리를 선언한다. 짧은 지시자는 하나의 줄에 선언할 수 있다. 여러 개의 태그 라이브러리 지시자들은 JSP 의 한 곳에 같이 모아둔다:

<%@ taglib uri="URI1" prefix="tagPrefix1" %>
<%@ taglib uri="URI2" prefix="tagPrefix2" %>
...

페이지 지시자처럼, 태그 라이브러리 지시자의 길이가 일반적인 JSP 폭(80 문자)을 넘어갈 경우 여러 줄로 나눠진다:

<%@ taglib
uri="URI2"
prefix="tagPrefix2"
%>

오직 페이지에서 사용하는 태그 라이브러리만 임포트되어야 한다.

JSP 1.2 부터, 웹 어플리케이션의 JSP에 JSTL;JSP 표준 태그 라이브러리사용하기를 적극 권장한다. 페이지에서 JSP 스크립틀릿 사용할 필요를 줄여주기 때문이다. 일반적으로, JSTL을 사용하는 페이지는 소스읽기와 유지보수가 보다 편하다.

선택적 JSP 선언문

Optional JSP Declaration(s)

JSP 선언문은 JSP에서 소속된 메소드와 변수를 선언한다. 이들 메소드와 변수는 자바 프로그램에서의 선언문과 다를바 없다. 그래서 적절한 코드 작성요령을 따르기만 하면 된다. 선언문은 <%! ... %> JSP 선언문 블록 하나에 모두 몰아서 한 곳에 집중해 놓는 것이 좋다. 예를 들면:

다른 선언문 블록들바람직한 선언문 블록

<%! private int hitCount; %>

<%! private Date today; %>

...

<%! public int getHitCount() {
return hitCount;
}
%>

<%!
private int hitCount;
private Date today;

public int getHitCount() {
return hitCount;
}

%>

HTML 과 JSP 코드

HTML and JSP Code

이 섹션은 JSP 코드와 HTML 이 섞여있는 페이지에 대해 설명한다. JSP 표현식, 스크립틀릿, 자바빈즈 지시자 등이 해당된다.

태그 라이브러리 설명서

Tag Library Descriptor

태그 라이브러리 설명서(TLD)는 적당한 XML선언과 올바른 DTD 문으로 시작한다. 예를 들어서, JSP 1.2 TLD 는 다음과 같이 시작해야 된다:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

바로 뒤이어 서버측 주석과 같은 스타일의 주석을 기입한다. 작성자, 일자, 저작권, 증명 정보, 라이브러리에 대한 짧은 설명이다:

<!--
- 작성자:
- 일자:
- 저작권 표시:
- @(#)
- 설명:
-->

여기에 관한 규칙과 가이드라인은 JSP 파일/프래그먼트 파일에서 정의된 것과 동일하다.

태그 라이브러리 파일의 나머지는 다음에 나오는 순서대로 이루어져 있다:

  • 태그 라이브러리 검증기 하나의 선택적 선언문
  • 이벤트 리스너들의 선택적 선언문
  • 하나 이상의 가능한 태그들의 선언

TLD 에서 엘리먼트 마지막에 선택적 서브 엘리먼트를 항상 덧붙이기를 추천한다. 이 선택적 서브 엘리먼트는 태그 디자이너가 TLD의 습성과 추가적인 정보를 문서화할 장소를 제공한다. 이것은 웹 컴포넌트 개발자들에게는 보이지 않게 된다.

TLD

Element

JSP 1.2

Recommended

Sub-element

JSP 1.1

Recommended

Sub-element

attribute

(JSP 1.2)

description

init-param

(JSP 1.2)

description
tagdisplay-name, description, examplename, info
tagliburi, display-name, descriptionuri, info

validator

(JSP 1.2)

description

variable

(JSP 1.2)

description

들여쓰기

Indentation

들여쓰기는 반드시 공백문자로 채워야한다. 탭은 사용하는 에디터마다 표시하는 공백의 수가 다르기 때문에 JSP 내에서 들여쓰기로 사용하기에는 적합하지 않다. 특별히 통합개발환경(IDE) 툴에서 제한되지 않았다면, 기본 들여쓰기 단위는 4개의 공백문자로 한다.

다음은 그 사용예이다:

<myTagLib:forEach var="client" items="${clients}">
<myTagLib:mail value="${client}" />
</myTagLib:forEach>

연속 들여쓰기는 이전 줄의 적당한 지점에서 시작한다. 연속 들여쓰기의 공백은 기본 들여쓰기 공백의 배수이다. (4개의 공백문자의 배수):

<%@ page attribute1="value1"
attribute2="value2"
...
attributeN="valueN"
%>

스크립트 엘리먼트의 들여쓰기

Indentation of Scripting Elements

JSP 스크립트 엘리먼트(선언문, 스크립틀릿, 표현식과 같은)가 한 줄에 맞지 않는 경우, 스크립트 언어의 들여쓰기 작성요령이 엘리먼트 내에 적용된다. 몸체는 엘리먼트의 여는 기호 <%=와 같은 줄에서 시작한다. 다음줄의 기준도 여는 기호 <%=가 된다. 몸체의 끝은 다른 줄에 있는 엘리먼트의 닫는 기호(%>)로 마무리된다. 예제이다:

<%= (Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
= Calendar.SUNDAY) ?
"Sleep in" :
"Go to work"
%>

첫줄과 마지막 줄을 제외한 몸체의 가운데 줄들은 단위 들여쓰기 공백(앞 예제에서 로 보인다)이 앞에 있기 때문에 나머지 JSP 보다 확연히 드러나게 된다.

JSP, HTML, JAVA의 복합 들여쓰기

Compound Indentation with JSP, HTML and Java

자바의 스크립트 코드와 템플릿 텍스트(HTML)가 섞여있는 JSP 엘리먼트를 위해서 복합 들여쓰기가 필요한 이유는 JSP 소스를 이해하기 위해 드는 노력을 덜어주기 위해서이다. 기존의 들여쓰기 요령은 JSP 소스파일을 더 알아보기 어렵게 할 수 있기 때문이다. 보편적인 규칙에 따라서, 다른 소스 사이에 끼어 있을 경우마다 보통 들여쓰기에 특별한 단위를 할당한다. 클라이언트에 보여지는 들여쓰기에 영향을 준다. 추가적인 들여쓰기는 (브라우저에 의해) 보통 무시되고, 브라우저에 나타나는 결과는 차이가 없다. 예를 들어, <TABLE> 태그 앞에 공백이 몇 개 더 추가된다고 해서, 브라우저에서 보여지는 테이블의 위치가 달라지는 것은 아니다. 그래서 이러한 작성요령을 사용하는 것이 더 좋아 보인다:

<table>
<% if { tableHeaderRequired ) { %>
<tr>
<th>Last Name</th>
<th>First Name</th>
</tr>
<% } %>
<c:forEach var="customer" items="${customers}">
<tr>
<td><c:out value="${customer.lastName}"/></td>
<td><c:out value="${customer.firstName}"/></td>
</tr>
</c:forEach>
</table>


위 방식보다는 아래 방식이 낫다:

<table>
<% if { tableHeaderRequired ) { %>
<tr>
<th>Last Name</th>
<th>First Name</th>
</tr>
<% } %>
<c:forEach var="customer" items="${customers}">
<tr>
<td><c:out value="${customer.lastName}"/></td>
<td><c:out value="${customer.firstName}"/></td>
</tr>
</c:forEach>
</table>

주석

Comments

주석은 추가 정보 전달이나 코드를 둘러쌀 목적으로 사용한다. 여기서는 JSP에서 사용하는 두가지 형태의 주석을 볼 것이다: JSP 측과 클라이언트 측 주석이다.

JSP 주석

JSP Comments

JSP 주석(또는 서버 측 주석)은 서버에서만 볼 수 있다(즉, 클라이언트로 전파되지 않는다). 순수 JSP 주석을 스크립팅 언어와 섞여있는 JSP 주석보다 즐겨 사용한다. 전자가 기반 스크립트 언어에 덜 종속적이기 때문이고, JSP 2.0 으로 진화하기 더 쉽기 때문이다.

다음 도표는 이것을 설명한다:

Line

JSP 스크립틀릿과

스크립트 언어 주석

순수 JSP

주석

한 줄

<% /** ... */ %>

<% /* ... */ %>

<% // ... %>

<%-- ... --%>
여러 줄

<%

/*

*

...

*

*/

%>

<%--

-

...

-

-- %>

<%

//

//

...

//

%>

클라이언트 측 주석

Client Side Comments

클라이언트 측 주석(<!-- ... -->)은 응답에 대해서 부가적인 정보를 클라이언트로 보내기 위해 응답에 주석을 다는 것이다. 서버 어플리케이션의 행동이나 내부적인 구조에 대한 것과 응답 내용을 생성하는 코드가 포함되어서는 안된다.

클라이언트/사용자의 입장에서 서버에서 보내온 응답을 해석하기 위해서 이런 종류의 주석을 직접 볼 필요가 없기 때문에, 클라이언트 측 주석은 보편적으로 사용되지 않는다. 앞서 얘기한대로 증명이나, 저작권 정보 등의 법적인 목적의 증명에 사용될 경우는 예외가 되겠다. 다른 예외적인 경우는 HTML 저작도구들이 HTML 문서 구조의 틀을 잡아주기 위해 작은 양의 HTML 주석들을 사용하는 경우가 되겠다. 예를 들면 다음과 같다:

<!-- 툴바 섹션 -->
...
<!-- 왼쪽 네비게이션 메뉴 -->
...
<!-- main body -->
...
<!-- footer -->
...

여러 줄의 주석

Multiline Comment Block

JSP 또는 클라이언트 측 모두, 여러 줄의 주석은 대시 문자 "-" 로 꾸며진다. XML 스펙에서, 더블-대시 문자열 "--"은 XML 주석 문 내에 허용되지 않는다. 그러므로, 이 스펙에 호환성과 일관성을 갖기 위해서, 더블-대시 문자열은 여러줄의 주석문 내에 사용되면 안된다. 다음 도표는 클라이언트 측 여러 줄 주석 사용법을 보여준다:

권장 XML과 맞지 않는 법

<!--

- line 1

- line 2

...

-->

<!--

-- line 1

-- line 2

...

-->

JSP 선언문

JSP Declarations

자바 코드 작성요령에 따라서, 같은 타입의 변수 선언문은 다른 줄에서 이루어져야 된다:

비 추천추천
<%! private int x, y; %>

<%! private int x; %>

<%! private int y; %>

자바빈즈는 <jsp:useBean> 액션 태그를 사용하는 대신, JSP 선언문을 통해서 선언되고 인스턴스화되면 안된다.

일반적으로, 변수를 위한 JSP 선언문은 그 자체가 스크립트 언어의 사용을 부추기기 때문에 사용하지 않는 것이 좋다. JSP 는 프리젠테이션 목적으로 설계되었는데, 여기에 비지니스 로직과 자바코드를 섞어놓기 때문이다. 그리고, 변수의 스코프 관리에 따른 부담도 생기게 된다.

JSP 스크립틀릿

JSP Scriptlets

가급적, 태그라이브러리로 동일한 기능을 구현할 수 있으면, JSP 스클립틀릿은 피하기 바란다. 이렇게 하면 페이지 가독성도 높이고, 유지보수도 쉬워진다. 비지니스 로직을 프리진테이션 로직에서 분리하는데 일조하며, JSP 2.0 스타일의 페이지로 쉽게 옮겨갈 수 있다(JSP 2.0 도 스크립틀릿을 지원하지만 덜 강조한다). 다음 예제는 customers 표시 방법이 데이터 형에 따라서 다른 스크립틀릿을 사용하는 것을 보여준다:

customers 는 Customers의 배열

<table>

<% for ( int i=0; i<customers.length; i++ ) { %>

<tr>

<td><%= customers[i].getLastName() %></td>

<td><%= customers[i].getFirstName() %></td>

</tr>

<% } %>

</table>

customers 는 Enumeration

<table>

<% for ( Enumeration e = customers.elements();

e.hasMoreElements(); ) {

Customer customer = (Customer)e.nextElement();

%>

<tr>

<td><%= customer.getLastName() %></td>

<td><%= customer.getFirstName() %></td>

</tr>

<% } %>

</table>

그러나, 공통 태그라이브러리를 사용하면, customers 의 데이터 형이 달라도 보다 높은 유연성이 생긴다. 예를 들어서, JSTL 에서는customers 를 나타내기 위해서 배열과 Enumeration 양쪽 모두 지원하는 다음과 같은 코드로 표시할 수 있다:

<table>

<c:forEach var="customer" items="${customers}">

<tr>

<td><c:out value="${customer.lastName}"/></td>

<td><c:out value="${customer.firstName}"/></td>

</tr>

</c:forEach>

</table>

비지니스 로직과 프리젠테이션 층과의 결합도을 줄이기 위한 모델-뷰-컨트롤러(MVC) 디자인 패턴을 적용하려고 한다면, JSP 스크립틀릿은 비지니스 로직을 구현하기 위해서 사용되어서는 안된다. 오히려, JSP 스크립틀릿은 클라이언트의 요청을 처리한 뒤에 나오는 데이터("가치 객체 value objects"로 불리는)를 적절한 클라이언트의 준비된 형식에 전송하기 위해 필요하다면 사용된다. 심지어 그럴 경우에도, 프론트 컨트롤러 서블릿이나 커스텀 태그로 하는 게 더 낫다. 예를 들면, 다음의 코드는 데이터베이스에서 직접 customers 의 이름을 가져와 클라이언트에 보여준다:

<% // 스크립틀릿을 이용하는 것은 추천하지 않음!

Connection conn = null;

try {

// Get connection

InitialContext ctx = new InitialContext();

DataSource ds = (DataSource)ctx.lookup("customerDS");

conn = ds.getConnection();

// Get customer names

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("SELECT name FROM customer");

// Display names

while ( rs.next() ) {

out.println( rs.getString("name") + "<br>");

}

} catch (SQLException e) {

out.println("Could not retrieve customer names:" + e);

} finally {

if ( conn != null ) conn.close();

}

%>

다음의 JSP 코드는 데이터베이스 처리부분을 내부적으로 데이터베이스 코드의 의존성을 숨기고 캡슐화한 커스텀태그myTags:dataSource에 위임하고 있기 때문에 더 보기 좋다:

<myTags:dataSource name="customerDS" table="customer" columns="name" var="result" /> <c:forEach var="row" items="${result.rows}"> <c:out value="${row.name}" /> <br /> </c:forEach>

result 는 커스텀 태그 myTags:dataSource가 customer 데이터베이스에서 customer의 이름들 뽑아낸 결과를 담으려고 만들어 낸 스크립팅 변수이다. JSP 코드는 클라이언트의 요구에 따라 동적으로 다른 종류의 출력(HTML, XML, WML)을 생성하기 위해 확장할 수 있다. 그것도 백엔드 코드(dataSource 태그를 위한)를 변경하지 않고도 가능하다. 더 나은 선택은 이것을 프론트 컨트롤러 서블릿에 위임하는 것이다. 이 서블릿은 데이터를 불러와서 그 결과를 request 스코프의 속성을 통해서 JSP에 제공한다. 예제는 자바 BluePrint의 엔터프라이즈 섹션을 참고하기 바란다.

요약하면 :

  • 이상적으로, 스크립트 언어로부터 독립하기 위해서 JSP 스크립틀릿은 JSP 내에서 사라져야 되고, JSP 내의 비지니스 로직 구현은 피해야 된다.
  • 그것이 불가하면, 서버 측에서 정보를 전달하는데 값 객체(자바빈즈)를 사용하고, JSP 스크립틀릿은 클라이언트 출력에 이 값 객체를 전달하는 데 사용한다.
  • 가능하면 커스텀 태그(태그 핸들러)를 사용해서 서버측에서 정보를 처리하도록 한다.

JSP 표현식

JSP Expressions

JSP 표현식은 JSP 스크립틀릿처럼 가능하면 삼가는 것이 좋다. 동일한 작업을 수행하는 다음 3가지 예제가 잘 설명해준다:

Example 1 (자바 코드 사용):

<%= myBean.getName() %>

Example 2 (JSP 태그 사용):

<jsp:getProperty name="myBean" property="name" />

Example 3 (JSTL 태그 사용):

<c:out value="${myBean.name}" />


Example 1 은 myBean 이라는 스크립트 변수가 선언된 것이라고 가정한다. 다른 두 예제에서 myBean은 어떤 스코프의 속성으로 PageContext.findAttribute()을 통해서 접근할 수 있다고 가정한다. 두 번째 예제는 또한 <jsp:useBean> 에 의해서 페이지에 소개된 myBean이라고 가정한다.

셋 중에서 JSTL 태그 예제가 낫다. JSP 표현식 만큼 짧고, 가독성도 좋고, 유지보수하기도 보다 편하다. 그리고, 자바 스크립틀릿에 의존하지 않는다(스크립틀릿은 자바 언어와 API 함수들에 익숙해야 다룰 수 있다.) 더우기, JSP 2.0 스타일 프로그램으로 쉽게 이동할 수 있는 장점이 있다. 어떤 선택이 채택되든, 모든 개발자들의 동의를 얻어서, 같은 프로젝트에 있는 JSP 결과물들은 전체적으로 일관된 방식을 사용해야 된다. 주의할 점은, JSTL 예제는 로컬 자바 스크립트 변수로부터가 아닌, page 컨텍스트로부터 myBean 의 값을 가져온다는 것이 실질적으로 조금 다른 점이다.

마지막으로, JSP 표현식은 기반 스크립팅 언어의 문법에 의존하는, 같은 기능의 JSP 스크립틀릿보다 낫다. 예를 들어,

<%= x %>

로 하는 게 아래 방법보다 좋다.

<% out.print( x ); %>

공백

White Space

코드의 이해와 유지보수에 드는 노력을 줄이기 위해서 JSP 코드를 보기 좋게 들여쓰기하는데 공백을 사용한다. 특히, 빈 줄과 공백은 필요한 곳에서 JSP 의 여러 곳에 삽입되어야 한다.

빈 줄

Blank Lines

빈 줄은 출력에 원하지 않는 영향만 주지 않는다면 JSP의 가독성을 높이기 위해서 가끔 사용된다. 아래 예제에서, HTML <PRE> 블록 내에 두 개의 JSP 표현식 사이에 있는 빈 줄은 클라이언트의 브라우저에 HTML 출력 결과에서 한줄 더 생기게 만든다. 그러나 빈 줄이 <PRE> 블록 사이에 있지 않다면, 브라우저의 출력에 나타나지 않는다.

JSP 구문

클라이언트의

HTML 출력

<pre>

<%= customer.getFirstName() %>

<%= customer.getLastName() %>

</pre>

Joe

Block

<pre>

<%= customer.getFirstName() %>

<%= customer.getLastName() %>

</pre>

Joe

Block

<%= customer.getFirstName() %>

<%= customer.getLastName() %>

Joe

Block

빈 문자열

Blank Spaces

공백 문자(; 역자주:공백은 길이가 1, 빈 문자열은 ""처럼 길이가 0)는 JSP 태그와 몸체 사이에 쓰여져야 된다.

예를 들어 다음

<%=customer.getName()%>

코드는 아래 것보다 좋다.

<%=customer.getName()%>

JSP 주석 태그와 주석을 분리하는 공백 문자들이 있어야 된다:

<%--

-여러 줄의 주석이 나뉘어지면, 각각의 줄은

-한 줄씩 차지한다. --%>

<%--짧은 주석--%>

이름짓는 요령

Naming Conventions

이름짓는 요령을 적용하면, 프로젝트 내의 웹 컴포넌트 엘리먼트들을 쉽게 확인, 분류, 통합할 수 있다. 이 섹션에서, JSP에 적합한 요령을 살펴보자.

JSP 이름

JSP Names

JSP (파일) 이름은 언제나 소문자로 시작해야 한다. 여러 개의 단어로 구성될 수 있고, 이러한 경우 단어들은 모두 붙여쓰고, 이어지는 단어의 첫글자는 대문자로 쓴다. JSP 이름은 간단한 명사나 짧은 문장이 될 수 있다. 동사뿐인 JSP 명은 개발자에게 충분한 의미를 전달하지 못하기 때문에, 피하도록 한다. 예를 들면:

perform.jsp

파일은 다음 파일보다 명확하지 않다.

performLogin.jsp

JSP 이름에 동사가 들어가는 경우, 은연 중에 뒷쪽에서 처리하고 있다는 표시로 현재형을 쓴다:

showAccountDetails.jsp

로 쓰는 게 아래 파일명 보다 좋다

showingAccountDetails.jsp

태그 이름

Tag Names

태그 핸들러와 관련된 클래스에 대한 이름짓는 요령은 다음과 같다:

설명

클래스명

XXX tag extra info

(javax.servlet.jsp.tagext.TagExtraInfo를 상속함)

XXXTEI

XXX tag library validator

(javax.servlet.jsp.tagext.TagLibraryValidator를 상속함)

XXXTLV

XXX tag handler interface (javax.servlet.jsp.tagext.Tag/IterationTag/BodyTag를 상속함)

XXXTag

XXX tag handler implementation

XXXTag

덧붙여, 태그 이름은 자바에 관련된 코드작성법에서 정한 클래스와 인터페이스 이름 짓는 요령을 따라서 정해야 된다.

태그 관련된 클래스와 다른 클래스와 더 분명하게 구분하기 위해서, 패키지 접미사(tags 또는 taglib)를 클래스의 패키지명에 적용한다.

예를 들면:

com.mycorp.myapp.tags.XXXTag

태그 prefix 이름

Tag Prefix Names

태그 prefix 는 짧지만 의미가 담긴 명사를 사용해야 하고, 첫문자는 소문자로 해야한다. 태그 prefix 는 알파벳 문자만 포함해야 된다. 몇 가지 예를 들면 다음과 같다:

OK?
mytaglibno
myTagLibyes
MyTagLibno
MyTagLib1no
My_Tag_Libno
My$Tag$Libno

XML 문법의 JSP 페이지

JSP Pages in XML Syntax

JSP 는 두가지 다른 문법을 제공한다: JSP 페이지를 작성하는 '표준 문법'과 JSP를 XML문서로 작성하는 'XML 문법'이 있다. 표준 문법을 사용하는 JSP 페이지들이 'JSP 페이지'로 많이 쓰인다. XML 문법으로 작성된 JSP는 'JSP 문서'라고 일컫는다. 이 기사는 우선적으로 JSP 페이지를 소개하지만, 많은 부분의 개념들이 JSP 문서에도 역시 적용될 수 있다. XML이 좀 더 유행하면 JSP 문서 사용도 많아질 것이라고 기대된다. JSP 2.0 스펙에서는 더 많은 XML 문법 친화적인 것들이 소개될 것이다.

주의할 것은 XML 문법을 이용해서 JSP를 만드는 것과 JSP로 XML 결과(view)를 만들어 내는 것과 혼동해서는 안된다. 페이지 제작도구는 JSP를 만들기 위해 표준 또는 XML 문법을 사용한다. 그리고 나서 컨테이너는 JSP를 XML 결과로 변환하고, 이것은 태그 라이브러리 밸리데이터(유효성 검증기)에서 확인한다.

JSP 문서 구조

JSP Document Structure

JSP 문서는 다음과 같은 기본 구조를 갖는다:

<? xml version="1.0" ?>

<!--

- Author(s):

- Date:

- Copyright Notice:

- @(#) - Description:

-->

<jsp:root xmlns:jsp=http://java.sun.com/JSP/Page

xmlns:prefix1="URI-for-taglib1"

xmlns:prefix2="URI-for-taglib2"

version="1.2">

JSP Document ...

</jsp:root>

첫 줄은, 이 페이지가 XML 문서라고 정의하는 선택적 XML 프롤로그이다. 다음으로 오는 것은 문서에 대한 주석이다. <jsp:root> 엘리먼트는 이것이 JSP 문서임을 정의하고, 반드시 이 엘리먼트가 루트 엘리먼트로 나타나야 된다. jsp 이름공간은 반드시 가져와야 되고, 모든 태그 라이브러리는 이 루트 엘리먼트를 사용해서 가져와야 된다. 버전 속성이 필요하고, 어떤 버전을 사용할 지를 정해준다. JSP 문서의 실제 내용은 <jsp:root> 엘리먼트의 서브엘리먼트에 나타난다. 표준 XML 들여쓰기 룰에 따라서 문서 전체적으로 일관되게 적용하는 들여쓰기 단위는 4개의 공백문자이다.

JSP 문서는 형식이 잘 갖춰진 XML 문서이기 때문에, <% %> 와 같은 엘리먼트는 <jsp:scriptlet /> 같이 XML로 바꿔서 표기해야 된다. 자세한 것은 JSP 스펙을 보기 바란다.

XML 주석

XML Comments

JSP 스펙은 XML 스타일의 주석을 어떻게 처리할 지에 대해 불분명하기 때문에, 주석이 클라이언트로 안전하게 전달되기 위해서는, <jsp:text>로 다음과 같이 감싸주어야 된다:

...

<jsp:text><![CDATA[

<!--

- Multiline comment

- to be sent to client.

-->

]]></jsp:text>

...

JSP 문서 내의 자바 코드 Java Code in JSP Documents

선언문, 스크립틀릿, 표현식에서 자바 코드를 쓰려고 할 때, 코드가 문서의 구조를 망가뜨리지 않는다면, CDATA엘리먼트를 사용한다.

...

<jsp:scriptlet>

for( int level = 0; level < 3; level++ ) {

</jsp:scriptlet>

<tr>

<td>

<jsp:expression><![CDATA[

"<h" + level + ">Text</h" + level + ">"

]]></jsp:expression>

</td>

</tr>

<jsp:scriptlet>

}

</jsp:scriptlet>

...

표준 문법에서와 다르게, XML 들여쓰기 법칙은 엘리먼트의 내용과 상관없이 준수되어야 한다.

프로그래밍 습관

Programming Practices

일반적으로, 다음과 같은 이유로 JSP 페이지에 자바 코드(선언문, 스크립틀릿, 표현식) 쓰기를 피한다:

  • JSP 페이지의 자바 코드 문법 에러는 페이지가 배치되기 전까지 발견되지 않는다. 반면에, 태그 라이브러리와 서블릿에 있는 문법 에러는 배치 이전에 발견된다.
  • JSP 페이지 내의 자바 코드는 디버깅하기 힘들다.
  • JSP 페이지 내의 자바 코드는 유지보수하기 힘들다. 특히 자바 전문가가 아니라면 더욱 더 그렇다.
  • 보통 복잡한 비즈니스 로직과 프리젠테이션 로직을 섞어놓지 않는 것이 납득이 가는 습관이다. JSP는 우선적으로 프리젠테이션 로직을 목적으로 한다.
  • 자바 코드가 포함된 코드와 HTML과 다른 스크립트 명령어가 섞여있다면 더 읽기 어려워진다.
  • JSP 2.0 은 더 단순한 표현 언어를 덕분에 스크립틀릿의 중요도를 낮추었다. JSP 에서 JSP 2.0 스타일로 쉽게 옮기기 위해서는 페이지에서 자바 코드를 사용하지 않는 것이 좋다.

자바 BluePrints의 엔터프라이즈 섹션에 있는 더 자세한 정보와 가이드라인을 참고하기 바란다.

자바빈즈 초기화

JavaBeans Initialization

JSP는 JavaBeanTM의 프로퍼티로 증명되는 모든 PropertyDescriptor를 초기화하기 위해 편리한 엘리먼트를 제공한다. 예를 들면:

<jsp:setProperty name="bankClient" property="*"/>

그러나, 주의해서 사용해야 한다. 첫째로, 빈이 프로퍼티를 갖고 있다, 즉 amount 프로퍼티가 있다고 하고, 현재 ServletRequest 객체에 파라미터(amount)가 없거나 파라미터 값이 ""라고 한다면, 아무것도 하지 않는다: JSP는 빈의 특정 프로퍼티에 null를 할당하지도 않는다. bankClient 빈에 amount의 기존 값이 무엇이든지 간에 영향을 받지 않는다. 둘째로, PropertyEditors를 선언하지 않은 비-요소적인 프로퍼티는 ServletRequest 객체의 스트링 값에서 암묵적으로 초기화 되지 않기 때문에, 명시적인 변환이 필요하다. 세째로, 만일 어플리케이션이 주의 깊게 설계되지 않았다면, 악의를 가진 사용자는 추가적으로 요청 파라미터를 덧붙여서 빈의 사용하지 말아야할 프로퍼티 값을 설정할 수 있다.

깔끔한 코드를 위해서 jsp:setProperty 태그에 property="*"를 사용한다면, jsp:setProperty 태그 이전에 ServletRequest 객체를 통해서 받아와야 할, 빈을 초기화하기 위한 파라미터들에 대해 주석을 달기를 권한다. 다음 예제에서는 bankClient 빈을 초기화하기 위해서 firstNamelastName 파라미터가 필요하다는 것을 주석에서 읽을 수 있다:

<%--

- ServletRequest에서 firstName와 lastName를 요구

--%>

<jsp:setProperty name="bankClient" property="*" />

JSP 내장 객체

JSP Implicit Objects

API 호출을 통해서 객체를 참조하기 보다는 JSP 내장 객체를 직접 사용하는 것이 좋다. 그래서 ServletContext 인스턴스에 의해 제공되는 초기 파라미터에 접근하기 위해 다음을 쓰는 대신에

getServletConfig().getServletContext().getInitParameter("param")

기존 내장 객체를 사용하는 게 낫다:

application.getInitParameter("param")

초기 파라미터 값이 출력이 되어야 하는 경우에는, JSTL로 접근해서 출력하는 것이 더 좋다:

<c:out value="${initParam['param']}" />

인용부호

Quoting

일정한 인용부호의 사용을 채택한다. 인용부호는 작은따옴표 ' 대신 큰따옴표 " 를 사용한다.

불규칙한 인용부호좋은 인용부호 사용
<%@ page import='javabeans.*'%>
<%@ page import="java.util.*" %>
<%@ page import="javabeans.*" %>
<%@ page import="java.util.*" %>

예외적인 경우는 작은따옴표가 필요할 때이다. 예를 들어서 스크립트 언어에서 큰따옴표를 사용하는 경우를 들 수 있다:

<jsp:include page='<%= getFoodMenuBar("Monday") %>' />

커스텀 태그 사용하기

Using Custom Tags

만일 커스텀태그가 몸체가 없다면, 컨텐트는 (생략해서 "JSP" 기본값으로 하지 말고) empty라고 명확하게 선언되어야 한다. 태그 라이브러리 설명서에서 다음과 같이 정해준다:

<tag>

<name>hello</name>

<tag-class>com.mycorp.util.taglib.HelloTagSupport</tag-class>

<body-content>empty</body-content>

...

</tag>

이렇게 하면 JSP 컨테이너는 태그 몸체가 무조건 비어야 되며 파싱할 어떤 JSP 문법도 포함하지 않아야 된다고 인식한다. 효과는 빈 몸체를 파싱하기 위해서 불필요하게 자원의 할당이 이뤄지는 것을 제거한다.

빈 태그는, 가독성향상을 위해 열고 닫는 XML 엘리먼트 쌍으로 표시하기보다는, 짧은 XML 엘리먼트로 표시한다. 그래서

<myTag:hello />

라고 표기하는 것이 아래보다 낫다.

<myTag:hello></myTag:hello>

TagExtraInfo와 TagLibraryValidator 사용

Use of TagExtraInfo and TagLibraryValidator

때때로, 태그 라이브러리를 사용하는데 TLD 하나로 유효성을 검증할 수 없는 경우가 있다. 그 때는 TLD에 등록된 TagExtraInfo 클래스나 TagLibraryValidator 클래스를 사용해서, 변환할 때 태그 라이브러리에 있는 에러를 잡아낼 수 있다.

자바스크립트 사용

Use of JavaScriptTM

스크립트가 제대로 돌아가기 위해서는 자바스크립트는 브라우저 타입의 특성과 관계없어야 된다.

동작을 한다면, JSP에서 자바스크립트 코드를 독립적인 파일로 분리하고, 다음과 같이 JSP에서 자바스크립트를 불러쓰는 방식은 좋은 생각이다:

<script language=javascript src="/js/main.js">

이렇게 하면 자바스크립트의 재사용성도 향상되고, 여러 JSP 사이에 일관된 습성의 자바스크립트를 유지할 수 있고, JSP페이지의 복잡성을 줄여준다.

캐스케이딩 스타일 시트

CSS Cascading Style Sheets

CSS를 사용해서 헤딩, 테이블 등의 공통적인 특성을 중앙에서 제어하도록 한다. 이 방법은 사용자들에게 프리젠테이션의 일관성을 향상시키고, 유지보수 노력과 JSP 페이지의 코드 사이즈를 줄여준다. 그래서, 다음과 같이 HTML 태그에서 스타일 정보를 끼어쓰지 말고:

<H1><FONT color="blue">Chapter 1</FONT></H1>

...

<H1><FONT color="blue">Chapter 2</FONT></H1>

...

하나의 스타일 시트 파일myJspStyle.css에 다음과 같은 스타일 정보를 정의한다:

H1 { color: blue }

그리고 JSP 페이지에 스타일 시트를 적용한다:

<link rel="stylesheet" href="css/myJspStyle.css" type="text/css">

...

<H1>Chapter 1</H1>

...

<H1>Chapter 2</H1>

...

컴포짓 뷰 패턴 사용

Use of Composite View Patterns

여러 JSP 페이지에서 반복되는 고정되고 복잡한 구조가 요구될 때, 이것을 다루는 방법으로 컴포짓 뷰 패턴(Composite View pattern;자바 Blueprints 의 패턴 섹션 참고)을 사용해서, 조각조각으로 나눠서 처리하는 법이 있다. 예를 들어, 프리젠테이션 구조에서 JSP 는 때때로 다음과 같은 로직 레이아웃을 갖고 있다:

header
menu barmain body
footnote
footer

이런 방식으로, 컴포짓 JSP 는 각각 분리된 JSP로 구현되는 다른 모듈로 나뉠 수 있다. 구성성분이 되는 JSP는 서블릿으로 변환할 때나 요청시에 include JSP 태그를 사용해서 컴포짓 JSP 의 적당한 위치에 놓이게 된다. 보편적으로, 독립적으로 요청되지 않는 페이지를 불러쓰는, 정적인 include 지시자를 사용할 때는 .jspf 확장자를 사용하고, 웹 어플리케이션 (war)에서 /WEB-INF/jspf/ 디렉토리에 놓아둘 것을 기억하기 바란다. 예를 들면 다음과 같다:

<%@ include file="/WEB-INF/jspf/header.jspf" %>

...

<%@ include file="/WEB-INF/jspf/menuBar.jspf" %>

...

<jsp:include page="<%= currentBody %>" />

...

<%@ include file="/WEB-INF/jspf/footnote.jspf" %>

...

<%@ include file="/WEB-INF/jspf/footer.jspf" %>

...

다른 추천사항

Other Recommendations

이 문서에서, JSP 코드와 웹 컴포넌트를 작성하는데 보다 유지보수하기 쉽고, 일관된 추천 코드 작성법 한 세트를 제시했다. 이 주제에 보다 더 관심있다면, 더 많은 최고의 작성법이 존재한다. 예를 들어, JSP 1.2 스펙에서는 다음을 추천한다:

  • 새로운 내장 객체 선언하기
  • 벤더 고유의 안내서 읽기
  • 커스텀 태그 라이브러리 사용하기

덧붙여서, 자바 BluePrints 는 더 큰 스케일에서 최고의 작성법을 제공한다. (패턴 섹션에서 보여지는) 모델-뷰-컨트롤러 패턴과 같은 것을 예로 들 수 있다.

우리는 이 문서에서 제시한 작성요령에 대한 여러분의 의견에 관심이 있습니다. JSP 코드 작성요령에 대해서 여러분의 다른 의견이 있다면 나누면 좋겠습니다. 피드백은 여기로 보내기 바랍니다.

jsp-codeconv-comments@sun.com.

아래에, 위에서 설명한 코드 작성요령을 적용해 놓은 완전한 웹 어플리케이션의 소스를 소개한다.

이 어플리케이션의 WAR 파일을 여기 에서 다운로드 받을 수 있다.

코드 예제

Code Examples

여기에 있는 웹 어플리케이션 예제는 이 문서에 있는 내용이 어떻게 적용되는지 보여주기 위한 것이다. .war 파일에는 다음의 소스코드 파일과 디렉토리 구조로 되어 있다:

/index.jsp

/WEB-INF/classes/codeconv/GetResultsTag.class

/WEB-INF/jspf/footer.jspf /WEB-INF/lib/jstl.jar

/WEB-INF/lib/standard.jar /WEB-INF/tld/lotterylib.tld

/WEB-INF/web.xml

index.jsp 페이지에서는 오늘까지 포함된 이번 달의 모의 복권 추첨결과를 보여주는 커스텀 태그 라이브러리( lotterylib.tld )를 사용한다. 그리고, HTML 에 보여질 결과를 형식화하고, 반복하기 위해서 JSTL을 사용한다.

예제는 JSP 1.2 과 JSTL 1.0 을 사용한다.

/index.jsp 파일 소스

<%--
- Author: Mark Roth
- Date: January 17, 2003
-
- Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
-
- This software is the proprietary information of
- Sun Microsystems, Inc.
- Use is subject to license terms.
-
- @(#)
- Description: Renders fake lottery results for the current month.
--%>

<%@ taglib prefix="c"
uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="fmt"
uri="http://java.sun.com/jstl/fmt" %>
<%@ taglib prefix="lottery"
uri="http://codeconv/lotterylib" %>

<html>
<head>
<title>Fake Lottery Results for this Month
</title>
</head>
<body>
<jsp:useBean id="now" class="java.util.Date" />
<h1>
Fake Lottery Results for
<fmt:formatDate value="${now}"
pattern="MMMM yyyy" />
</h1>
<hr />
<table border="1" cellpadding="5">
<%-- Store current month and year --%>
<c:set var="currentMonth">
<fmt:formatDate value="${now}" pattern="M" />
</c:set>
<c:set var="currentYear">
<fmt:formatDate value="${now}"
pattern="yyyy" />
</c:set>

<%-- Determine last day to report results for --%>
<c:set var="endDay">
<fmt:formatDate value="${now}" pattern="d" />
</c:set>

<%-- Display one row for each day --%>
<c:forEach var="day" begin="1" end="${endDay}">
<%-- Construct date --%>
<c:set var="dateString">
<c:out value="${currentMonth}/${day}/${
currentYear}" />
</c:set>

<fmt:parseDate var="date"
value="${dateString}"
pattern="M/d/yyyy" />
<jsp:useBean id="date" class="java.util.Date"
/>

<tr>
<td>
<c:out value="${dateString}" />
</td>
<%-- Retrieve and display fake results
for this day --%>
<lottery:getResults var="numbers"
date="<%= date %>" />
<c:forEach var="number" items="${numbers}">
<td>
<c:out value="${number}" />
</td>
</c:forEach>
</tr>
</c:forEach>
</table>
<%@ include file="/WEB-INF/jspf/footer.jspf" %>
</body>
</html>

/WEB-INF/classes/codeconv/GetResultsTag.java 소스
/*
* codeconv.GetResultsTag
*
* Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
*
* This software is the proprietary information of
* Sun Microsystems, Inc.
* Use is subject to license terms.
*
* Version: @(#)
*
* Date: January 13, 2003
*
*/

package codeconv;

import java.util.Date;
import java.util.Random;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.TagSupport;

/**
* Retrieves fake lottery results for the given date and
* returns the result in the given attribute
*
* @version @(#)
* @author Mark Roth
*/
public class GetResultsTag extends TagSupport {

/** The maximum number that can be drawn */
private static final int MAX_NUMBER = 58;

/** The number of numbers that are drawn */
private static final int NUMBER_COUNT = 6;

/** The variable to store results to */
private String var;

/** The date on which the numbers were drawn */
private Date date;

/** The PageContext, used to return the result */
private PageContext pageContext;

/**
* Remember the PageContext so it can be used later
* to return the result.
*
* @param pageContext The page context of the calling page
*/
public void setPageContext( PageContext pageContext ) {
this.pageContext = pageContext;
}

/**
* Returns fake lottery results for the given date.
*
* @return EVAL_PAGE so the rest of the page is evaluated.
*/
public int doEndTag() throws JspException {
// Generate the (fake) results.
Random random = new Random( this.date.getTime() );
int[] result = new int[NUMBER_COUNT];
for( int i = 0; i < NUMBER_COUNT; i++ ) {
result[i] = random.nextInt( MAX_NUMBER ) + 1;
}

// Place the result in the scoped attribute named by 'var'.
pageContext.setAttribute( this.var, result );

return EVAL_PAGE;
}

/**
* Setter for date
*
* @param date The fake date on which the lottery numbers
* were drawn
*/
public void setDate( Date date ) {
this.date = date;
}

/**
* Getter for date
*
* @return The fake date on which the lottery numbers
* were drawn
*/
public Date getDate() {
return this.date;
}

/**
* Setter for var
*
* @param var The name of the variable to store the result in
*/
public void setVar( String var ) {
this.var = var;
}

/**
* Getter for var
*
* @return The name of the variable to restore the result in
*/
public String getVar() {
return this.var;
}
}

/WEB-INF/jspf/footer.jspf 소스
<%--
- Author: Mark Roth
- Date: January 17, 2003
-
- Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
-
- This software is the proprietary information of
- Sun Microsystems, Inc.
- Use is subject to license terms.
-
- @(#)
- Description: Sample Footer that can be included on pages.
- Assumes JSTL fmt taglib is imported.
--%>
<!-- common footer -->
<hr />
<jsp:useBean id="footerNow" class="java.util.Date" />
<i>
Last Updated:
<fmt:formatDate type="both" value="${footerNow}"
dateStyle="full" timeStyle="full" />
</i>

/WEB-INF/tld/lotterylib.tld 파일 소스
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">

<!--
- Author: Mark Roth
- Date: January 17, 2003
-
- Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
-
- This software is the proprietary information of
- Sun Microsystems, Inc.
- Use is subject to license terms.
-
- @(#)
- Description: Tag Library for fake lottery results.
-->

<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>lottery</short-name>
<uri>http://codeconv/lotterylib</uri>
<display-name>FakeLotteryTaglib</display-name>
<description>
Tag Library for fake lottery results.
</description>

<tag>
<name>getResults</name>
<tag-class>codeconv.GetResultsTag</tag-class>
<body-content>empty</body-content>
<display-name>getResults</display-name>
<description>
Retrieve an array of fake lottery results for the given
date and store them in the given scoped attribute.
</description>
<variable>
<name-from-attribute>var
</name-from-attribute>
<declare>true</declare>
<description>
The fake lottery results for the given date.
</description>
</variable>
<attribute>
<name>var</name>
<required>true</required>
<description>
The name of the variable to store the results in.
</description>
</attribute>
<attribute>
<name>date</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.util.Date</type>
<description>
The date on which the fake lottery numbers
were drawn.
</description>
</attribute>
<example><![CDATA[
<lottery:getResults var="numbers"
date="${date}" />
]]></example>
</tag>
</taglib>

/WEB-INF/web.xml 소스
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<!--
- Author: Mark Roth
- Date: January 17, 2003
-
- Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
-
- This software is the proprietary information of
- Sun Microsystems, Inc.
- Use is subject to license terms.
-
- @(#)
- Description: Web Deployment Descriptor for JSP 1.2 fake
- lottery example
-->

<web-app>
<display-name>FakeLotteryExample</display-name>
<description>
JSP 1.2 example application that illustrates correct JSP
coding style.
</description>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>http://codeconv/lotterylib</taglib-uri>
<taglib-location>/WEB-INF/tld/lotterylib.tld
</taglib-location>
</taglib>
</web-app>

감사의 말 Acknowledgments

이 문서의 이전 드래프트에 소중한 조언을 제공해 주신 Gregory Murray (Java BluePrints Team), Damian Fauth (Sun Java Center), Kate Morris (Sun Java Center) 님들께 감사드립니다.

References

  1. Code Conventions for the Java Programming Language.
  2. JSP best practices.
  3. Hans's Top Ten JSP Tips.
  4. JavaServer Pages Specification version 1.2.
  5. Alur D., Crupi J., Malks D., Core J2EE Patterns: Best Practices and Design Strategies, Sun Microsystems Press, Prentice Hall Inc., 2001.
  6. Naming Conventions for Enterprise Applications.
  7. JavaServer Pages Standard Tag Library.
  8. Gamma E., Helm R., Johnson R., Vlissides J., Design Patterns: Elements of Reusable Software, Addison-Wesley, 1995.
  9. JavaServerTM Faces Technology.
  10. Java BluePrints.
posted by 구름너머 2006. 7. 18. 08:57

해외 인터넷 쇼핑몰 이렇게 쌀 줄이야…

무소뿔 빗질로 수험생 집중력 쑥쑥!!

클래식 음악 마니아인 양모(35·회사원)씨는 지난달 초 영국의 대형 인터넷쇼핑몰(www.amazon.co.uk)에서 카라얀 CD 1박스(20장)와 베토벤 교향곡 1박스(5장)를 샀다. 구입가격은 총 46.76파운드(8만1999원). 배송료(5.07파운드·8891원)를 포함하면 모두 51.83파운드(9만890원)가 들었다. 그런데 양씨가 같은 CD를 국내 한 인터넷쇼핑몰에서 주문하면 가격(배송비 무료)이 29만5100원까지 오른다. 양씨는 “해외 사이버몰을 잘 활용하면 훨씬 싼 가격에 살 수 있다”고 말했다. 다만 해외 인터넷 쇼핑몰은 배송 기간이 2주 정도 걸리고, 도착한 물건이 마음에 들지 않거나 주문한 것과 달라 반품할 때 비용이 많이 들고 절차가 복잡한 단점이 있다.

◆국경 없는 인터넷쇼핑 시대인터넷 쇼핑에 국경(國境)이 사라지고 있다. 클릭 한 번으로 전 세계 사이버몰을 누비며 보다 저렴하고 개성 있는 제품을 구입하는 국내 소비자들이 늘고 있다. 주문 제품의 종류도 서적, CD에서부터 의류, 화장품, 스포츠·레저용품에 이르기까지 다양해지고 있다.

현재 국내 고객들이 자주 이용하는 해외 사이버몰은 30~40개이며 주 고객층은 20~30대.

세계적인 대형 쇼핑몰인 아마존(www.amazon.com)

세계 최대 경매포털사이트인 이베이(www.ebay.com)는 물론,

패션·의류에서 노드스트롬(www.nordstrom.com)메이시(www.macys.com),

가구·생활·주방용품은 윌리엄스소노마(ww5.williams-sonoma. com)타깃(www.target.com),

제약·화장품은 드러그스토어(www.drugstore.com)에이본(www.avon.com),

스포츠 용품은 풋락커(www.footlocker.com) 등이 인기가 있는 쇼핑몰로 꼽힌다.

◆국내에서 구하기 힘든 제품을 싼값에해외 사이버몰은 전 세계 소비자를 대상으로 대규모 무점포 거래를 하기 때문에 유통·재고 관리 비용 절감을 통해 오프라인 매장에 비해 20~30% 정도 저렴한 가격에 제품을 공급하고 있다. 국내에서 찾기 힘든 제품을 구입할 수 있다는 장점도 있다.

2000년부터 해외 사이버몰을 이용하기 시작했다는 이모(25·대학생)씨는 지난 4월 미국의 스케이트보드용품 판매 사이트(www.skatewarehouse.com)에서 맘에 드는 운동화 두 켤레를 주문했다. 가격은 배송비를 포함해 156.23달러(14만8700원). 국내 한 인터넷 쇼핑몰에선 한 켤레에 10만4000원에 판매되고 있다. 이씨는 “내가 산 운동화가 6개월~1년 후에 국내에서도 유행하곤 한다”고 말했다. 해외 유학을 준비 중인 이모(여·27)씨는 아마존 등 해외 사이트에서 직접 외국 원서(原書)를 저렴하게 구입하고 있다. 해외 유명 인터넷 쇼핑몰은 대개 유피에스(UPS), 페덱스(FedEx) 등 세계 영업망을 갖춘 전문업체를 통해 배달한다. 항공 배송은 1~2주, 선박 배송(배송료는 항공의 절반 수준)은 3~4주 이상 걸린다. 늦어도 1주일 내에 물건을 갖다주는 국내 인터넷 쇼핑몰에 비하면 배송기간이 긴 편이다. 해외 사이버몰 이용이 익숙지 않은 소비자들을 대상으로 제품 구입을 대행해 주는 업체들도 빠르게 성장하고 있다. 해외구매 대행업체 ‘지오패스’ 서진원 해외쇼핑팀장은 “소비자가 직접 해외 쇼핑몰에서 구입할 때보다 비용이 약간 비싸지만 원하는 물건을 편리하고 안전하게 살 수 있다는 장점이 있다”고 말했다.

◆사업자 주소가 없는 인터넷 쇼핑몰은 주의해야해외 인터넷 쇼핑몰은 국내 사이버몰에 비해 소비자 보호를 제대로 받기가 쉽지 않다. 당장 제품을 반송하고 환불·교환을 하려 해도 고객의 반송료 부담이 크고 반송기간도 오래 걸린다. 따라서 피해를 최소화하려면 인지도가 높은 해외 유명 사이트를 이용하는 게 안전하다. 특히 웹사이트에 사업자의 주소, 전화번호, 이메일 등이 명시돼 있지 않은 쇼핑몰은 주의해야 한다. 또 결제는 무통장 송금이나 은행계좌이체보다는 가급적 신용카드로 하라고 전문가들은 권한다. 피해가 발생할 때 즉시 카드사에 신고해 결제를 막을 수도 있기때문이다. 이데일리ⓒ 1등 경제정보 멀티미디어.

○ [조선일보 제공] 2006/07/1807:40

'아무거나방' 카테고리의 다른 글

첨단 철강기술  (0) 2006.08.16
단말기  (0) 2006.08.08
초고속인터넷 해지 쉬워진다  (0) 2006.07.18
한자  (0) 2006.07.03
“선 크림 속 나노입자, 세포손상 시킬 수도”  (0) 2006.07.03
posted by 구름너머 2006. 7. 18. 08:53
Home > 통신방송 > 서비스·미디어

초고속인터넷 해지 쉬워진다

High-speed Internet Cancellation Becoming Simpler

무소뿔 빗질로 수험생 집중력 쑥쑥!!

앞으로는 초고속인터넷 해지가 한층 쉬워진다.

13일 관련기관 및 업계에 따르면 통신위원회는 최근 초고속인터넷 사업자들은 초고속인터넷 유치경쟁이 치열해지면서 해지 민원이 끊이지 않음에 따라 해지 절차를 대폭 간소화기로 했다.

이에 따라 초고속인터넷 해지를 위해 필요한 서류를 팩스나 우편으로 발송하면 사업자는 접수 여부를 문자메시지(SMS)나 e메일로 가입자에게 통보해야 하며 해지가 완료된 후에도 마찬가지로 가입자에게 알려줘야 한다.

이는 지금까지 해지 신청 서류를 팩스나 우편으로 보냈는데 사업자가 못 받았다고 하거나 신청이 접수된 줄 알았는데 몇 달째 사용료가 통장에서 빠져 나가는 등의 민원이 다수 제기된 데 따른 조치다.

해지 희망일 5일 전에 신청하도록 하던 것을 3일 전으로 앞당겨 전체 해지기간도 짧아졌다. 지금까지는 해지 신청 후 해지가 완료 되기까지 5일에서 최대 10일까지 걸리기도 해 불만이 다수 제기됐었다.

모뎀 수거가 안되더라도 우선 해지한 뒤 모뎀을 나중에 수거하도록 해 사업자들이 모뎀 반납 이후에 해지를 완료해주던 관행 역시 사라지게 됐다.

통신위위원회는 오는 20일 기간통신사업자 허가를 받을 예정인 종합유선방송사업자(SO)에게도 이 같은 가이드라인을 적용할 방침이다.

  박승정기자@전자신문, sjpark@etnews.co.kr

○ 신문게재일자 : 2006/07/14

'아무거나방' 카테고리의 다른 글

단말기  (0) 2006.08.08
해외 인터넷 쇼핑몰  (0) 2006.07.18
한자  (0) 2006.07.03
“선 크림 속 나노입자, 세포손상 시킬 수도”  (0) 2006.07.03
10억분의 1m ‘나노’입자 뇌·폐세포 거침없이 뚫어  (0) 2006.07.03
posted by 구름너머 2006. 7. 14. 09:28
[본문스크랩] [IT키워드]MPLS | 나의 관심정보 메모 삭제 2006/07/14 09:27
damool2 http://memolog.blog.naver.com/damool2/41
출처 블로그 > 슈마의 네트워크 이야기
원본 http://blog.naver.com/airbag1/80013043851

[IT키워드]MPLS

[전자신문 2004-12-21 09:23]


 MPLS는 ‘Multiprotocol Label Switching’의 약자로 데이터 패킷에 IP 주소 대신 별도의 라벨을 붙여 스위칭 및 라우팅하는 기술이다.


 패킷이 발생하면 기존 라우터 기반의 백본에서는 라우터가 IP를 보고 패킷을 전달했으나, MPLS 네트워크에서는 레이어2 기반의 라벨을 보고 스위칭한다. 즉 소프트웨어 기반 처리를 라벨을 읽음으로써 하드웨어 기반 처리로 바꾸면서 고속 스위칭을 가능케 했다.

 MPLS는 다양한 프로토콜을 수용하기 때문에 IP망은 물론 ATM, 프레임 릴레이에도 적용할 수 있다. 이로써 각 네트워크에서 오는 트래픽을 융합해 단일 네트워크로 결합함으로써 운영비를 절감할 수 있다.

 주로 가상사설망(VPN)에 적용되며 기존 IP가 지원하기 힘든 서비스품질(QoS) 지원 및 확장성도 뛰어나다. 반면 MPLS를 적용하려면 모든 백본망의 라우터를 최상위 기종으로 업그레이드해야 한다는 점이 단점으로 지적된다.

'스크랩' 카테고리의 다른 글

인천공항가는 버스노선  (0) 2007.12.14
음악감상-클래식  (0) 2007.10.06
비주얼 베이직에서 사용하는 모든 함수  (0) 2006.06.29
마우이섬  (0) 2006.06.07
KT SI 경력사원 모집  (0) 2006.06.01
posted by 구름너머 2006. 7. 10. 22:18
'뚝섬발 집값 후폭풍' 불까

서울 뚝섬 상업용지 1구역의 낙찰회사인 인피니테크가 지난 16일 서울시에 잔금을 내고, 개발이 본격화됨에 따라 인근 부동산 시장에 ’뚝섬발(發) 후폭풍’이 불어닥칠 지 관심이 쏠리고 있다.

18일 업계에 따르면 뚝섬 상업용지는 지난해 6월 서울시가 3개 블록을 입찰에 부쳐 1구역은 인피니테크, 3구역은 대림산업, 4구역은 피앤디홀딩스가 평당 5천660만-7천730만원에 낙찰했다.

하지만 당시 고가 낙찰에 따른 분양가 상승의 우려가 커지자 국세청이 낙찰업체에 대한 세무조사에 착수, 대림산업을 제외한 2개 사가 잔금을 내지 못하고 사업이 지지부진했었다.

그러나 이번에 1구역 낙찰자인 인피니테크가 한화건설을 시공사로 정하고 잔금을 납부함에 따라 4구역을 제외한 나머지 2개 블록은 사업이 빨라질 전망이다.

인피니테크와 한화건설은 이 곳에 ’서울숲’의 장점을 최대한 살려 강남구 도곡동 타워팰리스 수준의 주상복합아파트를 짓겠다는 계획이다.

회사측은 조만간 지구단위계획 변경 절차에 들어가 교통.환경 등 각종 영향평가를 거친 뒤 내년 초에 건축허가를 신청할 계획이다. 이 경우 이르면 내년 상반기에 분양이 가능할 전망이다.

회사측이 계획중인 주상복합아파트의 규모는 50-90평형 300가구. 예상 분양가는 평당 평균 3천800만원선, 일부 초대형 평형은 4천만원에 육박한다.

이는 지난해 6월 부지를 낙찰받을 당시 예상됐던 평당 4천만-5천만원에 비해서는 평당 1천만원 가량 낮은 편이지만 주변 아파트 시세보다는 여전히 높은 것이다.

현재 강변 건영 등 뚝섬 상업용지 인근 아파트 시세는 1천100만-1천800만원, 최고 2천만원선으로, 대부분 뚝섬 상업용지에 들어설 주상복합아파트 분양가의 절반에도 못미친다.

특히 아직 잔금을 내지 못한 4구역의 경우 당시 4천400억원이 넘는 최고가에 낙찰한 데다 연체이자가 수백억원에 달해 납부시한인 오는 29일까지 대금을 완납하고 사업을 하더라도 아파트 분양가는 평당 4천만원을 넘어설 전망이다.

이에 따라 전문가들은 뚝섬 주상복합아파트의 분양가가 주변 부동산 시장에도 적지 않은 영향을 미칠 것으로 보고 있다.

성수동 S공인 사장은 “인근 부동산 소유자들이 뚝섬 상업용지 아파트 분양을 눈여겨 보고 있다”며 “예상대로 분양가가 평당 3천800만원을 넘어선다면 인근 아파트 집주인들의 기대감이 커지면서 호가를 더 올릴 것”이라며 고 말했다.

자양동 J공인 관계자도 “상업용지안에 아파트뿐 아니라 업무.문화.쇼핑 등 다양한 시설이 갖춰지는 만큼 주변의 일반 아파트값도 영향을 미칠 수밖에 없다”고 말했다.

하지만 주상복합아파트가 높은 가격 때문에 분양에 실패할 경우 ’후폭풍’도 잠시에 그칠 것이라는 목소리도 있다.

성수동 골드컴부동산컨설팅 이영기 사장은 “평당 4천만원 가까이 주고 강남보다 기반시설이 부족한 강북으로 올 지 미지수”라며 “분양 성공여부에 따라 주변 부동산 시장에 미치는 영향도 달라질 것”이라고 말했다.

서울=연합뉴스
입력 : 2006.06.18 07:13 12'

'세상의진리방' 카테고리의 다른 글

IT시스템, 필요한 만큼 빌려쓰세요!  (0) 2006.09.22
Book:어두운 세상에 길은 있는가?  (0) 2006.09.07
바탕화면3  (0) 2006.06.18
삶의 열 가지 해답 ....  (0) 2006.06.16
위장을 망치는 불변의 5적  (1) 2006.06.09
WEB
posted by 구름너머 2006. 7. 10. 09:37
부산광역시가 서울 이외의 지역으로는 처음으로 지역인터넷교환노드(R-IX, Regional Internet eXchange)를 구축, 부산 및 경남지역의 콘텐츠 사업자와 인터넷 사용자들은 서울 지역의 IX를 거치지 않고 인터넷을 이용할 수 있게 됐다.

부산광역시는 초고속국가망 고도화사업의 일환으로 `부산지역 IX센터'를 구축, 내년 1월 개소한다고 7일 밝혔다.

시는 또 지역 최초로 설립되는 IX센터의 발전방향 및 정책협의, 지역 IX 활성화 방안 연구 등을 위해 지역 대학과 인터넷서비스사업자(ISP)가 주축이 된 `부산 IX 협의회'를 설립, 8일 오후 부산시청 대회의실에서 창립총회를 개최한다.

이날 창립총회에는 부산시, 한국전산원, 부산시 교육청을 비롯해 부산대, 동아대 등 지역대학 교수와 KT, 데이콤, 하나로통신 등 지역 ISP 관계자가 참석하며 초대 회장으로는 정종덕 동서대 교수가 선출될 예정이다.

부산지역 IX센터는 지난해 4월 부산시가 한국전산원에 지역 IX 설립을 제안한 이후 2차에 걸친 부산지역 IX 관련 세미나와 한국전산원의 연구용역을 거쳐 지난 2월 지역 최초의 IX 센터로 설립이 확정됐다.

현재 지방에는 인터넷 관문국이라 할 수 있는 인터넷 연동노드가 없고, 국내 4대 IX가 모두 서울에 위치하고 있어 부산 등 지방 이용자간의 인터넷 연동도 서울을 경유하게 돼 연동경로가 길어지고 속도저하 및 장애발생 빈도가 높아져 인터넷 이용품질이 상대적으로 낮아 이의 개선이 꾸준히 제기돼 왔다.

부산시는 서울 이외 지역 중 처음으로 설립되는 부산지역 IX센터 운영으로 연동기관간 정보교류 및 상호협력은 물론, 부산지역의 인터넷산업 활성화와 정보통신 인프라 고도화의 계기가 될 것으로 기대하고 있다.

한편 한국전산원은 부산지역 IX센터 구축을 위해 오는 10일 오후 한국전산원 서울청사에서 구축 제안요청설명회를 갖는다. 한국전산원은 사업예산으로 약 23억원을 책정했으며, 기술·가격 종합평가 및 협상을 통해 사업자를 선정할 예정이다.

(용어) IX(Internet eXchange)=서로 다른 ISP 또는 인터넷망간에 원활한 트래픽 소통을 위해 설치된 연동점을 말하며, 현재 국내에는 한국전산원이 운영하는 KIX, KT의 KT―IX, 데이콤의 DIX, ISP들이 공동 구축한 KINX(Korea Internet Neutral eXchange) 등 4개 IX가 모두 서울에 설치, 운영되고 있다.

<강동식기자>

ㅇ게재지 : 디지털타임스
ㅇ게재일 : 2002/10/08

'WEB' 카테고리의 다른 글

IE7.0 에따른 이슈사항들  (1) 2006.11.09
엑셀 특수문자표  (0) 2006.10.25
[기획-한국 인터넷백서 2004] IPv4주소 3098만개 보유 `세계8위`  (0) 2006.07.10
로그인관리  (0) 2006.03.28
소스보기  (0) 2006.03.04
WEB
posted by 구름너머 2006. 7. 10. 09:36
[기획-한국 인터넷백서 2004] IPv4주소 3098만개 보유 `세계8위`
[디지털타임스 2004-04-29 11:53]
정보통신부와 한국전산원이 발간한 `한국인터넷백서 2004'는 국내외 인터넷 이용자수, 시장 및 기술현황 등을 한 눈에 살펴 볼 수 있도록 구성됐다. 올해로 5번째를 맞는 이번 백서는 우리나라의 인터넷 이용 인구가 310만명에 불과했던 1999년부터 3000만명을 육박하는 현재에 이르기까지 우리나라의 인터넷 산업 및 이용환경을 비롯한 다양한 인터넷 분야의 현황과 정책을 담고 있다. 이번 백서는 또 국내 중소기업의 정보화를 선도할 `빌려쓰는 기업정보화, ASP 발전형황'과 향후 유비쿼터스 환경 기반 인프라인 `광대역통합망 추진 계획'을 특집편에 수록하고 있다. 주요 내용을 요약 정리한다.

◇인터넷 자원현황=현재 널리 쓰이고 있는 IP주소는 32비트(약 43억개)로 구성된 IPv4이며, 주소 부족문제와 QoS 강화 등을 목적으로 신규 도입된 128비트(약 43억×43억×43억×43억 개)의 IPv6 주소 또한 활용이 늘어나고 있다.

인터넷 이용을 위한 기초 자원인 IPv4 주소의 상위 10개 국가별 보유현황을 보면, 미국이 약 18억6496만개(75.21%)로 독보적인 1위 차리를 차지하고 있으며, 일본이 1억 770만개(4.34%), 영국이 6773만개(2.73%)를 보유하고 있다. 우리나라는 3098만개(1.25%)로 세계 8위 수준의 보유율을 보였다.

사실상 무한의 IP주소를 제공할 것으로 기대되는 IPv6의 경우 역시 미국이 73개로 가장 많았고, 일본이 65개, 독일 51개, 스위스 41개, 네덜란드 31개, 영국 22개의 순으로 조사됐다. 우리나라는 18개로 영국에 이어 7위를 차지했고, 이어 프랑스와 이탈리아가 17개, 스웨덴이 16개로 나타났다.

◇인터넷 이용자 현황=인터넷 이용자는 국제적으로 표준화된 정의가 아직 없기 때문에 국가별로 상이한 정의와 측정방법에 따라 통계가 집계되는 실정이다.

전반적으로는 50개국 전체 인터넷 이용자 수가 1995년 3900만명에서 2002년 5억7600만명으로 14배 이상 증가했으며, 인구 1000명당 평균 이용자 수도 1995년 18명에서 2002년 263명으로 14배 정도 증가했다.

2002년 기준 인구 1000명당 인터넷 이용자는 스웨덴이 573명으로 1999년과 2000년에 이어 1위를 차지했으며 뒤를 이어 우리나라, 싱가포르, 미국, 네덜란드가 상위권을 형성하고 있다. 우리나라는 1999년 이후 급속한 인터넷 이용의 확산에 힘입어 1999년 11위, 2000년 6위, 2001년에는 1위를 기록했고, 2002년에는 인구 1000명당 552명으로 2위를 차지한 것으로 조사됐다.

◇초고속인터넷 가입자수=인터넷 콘텐츠가 점차 다양해지고 온라인 게임, 전자상거래, 각종 동영상 및 영화 등의 신규서비스 제공이 늘어가면서 초고속인터넷 서비스의 중요성이 높아지고 있다. 우리나라가 부동의 1위를 지키고 있는 초고속인터넷 가입자수는 2002년 6월 100명당 19.1명으로 2위보다 2배 가까이 높은 수치로 1위를 차지했으며, 캐나다(10.2명)ㆍ스웨덴(7명)ㆍ덴마크(6.7명) 등이 뒤를 이었다.

ITU가 발표한 초고속인터넷 이용자 수에서도 우리나라가 2002년말 100명당 21.3명으로 1위를 유지했고 홍콩이 14.6명으로 2위, 캐나다가 11.5명으로 3위를 차지했다.

정부가 주도하고 민간이 합심해 고품질 인터넷망 구축 및 서비스 제공에 힘써온 결과, 우리나라의 초고속인터넷 보급은 사례를 찾아보기 쉽지 않은 성공 사례로 평가되고 있다.

◇인터넷 기반기술 및 솔루션

국내 인터넷교환노드(Internet eXchange)는 한국전산원, KT, 데이콤, KINX에서 서비스를 제공하고 있다. 비영리 공공 인터넷망은 한국전산원의 KIX를 중심으로 연동되고 상용 ISP는 KT-IX, 데이콤-IX, KINX를 통해 연동되고 있다.

ISP와 IX간의 연결은 전용회선, 광케이블 방식 등으로 트래픽 규모에 따라 155Mbps∼1Gbps이상의 속도로 복수의 IX와 연결되어 있다. 2003년 12월 기준으로 KIX에는 초고속국가망(PUBNet), 초고속선도망(KOREN), 초고속연구망(KRONet) 등 비영리 공공망과 주요 상용망 등 10개 인터넷망과 연동되어 있고 연동대역폭은 30.5Gbps정도이다.

KT-IX는 총 21개 ISP를 연동하고 있으며 총 접속총량은 130Gbps규모이다. 데이콤-IX는 상용 ISP 39개가 접속되어 있으며 총접속용량은 92Gbps, KINX는 총 35개의 ISP를 연동하고 있고 총 접속용량은 44Gbps규모이다. 현재 국내 인터넷사용망은 KT, 데이콤, 온세통신, 하나로통신, 두루넷, 등 78개 업체가 인터넷서비스를 제공하고 있다. 이는 1998년 총 ISP수가 25개, 2001년 99개에서 2003년에는 78개로 약간 감소하는 추세이다.

우리나라는 2003년 국제전기통신연합(ITU)보고서에 의해 초고속인터넷서비스 보급률이 인구 100명당 21명으로 세계 1위로 성장했다. 가입자 유선망은 구리 전화선을 이용한 xDSL계열과 HFC망을 이용한 케이블 모뎀 계열로 분류할 수 있다. 이용자수 1110만명중 xDSL계열이 644만명, HFC망을 이용한 케이블모뎀 계열이 383만명규모로 xDSL계열이 앞서고 있다.

현재 국내에서는 이동전화, 무선호출, 주파수공용통신(TRS), 무선데이터통신 등의 이동통신 서비스를 제공하고 있으며 2003년 11말 현재 3389만명의 가입자를 확보하고 있다. 특히 이동전화서비스 가입자가 전체의 98.7%로 이동통신시장의 대부분을 차지하고 있다. 인구대비 보급률이 70%에 달하고 있다.

◇인터넷정책

정부는 인터넷 주소자원의 중요성 인식을 기반으로 인터넷 주소자원의 체계적인 관리를 통한 대국민 이용 편의성 증진을 위해 2003년 인터넷주소자원관리에 관한 법률을 제정했다. 이를 통해 공정하고 투명한 인터넷 주소정책의 수립과 함께 보다 체계적이고 효율적인 인터넷 주소자원 관리에 크게 기여할 것으로 기대된다.

현재 IP주소는 IPv4로 총 32비트 체계의 네트워크 부분과 호스트부분으로 구성되고 약 43억개의 주소공간을 활용할 수 있다. 하지만 IP주소의 수요급증에 따라 현재 사용중인 32비트 IPv4 주소는 향후 5∼10년내에 고갈될 것으로 예상되고 있다. 이에 대한 문제 해결 및 이동성, 보안, 그리고 QoS 강화를 통한 차세대 인터넷품질제고를 위해 128비트의 IPv6주소체계의 도입 및 상용화를 추진중이다.

정통부는 국내외 차세대 인터넷 기반을 확보하기 위해 2001년 인터넷 신주소체계(IPv6)도입을 통한 차세대 인터넷 기반구축 계획을 발표했고, 2004년 3월 IPv6 보급촉진 기본계획을 확정했다. 정부는 IPv6 활성화를 위해 광대역통합망 구축사업과 연계해 IPv6를 정부 및 공공분야에 선도적으로 보급한다는 방침이다.

김홍식 kimhs@dt.co.kr

'WEB' 카테고리의 다른 글

엑셀 특수문자표  (0) 2006.10.25
부산시 인터넷교환노드 구축[2002/10/8]  (0) 2006.07.10
로그인관리  (0) 2006.03.28
소스보기  (0) 2006.03.04
WLS : 데이터 전송시 성능저하(AIX플랫폼)  (0) 2006.02.17