http://m.blog.naver.com/PostView.nhn?blogId=hopefuldream&logNo=140110566940 에서 참조

XML은 익히 많이 들어봐서 대충~ 무엇이다라는건 알고 있지만 확실히 무엇인지..
DTD는 무엇인지 스키마는 무엇인지 잘 모르는 분들이 계실겁니다.

XML은 정해진 데이터 표현법이라고 볼 수 있습니다. 생긴모습은
<booklist>
    <book id=“스트럿츠1”>
        <저자>홍길동</저자>
        <가격>10000원</가격>
    </book>
    <book id=“스프링”>
        <저자>김갑순</저자>
        <가격>20000원</가격>
    </book>
</booklist>
이렇게 생겼습니다.. HTML과도 비슷하게 생긴 도데체 이게 뭐 어쨌다는거냐…라고 물으신다면..
제가 상상한 다음과 같은 이야기를 해야할것 같습니다.

서로다른 업체 혹은 프로그램끼리 데이터를 주고받는 방법은 사실 매우 많습니다. 예를들어, 김개발씨가 통합서점프로그램을 만들면서
홍길동씨에게 이렇게 말합니다.
“야, 길동아. 나 이번에 통합서점프로그램 만드는 중이니까, 너네 서점 책목록좀 줘봐. 내가 정해준 형태로 줘야 프로그램에서
분석해 쓰거든? 내가 정한 형태로 메모장에 작성해서 텍스트 형태로 줘”
이렇게 말합니다. 김개발씨는 텍스트문서에

책=스트럿츠, 스프링, 아이바티스
가격=10000, 20000, 30000
저자=홍길동, 김갑순, 슈아

이런식으로 써서 주면, 프로그램에서 파일을 읽어와 데이터를 파싱해서 각각 알맞게 DB에 넣도록 프로그램을 짰던 것입니다.
그리고 이번엔 금당무씨에게 똑같이 말했습니다.
“당무야.. 나 이번에 통합서점프로그램 만드는 중인데…”
그런데 이 당무씨는 순순히 OK 하지 않고 반항을 합니다.
“야임마~ 나 이미 우리 서점프로그램에서 쓰는 데이터 형식 있으니까 그거 갔다가 니가 알아서해라”
그리고선
책{스트럿츠, 홍길동, 10000}
책{스프링, 김갑순, 20000}
이런 형식의 텍스트문서를 던져 줍니다…

무슨 이야기 하는지 아실겁니다. 데이터를 주고받을때 모두 똑같은 형식으로 주고받으면 … 각 프로그램마다 파싱하는 부분을
따로 만들 필요가 없겠지요. 그런데 데이터형식을 회사끼리도 아니고 전세계인이 똑같은 방식으로 만들어 주고받는다??
이게 가능한가?? 가능합니다. XML 이 그런 용도로 쓰입니다.

그렇다면 데이터 주고받을려고 XML만들었나? 저는 그렇다고 생각합니다. 데이터 주고받을일 없으면.. 나혼자 개발하고 혼자 지지고볶고
다 한다면 XML따위는 필요 없다고 생각합니다. 나 혼자 꼴리는대로 데이터 주고받게 만들면 그만이고..
실제 흔히 학원에서 자바 메신져 프로그램 만들기를 마지막 과제로 하는데…
이때 메신져간 데이터를 주고받는 형식을 보면 개발자 맘대로 정하는 경우가 많습니다.

그럼 그 XML 은 어떻게 만드냐??? 그냥 메모장 열어서 다짜고짜
<booklist>
    <book>
    </book>
</booklist>
이렇게 만들고 확장자 xml로 저장하면 그냥 XML문서가되는거냐?? 라고 한다면 네.. 그렇습니다…
특수문자에 대한 규칙이나.. “<” 다음에 공백이 와서는 안된다는 등의 기초적인 규칙만 지켜주면 그게 XML 입니다.
안에 들어가는 booklist 등의 문자를 내맘대로 만들수가 있는 겁니다.
<책목록>
  <책제목></책제목>
</책목록>
이렇게 만들어도 이것도 맞는 XML 인 겁니다.  이렇게 내 맘대로 만들어서 상대방한테 여기 맞춰 데이터 달라고 하면 되는거고
아니면 맘대로 이런 XML형식으로 데이터 줄테니까 맘대로 써라.. 할수도 있는 것입니다.

이렇게 간단하면 DTD는 뭐고 스키마는 뭐냐…
결론은 대중성이라고 생각합니다… 즉, 내가 만든 프로그램을 홍길동씨도 쓰고 김갑순씨도 쓰고 미국에사는 제임스씨도 쓴다는것이죠.
내가 분명
<책목록>
  <책제목></책제목>
</책목록>
이런식으로 데이터를 달라고 했는데, 오지마을에사는 김순덕씨는
<책리스트>
  <책타이틀></책타이틀>
</책타이틀>
이렇게 주는겁니다. 이런사람이 안생길까요? 절대로 생깁니다. 특히 공개된 대중적인 프로그램이라면..
예를들어 RSS 같은경우 RSS 형식에 맞게 데이터를 표현해야 RSS리더 프로그램에서 RSS를 읽습니다.
그런데 아랫층사는 박판돌씨는 그냥 멋대로 XML을 만들고 RSS리더 프로그램에서 RSS를 읽히려고 합니다.

그래서 아예 내가 원하는대로 XML을 표현하게 규제를 해합니다.. 그게 DTD, 스키마 입니다…
DTD 가 최초 XML 형식을 정의하는 언어였는데 그게 개선된것이 스키마 구요.. 둘다 목표는 같은겁니다…
데이터정의언어… 왜? 규제할라고.김순덕씨같은 사람들때문에…

에이..난 대중에 공개할일도 없고 개발자는 나 혼자인데요???
그럼 DTD고 스키마고 나발이고간에 만들필요 없습니다. 그냥 XML문서 내 맘대로 만들고 프로그램에서 돌리면 됩니다.

그럼 DTD나 스키마 쓴거랑 안쓴거랑 어떻게 구분하고 규제하고 하는가???

XML문서의 초기부분에..
<?xml version=“1.0” encoding=“euc-kr” ?>
<booklist>
    <book>….
이렇게만 쓰면.. 규제고 뭐고 하는거 없고 그냥 내맘대로 XML형식에만 어긋나지 않게 만들면 됩니다만…
<?xml version=“1.0” encoding=“euc-kr” ?>
<booklist xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
                      xsi:noNamespaceSchemaLocation=“test.xsd”>
이렇게 덧붙여서 시작하면..test.xsd 에서 선언한대로 xml 문서를 만들어야 합니다… 틀리면…
XML문서를 읽어들이는 프로그램의 파서가 에러를 내뱉습니다..
XML문서를 읽어들이는 프로그램으로 우리는 주로 인터넷 익스플로러를 사용하지요… 이 인터넷 익스플로러 안에
XML을 파싱하는 프로그램이 내장되어 있습니다.. 요놈이 “에러야!!크흑!!!!컥!!!” 하면서 에러를 뱉어냅니다..

소개

이전 글 에서 함수의 컨셉에 대해 소개했다. 함수를 사용함으로서 프로그램들을 논리적인 덩어리들로 쪼개서 당신의 코드를 좀더 잘 조직화하고, 쉽게 재사용할 수 있었다. 이제 당신이 자바스크립트 프로그래밍의 핵심적인 개념들을 거부감 없이 받아들일 수 있게 되었으므로, 객체 에 대해 소개함으로서 활용의 폭을 더욱 넓혀보고자 한다. 객체를 사용함으로서 함수로 정의한 기능성들을 하나로 묶을 수 있고, 또한 그것을 이곳저곳으로 전달하며 또한 참조할 수 있다. 이러한 능력은 당신이 앞으로 작성할 코드에 상당히 실질적인 의미를 갖게 될 것이다 – 비록 지금 이 순간에는 다소 모호하게 들리겠지만 말이다.

눈치채지 못했을수도 있지만, 당신은 이 시리즈를 따라 오면서 암묵적으로 객체들을 사용해 왔다. 이제 이것에 대해 좀 더 명시적인 설명을 함으로서 자바스크립트에서 객체가 어떻게 동작하는지, 그리고 객체를 통해 당신의 프로그램을 좀 더 명확하게 하고 재사용하기 쉽도록 하는 방법을 알려주겠다.

이 글의 구조는 다음과 같다:

  • 왜 객체를 사용하는가?
  • 익숙한 영역
  • 객체 생성하기
  • 자가 참조
  • 연관 배열로서의 객체
  • 객체 리터럴
  • 요약 – 배울것이 더 많이 있다
  • 읽어볼것들
  • 연습문제
다운로드하거나 직접 실행해볼 수 있는 예제가 준비되어 있다. 이것은 삼각형의 면적을 계산하는 코드를 포함하고 있는데, 객체를 사용한 것과 사용하지 않은 것이 있다. 이 코드는 아래에서 설명하는 예제들로 만들어져 있다. 삼각형 객체 예제를 실행해보라.

왜 객체를 사용하는가?

객체에 대해 주의를 기울이는 단 하나 가장 중요한 이유는, 객체를 사용함으로서 당신의 코드에서 데이터와 처리과정을 더 잘 표현할 수 있기 때문이다. 익숙한 예제로서, 당신이 삼각형에 관한 뭔가를 코딩한다고 가정하자. 삼각형은 3개의 변 을 가지고 있다는 것을 알고 있으므로, 특정한 삼각형에 대해 다루려면 당연히 3개의 변수를 만들어야 할 것이다:

  1. // This is a triangle.
  2. var sideA = 3;
  3. var sideB = 4;
  4. var sideC = 5;

자, 삼각형이 준비되었다. 하지만 아직 명확하지는 않다. 따로따로 추적해야 할 세개의 변수를 이제 만들었고, 당신이 이것을 가지고 무엇을 어떻게 하려고 했었나를 떠올리게 해 줄 주석이 있다. 이것은 그다지 명확하거나, 사용할만하다고 할 수는 없다. 어쨌든, 계속해보자. 이 “삼각형”에 대해 어떤 계산을 할 수 있을까? 면적을 알기 위해서, 다음과 같은 함수를 사용할 수 있을 것이다:

  1. function getArea( a, b, c ) {
  2. // Heron의 공식을 이용해서 삼각형의 면적을 계산한다.
  3. var semiperimeter = (a + b + c) / 2;
  4. var calculation = semiperimeter * (semiperimeter – a) * (semiperimeter – b) * (semiperimeter – c);
  5. return Math.sqrt( calculation );
  6. }
  7. alert( getArea( sideA, sideB, sideC ) );

뭔가 계산을 하기 위해서는 삼각형에 대한 모든 정보를 전달해주어야 한다는 것을 깨달았을 것이다. 삼각형과 관련된 활동(계산)은 삼각형의 데이터로부터 완전히 분리되어 있는데, 이러한 고립에는 그다지 의미가 있어 보이지 않는다.

좀 더 보자. 나는 이 함수와 변수들에 대해 상당히 범용적인 이름을 정해주었다: getArea, sideA 와 같이 말이다. 다음주에, 직사각형에 대해서 동작하도록 프로그램을 확장해야 함을 깨달았다면 어떻게 할 것인가? 아마도, 사각형에 사용하기 위해 sideA 와 sideB 같은 변수를 사용하려고 하겠지만, 이러한 변수는 이미 사용되었다. side1 과 side2 를 사용할수도 있겠지만, 이런 변수를 사용함으로서 혼동과 재난을 초래할 것이 분명함을, 당신도 이미 짐작할 것이라고 생각한다. 아마도, rectangleSideA, rectangleSideB 같은 변수들을 시도해 보다가 모순 속에 빠져들게 될 것 같다. 삼각형에 대해 이미 만들어 둔 코드를 다시 수정해서 triangleSideA 같은 것을 쓰게끔 하다가, 필경 에러를 만들어 낼 것이다. 이러한 수작업과 오류는 물론 함수의 이름에도 계속된다 – 두개의 다각형에 대해서, 그 계산이 개념적으로는 같은 것이기 때문에, 똑같이 getArea 라는 이름을 사용하고 싶지만, 그렇게 할 수 없다. 데이터를 표현할 수 있는 더 좋은 방법이 있을것이다.

몇개의 명령어들을 묶어서 단일한, 적당한 이름을 가진 활동(함수)을 만들어 내는 것이 이치에 맞는다. 마찬가지로, 몇가지 “것” 들을 하나의 단위로 묶어서 객체를 만들어내는 것이 이치에 맞는다. 자바스크립트에서 미리 정의된 기초적 데이터 타입(문자열, 상수, 불린 등)에 제한받는 대신, 객체를 만들어 사용함으로서 당신만의 데이터 타입 연결을 만들어 낼 수 있다. 객체에 사용되는 변수들은 숫자나 타입의 제한을 받지 않는다. 이렇게, 형식에 얽매이지 않는 유연함은, 프로그램을 작성할 때 당신이 다루려고 하는 것을 직접적으로 다루는 구조를 만들어낼 수 있게 하며, 또한 그것들을 자바스크립트에 내장된 기초적인것들과 마찬가지로 사용할 수 있게 해준다. 이제 삼각형과 직사각형 객체를 만들 것인데, 각각의 객체는 그 모양을 다루기 위해 필요한 모든 데이터들을 포함할 것이며, 또한 그 데이터들을 가지고 수행하려고 하는 모든 행동들도 함께 포함할 것이다. 이러한 목적을 염두에 두고, 문법을 보도록 하자.

익숙한 영역

이전 글의 마지막 실습을 보면, 다음과 같은 코드가 포함되어 있다:

  1. var obj = document.getElementById( elementID );

그리고:

  1. obj.style.background = ‘rgb(’+red+’,’+green+’,’+blue’)’;

자, 객체가 무엇인지 몰랐지만 이미 객체를 사용하고 있었다. 이 두개의 조각을 좀 더 자세히 분석해서 자바스크립트의 객체 문법에 대해 살펴보도록 하자.

var obj = document.getElementById( elementID ) 이 코드는 익숙해 보인다. 명령어 마지막에 포함되어 있는 괄호는 뭔가가 실행될 것이라는 의미이고, 이 실행의 결과가 obj 라는 변수에 저장될 것이라고 짐작할 수 있다. 여기에서 새로운 것은 딱 하나, 중간에 있는 점 이다. 이러한 점 표기법은 자바스크립트가 객체 안에 저장된 데이터에 접근하기 위해 사용하는 방법이다. 점 은 + 나 – 와 마찬가지로, 피연산자 사이에 있는 연산자이다.

관습적으로, 객체 안에 저장되고 점 연산자를 통해 접근하는 데이터를 property 라고 부른다. 프로퍼티는 함수가 될 수 있는데, 이 경우 method 라 부른다. 이러한 단어에 특별한 의미는 없다 – 메서드는 함수일 뿐이고, 프로퍼티는 변수일 뿐이다.

점 연산자의 왼쪽에는 객체가, 오른쪽에는 프로퍼티가 놓인다. 위의 코드에 이러한 규칙을 적용해 본다면, 자바스크립트에 내장되어 있는 document 객체의 getElementById 메서드에 접근한다고 말할 수 있을 것이다. 이것에 관해 더 자세한 내용은 이어질 DOM 여행 글에서 확인할 수 있다.

다음 코드는 조금 더 흥미롭다: 이것은 점을 두개 가지고 있다. 자바스크립트의 객체 지원 중에서 정말로 흥미로운 것 중 하나는, 점 연산자 체인을 통해 복잡한 구조 속으로 들어간다는 것이다. 짧게 말해서, 이러한 체인은 마치 var x = 2 + 3 + 4 + 5; 를 계산하고 값으로 14를 기대하는 것과 같다. 객체 참조는 자신을 반환하고, 이러한 체인이 왼쪽에서 오른쪽으로 계속 이어진다(친구들에게 이것을 설명하면서 자바스크립트가 점 연산자를 “좌측 연결 삽입 연산자” 로 사용한다고 표현해서 깊은 인상을 줄 수 있을 것이다) 이 경우, obj.style 이 먼저 평가되고, 이것을 해석하면 그것의 background 프로퍼티에 접근하는 객체가 된다. 당신이 원한다면, 괄호를 사용해서 이것을 좀 더 명시적으로 표현할 수 있다: (obj.style).background.

객체 생성

삼각형 객체를 만들기 위해, 다음의 문법을 사용해서 명시적으로 생성할 것이다:

  1. var triangle = new Object();

triangle 는 이제 비어있는 기초이며 무언가를 그 위에 쌓아올려야 한다. 점 연산자를 통해 프로퍼티들을 추가함으로서 그렇게 할 수 있다:

  1. triangle.sideA = 3;
  2. triangle.sideB = 4;
  3. triangle.sideC = 5;

객체에 새로운 프로퍼티를 생성하기 위해서 다른 특별한 일을 할 필요는 없다. 자바스크립트가 점 연산자를 평가할 때, 이것은 대단히 관대한 방법을 사용한다. 존재하지 않는 프로퍼티에 접근하려고 시도한다면, 자바스크립트는 그것을 새로 만들어낸다. 존재하지 않는 프로퍼티를 읽으려 한다면 자바스크립트는 “undefined” 값을 반환한다. 이것은 편리하지만, 주의깊게 사용하지 않는다면 에러를 만들어 낸다. 따라서 오타에 주의하도록 하자.

메서드를 추가하는 것 역시 비슷하다 – 예제를 보자:

  1. triangle.getArea = function ( a, b, c ) {
  2. // Return the area of a triangle using Heron’s formula
  3. var semiperimeter = (a + b + c) / 2;
  4. var calculation = semiperimeter * (semiperimeter – a) *
  5. (semiperimeter – b) * (semiperimeter – c);
  6. return Math.sqrt( calculation );
  7. }; // 이 줄에 사용된 세미콜론을 눈여겨 보기 바란다. 이것은 규칙의 일부이다.

이것이 함수 선언과 무척 비슷하다고 생각한다면, 제대로 보고 있는 것이다. 그저 함수 이름이 빠졌을 뿐이다. 자바스크립트는 익명 함수라는 개념을 갖고 있는데, 함수는 이름을 가지는 대신 다른 값들과 마찬가지로 변수에 저장된다. 이 코드에서, 나는 익명 함수를 만들어내고 그것을 triangle 객체의 getArea 프로퍼티에 저장했다. 이제 객체는 데이터와 함께 함수를 데리고 다닌다.

자가 참조

삼각형 객체를 만들어 낸 목적 중 하나는, 삼각형의 데이터와, 그 데이터를 가지고 할 계산 사이의 관계를 만들어 내는 일이었는데, 아직 그것을 완성하지 못했다. triangle.getArea 메서드가 여전히 각 변의 길이를 필요로 하고 있음을 알 수 있을 것이다. 따라서 이런 식으로 명령해야 하는데:

  1. triangle.getArea( triangle.sideA, triangle.sideB, triangle.sideC );

이것이 처음에 했던 코드보다는 나은데, 왜냐하면 이것은 데이터와 계산 사이의 관계를 명확하게 표현하고 있기 때문이다. 하지만, 그 관계는, 메서드에게 어떤 값을 가지고 계산할지를 매번 알려줄 필요가 없는 것이어야 한다. 메서드는 자신을 포함하고 있는 객체 안에서 데이터를 수집할 수 있어야 하고, 사용자에게 값을 입력할 것을 요구하지 않고 그 데이터를 사용해야 한다.

메서드가 자신을 포함한 객체 안에서 데이터를 수집할 수 있게 하는 비결은 this 키워드 안에 있다. 메서드를 정의할 때 이 키워드를 사용함으로서, 메서드가 실행될 때 같은 객체 내의 다른 프로퍼티나 메서드를 참조하도록 지정할 수 있다. this 를 사용하도록 getArea 를 다시 수정하면 다음과 같다:

  1. triangle.getArea = function () {
  2. // Return the area of a triangle using Heron’s formula
  3. var semiperimeter = (this.sideA + this.sideB + this.sideC) / 2;
  4. var calculation = semiperimeter * (semiperimeter – this.sideA) * (semiperimeter – this.sideB) * (semiperimeter – this.sideC);
  5. return Math.sqrt( calculation );
  6. }; // Note the semi-colon here, it’s mandatory.

여기서 보는 바와 같이, this 키워드는 거울과 비슷하게 동작한다. getArea 메서드가 실행될 때, 메서드는 객체 내부에서 sideA, sideB, sideC 프로퍼티를 검색하게 된다. 객체 내부에 프로퍼티가 이미 정의되어 있으므로, 외부에서 입력하는 값에 의존하지 않고 계산을 할 수 있다.

이것은 조금 과하게 단순화시킨 표현이다. this 키워드가 언제나 메서드를 포함하는 객체를 참조하는 것은 아니다 – 사실 이 키워드는 자신을 호출하는 문맥에 기반해서 동작한다. 모호함에 대해 사과드린다. 하지만, 이것을 다루는 것은 이 글의 초점을 벗어나는 일이 될 것이다. 아무튼, 이 글에서는, this 키워드는 항상 triangle 객체를 참조할 것이다.

연관된 배열로서의 객체

객체의 프로퍼티와 메서드에 접근하는 방법에는 점 연산자만이 있는것은 아니다. 이미 다루었던 글, 배열에 대하여를 통해서 충분히 익숙해져 있을, 대괄호 표기법script notation을 사용해서 더 효율적으로 접근할 수 있다. 짧게 말해, 당신은 객체를 연관된 – 일반적인 배열이, 값에 숫자를 할당하는 것과는 대조적으로 값에 문자열을 할당하는 – 배열이라고 생각해도 무방하다는 것이다. 이러한 표기법을 사용해서, triangle 객체를 다른 방법으로 작성할 수 있다:

  1. var triangle = new Object();
  2. triangle[‘sideA’] = 3;
  3. triangle[‘sideB’] = 4;
  4. triangle[‘sideC’] = 5;
  5. triangle[‘getArea’] = function ( a, b, c ) {
  6. // Return the area of a triangle using Heron’s formula
  7. var semiperimeter = (a + b + c) / 2;
  8. var calculation = semiperimeter * (semiperimeter – a) * (semiperimeter – b) * (semiperimeter – c);
  9. return Math.sqrt( calculation );
  10. }; // Note the semi-colon here, it’s mandatory.

언뜻 보기에는, 이것은 불필요하게 길게 쓴 것으로 보일 수 있다. 왜 간단한 점 연산자를 사용하지 않는가? 이러한 새로운 문법의 장점은, 프로퍼티의 이름이 프로그램 안에서 완전하게 정의될 필요가 없다는 것이다. 프로퍼티의 이름을 명시하기 위해 변수를 사용할 수 있고, 이러한 것을 허용함으로서 프로그램은 참으로 유연해질 수 있다 – 문맥에 기초해서 다양한 동작을 수행할 수 있다는 뜻이다. 예를 들어, 두개의 객체가 하나의 프로퍼티를 공유하는지 비교해 볼 수 있는 함수를 작성할 수 있다:

  1. function isPropertyShared( objectA, objectB, propertyName ) {
  2. if (
  3. typeof objectA[ propertyName ] !== undefined
  4. &&
  5. typeof objectB[ propertyName ] !== undefined
  6. ) {
  7. alert(“Both objects have a property named ” + propertyName + “!”);
  8. }
  9. }

이러한 함수는, 점 표기법을 사용해서는 절대 만들어 낼 수 없는데, 점 연산자 뒤에는 프로퍼티의 이름을 명시적으로 적어주어야만 하기 때문이다. 당신은 이 문법을 아주 많이 사용하게 될 것이다.

참고 : 연관된 배열은 Perl 언어에서는 해쉬 라고 부르며, C# 에서는 해쉬테이블, C++ 에서는 맵, 자바 에서는 해쉬맵, Python 언어에서는 딕셔너리, 이렇게 다양하게 표현된다. 이것은 아주 강력하면서도 기초적인 프로그래밍 기법이고, 이것의 다른 이름을 이미 알고 있었을 수도 있다.

객체 리터럴

아주 친숙한 코드를 좀 더 자세히 들여다보도록 하자:

alert(“Hello world”);

alert는 함수이고, “Hello world” 라는 문자열을 인수로 가지고 호출되고 있다는 것을 알 수 있다. 여기에서 강조하고자 하는 것은, 이렇게 쓸 필요가 없다는 것인데:

  1. var temporaryString = “Hello world”;
  2. alert(temporaryString);

자바스크립트는, 따옴표(” ”)로 둘러싸인 모든 것은 문자열로 취급되어야 한다고 이해하며, 그것이 어디에 쓰였든 간에 올바르게 처리할 수 있는 필요한 모든 일을 백그라운드로 처리한다. 문자열이 만들어지고, 그것이 함수의 인수로 전달되는 과정이 한번에 이루어졌다. 정형적으로는, “Hello world” 이것은 문자열 리터럴 을 참조한다: 문자열을 생성하기 위해 필요한 모든 것을 완전하게 입력한 것이다.

자바스크립트는, “객체 리터럴” 에 대해서도 비슷한 문법을 가지고 있으며 이것을 통해 문법적인 제약에 지나치게 구애받지 않고 객체를 생성할 수 있다. 객체 리터럴을 가지고, 위에서 만들어 낸 객체를 다시 작성해 보자:

  1. var triangle = {
  2. sideA: 3,
  3. sideB: 4,
  4. sideC: 5,
  5. getArea: function ( a, b, c ) {
  6. // Return the area of a triangle using Heron’s formula
  7. var semiperimeter = (a + b + c) / 2;
  8. var calculation = semiperimeter * (semiperimeter – a) * (semiperimeter – b) * (semiperimeter – c);
  9. return Math.sqrt( calculation );
  10. }
  11. };

역주 : 이러한 표기법을 JavaScript Object Notation – 자바스크립트 객체 표기법 – JSON 이라고 부른다.

이러한 문법은 명확하다: 객체 리터럴은 객체의 시작과 끝을 중괄호로 둘러싸며, 중괄호 안에는 프로퍼티 이름 : 프로퍼티 값 쌍이 콤마로 구분되어 나열된다. 이러한 문법을 사용함으로서, 프로그램의 매 행마다 객체 이름을 반복하는 지루한 작업에서 해방되어 쉽게 프로그램을 구조화할 수 있다.

한가지 조심할 것이 있다 : 객체 리터럴의 프로퍼티 리스트 중 마지막 것(여기에서는, getArea) 뒤에 쉼표를 넣는 실수를 아주 흔하게 범한다. 쉼표는 프로퍼티 사이 에만 넣어야 한다 – 마지막에 넣어진 필요없는 쉼표는 에러를 만든다. 특히, 코드를 이후에 수정하면서 프로퍼티를 추가하거나 지울 때 이런 실수를 범하기 쉬우므로, 쉼표가 정확한 위치에 있도록 주의를 기울일 필요가 있다.

요약 – 배울 것이 더 많이 있다

이 글은, 자바스크립트에서 객체가 갖는 가능성과 한계에 대해서 정말로 수박 겉핧기 정도밖에는 되지 않는다. 이 글을 완전히 읽었다면, 스스로 객체를 생성하여 프로퍼티와 메서드를 추가하고 그것을 자가참조의 형태로 사용하는데에는 익숙해 질 것이다. 이것 외에도 정말로 많은 것들이 있지만, 그중 어떤것도 필수적 이지는 않다. 이 글은 긴 여행의 출발점으로서 기획되었으며, 이후 당신이 길을 헤쳐나가는데 필요로 할 도구를 제공하는 목적으로 작성되었다.

읽어볼 것들

연습문제

  • 객체의 프로퍼티를 참조하기 위해 점 표기법 대신 대괄호 표기법을 사용해야 할 때는 어떤 경우인가?
  • 객체는 어떻게 자신을 참조하는가? 왜 이것이 중요한가?
  • 객체 리터럴이란 무엇인가? 객체 리터럴을 생성할때, 쉼표를 어디에 사용해야 하는가?
  • 삼각형을 표현하고, 넓이를 계산하는 객체를 만들었다. 직사각형에 대해서도 그렇게 해 보기를 바란다. this 키워드를 사용해서, 직사각형의 getArea 메서드가 그 데이터를 필요하지 않은 곳에 전달하는 것을 막도록 해 보라.

http://intomysql.blogspot.com/2010/12/full-text-search-engine.html 에서 참조

 전문 검색 엔진(Full text search engine)의 검색 방식 및 인덱싱

검색 방식

  • 자연어 검색
    자 연어 검색이란, 문자 그대로 검색어를 일반적으로 인간이 사용하는 문장이나 절로(자연스러운 문장의 구문) 가정하여 그대로 Matching해서 검색을 실행하는 방법을 의미한다.  별도의 연산자를 사용할 수 없으며, StopWord 가 적용되며,  50% 이상의 레코드에 존재하는 단어는 일반적인 단어로 간주하여 검색에서 배제한다. 또한, 검색 결과 Match율은 Percentage로 표시된다. MySQL에서는 별도의 옵션을 제공하지 않으면, 자연어 검색을 실행하게 된다.
    (MySQL Built-in 전문 검색엔진을 포함한 대부분의 전문 검색 도구가 지원한다.)
  • Boolean 검색
    자 연어와 달리 검색어의 단어 단위로 특별한 예약어 (+-* 등)를 사용하여 검색 방법을 지정할 수 있다. 검색 방식의 이름에서도 알 수 있듯이, 일부 일치(몇 Percentage 일치)와 같은 개념은 존재하지 않으며, Match율은 순수하게 0% 아니면, 100% 일치로 표기된다. 또한 검색 결과도 100% 일치건만 추출된다.
    (MySQL Built-in 전문 검색엔진을 포함한 대부분의 전문 검색 도구가 지원한다.)

인덱싱 방식

  • 구분자 또는 불용어 (Delimiter, StopWord)
    Full Text search에서는 전문 (Text)의 내용의 빠른 검색을 위해서 Index Building이 중요한데, 전문의 내용을 기 정의된 StopWord 목록을 이용하여 Parsing(분리)을 해서 결과 단어들의 목록을 인덱스로 생성해 두고 검색에 이용하는 방법을 말한다.  일반적으로 구분자는 공백이나 쉼표 또는 한국어의 조사 등을 구분자로 많이 사용하게 되며, 특정 시스템별로 아주 자주 사용되는 단어들도 검색의 의미가 없기 때문에 구분자로 등록하는 경우도 많다. (예를 들어 MySQL 홈페이지에서 MySQL 이라는 단어는 검색의 의미가 없기 때문에 구분자로 등록하는 것이 효율적일 수 있다) MySQL의 Built-in 전문 검색 엔진 (FullText search)은 이 방식만으로 인덱싱을 할 수 있다.
  • N-Gram
    지 정된 구분자로 전 세계 모든 언어에서 단어를 구분해 낸다는 것은 쉽지 않을 것이다. 이러한 부분을 보완하기 위해서 지정된 규칙이 없는 전문도 분석 및 검색을 가능하도록 하는 방법이 N-Gram이라는 방식이다. N-Gram이란, 전문을 무조건적으로 몇 글자씩 잘라서 Indexing을 하는 방법이다. 구분자에 의한 방법보다는 Indexing이 복잡하고, 만들어진 Index의 Size도 상당히 큰 편이다.  (Tritonn이나 Sphinx는 다른 인덱싱 방법들도 제공하지만 이 방법이 주로 사용된다.)
  • 형태소 분석
    국 가별 언어에 대해서 각 문장 및 단어들의 문법 또는 의미적인 단위(형태소)로 쪼개어서 구분하고, 구문의 실제 의미를 인식할 수 있는 수준까지 분석하는 방법으로 주로 번역 시스템이나 검색 엔진들이 사용하는 방법이다. 이러한 방식은 상당히 복잡하기 때문에 일반적인 DBMS의 전문 검색 엔진에서는 쉽게 사용되진 않는 편이다. (Tritonn에서는 MeCab(일본어 형태소 분석기) 과 같은 형태소 분석기 라이브러리를 사용하여 적용할 수도 있다.)

Online / Offline 인덱싱

  • Online 인덱싱
    Full Text Search Engine 방식에 따라서, 대상 테이블에 데이터 레코드가 등록, 변경, 삭제되면서, Full Text Search Index에도 실시간으로 변경 분만 적용되는 형태를 의미한다. (MySQL Builtin Engine과 Tritonn Search Engine이 이와 같은 형태로 구현되어 있음)
  • Offline 인덱싱
    대 상 테이블에 데이터 레코드가 등록, 변경, 삭제와는 무관하게 Full Text Search Index가 관리되면서, 실시간으로 Full Text Index에 반영되지 않고, 일정 주기로 수동 Batch 형태로 Full Text Index Building 작업을 해 주어야 하는 형태를 의미한다. (현재, Sphinx Engine이나 Lucene과 같은 소프트웨어가 이와 같은 형태로 구현되어 있음
FullText 의 개념
mysql 메뉴얼을 읽어보면 알 수있듯이
FullText 검색 기능의 개념 자체는 작은 규모가 아닌 큰 규모의 
문자열 집합을(Large collections) 대상으로 빠르게 해당 검색어를 
검색하기 위해서 만들어진 것입니다.
그리고, 이것은 ‘Like’ 문 기능과는 다르고,
‘Where 필드 = 검색문자열’ 문과도 (어떻게 만드느냐에 따라서) 다를 수 있습니다.
큰 규모라고 하면, 웹 검색엔진을(the Internet with a search engine) 
상상해보시면 될겁니다. 구글(Google)의 경우 30억개 이상의 웹페이지를 
대상으로 검색할 수 있다고 사이트에 명시하고 있습니다. DB 개념으로 
이해하자면, 웹페이지와 같은 큰 문자열을 각각 지니고 있는 30억개 
이상의 레코드들을 검색한다는 것입니다.
이런 방대한 자료에서 어떤 문자열 하나를 찾기위해서 ‘Like’ 문을 쓴다고 상상해보세요.
여기에, 전 세계적으로 엄청난 동시 사용자들을 감안한다면, ‘Like’ 문같은 검색은 
쓸 수가 없겠죠. 실제로 구글에서 여러가지 문자열을 가지고 테스트 
해보시면, 절대 Like 검색방식으로 처리가 되고있지 않다는 것을 알 수 
있습니다.
그리고, ‘Where 필드 = 검색문자열’과 같은 것은, FullText 검색기능을 
내부적으로 어느 정도선까지 지원하도록 개발하느냐에 따라서 틀려질 수 
있습니다.
 
단어를 포함하는 모든 자료를 가져올지, 아니면 단어들중 의미 
있다고 판단되는 단어만을 포함하는 자료를 가져올지 등등… 구글은 
전자의 형태로 개발된 것 같습니다.
당장, ‘a’, ‘are’, ‘this’라는 단어로 검색해보면 엄청난 수의 검색결과를 볼 수 있습니다. MySQL의 FullText 검색은 보통 후자를 택하고 있고,
일종의 자연어 검색(Natural Language Search)을 한다고 밝히고 있습니다.
(단, Boolean Mode도 따로 제공하고 있습니다.)
 
* ‘자연어 검색’에 대해서는 잘 모르지만, 그것과는 별개로, MySQL이 
채택한 검색방식의 핵심을 이해하기 위해서는, 해당부분 MySQL 메뉴얼에서 
자주 쓰인 ‘적절성 값(Revelence Value)’라는 말을 이해해야 될겁니다.
‘적절성 값(Revelence Value)’의 뜻은, 레코드에 포함되어있는 문자열과 
검색하려는 검색어가 얼마나 유사성(Similarity)을 갖고 있는지를 측정한 
것이라고 합니다.(여기에서의 유사성은 단어중 몇글자가 같냐는 식으로 
판단되는 것은 아닙니다.) 그리고, 이 값은 다음과 같은 것들을 계산해서 
나온다고 합니다.
 
레코드안에 들어있는 단어들의 수 
(the number of words in the row) 
그 레코드 안에서 유일한 단어들의 수 
(the number of unique words in that row) 
그 집합 안에서 단어들의  총 갯수 
(the total number of words in the collection) 
특별한 단어를 포함하고 있는 문서들(레코드들)의 수 
(the number of documents (rows) that contain a particular word)
 
‘유사성’이라는 말을 염두에 둔다면, 대충 Revelence Value가 어떻게 계산 
되는지를 유추해볼 수는 있을겁니다. 예를 들어, 검색어로 5개의 단어를 
입력했다면, 5개의 단어들중 각각의 레코드가 몇개의 단어를 포함하고 
있는지, 5개 각각의 단어들이 몇개씩 포함하고 있는지 등에 따라서 
유사성이 틀려질 수 있겠지요. 이 값이 0이면, 유사성이 전혀 없다는 것을 
의미합니다. (Zero relevance means no similarity.)
fulltext 를 이용한 검색 기능 구현 방식은 아래와 같습니다.
 
1. 테이블 생성시에 검색할 필드를 전부 fulltext() 로 잡습니다.
fulltext ( name, subject, contents )
2. 검색 쿼리
select * from table match(name,subject, contents ) against(’“검색단어”’ in boolean mode);
3. 쿼리시 주의점
in boolean mode 선언이 반드시 필요하며, match()의 필드는 fulltext() 에서 선언된 그대로 넣어야합니다.
 
against 에서는 작은따옴표 안에 큰따옴표를 사용해야 온전한 글로 인식되어 검색됩니다.
따옴표가 하나밖에 없다면, or 검색이 되어 원치 않는 결과가 나옵니다
4. 필드 추가시
alter table ‘해당테이블’ add fulltext(‘추가필드’)

Ogg Vorbis는 특허권, 지적재산권이 걸려있는 MP3등의 모든 독점적, 폐쇄적인 오디오 코덱들을 대체하기 위해 태어난 손실압축 오디오 포맷입니다. 1990년대 초중반에 구상되기 시작하여, MP3 라이센스 관련 문제가 터진 1998년에 본격 개발되기 시작하였습니다.
Ogg Vorbis 파일은 다양한 샘플링레이트, 비트레이트, 채널 수에도 유연하게 작동하며, 비슷한 비트레이트의 MP3파일들보다 뛰어난 음질을 자랑하고 있습니다. 또, 유연한 파일 포맷의 채택으로, Ogg Vorbis의 음질은 앞으로 발전을 거듭할 것입니다.

Ogg Vorbis의 파일 포맷의 이용에는 아무런 제한이 없어서, 어떠한 용도로도 자유롭게 무료로 사용하실 수 있습니다. 소프트웨어 관련으로는 레퍼런스 라이브러리가 BSD라이센스로 배포되고 있어서, 상용 소프트웨어 제작에도 문제가 없습니다. 인터넷 방송에도 역시 자유롭게 사용하실 수 있습니다.

현재 Ogg는 “Winamp, XMMS, Sonique, Windows Media Player, ZINF 등의 거의 대부분의 음악 재생 플레이어에서 재생할수 있으며, CDex, Easy CD-DA Extractor, GRIP등의 CD추출 프로그램을 통해서 손쉽게 CD에서 추출이 가능합니다. 또한 거원 제트오디오 5.0, SIREN Jukebox, Media Jukebox 등의 프로그램을 통해서 Audio CD로 바로 만들수 있으며, GoldWave, Cool Edit, Audacity 등의 소리 편집 프로그램에서 편집을 할수 있는 등 무척 다양한 종류의 소프트웨어에서 지원되고 있고, 그 수도 점점 늘어나고 있는 추세입니다.

현재 Ogg Vorbis지원에 관심을 갖고 있는 하드웨어 업체로는 우리나라의 iRiver 싱가폴의 Frontier Labs, 독일의 Pontis 등 여러 곳이 있습니다.

영국의 BBC 방송에서도 Ogg Vorbis에 큰 관심을 가져, Ogg Vorbis로 여러 차례에 걸친 인터넷 라디오 시험방송을 마치고 현재 본 방송을 준비중입니다.

사족: Ogg의 이름은 Netrek이라는 온라인 우주전쟁 게임의 어느 전법의 이름에서 유래되었는데, Ogg Vorbis 파일 포맷의 기본 틀을 의미합니다. Vorbis라는 이름은 Terry Pratchett의 SF소설인 Small Gods의 무자비한 종교인의 이름에서 따온 것인데, Ogg Vorbis 파일에서 사용되는 오디오압축 방식을 의미한다고 합니다.

Ogg Vorbis는 Ogg 멀티미디어 프로젝트의 일환으로 Ogg라는 기본 포맷안에 모든 종류의 멀티미디어 정보를 담기 위한 포괄적 프로젝트입니다. 현재 무손실 압축의 Ogg FLAC, 목소리 압축의 Ogg Speex, 동영상 압축의 Ogg Theora등의 코덱들도 개발되고 있으며, Ogg Vorbis의 음질도 계속 향상될 것으로 보입니다

Script output – How to deal with it

There is basically two way to use the output stream of the pChart library.

Rendering to the web browser

The most common way to use this library. Your script are processing real time or archived data and then generate a picture that is sent directly to the user browser. Server side, you‘ll call the stroke() function, client side, you‘ll invoke the script from an <IMG> HTML tag. The whole stuff would be like :
Server Side (mypic.php)

1./* Render the picture (choose the best way) */
2.$myPicture->stroke;

Client side (mypage.html)

1.<IMG SRC=‘mypic.php‘>

Calling the Stroke() method in your script will automatically send the ‘Content-type: image/png‘ header to the user web browser and the raw picture in the HTTP GET data field.

Rendering to a flat file

This option is often used by scheduled tasks and automatic script that are run on a regular interval and generate a picture that will be access like a standard file from the web server. Those pictures may also be used inside complex documents (PDF, bigger pictures). To render a picture to a file, just invoke the render(“myfile.png”) function.
Server Side (mypic.php)

1./* Render the picture (choose the best way) */
2.$myPicture->render("mypic.png");

Client side (mypage.html)

1.<IMG SRC=‘mypic.png‘>

..with this way, the user browser will NOT trigger the picture generation. the mypic.php should be called by another source.

Automatic method choosing

You may have noticed that the examples shipped with the pChart library can either be run from a web browser or the command line. This behavior is possible because of the autoOutput(“myfile.png”) method. If this method is called from a CLI session then the picture will be rendered to a file. If this method is called from any other type of session, the picture will be sent to the user browser.
Server Side (mypic.php)

1./* Render the picture (choose the best way) */
2.$myPicture->autoOutput("mypic.png");

Client side (mypage.html)

1.<IMG SRC=‘mypic.php‘>

..if mypic.php is called from the IMG tag, the picture will be sent to the browser. If it is called from a CLI interface, a file named mypic.png will be created.

인터넷 홈페이지를 두 개 이상 제작하여 운용하다보면 하나의 도메인뿐아니라 여러개의 도메인을 셋팅하여 하나의 홈페이지가 뜨도록해야할 필요성을 느낄때가 있습니다.

처음 가입시에는 하나의 도메인에 하나의 홈페이지를 운영하는 것이 가장 일반적이나 이용도중 필요에 의해서 다수개의 도메인을 가지게 될 때가 있으며 이때에 이들 도메인을 나름대로 활용할 방안을 찾게됩니다.

이런 필요에 의해서 나온 것이 멀티도메인이란 개념이며 이와 유사한 개념으로 서브도메인, 가상도메인등이 있습니다.

우선 이런 도메인에 관련된 용어부터 정의를 해보겠습니다. 

  • 기본도메인 : 처음에 신청했던 도메인으로 홈페이지를 운용하고 있는 도메인
  • 멀티도메인 : 기본도메인에 호스트이름만 다르게붙여서 사용하는 여러개의 도메인
  • 서브도메인 : 멀티도메인과 거의 같은 개념
  • 가상도메인 : 기본도메인외에 별도의 도메인으로 기본도메인과 같은 홈페이지에 연결된 도메인 

 

여기서 우리는 일반적으로 도메인이라하면 www.superuser.co.kr이라고 여기는 경우가 많은데 사실 엄격히 말씀드려서 호스트명과 도메인은 구분이 되어야합니다.

이의 이해를 돕기 위해서 다음의 FQDN(Fully Qualified Domain Name)이란 용어를 먼저 이해하시기 바랍니다. 

FQDN(Fully Qualified Domain Name)

FQDN이란 용어를 이해하기 전에 우리가 사용하는 도메인에 대한 분명한 이해가 필요할 것 같습니다. www.superuser.co.kr이란 웹사이트주소를 예로 들어보면 www는 호스트이름이며 
superuser.co.kr은 도메인을 의미하는 것입니다.

또한 bbs.superuser.co.kr에서도 bbs는 호스트이름을 의미하며 superuser.co.kr은 도메인을 의미하는 것입니다.

따라서 우리가 무심코 사용하는 도메인이라는 것은 엄격히 구분하여 ‘호스트이름+도메인’으로 이루어져 있습니다.  

FQDN이란 호스트이름과 도메인을 함께 표기한 것을 의미하는 것입니다.

위의 예에서 www와 bbs는 일종의 호스트이름이며superuser.co.kr은 도메인이며 www.superuser.co.kr과bbs.superuser.co.kr은 FQDN이 되는 것입니다.

image 

FQDN(Fully Qualified Domain Name)

FQDN이란 용어를 이해하기 전에 우리가 사용하는 도메인에 대한 분명한 이해가 필요할 것 같습니다.

www.superuser.co.kr이란 웹사이트주소를 예로 들어보면 www는 호스트이름이며 superuser.co.kr은 도메인을 의미하는 것입니다.

또한 bbs.superuser.co.kr에서도 bbs는 호스트이름을 의미하며 superuser.co.kr은 도메인을 의미하는 것입니다.

따라서 우리가 무심코 사용하는 도메인이라는 것은 엄격히 구분하여 ‘호스트이름+도메인’으로 이루어져 있습니다.

FQDN이란 호스트이름과 도메인을 함께 표기한 것을 의미하는 것입니다.

위의 예에서 www와 bbs는 일종의 호스트이름이며 superuser.co.kr은 도메인이며 www.superuser.co.kr과 bbs.superuser.co.kr은 FQDN이 되는 것입니다. 

처음 신청한 도메인(기본도메인)이 www.superuser.co.kr이라고 한다면 멀티도메인은 superuser.co.kr이라는 도메인에서 www라는 호스트이름만을 달리하여 만들어지는 도메인이 멀티도메인입니다.

예를 든다면 다음과 같은 도메인이 www.superuser.co.kr의 멀티도메인이 되는 것입니다.

image

등과 같이 개수에 제한없이 호스트이름만을 붙여서 원하는 멀티도메인을 얼마든지 사용가능합니다.

물론, KRNIC이나 INTERNIC에 새롭게 등록할 필요없이 그냥사용이 가능합니다.

단지 저희 웹호스팅에 원하는 멀티도메인을 사용하겠다고 셋팅을 요청만을 하면됩니다. 

그렇다면 가상도메인이란 무엇일까요? 

가상도메인이란 기본도메인과는 전혀다른 도메인으로 같은 홈페이지에 연결되어있는 도메인을 말합니다.

위의 예와 마찬가지로 기본으로 사용하고있던 도메인이 www.superuser.co.kr이고 이 도메인을 클릭했을 때 뜨는 홈페이지가 A라는 홈페이지라고 했을경우에는 다음과 가상도메인은 기본도메인(www.superuser.co.kr)과 같은 홈페이지(A)에 연결되어 있는 다음과 같은 도메인들을 말하는 것입니다. 

image

image

가상도메인은 멀티도메인과 달리 기본도메인과 전혀다른 도메인이기 때문에 사용하기 위해서는 KRNIC이나 INTERNIC에 등록을 해야합니다. 

이런 가상도메인과 멀티도메인을 고객께서 사용하기위해서는 저희에게 요청을 해야합니다.

고객께서 달리 셋팅해줘야하는 것은 없으며 저희가 웹서버나 도메인포워딩과 같은 것으로 셋팅을 해주면됩니다.

지금껏 설명한 멀티도메인, 가상도메인외에 서버도메인이란 개념을 사용하는 곳이 있습니다.

이는 멀티도메인과 거의 같은 개념이지만 다음과 같은 점이 강조된 것입니다. 

  • 기본도메인 : www.superuser.co.kr
  • 멀티도메인1 : bbs.superuser.co.kr
  • 멀티도메인2 : board.superuser.co.kr 
  • 서브도메인1 : friend.bbs.superuser.co.kr
  • 서브도메인2 : love.bbs.superuser.co.kr
  • 서브도메인3 : 20age.love.bbs.superuser.co.kr 

일반적인 도메인은 www.superuser.co.kr이나 www.kornet.net등과 같이 사용하는 것이 일반적이며 위의 서브도메인1, 2, 3과 같이 도메인앞에 여러개의 호스트이름을 붙여서 사용할 수 있습니다.

도메인명으로 사용할 수 있는 문자의 개수내에서 원하는 만큼의 호스트이름을 얼마든지 붙여서 사용할 수가 있습니다. 

즉, 서브도메인이란 멀티도메인과 같이 같은 도메인을 사용하면서 다른 호스트이름을 붙여서 사용한다는 것은 같으나 서브도메인은 위의 서브도메인1, 2, 3과 같이 2개이상의 호스트이름을 사용하는 점을 강조하는 것입니다. 

그리고, 도메인추가란 위의 여러 가지 경우를 통틀어서 일컫는 말입니다.

저희 웹호스팅에서는 도메인추가서비스에는 위에서 설명드린 멀티도메인, 가상도메인, 서브도메인등을 추가하는 경우를 일컫는 말입니다. 

참고로 도메인파킹(Domain Parking)이란 용어에 대해서 간단히 설명을 드리겠습니다. 

홈페이지를 만들지않고 네임서비스만 제공되는 도메인을 의미하는 것으로 한국인터넷정보센터(KRNIC)에서는 도메인을 등록한후에 3개월내에 반드시 등록한 도메인은 네임서비스를 받도록 하고 있습니다.

네임서비스란 해당도메인이 위치한 주소를 찾을 수있게 제공되는 서비스를 말합니다.

네임서비스를 받기위해서는 1차네임서버와 2차네임서버가 반드시 지정이되어야하는데 웹호스팅업체에서는 홈페이지를 만들지 않은 도메인에 대해서 네임서버등록을 할 수 있도록 하고 있는데 이서비스가 도메인파킹(Domain Parking)서비스입니다. 

이상으로 도메인에 대한 일반적인 용어의 개념들에 대해서 알아보았습니다.