파일 Rename class

Java2 2006.08.29 03:08
/**
* Class Name : ByTimestampFileRenamePolicy.java
* 내용 : 중복되는 파일이 존재시 이름 바꾸는 정책
* by creep (cryingj@dreamwiz.com)
* 배포 및 수정은 마음대로 하세요.
* 근데 이거 수정해서 배포해도 되는건지 몰겠네요.
* 만약 저작권문제가 있는것이면 알려주세요. 바로 삭제하겠습니다.
*/

package com.oreilly.servlet.multipart;

import java.io.*;
import java.sql.Timestamp;

public class ByTimestampFileRenamePolicy implements FileRenamePolicy {

private String strCode = ""; //분리자 code명

/**
* 기본 생성자
*/
public ByTimestampFileRenamePolicy()
{
this( new String(""));
}

/**
* 생성자
* @param v : 분리자 (String 형)
*/
public ByTimestampFileRenamePolicy(String v)
{
if ( v.length() < 1)
{
this.strCode = v;
}else{
this.strCode = v + "_";
}

}

public File rename(File f) {

if (!f.exists()) {
return f;
}

String fileSystemName = ""; // 실제 시스템에 저장될 이름
String name = null; // 시스템에 저장되어 있는 이름
String ext = null; // 확장자
String body = null; // 확장자 제외한 파일이름
String tmpStr = "";
Timestamp ts = null;

name = f.getName();

int dot = name.lastIndexOf(".");
if (dot != -1)
{
ext = name.substring(dot); // includes "."
body = name.substring(0, dot);
}
else
{
body = name;
ext = "";
}

ts = new java.sql.Timestamp(System.currentTimeMillis()) ;
tmpStr = ts.toString();
tmpStr = tmpStr. substring( 0, tmpStr.indexOf(" ") ).substring(0,4) +tmpStr.substring(0, tmpStr.indexOf(" ") ).substring(5,7)
+tmpStr.substring( 0, tmpStr.indexOf(" ") ).substring(8)
+ tmpStr.substring( (tmpStr.indexOf(" ")+1), 19 ).substring(0, 2)+ tmpStr.substring( (tmpStr.indexOf(" ")+1), 19 ).substring(3, 5)
+ tmpStr.substring( (tmpStr.indexOf(" ")+1), 19 ).substring(6);

// 분리 코드명 + 이전파일이름 + "_"+ 등록 년월일 시분초 + 확장자
fileSystemName = this.strCode + body + "_" + tmpStr + "."+ ext;
f = new File(f.getParent(), fileSystemName);

return f;
}
}
신고
Posted by The.민군
캐치되지 않은 예외 캐치하기
 

2004년 3월 25일자 테크팁예외 처리의 Best Practices에서 예외 처리를 위한 몇 가지 선진 기법을 설명한 바 있다. 이번 테크팁에서는 예외를 처리하는 또 다른 방법에 관해 배우게 될 것인데, J2SE 5.0에 추가된UncaughtExceptionHandler가 바로 그것이다.

이름에서 알 수 있듯이UncaughtExceptionHandler는 캐치되지 않은 예외를 처리하는 방법인데, 좀더 구체적으로 얘기하면 캐치되지 않은 런타림 예외를 처리하는 것이다. 자바 컴파일러는 모든 비(非) 런타임 예외를 처리할 것을 요구하며, 그렇지 않을 경우 프로그램은 컴파일되지 않는다. 여기서 '처리한다'는 것은 예외가 선언하는 메소드의throws절에서 선언되거나 try-catch 블록의catch절에서 캐치되는 것을 의미한다.

그럼 예시를 위해 다음 두 가지 예외를 살펴보기로 하자:FileNotFoundExceptionArithmeticException.String이나File인자로FileReader생성자를 호출할 때, 제공된 장소가 유효한 정상 파일을 가리키지 않을 경우FileNotFoundException이 throw된다. 컴파일러는 이 생성자들 중 하나를 호출할 때 throw된 예외를 처리할 것을 요구한다.
FileReader input;   String filename = ...;   try {     input = new FileReader(filename);   } catch (FileNotFoundException e) {     processMissingFile(filename, e);   }
이와 대조적으로,ArithmeticException은 일종의 런타임 예외라 할 수 있는데, 자바 프로그래밍 언어 스펙은(컴파일러도 마찬가지로) 그 런타임 예외를 처리할 것을 요구하지 않는다. 따라서 10에서 0까지의 수를 100으로 나누는 다음 루프의 경우 루프를 통과하는 최종 패스에ArithmeticException을 throw한다:
for (int i=10; i >= 0; i--) {     int div = 100 / i;   }   Exception in thread "main" java.lang.ArithmeticException: /    by zero        at Test.main(Test.java:4)
기본 Uncaught Exception Handler의 역할은 스택 트레이스를 프린트하는 것인데, 보통 이 기본값 동작으로 충분하지만 꼭 그렇지 않은 경우도 있다. 스택 트레이스를 시스템 콘솔에 덤프하는 대신 팝업 창에 트레이스를 표시한다고 생각해보자. 이럴 때는 자체의 기본 Uncaught Exception Handler를 설치하면 이 작업을 수행할 수 있다.

Uncaught Exception Handler 설치에는 최소 세 가지 방법이 사용되고 있다. 첫째는ThreadsetUncaughtExceptionHandler()메소드를 호출하는 것인데, 이 경우 특정 스레드의 동작을 커스터마이즈할 수 있게 된다. 둘째로, 자체ThreadGroup을 정의하고 그룹 내에 생성된 스레드의uncaughtException() 메소드를 오버라이드하여 해당 스레드의 동작을 변경할 수 있다. 셋째로,Thread의 정적setDefaultUncaughtExceptionHandler()메소드를 호출하여 모든 스레드의 기본값 동작을 설정할 수 있다.

ThreadsetUncaughtExceptionHandler()setDefaultUncaughtExceptionHandler()메소드 모두UncaughtExceptionHandler인터페이스 인자의 구현을 수용한다. 이 인터페이스는Thread클래스의 내부 인터페이스이므로 정식 명칭은Thread.UncaughtExceptionHandler이며, 하나의 메소드를 가진다.
void uncaughtException(Thread t, Throwable e)
uncaughtException메소드의 구현을 인터페이스의 커스텀 구현의 일부로서 또는ThreadGroup의 오버라이드된 메소드로서 제공하여 커스터마이즈된 동작을 얻을 수 있다. 예시를 위해, 런타임 예외와 마주칠 때마다 텍스트 영역의 말미에 첨부되는 스택 트레이스가 포함된 창을 표시하는UncaughtExceptionHandler의 구현을 살펴보기로 하자. 예외 사이에 창을 닫을 수 있으며, 창은 다음 예외가 발생할 때 다른 창 앞에 다시 표시된다
import java.awt.*;   import java.io.*;   import javax.swing.*;   public class StackWindow extends JFrame       implements Thread.UncaughtExceptionHandler {     private JTextArea textArea;     public StackWindow(      String title, final int width, final int height) {       super(title);       setSize(width, height);       textArea = new JTextArea();       JScrollPane pane = new JScrollPane(textArea);       textArea.setEditable(false);       getContentPane().add(pane);     }     public void uncaughtException(Thread t, Throwable e) {       addStackInfo(e);     }     public void addStackInfo(final Throwable t) {       EventQueue.invokeLater(new Runnable() {         public void run() {           // Bring window to foreground           setVisible(true);           toFront();           // Convert stack dump to string           StringWriter sw = new StringWriter();           PrintWriter out = new PrintWriter(sw);           t.printStackTrace(out);           // Add string to end of text area           textArea.append(sw.toString());        }     });   }  }
핸들러를 테스트하기 위해서는 핸들러를 설치한 다음 런타임 예외를 throw하는 프로그램이 필요한데, 다음의 프로그램DumpTest가 이 작업을 수행한다. 단순성을 감안하여,DumpTest는 2개의 예외만을 생성한다. 사용자 여러분은 더 난해한 코드를 마음대로 프로그램에 추가하여 더 많은 예외가 throw되도록 한다. 이 때, 프로그램은 예외 사이에서 일시 중지됨으로써 사용자가 예외 사이에 예외 덤프 스택 창을 닫을 수 있음을 보여준다.
import java.io.*;   public class DumpTest {    public static void main(final String args[])      throws Exception {       Thread.UncaughtExceptionHandler handler =         new StackWindow("Show Exception Stack", 400, 200);       Thread.setDefaultUncaughtExceptionHandler(handler);       new Thread() {         public void run() {           System.out.println(1 / 0);         }       }.start();       BufferedReader br =         new BufferedReader(new InputStreamReader(System.in));       System.out.print("Press Enter for next exception");       br.readLine();       new Thread() {         public void run() {           System.out.println(args[0]);         }       }.start();       System.out.print("Press Enter to end");       br.readLine();       System.exit(0);     }    }
StackWindowDumpTest를 컴파일한다.DumpTest실행 시 콘솔에 다음과 같은 내용이 표시되어야 한다.
> java DumpTest   Press Enter for next exception
아울러, 텍스트 영역의 예외를 위한 스택 트레이스가 포함된 창이 표시된다.

사용자 삽입 이미지

Enter를 누르면 콘솔에 다음과 같은 내용이 표시되어야 한다.
Press Enter to end
또한, 창 내의 텍스트 영역에 첨부된 또 다른 스택 트레이스가 표시되어야 한다.

사용자 삽입 이미지

캐치되지 않은 예외를 처리하는 작업은 이것 말고도 더 여러 가지가 있다. Modal Dialogs(여러가지 양식의 대화상자)의 경우에는 자체 이벤트 스레드를 요구하며, 따라서 자체 Uncaught Handler가 필요하다. 시스템 속성sun.awt.exception.handler는 모든 경우를 커버할 수는 있지만 문서화 수준이 아직 미흡한 상태이다. 한편, 속성을 정식 API에 포함시키기 위해 RFE(Request for Enhancement)가 이미 제출된 상태이다.

예외 처리의 Best Practices외에도,2002년 5월의StackTraceElements에 관한 팁에서도 유용한 참고 정보를 얻을 수 있다. 또한, 자바 튜토리얼에 포함된 레슨Handling Errors Using Exceptions도 함께 참조할 것.
신고
Posted by The.민군

자바 애플리케이션에서 동적으로 PDF 파일 생성하기 (한글)

오픈 소스 라이브러리, iText 가이드

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
문서 옵션
사용자 삽입 이미지이 페이지를 이메일로 보내기');// :badtag -->
사용자 삽입 이미지사용자 삽입 이미지

이 페이지를 이메일로 보내기

사용자 삽입 이미지
사용자 삽입 이미지

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

사용자 삽입 이미지사용자 삽입 이미지

샘플 코드


제안 및 의견
사용자 삽입 이미지피드백
사용자 삽입 이미지

난이도 : 초급

Amit Tuli, Staff Software Engineer, IBM

2006 년 3 월 14 일

애플리케이션에서 PDF 문서를 동적으로 만들어야 한다면 iText 라이브러리가 필요하다. 오픈 소스 iText 라이브러리로 PDF 생성이 간단해 진다. 이 글에서는 iText를 소개하고 이를 사용하여 자바 애플리케이션에서 PDF 문서를 생성하는 방법을 설명한다. iText를 잘 이해할 수 있도록 샘플 애플리케이션도 구현한다.

많은 애플리케이션들이 PDF 문서의 동적 생성을 요구하고 있다. 이 같은 애플리케이션은 이메일 전달용 고객 일람표를 생성하는 은행부터, 책의 특정 챕터를 구매하여 이를 PDF 포맷으로 받는 리더기 까지 다양하다. 그 리스트는 끝이 없다. 이 글에서 iText 자바 라이브러리를 사용하여 PDF 문서를 만들 것이다. 여러분의 이해를 돕기 위해 샘플 애플리케이션도 제공한다.

iText와 친해지기

iText는 Lowagie.com(참고자료)에서 무료로 사용할 수 있는 자바 라이브러리이다. iText 라이브러리는 강력하고, HTML, RTF, XML 문서의 생성 뿐만 아니라 PDF 생성을 지원한다. 문서에 사용될 다양한 폰트를 선택할 수 있다. 또한 iText 구조에서는 같은 코드를 사용하여 앞서 언급한 유형의 문서를 만들 수 있다.

iText 라이브러리에는 다양한 폰트로 PDF 텍스트를 만들고, PDF 문서에 테이블을 생성하고, 워터마크를 페이지에 추가하는 클래스가 포함되어 있다. iText로 사용할 수 있는 더 많은 기능들이 있다. 하지만 그 모든 것을 이 글에서 다 설명하기는 불가능하다. PDF 생성에 필요한 기본적인 것만을 설명하겠다.

샘플 애플리케이션 개발에 Eclipse를 사용할 것이다. 오픈 소스 IDE인 Eclipse는 무료로 사용할 수 있고 매우 강력하다. 지금 Eclipse를 다운로드 하라. (참고자료)

iText API

com.lowagie.text.Document는 PDF 문서 생성을 위한 주 클래스이다. 인스턴스로 만들어질 첫 번째 클래스이다. 문서가 생성되면 라이터는 여기에 작성해야 한다. com.lowagie.text.pdf.PdfWriter는 PDF 라이터이다. 다음은 일반적으로 사용되는 클래스들이다.

  • com.lowagie.text.Paragraph-- 들여쓰기 단락을 나타내는 클래스이다.
  • com.lowagie.text.Chapter-- PDF 문서의 챕터이다. 타이틀로Paragraph를 사용하고, 챕터 번호로int를 사용한다.
  • com.lowagie.text.Font-- 폰트, 크기, 스타일, 컬러 같은 모든 폰트 스팩들이 포함되어 있다. 다양한 폰트들은 이 클래스에 정적 상수로서 선언된다.
  • com.lowagie.text.List-- 많은ListItems를 포함하고 있는 리스트이다.
  • com.lowagie.text.Table-- 매트릭스에서 정렬된 셀들을 포함하고 있는 테이블이다.

Eclipse에서 iText 다운로드 및 설정하기

순수 자바 라이브러리인 아아텍스트는 JAR 파일의 형태로 되어 있다. (참고자료.) 라이브러리를 다운로드 하면(C:\temp) Eclipse 환경에서 iText 라이브러리를 설정한다.

  1. Eclipse에서 iText라는 이름의 새로운 자바 프로젝트를 만든다.
  2. Package Explorer 뷰에서 iText 프로젝트를 오른쪽 클릭하고Properties를 선택한다.
  3. Java Build Path를 클릭한다. Libraries 탭에서,Add External JARs를 클릭한다.
  4. C:\temp 디렉토리를 검색하여 itext-1.3.jar를 선택한다.
  5. OK를 클릭한다.

iText가 설정되면 Eclipse는 동적인 PDF 문서를 생성하는 자바 애플리케이션을 구현할 준비를 갖춘 것이다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


샘플 애플리케이션

직접 샘플을 만드는 것 만큼 확실한 설명 방법은 없다. 필요한 툴(Eclipse IDE)과 라이브러리(iText 라이브러리)가 준비되었으니 샘플 프로그램을 디자인 및 개발해 보자.

평이한 텍스트, 특별 폰트로 색상을 입힌 텍스트, 테이블, 리스트, 챕터, 섹션 같은 기본적인 엘리먼트를 포함하고 있는 PDF 문서를 만들어 보자. 이 애플리케이션의 목적은 여러분이 iText 라이브러리를 사용하는 방법을 보다 잘 이해할 수 있도록 돕는 것이다. PDF 문서 생성과 관련되어 많은 일을 수행하는 많은 클래스들이 있다. 이 모든 클래스들을 다 다루기는 불가능하다. iText의 javadoc은 이러한 클래스들의 사용법을 잘 이해할 수 있는 좋은 자료이다. 코딩부터 시작해 보자.

첫 번째 단계는 문서를 만드는 것이다. 이 문서는 PDF 문서의 모든 엘리먼트용 컨테이너이다.


Listing 1. 문서 객체의 인스턴스화
Document document = new Document(PageSize.A4, 50, 50, 50, 50);

첫 번째 인자는 페이지 크기이다. 다음 인자들은 각각 왼쪽, 오른쪽, 상단, 하단 여백들이다. 이러한 유형의 문서는 아직 정의되지 않았다. 여러분이 만드는 라이터의 유형에 의존한다. 이 샘플에서 우리는 com.lowagie.text.pdf.PdfWriter를 선택했다. 기타 라이터로는 HtmlWriter, RtfWriter, XmlWriter 등이 있다. 이름만으로도 충분히 그 용도를 알 수 있다.


Listing 2. PdfWriter 객체의 생성
PdfWriter writer = PdfWriter.getInstance(document, \new FileOutputStream("C:\\ITextTest.pdf"));document.open();

첫 번째 인자는 문서 객체에 대한 참조이고, 두 번째 인자는 아웃풋이 작성될 파일의 고유 이름이다. 작성을 위해 문서를 연다.

이제, 문서의 첫 번째 페이지에 몇 가지 텍스트를 추가할 것이다. com.lowagie.text.Paragraph을 사용하여 어떤 텍스트라도 추가된다. 텍스트로 기본 단락을 만들고 폰트, 컬러, 크기 등 기본적인 설정을 할 수 있다. 각자의 고유 폰트를 사용해도 된다. 두 가지 옵션 모두를 살펴보자.


Listing 3. 단락 객체의 생성
document.add(new Paragraph("First page of the document."));document.add(new Paragraph("Some more text on the \first page with different color and font type.", FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD, new Color(255, 150, 200))));

아래 그림은 위 코드의 아웃풋이다. 위 코드 말미에document.close();을 추가하여 문서를 마감한다.


그림 1. 아웃풋
사용자 삽입 이미지

평이한 텍스트를 PDF 문서에 추가하는 방법을 배웠다. 복잡한 요소들도 문서에 추가해야 한다. 새로운 챕터를 만든다. 이 챕터는 특별 섹션으로서 새로운 페이지로 시작하고 기본적으로 디스플레이 된 숫자가 있다.


Listing 4. 챕터 객체의 생성
Paragraph title1 = new Paragraph("Chapter 1",            FontFactory.getFont(FontFactory.HELVETICA, \           18, Font.BOLDITALIC, new Color(0, 0, 255)));Chapter chapter1 = new Chapter(title1, 1);chapter1.setNumberDepth(0);

위 코드에서chapter1이라는 새로운 챕터 객체를 만들었다. 제목은 "This is Chapter 1."이다. 숫자 한계를0으로 설정하면 페이지에 챕터 번호가 디스플레이 되지 않는다.

섹션은 챕터의 하위 요소이다. 다음 코드에서, "This is Section 1 in Chapter 1." 이라는 제목의 섹션을 만들었다. 이 섹션에 텍스트를 추가하기 위해 또 다른 단락 객체인someSectionText를 만들고 이를 섹션 객체에 추가한다.


Listing 5. 섹션 객체의 생성
Paragraph title11 = new Paragraph("This is Section 1 in Chapter 1",            FontFactory.getFont(FontFactory.HELVETICA, 16, \           Font.BOLD, new Color(255, 0, 0)));Section section1 = chapter1.addSection(title11);Paragraph someSectionText = new Paragraph("This \text comes as part of section 1 of chapter 1.");section1.add(someSectionText);someSectionText = new Paragraph("Following is a 3 X 2 table.");section1.add(someSectionText);

테이블을 추가하기 전에 문서가 어떤 모습인지를 보자. 다음 두 줄을 추가하여 문서를 종료하고 프로그램을 컴파일 및 실행하여 PDF 문서를 만든다.document.add(chapter1);document.close();.


그림 2. 아웃풋
사용자 삽입 이미지

이제 테이블 객체를 만들어 보자. 테이블에는 열과 칼럼의 매트릭스가 포함된다. 한 열의 셀은 한 개 이상의 칼럼으로 확장될 수 있다. 마찬가지로, 한 칼럼에 있는 셀은 한 개 이상의 열로 확장될 수 있다. 따라서, 3 x 2 테이블은 정확히 6 개의 셀만 가질 필요가 없다.


Listing 6. 테이블 객체의 생성
Table t = new Table(3,2);t.setBorderColor(new Color(220, 255, 100));t.setPadding(5);t.setSpacing(5);t.setBorderWidth(1);Cell c1 = new Cell("header1");c1.setHeader(true);t.addCell(c1);c1 = new Cell("Header2");t.addCell(c1);c1 = new Cell("Header3");t.addCell(c1);t.endHeaders();t.addCell("1.1");t.addCell("1.2");t.addCell("1.3");section1.add(t);

위 코드에서,t라는 테이블 객체를 만들었다. 세 개의 칼럼과 두 개의 열을 갖고 있다. 테이블의 보더 색상을 설정했다. 패딩(padding)은 셀의 텍스트와 셀의 경계간 공간을 만드는데 사용된다. 스페이싱(spacing)은 인접하는 셀의 경계들간 공간이다. 그런 다음, 세 개의 셀 객체를 만든다. 각각 다른 텍스트를 갖고 있다. 이들을 계속해서 테이블에 추가한다. 첫 번째 칼럼에서 시작하여 같은 열의 다음 칼럼으로 이동한다. 열이 완성되면 다음 셀이 다음 열의 첫 번째 칼럼에 추가된다. 셀은t.addCell("1.1");같은 셀의 텍스트를 제공하여 테이블에 추가될 수 있다. 마지막으로 테이블 객체가 섹션 객체에 추가된다.

마지막으로 PDF 문서에 리스트를 추가해 보자. 리스트에는 많은ListItem들이 추가된다. 리스트에는 번호가 붙을 수도 있고 붙지 않을 수도 있다. 첫 번째 인자를 TRUE로 전달하면 번호가 붙은 리스트를 만들어야 한다.


Listing 7. 리스트 객체의 생성
List l = new List(true, false, 10);l.add(new ListItem("First item of list"));l.add(new ListItem("Second item of list"));section1.add(l);

지금까지chapter1객체에 모든 것을 추가했다.chapter1에 추가될 더 이상의 객체가 없기 때문에,chapter1을 주document에 추가해야 한다. 샘플 애플리케이션을 통해 한 개의 문서를 완성했다.


Listing 8. 주 document에 챕터 추가하기
document.add(chapter1);document.close();


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


샘플 애플리케이션 실행하기

  1. 샘플 애플리케이션, j-itextsample.jar(Download)을 다운로드 한다.
  2. 디렉토리에 j-itextsample.jar의 압축을 푼다. C:\temp에 추출하면, 소스와 클래스 파일은 C:\temp\com\itext\test에 배치된다.
  3. 명령어 프롬프트를 열고 디렉토리를 C:\temp로 변경한다.
  4. 명령어 프롬프트에 시스템의 classpath를 설정한다. 시스템의 classpath에C:\temp\itext-1.3.jar를 포함시킨다. Windows®에서는,set classpath=C:\temp\itext-1.3.jar;%classpath%명령어를 실행한다.
  5. java com.itext.test.ITextTest명령어로 애플리케이션을 실행한다.

이 프로그램은 C:\에 ITextTest.pdf 문서를 생성할 것이다. 아래 그림은 이 PDF 문서의 두 번째 페이지 모습이다.


그림 3. PDF 문서 모습
사용자 삽입 이미지

결론

지금까지 PDF 생성을 위한 기본 요소들을 살펴 보았다. iText의 장점은 같은 엘리먼트의 신택스가 다른 유형의 라이터에도 사용될 수 있다는 점이다. 또한, 이 라이터의 결과는 콘솔( XML과 HTML 라이터), 서블릿의 아웃풋 스트림 (PDF 문서의 웹 요청에 대한 응답), 또는 다른 유형의 OutputStream 으로 리다이렉션 된다. 또한 iText는 응답은 갖지만 PDF, RTF, HTML, XML 등 다양한 응답 유형을 보이는 상황에서 편리하게 사용할 수 있다. iText에서는 워터마크를 만들 수 있고 문서를 암호화 할 수 있으며 아웃풋도 정확하다.

기사의 원문보기



사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


다운로드 하십시오

설명이름크기다운로드 방식
Sample codeos-javapdf-itextsample.jar3.2KBHTTP
사용자 삽입 이미지
사용자 삽입 이미지다운로드 방식에 대한 정보사용자 삽입 이미지사용자 삽입 이미지Get Adobe® Reader®

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


참고자료

교육
신고
Posted by The.민군

Java theory and practice:유연한 참조로 메모리 누수 막기 (한글)

캐싱에 제공되는 유연한 참조

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
문서 옵션
사용자 삽입 이미지이 페이지를 이메일로 보내기');// :badtag -->
사용자 삽입 이미지사용자 삽입 이미지

이 페이지를 이메일로 보내기

사용자 삽입 이미지
사용자 삽입 이미지

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

사용자 삽입 이미지사용자 삽입 이미지

토론


제안 및 의견
사용자 삽입 이미지피드백
사용자 삽입 이미지

난이도 : 초급

Brian Goetz, Principal Consultant, Quiotix

2006 년 3 월 14 일

지난 달에는약한 참조(weak references)에 대해 설명했다. 이번 달에는 또 다른 형식의 참조 객체(Reference)인 유연한 참조(soft references)를 설명한다. 이것 역시 메모리 사용을 관리하고 잠재적인 메모리 누수를 없애는 보조 가비지 컬렉터이다.

가비지 컬렉션으로 자바 프로그램은 메모리 누수에 대해 면역성을 갖는다. 적어도 좁은 의미의 "메모리 누수 "의 경우가 그렇다는 것이다. 하지만 자바 프로그램의 객체 수명주기의 문제를 완전히 무시할 수 있다는 의미는 아니다. 자바 프로그램에서의 메모리 누수는 객체의 수명주기에 대한 주의가 부족할 때나 객체 수명 주기를 관리하는 표준 방식들을 파괴했을 때 발생한다. 예를 들어,지난 시간에는 우리는 객체의 수명주기를 분명히 정하지 못하면, 메타데이터와 일시적인 객체를 제휴하려고 할 때 의도하지 않은 객체 보유를 야기하게 된다는 것을 배웠다. 객체 수명주기 관리를 무시하거나 메모리 누수로 진행될 수 있는 다른 이디엄들도 있다.

객체 로이터링(Object loitering)

메모리 누수의 한 형태인객체 로이터링은 Listing 1의LeakyChecksum클래스가 설명하고 있다. 이것은getFileChecksum()메소드를 제공하여 파일 컨텐트의 체크섬을 계산한다.getFileChecksum()메소드는 파일 내용들을 버퍼로 읽어 들여 체크섬을 계산한다. 보다 단순한 구현은 버퍼를getFileChecksum()내의 로컬 변수로 할당하는 것이다. 인스턴스 필드에 버퍼를 캐싱하여 메모리 혼합을 줄인다. 이러한 "최적화 " 로는 부족하다. 객체 할당이 더 낫다. (또한 버퍼를 로컬 변수에서 인스턴스 변수로 승격시키면 추가적인 동기화 없이 더 이상의 쓰레드 보안 없는 클래스로 만든다. 단순한 구현은getFileChecksum()synchronized로 선언될 필요가 없고, 동시에 호출될 때 더 나은 확장성을 제공한다.)


Listing 1. "object loitering" 클래스
// BAD CODE - DO NOT EMULATEpublic class LeakyChecksum {    private byte[] byteArray;        public synchronized int getFileChecksum(String fileName) {        int len = getFileSize(fileName);        if (byteArray == null || byteArray.length < len)            byteArray = new byte[len];        readFileContents(fileName, byteArray);        // calculate checksum and return it    }}

이 클래스는 많은 문제들을 갖고 있지만 메모리 누수에 집중해 보자. 버퍼를 캐싱하려는 결정은 이것이 프로그램 내에서 여러 번 호출될 수 있고 재할당 보다는 버퍼를 재사용하는 것이 더 효율적이라는 가정에서 나온 것이다. 하지만 결과적으로 버퍼는 결코 릴리스 되지 않는다. (LeakyChecksum객체가 가비지 컬렉션이 되지 않는 한) 프로그램을 통해 언제나 접근할 수 있기 때문이다. 더욱 나쁜 것은 이것은 줄어들 수 없기 때문에LeakyChecksum은 영구적으로 버퍼를 보유하게 된다. 이는 가비지 컬렉터에 많은 부담을 주고 더 많은 컬렉션을 요구한다. 앞으로의 체크섬을 계산할 목적으로 큰 버퍼를 사용한다면 가장 비효율적인 일이 아닐 수 없다.

LeakyChecksum에서 문제의 원인은 버퍼가 논리적으로getFileChecksum()연산에만 국한되기 때문이다. 하지만 수명 주기는 인공적으로 늘어나서 인스턴스 필드까지 진입한다. 결과적으로 JVM 대신에 이 클래스가 버퍼의 수명 주기를 관리해야 한다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


유연한 참조(soft reference)

이전 글에서 객체가 프로그램에 의해 사용되는 동안 객체에 접근하는 대안 방식을 약한 참조(weak references)가 제공하는 방법을 배웠다. 하지만 수명은 연장하지 않았다.Reference의 또 다른 하위 클래스인 유연한 참조(soft reference)는 다르면서도 관련된 목표를 수행한다. 약한 참조의 경우 애플리케이션이 가비지 컬렉션을 방해하지 않는 참조를 만들도록 한 반면 유연한 참조에서는 애플리케이션이 몇몇 객체를 "소모 가능한 것 "으로 위임하여 보조 가비지 컬렉터를 모으도록 하고 있다. 애플리케이션이 메모리를 사용하는지의 여부를 파악하는데 가비지 컬렉터가 제 기능을 하기 때문에 가용 메모리의 적절한 사용법을 결정하는 것은 애플리케이션에 달려있다. 애플리케이션이 객체 보유에 대해 그릇된 결정을 내린다면 퍼포먼스가 나빠진다. 왜냐하면 가비지 컬렉터는 애플리케이션이 메모리를 초과하여 실행되는 것을 막아야 하기 때문이다.

캐싱은 일반적인 퍼포먼스 최적화 방법이다. 애플리케이션이 이전 계산의 결과를 재사용 하는 것이 가능하다. 다시 계산을 할 필요가 없다. 캐싱은 CPU 활용과 메모리 사용은 서로 상쇄된다. 이상적인 균형은 얼마나 많은 메모리를 사용할 수 있는가에 달려있다. 너무 적은 캐싱으로는 원하는 퍼포먼스를 얻을 수 없다. 또한, 캐싱이 너무 많으면 퍼포먼스가 타격을 받는다. 너무 많은 메모리가 캐싱에 소비되기 때문에 다른 것에 쓰일 수 있는 것이 충분치 않기 때문이다. 메모리 수요를 결정할 때에는 애플리케이션 보다 가비지 컬렉터가 더 나은 위치에 있기 때문에 이러한 결정을 내릴 때에는 가비지 컬렉터의 도움을 받는 것이 합리적이다. 바로 이것이 유연한 참조가 하는 일이다.

객체에 유일하게 남아있는 참조가 약한 참조이거나 유연한 참조라면 그 객체는 유연하게 접근할 수 있다. 가비지 컬렉터는, 약하게 접근 할 수 있는 객체에 수행하는 것 처럼 이러한 객체들을 공격적으로 모으지 않는다. 대신 메모리가 정말 필요할 경우에만 유연하게 접근할 수 있는 객체를 모은다. 유연한 참조는 가비지 컬렉터에게 "메모리가 그렇게 적지 않다면 이 객체를 보유하고 싶다. 하지만 메모리가 부족하면 계속 진행하여 메모리를 모으면 처리하겠다. "라는 명령하는 방식이라고 할 수 있다. 가비지 컬렉터는OutOfMemoryError를 던지기 전에 모든 유연한 참조를 제거해야 한다.

캐싱된 버퍼를 관리하는 유연한 참조를 사용하여LeakyChecksum의 문제를 픽스할 수 있다.(Listing 2). 이제 메모리가 요구되지 않는 한 버퍼가 보유 되지만, 가비지 컬렉터에 의해 사용될 수 있다.


Listing 2. 유연한 참조로 LeakyChecksum 해결하기
public class CachingChecksum {    private SoftReference<byte[]> bufferRef;        public synchronized int getFileChecksum(String fileName) {        int len = getFileSize(fileName);        byte[] byteArray = bufferRef.get();        if (byteArray == null || byteArray.length < len) {            byteArray = new byte[len];            bufferRef.set(byteArray);        }        readFileContents(fileName, byteArray);        // calculate checksum and return it    }}

캐시

CachingChecksum은 유연한 참조를 사용하여 한 개의 객체를 캐싱하고 JVM이 상세를 핸들하도록 하였다. 이와 비슷하게, GUI 애플리케이션에서 비트맵 그래픽을 캐싱하는데 유연한 참조가 사용된다. 유연한 참조가 사용될 수 있는지의 열쇠는 애플리케이션이 캐싱되는 데이터의 손실에서 회복될 수 있는지에 달려있다.

한 개 이상의 객체를 캐싱해야 한다면Map을 사용하면 된다. 하지만 유연한 참조를 적용하는 방식에는 선택권이 있다. 캐싱을Map<K, SoftReference<V>>또는SoftReference<Map<K,V>>로서 관리할 수 있다. 대게는 후자 옵션이 사용된다. 컬렉터 작업이 수월하고 메모리 수요가 높을 때 전체 캐시를 수월하게 사용할 수 있기 때문이다. 가끔 캐시를 구현할 때 유연한 참조 대신 약한 참조가 사용되지만 이렇게 되면 캐싱 퍼포먼스는 나빠진다. 실제로, 약한 참조는 객체가 약하게 접근 가능한 것으로 된 후에 빠르게 제거될 것이다. 소소한 가비지 컬렉션들은 자주 실행되기 때문이다.

퍼포먼스를 위해 캐싱에 많이 의존하는 애플리케이션의 경우 유연한 참조는 너무 무디다. 유연한 종료, 복사, 트랜잭션 캐싱을 제공하는 보다 고급의 캐싱 프레임웍으로 대체해야 한다는 의미는 아니다. "값싸고 지저분한 " 캐싱 메커니즘으로서는 매력적인 장치이다.

약한 참조와 마찬가지로, 유연한 참조는 제휴 참조 큐를 사용하여 만들어지고, 가비지 컬렉터에 의해 생성될 때 이 참조가 인큐(enqueue)된다. 참조 큐는 약한 참조 만큼 유연한 참조에서는 유용하지 않다. 하지만 적은 메모리에서 애플리케이션이 시작할 때 관리 경고를 만드는데 사용될 수 있다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


가비지 컬렉터가 Reference를 핸들하는 방법

약한 참조와 유연한 참조 모두 (팬텀 참조(phantom references)처럼) 추상Reference클래스를 확장한다. 참조 객체들은 가비지 컬렉터에 의해 특별하게 취급된다. 가비지 컬렉터가 힙을 추적하는 과정에서Reference를 만나면 대상 객체를 마킹 또는 추적하지 않고 대신 알려진 활성 Reference 객체 큐에 그Reference를 둔다. 트레이싱 후에 컬렉터는 유연하게 참조할 수 있는 객체들을 규명한다. 이러한 객체에는 강한 참조가 존재하지 않지만 유연한 참조는 존재한다. 가비지 컬렉터는 현재 컬렉션에 의해 사용된 메모리 양과 다른 정책 사항에 기반하여 유연한 참조가 이 시점에서 제거되었는지의 여부를 판단한다. 상응하는 참조 큐가 있다면 정리될 유연한 참조가 인큐된다. 남아있는 객체들은 루트 세트로서 취급되고 힙 트레이스는 이러한 루트들을 사용하여 지속되어 유연한 참조를 통해 접근 가능한 객체들이 마킹될 수 있도록 한다.

유연한 참조를 처리한 후에 약하게 접근 할 수 있는 객체 세트가 정의된다. 이 객체에는 강한 참조나 유연한 참조가 존재하지 않는다. 이들은 정리 및 인큐된다. 모든Reference유형들은 인큐 되기 전에 정리되어서 사후 클린업을 핸들하는 쓰레드는 대상 객체에 액세스 할 수 없다. 이 같은 이유로Reference가 참조 큐와 연합하여 사용될 때,WeakHashMapMap.EntryWeakReference를 확장하는 것 처럼) 적절한 참조 유형을 분류하고 디자인에서 직접 사용하거나 클린업을 필요로 하는 엔터티에 대한 참조를 저장한다.

참조 프로세싱의 퍼포먼스 비용

참조 객체들은 가비지 컬렉션 프로세스에 추가 비용을 부과한다. 각 가비지 컬렉션에서 활성Reference객체들의 리스트가 만들어져야 하고 각 참조는 적절하게 처리되어Reference당 오버헤드를 각 컬렉션에 추가한다. 이 때 해당 객체가 컬렉팅 되는지의 여부는 상관이 없다.Reference객체들은 가비지 컬렉션에 속해있고 해당 객체 전에 컬렉팅 될 수 있다. 이 같은 경우는 인큐가 되지 않는 경우이다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


어레이 기반 컬렉션

스택이나 순환식 버퍼 같은 데이터 구조를 구현할 때 어레이가 사용될 때 또 다른 형태의 객체 로이터링이 발생한다. Listing 3의LeakyStack클래스는 어레이의 지원을 받는 스택의 구현 모습이다.pop()메소드에서 상위 포인터가 감소된 후에도elements는 스택에서 없어진 객체에 대한 참조를 여전히 유지하고 있다. 이 객체에 대한 참조는 프로그램에 의해서도 접근할 수 있다. 그 프로그램이 실제로 그 참조를 다시 사용하지 않더라도 말이다. 이 위치가push()에 의해 재사용 될 때까지 객체의 가비지 컬렉션을 방지한다.


Listing 3. 어레이 기반 컬렉션에서의 객체 로이터링
public class LeakyStack {    private Object[] elements = new Object[MAX_ELEMENTS];    private int size = 0;        public void push(Object o) { elements[size++] = o; }        public Object pop() {         if (size == 0)            throw new EmptyStackException();        else {            Object result = elements[--size];            // elements[size+1] = null;            return result;        }     }}

이 경우 객체 로이터링에 대한 해결책은 스택에서 제거된 후에 참조를 무효로 하는 것이다. (Listing 3). 하지만 클래스가 자신의 메모리를 관리하는 경우는 매우 드문 상황이다. 더 이상 필요하지 않는 객체를 무효로 하는 것이 좋다. 대부분, 공격적으로 참조를 무효화 하는 것에는 퍼포먼스나 메모리 사용에 있어서 이득이 없다. 형편 없는 퍼포먼스나NullPointerException을 발생시킬 뿐이다. 이러한 알고리즘의 연결된 구현은 문제가 없다. 연결된 구현에서 링크 노드의 수명(그리고 저장될 객체에 대한 참조)은 객체가 컬렉션에 저장되는 동안 자동으로 묶인다. 약한 참조는 이 문제를 해결하는데 사용된다. 강한 참조 대신에 약한 참조 어레이를 관리한다. 하지만 실제로LeakyStack는 자신의 메모리를 관리하고 더 이상 필요 없는 객체에 대한 참조가 제거되도록 한다. 어레이를 사용하여 스택이나 버퍼를 구현하는 것은 할당을 줄이는 최적화이지만 구현자에게는 큰 짐이다. 이 어레이에 저장된 참조들의 수명을 관리해야 하기 때문이다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


요약

약한 참조와 마찬가지로 유연한 참조는 애플리케이션에서 객체 로이터링을 방지한다. 애플리케이션이 유연하게 참조된 객체의 손실을 감당할 수 있다면 유연한 참조가 알맞다.

기사의 원문보기

신고
Posted by The.민군

Geronimo 시작하기

Java2 2006.08.29 02:28

Geronimo 시작하기 (한글)

수분 내에 Geronimo 시작하기

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
문서 옵션
사용자 삽입 이미지이 페이지를 이메일로 보내기');// :badtag -->
사용자 삽입 이미지사용자 삽입 이미지

이 페이지를 이메일로 보내기

사용자 삽입 이미지
사용자 삽입 이미지

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

사용자 삽입 이미지사용자 삽입 이미지

토론


제안 및 의견
사용자 삽입 이미지피드백
사용자 삽입 이미지

난이도 : 초급

Sing Li, Author, Wrox Press

2006 년 3 월 13 일

Apache Geronimo는 진취적인 개발 커뮤니티와 성장하고 있는 사용자 커뮤니티를 갖춘 대형 오픈 소스 프로젝트이다. 따라서 새로운 사용자들은 감히 엄두를 내지 못한다. 심지어 숙련된 Java™ 2 Platform, Enterprise Edition(J2EE) 개발자들도 헤맬 때가 있다. 이 글은 신참 Geronimo 사용자를 위한 지침서이다. Geronimo 개발에 관한 광범위한 질문에 대한 답도 제시한다.

본 가이드에서는,

  • Apache Geronimo 애플리케이션 서버와 오픈 소스 Geronimo 프로젝트를 소개한다.
  • 서버를 다운로드 할 장소와 설치 방법을 설명한다.
  • 첫 번째 Geronimo 애플리케이션을 구현하는 단계별 방법을 제시한다.

나머지 부분은 FAQ 리스트를 중심으로 엮었다. "최신 기술 정보를 어디에서 얻을 수 있는가?"부터 "커뮤니티에서 Geronimo 개발자들과 접촉할 수 있는 방법은?"까지 질문 범위는 다양하다.

Geronimo 애플리케이션 서버

Apache Geronimo 프로젝트(참고자료)의 목표는 완벽한 호환성을 갖춘 오픈 소스 J2EE 1.4 애플리케이션 서버용 코드 베이스와 관련하여 J2EE 사용자와 개발자들의 글로벌 커뮤니티를 만드는 것이다.

이 글을 쓰고있는 지금, 프로젝트 팀은 Release 1.0으로 향하고 있고, 서버도 J2EE 1.4 인증을 완전히 받은 상태이다. Geronimo 구현도 사용할 수 있다.(참고자료) Geronimo 구현에 포함된 바이너리 배포판은 개발과 평가를 위한 완벽한 서버 환경을 제공한다.

Geronimo 개발자들은 필드 테스트를 거친 기존의 여러 가지 오픈 소스 프로젝트를 통합했다. 많은 프로젝트들이 성숙하고 잘 알려져 있다. 사실, 벌써 사용하고 있는 사람들도 있을 것이다. 표 1은 Geronimo에 통합된 오픈 소스 코드의 일부이다.



표 1. Geronimo에 통합된 오픈 소스 프로젝트
오픈 소스 프로젝트설명
Apache Tomcat 5.5Java Servlet 2.4와 JavaServer Pages™(JSP) 2.0을 지원하는 웹 티어 애플리케이션 서버.
JettyTomcat 서버의 대안인 Servlet 2.4와 JavaServer Pages 2.0을 지원하는 웹 티어 애플리케이션 서버.
ActiveMQ메시지 중심 빈(MDB)의 오픈 소스 Java Message Service(JMS) 1.1 애플리케이션 공급자와 지원자.
OpenEJB오픈 소스 Enterprise JavaBeans(EJB) Container System과 EJB Server. 2.1 레벨에서 Enterprise JavaBeans와 Container Managed Persistence 2(CMP2)와 EJB Query Language(EJBQL)를 지원한다.
Apache Axis and Scout웹 서비스와 Web Services Interoperability Organization(WS-I) Basic Profile 지원을 위한 Simple Object Access Protocol(SOAP) 구현(Axis)과 JSR 93(JAXR) 구현(Scout).
Apache Derby원시 Java Database Connectivity(JDBC) 지원을 갖춘 완전한 관계형 데이터베이스 관리 시스템(RDBMS).

표 1에 소개된 Geronimo의 J2EE 코어를 지원하는 오픈 소스 프로젝트 외에도, Geronimo 커뮤니티는 두 개의 중요하고 잘 알려진 오픈 소스 프로젝트를 기여했다.표 2에 리스팅 된 이 프로젝트들은 Geronimo에 통합되어 테스트되고 Geronimo 바이너리 배포판을 함께 포함시켰다.



표 2. Geronimo에 통합된 오픈 소스 프로젝트
오픈 소스 프로젝트설명
Spring Framework경량 Inversion of Control(IoC) 컴포넌트에서 애플리케이션을 구현하는 대중적인 애플리케이션 프레임웍.
ServiceMixJava Business Integration(JBI)을 지원하고 서비스 지향 아키텍처(SOA) 구현에 Enterprise Service Bus(ESB)를 제공하는 오픈 소스 툴킷.

위 오픈 소스 프로젝트 중 하나라도 이미 사용하고 있다면 Geronimo를 배우는 과정이 훨씬 간단해 진다.

Geronimo에서 실행할 수 있는 애플리케이션, 애플리케이션 서비스, 컴포넌트들

표 1에서 제시된 통합 서비스들을 통해 다양한 애플리케이션, 애플리케이션 서비스, 컴포넌트들을 Geronimo에서 실행할 수 있다.

  • JSP와 서블릿 기반의 웹 애플리케이션
  • JSP, 서블릿, EJB가 포함된 엔터프라이즈 애플리케이션
  • 관계형 데이터베이스 서비스
  • JMS 기반 메시지 큐 컴포넌트
  • MDB 컴포넌트
  • Spring 기반 경량 애플리케이션 컴포넌트
  • 웹 서비스
  • JBI 서비스 컴포넌트

지체할 것 없이 Geronimo 서버를 설정해 보자.



사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


정확히 5분 안에 Geronimo 실행하기

시작하기 전에, 다음 체크리스트를 점검해 보자.

  1. 서버의 코드를 다운로드하기 위한 고속 인터넷 연결.
  2. Sun Java 2 Platform, Standard Edition(J2SE) Development Kit(JDK) 1.4.2_08 또는 이후 버전(JDK 1.5는 현재 작동하지 않는다.)
  3. (Windows 사용자의 경우) Microsoft® Windows® 2000, 또는 Windows Server 2003, Windows XP.
  4. (리눅스 사용자의 경우) Sun JDK 1.4.2 애플리케이션을 갖춘 리눅스 버전, 또는 완벽한 테스트를 거친 Red Hat Enterprise Linux, Version 3 또는 4, SUSE Linux Enterprise Server, Version 9.
  5. Sun Solaris™ 9와 10.
  6. 최소 1.6-GHz Intel® Pentium® 4 프로세서. 1 GB RAM을 갖추면 이상적이다. (최소 256 MB도 가능하다.)
  7. Geronimo를 설치 및 실행할 200 MB 이상의 유휴 디스크 공간. (최소 60 MB도 가능하다.)

Geronimo 다운로드

위 체크리스트를 다 검토한 후에 Apache Geronimo 사이트에서 Geronimo의 최신 마일스톤 구현을 다운로드(참고자료)한다. (이 글에서는 Milestone 4 또는 M4를 사용한다.)

.zip 또는 .jar 설치를 선택한다. 이것이 가장 빠른 방법이다. 다른 것으로는 .exe 인스톨러가 있는데, 더 많은 설정 옵션이 있고 추기 구현에 유용하다.

사용자 삽입 이미지
Windows 플랫폼에서의 방화벽 관련 경고
방화벽을 실행하는 특정 Windows에서 애플리케이션이 인커밍 네트워크 요청을 수락한다는 경고를 받게 된다. Geronimo를 실행하려면 접근을 허용하거나 방화벽을 끈다.

여러분이 선택한 설치 디렉토리에 .zip 또는 .jar의 압축을 푼다. 이 글에서는 Geronimo_installation_directory로 정했다.

기본 설치는 압축을 푸는 것 만큼 간단하다. 이제 서버를 시작해 보자.

Geronimo 시작하기

현재 작업 디렉토리를 Geronimo_installation_directory로 바꾸고 다음 명령어를 입력한다.

java -jar bin/server.jar

서버는 server.jar 아카이브로서 Geronimo_installation_directory에서 실행할 준비가 된다.

그림 1은 콘솔 디스플레이 모습이다. 서버가 시작되었다는 것을 알려준다. 여러분도 같을 것이라 믿는다.



그림 1. Geronimo 서버 시작하기
사용자 삽입 이미지

그림 1에서, 여러 가지 통합 서비스들은 시스템의 요청에 대해 TCP 포트를 리포팅 한다. 서버를 중지해야 한다면 콘솔에서 control-c 를 입력한다. Geronimo 1.0은 시스템 서비스로서 서버의 설치를 지원하고 콘솔 없이도 실행될 수 있도록 한다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


10분 안에 Geronimo 애플리케이션 구현하기

Listing 1은 여러분이 만들 JSP 웹 애플리케이션이다.Hello world!메시지를 프린팅하는 하나의 JSP로 구성되어 있다. 이 JSP는 표준 <jsp:useBean> 명령어와 Expression Language(EL)를 사용하여 현재 서버 시간을 프린트 한다.



Listing 1. Hello world JSP
<html><head><jsp:useBean id="datetime" class="java.util.Date" /><title>dw Getting Started with Geronimo</title></head><body><h1>Hello world, from Geronimo!</h1>on ${datetime}</body></html>

먼저, project_base 라고 하는 작업 디렉토리를 만들어서 제품을 포함시킨다. 이 디렉토리에서Listing 1의 내용이 담긴 hellojsp.jsp 파일을 만든다.

이제, WEB-INF라고 하는 프로젝트베이스 밑에 하위 디렉토리를 만든다. WEB-INF 디렉토리에서Listing 2의 내용이 담긴 web.xml 파일을 만든다.



Listing 2. hellojsp.war용 web.xml 전개 디스크립터
<?xml version="1.0" encoding="ISO-8859-1"?><web-app xmlns="http://java.sun.com/xml/ns/j2ee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"    version="2.4">   <description>   developerWorks Getting Started with Geronimo    - Hello JSP example        </description>    <display-name>    IBM developerWorks getting started with Geronimo example    </display-name></web-app>

Listing 2는 표준 Servlet 2.4 호환의 J2EE 전개 디스크립터이다. 이 디스크립터는 Web Application aRchive(.war) 파일에 J2EE 1.4 표준에서 요구되는 것이다.

이제, 다시 project_base 디렉토리로 가서 다음 명령어를 사용하여 .war 파일을 만든다.

jar cvf  hellojsp.war

드디어 Geronimo 서버에 전개할 hellojsp.war 파일이 생겼다.

웹 애플리케이션을 전개하려면 hellojsp.war 파일을 Geronimo_installation 디렉토리에 복사한다. 이 디렉토리에서 런타임 전개자를 사용하여 애플리케이션을 전개한다.

java –jar bin/deployer.jar  --user system --password manager deploy hellojsp.war

첫 번째 Geronimo 애플리케이션 전개를 성공적으로 완료하면 Geronimo 전개자는 다음과 같은 인디케이터를 프린트 한다.

Deployed hellojsp

이제 브라우저를 시작하여 URL http://localhost:8080/hellojsp/hellojsp.jsp로 들어가 보자.

디폴트 Jetty 컨테이너가 JSP를 처리 및 실행했다. (1.0 릴리스에서는 기본적으로 Tomcat을 실행할 수 있다. 브라우저는 다음과 같이 JSP를 디스플레이 한다.(그림 2)



그림 2. Geronimo에서 실행되는 Hello world JSP
사용자 삽입 이미지

축하한다! 드디어 Geronimo 서버의 설치와 설정을 마쳤다. 게다가 애플리케이션을 만들고 이를 서버에 전개한 것이다.

다음 섹션에서는 새로운 Geronimo 사용자를 위한 FAQ를 마련했다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


Geronimo FAQ

Geronimo 서버에 무엇이 전개되었는지를 어떻게 아는가?

런타임 전개자를 사용하여 서버상의 모든 전개된 모듈들을 리스팅 한다. 명령어는 다음과 같다.

java -jar bin/deployer.jar -user system -password manager list-modules

Geronimo에서 버그를 찾았거나 새로운 기능 요청을 하려면?

Geronimo 프로젝트는 Apache Software Foundation의 버그와 이슈 트래킹 데이터베이스(참고자료)를 사용하여 이슈와 기능 요청들을 트래킹 한다. 어떤 Geronimo 사용자라도 버그나 기능 요청들을 제출할 수 있다.

버그나 기능 요청을 제출하기 전에 다른 사람이 먼저 제출했는지의 여부를 확인한다.

처음 로그인 할 경우 계정을 만들어야 한다. 그런 다음, 여러분이 발견한 버그의 디스크립션을 입력한다. 버그가 어떻게 만들어졌는지를 자세히 설명하고 도움이 될만한 파일을 첨부하라.

Geronimo에 대한 기술 정보는 어디에서 찾을 수 있는가?

developerWorks에는 Geronimo 아키텍처와 관련된 기술자료들이 있다.(참고자료)

  • "오픈 소스 방식으로 더 나은 J2EE 서버 구현하기" (developerWorks, May 2005)
  • "Geronimo! Part 1: J2EE 1.4 엔진" (developerWorks, May 2005)
  • "Geronimo! Part 2: J2EE 1.4 길들이기" (developerWorks, May 2005)

다음은 보다 구체적인 Geronimo 개발 작업에 참조할 수 있는 리스트들이다.(참고자료)

  • Geronimo 공식 프로젝트와 커뮤니티 웹 사이트는 기본적인 자료 제공처이다.
  • JSP와 웹 애플리케이션의 경우, "Powerful browser detection and custom JSP tags with Geronimo" (developerWorks, 2005년 9월)를 참조하라.
  • EJB의 경우, "Dive into EJB Web applications with Geronimo" (developerWorks, 2005년 7월).
  • JMS의 경우, "Magic with JMS, MDBs, and ActiveMQ in Geronimo" (developerWorks, 2005년 7월).
  • 데이터베이스의 경우, "Three ways to connect a database to a Geronimo application server" (developerWorks, 2005년 6월).
  • 웹 서비스의 경우, "J2EE Web services in Geronimo, Part 1" (developerWorks, 2005년 8월)와 "Deploy Web services in Apache Geronimo" (developerWorks,2005년 6월).
  • 클라이언트 또는 GUI 개발자라면, "Create client applications for Geronimo" (developerWorks, 2005년 6월)와 "Connect a Java Swing application to a Geronimo server" (developerWorks, 2005년 7월)를 참조하라.
  • Geronimo의 보안 구현은 "Build a secure enterprise infrastructure with Geronimo" (developerWorks, 2005년 7월)를 참조하라.

developerWorks Apache Geronimo 프로젝트 리소스 페이지에서 최신 Geronimo 기술자료와 튜토리얼을 참조할 수 있다.(참고자료)

Geronimo 프로젝트 wiki(참고자료)는 커뮤니티 기반의 정보 사이트로서 Geronimo의 기술적인 측면에 대해 상세하게 설명하고 있다.

Geronimo 관련 서적은 있는가?

거의 모든 메이저 출판사에서 Geronimo에 대한 책을 발간하고 있다. 이들 대부분이 2005년 말과 2006년 초에 출간될 예정이다. Apache의 Geronimo 책 리스트에는 곧 출간 예정인 Geronimo 도서 리스트가 제공된다.(참고자료)

Geronimo에 Integrated Development Environment (IDE) 지원이 되는가?

그렇다. Eclipse용 Geronimo 플러그인을 Eclipse Web Tools Platform 프로젝트(참고자료)에서 사용할 수 있다. "Create, deploy, and debug Apache Geronimo applications"(참고자료)에서는 이 플러그인의 기능을 배울 수 있다.

Geronimo가 레이센스를 받는 방식은?

Geronimo는 Apache License, Version 2.0(참고자료)에서 라이센스를 받는다. 라이센스 스팩들은 합법적인 법률 위원회에서 면밀히 해석되는 반면 기여의 의무 없이 프로젝트에서 서버를 무상으로 사용할 수 있다.

오픈 소스 소프트웨어란 무엇인가? 다운로드와 사용 모두 합법적인가? IBM이 이를 승인하는가?

developerWorks의 "New to open source" 리소스 센터를 참조하라.(참고자료)

누가 Geronimo를 개발하는가?

Geronimo 커미터(committer) 리스트를 참조하라.(참고자료) 커미터는 Geronimo의 소스 코드 리파지토리에 쓰기 액세스를 가진 Geronimo 서버의 개발자이다. 현재 커미터 팀은 월드 클래스 J2EE 서버의 개발이라는 공통 관심사를 가진 전문 기술자들의 글로벌 그룹이다. 여러 벤더들 출신의 개인 또는 사원들이 대표를 맡고 있다. Geronimo 개발자가 되고싶다면커미터가 되는 방법에 답변하기 바란다.

Geronimo는 J2EE 서버라고 생각했다. ServiceMix와 Spring 같은 프레임웍이 배포판에 통합되는 이유는?

실제로, Geronimo는 J2EE 서버 그 이상이다. 이것은 근본적으로 서비스 컴포넌트들을 하나로 이어주는 프레임웍이다. Geronimo의 어셈블리라는 개념 때문에 여러분이 필요로 하는 서버 컴포넌트들만 포함하고 있는 특별한 Geronimo 버전을 만들 수 있다. J2EE 서버는 기존의 오픈 소스 서비스 컴포넌트들의 특정 어셈블리에 불과하다. 다른 서비스 컴포넌트를 Geronimo에 통합할 수도 있다. "Integrate third-party components into Geronimo" (developerWorks, developerWorks, 2005년 8월)를 참조하라.(참고자료)

Geronimo에 대해 도움이 필요하다. 누구에게 문의해야 하는가?

Apache Geronimo 사용자 메일링 리스트가 제일 좋다.(참고자료) 많은 커뮤니티 멤버들을 비롯하여 개발 팀이 이 리스트를 구독하고 있다. 여러분이 이 리스트를 사용한다면 빠르게 도움을 받을 수 있을 것이다. 이미 답변을 받은 질문인지를 먼저 확인하도록 하라.

여러분의 회사에서 제품급의 J2EE 애플리케이션을 개발중이라면 신뢰성 있고 전문적인 지원이 필요할 것이다. IBM Support for Apache Geronimo에 등록하기 바란다.(참고자료).

Geronimo 개발자와 연락하는 방법은?

developerWorks Apache Geronimo 커뮤니티 포럼(참고자료)에서 핵심적인 Geronimo 개발자들을 만날 수 있다. 그들이 기술적인 질문에 답해 줄 것이다. 또한, developerWorks "Meet the experts" 섹션(참고자료)에서는 Dain Sundstrom이 Geronimo 개발에 대한 질문에 답변한다.

Apache Geronimo의 빡빡한 개발 스케줄은 두 명의 개발자들이 언제나 상주하고 있다는 것을 의미한다. IRC 채널에서도 도움을 받을 수 있다. 리소스를 사용하려면 IRC 클라이언트가 필요하고 #geronimo 채널에 참여해야 한다. IRC 정보에 대한 프리노드 서버를 참조하라.(참고자료).

현재의 모든 Geronimo 개발자들은 Geronimo 개발자 메일링 리스트에 등록되어 있다.(참고자료) 메일링 리스트는 Geronimo 서버의 개발과 직접적인 관련이 있는 논의로 제한된다.

일년에 한 번, ApacheCon 연례 컨퍼런스가 열린다.(참고자료)

Geronimo 마일스톤 구현이란 무엇인가?

공식 Geronimo 1.0 릴리스 전에, Geronimo 서버의 릴리스는 마일스톤 구현을 통해 가능하다. 이러한 구현들은 서버로 빠른 액세스를 위해 제공된다. 이는 오픈 소스 프로젝트의 일반적인 관행이다.

이 글을 쓰는 지금은 Milestone 4를 사용할 수 있다.표 3은 다양한 Geronimo 마일스톤 구현에 대한 정보이다.



표 3. Geronimo 마일스톤 구현
마일스톤 구현설명
M51.0 릴리스에 가장 가까운 최신 기능 세트. 웹 콘솔과 결합되었다. 웹 티어 컴포넌트에 Tomcat과 Jetty 중 쉽게 선택할 수 있다.
M4OpenEJB를 통해 EJB를 완전히 지원하는 첫 번째 마일스톤 구현.
M3주요 마일스톤 구현. 모든 웹 티어 지원을 갖추었고 ActiveMQ가 작동을 하며 Derby가 빌트인 RDBMS이다. EJB 지원은 없어졌다. 웹 티어 개발에는 Tomcat 보다는 Jetty를 선호한다.
M1, M2제한된 기능 세트만 제공하는 제한 릴리스.

마일스톤 구현 외에 다른 바이너리 배포판이 있는가?

있다. 마일스톤 구현 중간에 Geronimo 팀은 최신 불안정 빌드를 구현했다.

이 빌드는 이름에서 암시하듯 테스트도 되지 않고 안정성에 대한 보장도 없다. 하지만 평가를 원하는 사용자들을 위한 최신 기능들을 제공하지만 소스 코드에서 구현할 수는 없다.

소스 코드에서 Geronimo를 구현하는 방법은?

소스 코드에서 Geronimo를 구현하는 것은 간단한 일이 아니다. 수십억 달러 소프트웨어 회사들이 전용 구현 서버에서 수행하는 것을 여러분의 데스크탑 컴퓨터에서 수행하는 꼴이 된다.

Geronimo는 큰 프로젝트이고 버전 컨트롤과 구현 툴을 사용한다. 여러분이 굳이 구현하고 싶다면 설정과 관련한 문제해결에 많은 시간을 보내야 한다. 여러분이 준비가 되었다면 wiki 페이지를 참조하기 바란다.(참고자료)

Geronimo 프로젝트에 기여하고 싶다. Geronimo 오픈 소스 프로젝트의 개발자가 되려면 어떻게 해야 하는가?

단순히 등록할 수는 없다. 유명한 Apache 웹 서버 팀 같은 Geronimo 팀은 상당한 실력을 갖추고 있다. 여러분 스스로 합당한 자격을 갖추었는지 확인해야 한다. 오랜 기간 동안 프로젝트에 중대한 기여를 하는 등의 헌신적인 노력을 해야 한다. 버그 픽스, 패치 제출, 커뮤니티와의 교류, 많은 코드 작성부터 시작해야 한다. 그런 다음, 어느 좋은 날 프로젝트의 기존 커미터가 여러분에게 멤버 초대장을 보낼 것이다. 기존 개발자 그룹(참고자료)은 여러분의 활동 내역을 기반으로 투표를 할 것이다. 정말로 이 같은 일을 시작하려면 Geronimo to-do 리스트를 확인하기 바란다. (참고자료)

요즘 오픈 소스 분야에서, Geronimo 같은 Apache 프로젝트의 유급 커미터의 위치는 소프트웨어 마스터 급으로 인식된다.

IBM WebSphere 사용자이다. Geronimo에 상당한 관심이 있다. IBM WebSphere Application Server와 어떻게 다른가?

"Apache Geronimo uncovered" (developerWorks, 2005년 8월) 튜토리얼을 참조하라.(참고자료)


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


결론

열정적인 오픈 소스 개발자 팀은 여러분이 무상으로 다운로드 하여 사용할 수 있는 표준의 인증 서버를 제공하기 위해 열심히 일하고 있다.

이 서버는 확장 가능하고, 관리하기 쉬우며, 구성력도 뛰어나다. 기존 지원 사용자들이라는 굴레에서 벗어나서 다른 사람이 이전에 저지른 값비싼 실수까지 피한다.

동시에, Geronimo는 주요 글로벌 소프트웨어 기업과 적극적인 오픈 소스 전략의 지원을 받는 서버이다.

J2EE 개발자라면 Geronimo를 진지하게 고려해 보라.

기사의 원문보기


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


참고자료

교육
신고
Posted by The.민군

IDE 없이 웹 서비스 개발하기, Part 2:"Hello World!" 구현 – 명령행에서 웹 서비스 클라이언트 만들기 (한글)

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
문서 옵션
사용자 삽입 이미지이 페이지를 이메일로 보내기');// :badtag -->
사용자 삽입 이미지사용자 삽입 이미지

이 페이지를 이메일로 보내기

사용자 삽입 이미지
사용자 삽입 이미지

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

사용자 삽입 이미지사용자 삽입 이미지

토론

사용자 삽입 이미지사용자 삽입 이미지

샘플 코드


제안 및 의견
사용자 삽입 이미지피드백
사용자 삽입 이미지

난이도 : 초급

Alec Go, Software Engineer , IBM

2006 년 4 월 04 일

WSDL2Java 명령어를 사용하여 "Hello World" 자바 애플리케이션 웹 서비스를 구현해 봅시다. TCPMonitor를 사용하여 HTTP 메시지를 트레이싱 하는 방법도 설명합니다.

머리말

Part 1에서는 명령행에서 웹 서비스 프로바이더를 구현해 보았다. 이번에는 Integrated Development Environment(IDE) like WebSphere® Studio Application Developer(WSAD)나 Rational ® Application Developer(RAD) 없이 웹 서비스 클라이언트를 구현하는 방법을 설명하겠다. 웹 서비스 클라이언트의 구현은 간단하다. 구현 과정에서 Java™ 컴파일러와 WSDL2Java를 사용하는 방법도 배우게 될 것이다. HTTP 메시지를 트레이싱 하는 방법을 설명하기 위해 TCPMonitor를 사용했다.

이 글은 아래와 같은 전제 조건이 있다.

  1. Windows 기반 OS
  2. WebSphere Application Server 5.x 또는 6.x.트라이얼 버전 다운로드


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


준비

Part 1부터 시작하지 않았다면,다운로드섹션에서 WebSphere Application Server Administration Console을 사용하여 WAR 파일을 설치하라. 이미 WAR 파일이 있다면 이 단계를 무시해도 된다. WAR 파일 설치 단계는 아래와 같다.

Applications -> Enterprise Applications -> Install로 간다. Local Path는HelloWorld.war의 위치를, Context Root는HelloWorldWAR를 지정한다.



그림 1. Admin Console 모습
사용자 삽입 이미지

WSDL 파일이 처음 만들어졌을 때, 위치 매개변수는 "http://localhost:9080/HelloWorldWAR/services/HelloWorld."로 설정되었다. 따라서, WSDL 파일을 클라이언트 생성에 사용하려면 Context Root는 "HelloWorldWAR"가 되어야 한다.

기본 내용들은 모두Next를 누른다. WAR 설치를 끝내면 모든 변경 사항들을 저장하라. 가장 중요한 단계는 WAR 파일을 시작하는 것이다. 이 단계는 쉽게 잊혀진다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


클라이언트 구현하기

웹 서비스 프로바이더가 올바르게 시작되었다고 가정하고, 이제 클라이언트를 만들어야 한다. 세 가지 기본 단계가 있다.

  1. WSDL에서 클라이언트 스텁구현하기
  2. 스텁을 사용하는 자바 클래스개발하기
  3. 클라이언트를 실행하는 자바 파일컴파일하기


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


WSDL에서 클라이언트 스텁 구현하기

웹 서비스 프로그래밍 모델의 강점은 원격 메소드를 호출하기가 쉽다는 점이다. WSDL은 스텁(stub)을 만드는데 사용되고, 이것은 클라이언트 측의 원격 객체를 나타내는데 사용될 수 있다.

A)디렉토리(c:\temp\Client)를 만든다. Part 1에서 만들었던 HelloWorld.wsdl을 복사하거나,다운로드섹션에서 다운로드 한다.

B)명령행 프롬프트를 열고 c:\temp\Client를 검색한다. 다음 명령어를 입력한다.


Listing 1. 명령행 프롬프트 설정하기
SET WAS_HOME=C:\Program Files\WebSphere\AppServer5.1call "%WAS_HOME%\bin\setupcmdline.bat"

첫 번째 라인에서는 WebSphere Application Server가 설치될 장소에 "WAS_HOME"환경 변수를 설정한다. 이것이 정확한 디렉토리를 가리키는지를 확인하라. 두 번째 라인은 JAVA_HOME 같은 추가 환경 변수를 설정하는 스크립트를 호출하게 될 것이다.

C)WSDL2Java 명령어를 사용하여 클라이언트 스텁을 생성한다.


Listing 2. WSDL2Java 실행하기
call "%WAS_HOME%\bin\WSDL2Java" -role client -verbose -output . HelloWorld.wsdl

다음은 우리가 사용할 옵션들이다.

  • Role- 서버나 클라이언트를 지정하는데 사용된다. 우리는 클라이언트를 구현하는 것이므로 후자를 선택했다.
  • Verbose- 매 단계 마다 메시지들을 콘솔에 프린트 한다.
  • Output- 현재 디렉토리를 지정하기 위해 마침표를 사용한다.
  • WSDL file- 언제나 마지막 인자가 된다.

이 명령어를 실행한 후에는 다음과 같이 콘솔에 나타난다.


Listing 3. WSDL2Java의 아웃풋
WSWS3185I: Info: Parsing XML file:  HelloWorld.wsdlWSWS3282I: Info: Generating .\mypackage\HelloWorld.java.WSWS3282I: Info: Generating .\mypackage\HelloWorldSoapBindingStub.java.WSWS3282I: Info: Generating .\mypackage\HelloWorldService.java.WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceLocator.java.WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceInformation.java.

mypackage라는 디렉토리는 위 파일들을 사용하여 만들어 진다. 다음은 파일에 대한 상세이다.

  • HelloWorld.java- Service Endpoint Interface이다.
  • HelloWorldSoapBindingStub.java- Service Endpoint Interface의 구현이다.
  • HelloWorldService.java- Service Interface이다.
  • HelloWorldServiceLocator.java- Service Interface의 구현이다.

유념해야 할 것으로는,

  • Service Endpoint Interface:HelloWorldSoapBindingStub은 HelloWorld를 구현한다.
  • Service Interface:HelloWorldServiceLocator는 HelloWorldService를 구현한다.

다음 섹션에서 클라이언트를 구현하면서 자세히 설명하겠다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


스텁을 사용하는 자바 클래스 개발하기

다음은 생성된 스텁을 활용하는 클래스 파일을 만들 차례이다. "mypackage" 디렉토리에서 HelloWorldClient.java 파일을 만든다. 다음 코드를 붙인다.


Listing 4. HelloWorldClient.java
package mypackage;public class HelloWorldClient {    public static void main(String[] args) throws Exception     { HelloWorldServiceLocator hwlocator = new HelloWorldServiceLocator(); HelloWorld hw = hwlocator.getHelloWorld(); String str = hw.sayHello(); System.out.println(str); }}

웹 서비스를 호출하는데 단 세 줄만 사용된다.

A)HelloWorldServiceLocator는 Service 객체이다. 간단히 말해서 Service 객체는 생성된 스텁을 얻는데 사용된다. Service 객체는 다음 라인에 의해 생성된다.


Listing 5. HelloWorldServiceLocator 만들기
HelloWorldServiceLocator hwlocator = new HelloWorldServiceLocator();

서비스 객체의 이름은 언제나*service name*Locator여야 한다. 여기에서 *service name*은 WSDL 파일에서의 서비스 이름이다.

주: J2EE라는 정황에서(서블릿이나 EJB 내에서) Service 객체는 JNDI를 통해 가져올 수 있다. 우리는 J2SE 클라이언트를 사용하기 때문에 이것은 Service 객체를 가져올 수 있는 유일한 방법이다.

B)이제는 클라이언트 스텁이 생성되어야 한다. 이 스텁은 원격 객체를 나타낸다.


Listing 6. 스텁 생성하기
HelloWorld hw = hwlocator.getHelloWorld();

포트를 얻는 메소드는 언제나get*port name*여야 한다. *port name*은 WSDL 파일에서의 포트의 이름이다.

C)이 스텁에 원격 메소드가 호출될 수 있다. 우리는 여기서 스텁에 대해sayHello메소드를 사용하고 리턴 값을 String에 둔다.


Listing 7. 스텁에 메소드 호출하기
String str = hw.sayHello();


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


클라이언트 컴파일과 실행

이제는 클라이언트를 실제로 컴파일 해보자. 다음 명령어를 사용하여 컴파일 한다.


Listing 8. 클래스 컴파일 하기
"%JAVA_HOME%\bin\javac" -extdirs "%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage\*.java

클래스 파일들은 mypackage 디렉토리에 나타나야 한다. 마지막으로 자바 애플리케이션을 실행한다.


Listing 9. 자바 애플리케이션 실행하기
"%JAVA_HOME%\bin\java"  -Djava.ext.dirs="%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage.HelloWorldClient

"Hello World!"가 콘솔에 나타날 것이다. 축하한다! 여러분의 클라이언트에서 웹 서비스를 호출하는데 성공했다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


TCPMonitor Trace 설정하기

나머지 단계에서는 데이터가 연결되는지를 확인한다. WebSphere Application Server에는 TCPMonitor라고 하는 툴이 있다. 이 툴로 HTTP 메시지들을 트레이싱 할 수 있다. TCPMonitor를 사용하려면 이를 클라이언트와 서버 사이에 두어야 한다. 현재, 클라이언트는 서버와 직접 인터랙팅 한다. 우리는 클라이언트가 TCPMonitor와 인터랙팅 하도록 지시할 것이고, TCPMonitor가 트래픽을 서버로 보내게 될 것이다.

A)TCPMonitor를 활용하려면 클라이언트를 변경해야 한다. HelloWorldClient.java를 다음과 같이 편집한다.


Listing 10. HelloWorldClient.java
package mypackage;import javax.xml.rpc.Stub;public class HelloWorldClient {    public static void main(String[] args) throws Exception     { HelloWorldServiceLocator hwlocator = new HelloWorldServiceLocator(); HelloWorld hw = hwlocator.getHelloWorld(); ((Stub) hw)._setProperty("javax.xml.rpc.service.endpoint.address",  "http://localhost:1234/HelloWorldWAR/services/HelloWorld"); System.out.println(hw.sayHello()); }}

((Stub) hw)._setProperty("javax.xml.rpc.service.endpoint.address", "http://localhost:1234/HelloWorldWAR/services/HelloWorld");라인이 추가되어 클라이언트가 트래픽을 보낼 엔드포인트를 변경한다.private final java.lang.String helloWorld_address = "http://localhost:9080/HelloWorldWAR/services/HelloWorld"; 라인과 함께 디폴트 엔드포인트 주소는 HelloWorldServiceLocator.java 파일에 지정된다.
포트를 9080에서 1234로 변경했다. HelloWorld 인스턴스를 Stub 객체로 던지기 위해서는 java.xml.rpc.Stub을 반입해야 한다.

B)TCPMonitor를 실행할 때 WebSphere Application Server에서 제공하는 자바 버전을 사용해야 한다. 그렇지 않으면 NullPointerException을 받게 된다. 다음 명령어를 실행한다.


Listing 11. TCPMon 실행하기
"%JAVA_HOME%" -Djava.ext.dirs="%WAS_EXT_DIRS%" com.ibm.ws.webservices.engine.utils.tcpmon

C)다음 값을 지정한다.


Listing 12. TCPMon의 값들
Listen Port - 1234Target Hostname - localhostTarget Port # - 9080

윈도우 모양은 다음과 같다.
그림 2. TCPMonitor에서 값 설정하기
사용자 삽입 이미지

다음에는 Add 버튼을 클릭한다. TCPMonitor가 1234 포트에서 트래픽을 수락하여 이를 9080 포트로 리다이렉션 하도록 설정될 것이다. Add 버튼을 클릭한 후에 리스너가 자동으로 실행된다. TCPMonitor의 상단에 있는 탭에 리스너가 나타날 것이다.

D)다음 명령어를 통해 웹 서비스 클라이언트를 재컴파일 및 호출한다.


Listing 13. HelloWorldClient 실행하기
"%JAVA_HOME%\bin\javac"  -extdirs "%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage\*.java"%JAVA_HOME%\bin\java"  -Djava.ext.dirs="%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage.HelloWorldClient

E)TCPMonitor 윈도우에서 트래픽을 검사하라. SOAP envelope는 한 줄로 모든 것을 나타낸다. 웹 서비스 엔진은 공간을 절약하기 위해 새로운 줄을 만들지 않는다.


그림 3. TCPMonitor 아웃풋
사용자 삽입 이미지

F)읽기 쉬운 XML을 만들려면 tcptrace.xml 이라는 새로운 파일을 만들어서 XML을 여기에 붙인다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


결론

웹 서비스 프로그래밍 모델을 활용하면 클라이언트 애플리케이션이 사용할 스텁을 매우 쉽게 만들 수 있다. 이 글에서 설명한 기술들을 사용하고 있는 많은 웹 서비스들이 있다. Google, Amazon, Ebay, Fedex 웹 사이트가 현재 여러분이 사용할 수 있는 웹 서비스를 갖고 있다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


부록 A: 클라이언트를 자동으로 구현하기

위 단계들은 아래다운로드섹션의 WebServiceTutorial.bat을 사용하면 자동화 될 수 있다. 먼저, WebServiceTutorial.bat을 변경하여 WAS_HOME 디렉토리가 현재 WAS 설치 디렉토리를 가리키도록 한다. 그런 다음 배치 파일을 실행한다. 아웃풋은 다음과 같다.


Listing 14. WebServiceTutorial.bat의 아웃풋
1. Creating Binding Classes...WSWS3185I: Info: Parsing XML file:  HelloWorld.wsdlWSWS3282I: Info: Generating .\mypackage\HelloWorld.java.WSWS3282I: Info: Generating .\mypackage\HelloWorldSoapBindingStub.java.WSWS3282I: Info: Generating .\mypackage\HelloWorldService.java.WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceLocator.java.WSWS3282I: Info: Generating .\mypackage\HelloWorldServiceInformation.java.2. Compiling Java Client...3. Running Java Client...Hello World!

기사의 원문보기



사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


다운로드 하십시오

설명이름크기다운로드 방식
Hello World WAR file to install on server sideHelloWorld.war6KBHTTP
Hello World WSDL fileHelloWorld.wsdl3KBHTTP
Script to build the client automaticallyWebServiceTutorial.bat1KBHTTP
Final codeFinish.zip14KBHTTP
사용자 삽입 이미지
사용자 삽입 이미지다운로드 방식에 대한 정보사용자 삽입 이미지사용자 삽입 이미지Get Adobe® Reader®

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


참고자료

교육

제품 및 기술 얻기
신고
Posted by The.민군

IDE 없이 웹 서비스 개발하기, Part 1:서버 - 명령행에서 웹 서비스 프로바이더 만들기 (한글)

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
문서 옵션
사용자 삽입 이미지이 페이지를 이메일로 보내기');// :badtag -->
사용자 삽입 이미지사용자 삽입 이미지

이 페이지를 이메일로 보내기

사용자 삽입 이미지
사용자 삽입 이미지

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

사용자 삽입 이미지사용자 삽입 이미지

토론

사용자 삽입 이미지사용자 삽입 이미지

샘플 코드


제안 및 의견
사용자 삽입 이미지피드백
사용자 삽입 이미지

난이도 : 초급

Alec Go, Software Engineer , IBM

2006 년 4 월 04 일

전개 디스크립터와 자바 클래스가 포함된 웹 서비스 공급자를 구현하는 방법을 배워봅시다. 자바 컴파일러, Java2WSDL, WSDL2Java 명령행 툴의 데모도 선보입니다.

머리말

WebSphere® Studio Application Developer (Application Developer)나 Rational® Application Developer 같은 Integrated Development Environment (IDE)가 웹 서비스를 만드는데 도움이 되긴 하지만 사용자들이 언제나 이 같은 툴을 사용할 수 있는 것은 아니다. 이 글에서 명령행 툴만을 사용하여 웹 서비스 프로바이더를 만드는 방법을 설명하고 여러 자바 클래스들과 전개 디스크립터도 소개하겠다. 매우 단순한 웹 서비스를 구현하는데 필요한 필수 파일에 대해서도 설명할 것이다. 웹 서비스 프로바이더를 개발하는 과정에서 자바 컴파일러, WSDL2Java, Java2WSDL 같은 WebSphere Application Server에서 제공하는 명령행 툴을 사용하게 될 것이다. Part 2에서는 웹 서비스에 액세스 하는 클라이언트를 만드는 방법을 설명하겠다

사용자 삽입 이미지

SEI의 대안들이 몇 가지 있다:

  1. Stateless Session Bean EJB 원격 인터페이스
  2. JavaBean
  3. WSDL 파일

EJB 원격 인터페이스나 자바 빈에서 웹 서비스를 구현하는 방법은 이 글에서 설명한 프로세스와 비슷하다. 보다 자세한 정보는 WebSphere InfoCenter의Developing Web services based on Web services for J2EE를 참조하기 바란다.

WSDL 파일에서 웹 서비스를 구현한다면WSDL에서 서버 측 생성물과 서비스 엔드포인트 구현 생성하기섹션부터 시작해도 좋다.

명령행 툴만을 사용하여 웹 서비스 프로바이더를 구현하는 기본 단계는 아래와 같다.

  1. 서비스 엔드포인트 인터페이스(SEI)를 구현한다.
  2. SEI에서 Web Services Description Language(WSDL) 파일을 만든다.
  3. WSDL 파일에서 웹 서비스 골격을 만든다.
  4. 웹 아카이브(WAR) 파일을 패키징 한다.
  5. 웹 서비스를 전개한다.

이 글은 아래와 같은 전제 조건에 기반한다.

  1. Microsoft® Windows®.
  2. WebSphere Application Server 5.x 또는 6.x의 라이센스나 트라이얼 버전(참고자료)


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


SEI 구현하기

이 글에서 설명할 웹 서비스는 SEI로부터 만들어 진다.

SEI는 웹 서비스 함수가 어떠해야 하는지에 대한 디스크립션이다. 프로그래밍 인터페이스는 종종 분산 컴퓨팅에서 원격에 있는 함수들을 기술하는데 사용된다. 예를 들어, Enterprise JavaBeans는 컴포넌트 인터페이스 개념을 포함하고 있고, Common Object Request Broker Architecture(CORBA®)는 Interface Definition Language(IDL) 파일의 개념을, Java RMI는 java.rmi.Remote를 확장하는 자바 인터페이스의 개념을 갖고 있다. J2EE 웹 서비스는 SEI에서 요구되는 비슷한 패턴을 따른다.

"Hello World" 웹 서비스의 경우, SEI는 다음과 같다.

package mypackage;public interface HelloWorld extends java.rmi.Remote { public java.lang.String sayHello() throws java.rmi.RemoteException;}

이것은 sayHello라는 함수를 가진 매우 단순한 인터페이스이다. 이 함수는 java.lang.String 객체를 리턴한다. 인터페이스가 유효 SEI가 되기 위해서는 인터페이스는 java.rmi.Remote를 확장해야 하고 각 메소드는 java.rmi.RemoteException를 보내야 한다.

다음 단계들을 진행한다.

  1. 시작 디렉토리 c:\temp\Server를 만든다. 이 안에서 mypackage라는 디렉토리를 만든다. 이 디렉토리에는 웹 서비스와 관련된 모든 클래스 파일들이 포함 될 것이다.
  2. c:\temp\Server\mypackage 내에서 HelloWorld.java를 만든다. 다음 코드를 파일에 복사하여 붙인다.
    package mypackage;public interface HelloWorld extends java.rmi.Remote { public java.lang.String sayHello() throws java.rmi.RemoteException;}

  3. WebSphere 명령행 툴은 소스 파일이 아닌 클래스 파일에 대해서만 작동한다. 계속 하려면 자바 파일을 클래스 파일로 컴파일 해야 한다. 새로운 명령행 윈도우를 연다. 본 튜토리얼의 나머지 부분도 이 명령행 윈도우를 사용하도록 한다. 이 안에 다음 명령어를 실행한다.
    SET WAS_HOME=C:\Program Files\WebSphere\AppServer5.1call "%WAS_HOME%\bin\setupcmdline.bat""%JAVA_HOME%\bin\javac" -extdirs "%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage\*.java

    첫 번째 라인은 WebSphere Application Server가 설치될 곳에 WAS_HOME 환경 변수를 설정한다. 두 번째 라인은 JAVA_HOME 같은 추가적인 환경 변수들을 설정하는 스크립트를 호출한다. 마지막 라인은 자바 컴파일러를 호출하여 여러분이 만든 SEI를 컴파일 한다.
  4. 이 명령어를 실행한 후에 HelloWorld.class 라고 하는 새로운 파일이 c:\temp\Server\mypackage에 만들어 진다. 클래스 파일이 만들어졌는지 다시 한번 확인하라.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


SEI에서 WSDL 파일 생성하기

WSDL 파일은 웹 서비스를 기술한다. 웹 서비스와 웹 서비스 클라이언트 간 인터페이스를 정의한다. SEI도 웹 서비스를 기술하기는 하지만 자마 프로그램만 읽을 수 있는 자바 스팩으로 되어있다. WSDL 파일은 모든 언어에서 독립된 방식으로 웹 서비스를 기술한다. .NET 개발자나 PHP 개발자도 WSDL 파일을 사용하여 자신의 클라이언트를 개발할 수 있다. 웹 서비스를 만들기 위해서는 WSDL 파일이 있어야 한다. WSDL은 Java2WSDL 명령어를 사용하여 SEI에서 만들어 질 수 있다.

call "%WAS_HOME%\bin\Java2WSDL" -style document -use literal -verbose -location http://localhost:9080/HelloWorldWAR/services/HelloWorld mypackage.HelloWorld

옵션에 대하여:

  • Style - "document"나 "rpc"가 된다. SOAP 메시지의 포맷팅과 관련되어 있다. 일반적으로 document는 rpc 보다 상호 운용성이 높다. 따라서 여기에서는 document를 선택했다. rpc 스타일은 어레이와 관련하여 문제를 일으킨다.
  • Literal – "literal" 또는 "encoded"가 된다. 서버와 클라이언트가 SOAP 메시지에서 오는 정보를 인터프리팅 하는 방식과 관련이 있다. encoded는 거의 언제나 상호 운용성 문제를 일으킨다. 따라서 literal을 선택했다.
  • Verbose - 매 단계 마다 메시지가 콘솔에 프린트 될 것이다.
  • Location - 웹 서비스의 엔드포인트를 지정한다. 엔드포인트란 웹 서비스 클라이언트가 정보를 보내는 곳이다.
  • Class - 마지막 명령행 인자는 클래스 이름이다.

Java2WSDL 명령어를 실행한 후에, 콘솔에 아래와 같은 것이 나타난다.

WSWS3429I: Binding-specific properties are {MIMEStyle=WSDL11, use=literal, debug=false,     style=document,     bindingName=HelloWorld, encodingStyle=http://schemas.xmlsoap.org/soap/encoding/,     verbose=true, wrapped=true, portTypeName=HelloWorld, servicePortName=HelloWorld,     intfNS=http://mypackage, location=    http://localhost:9080/HelloWorldWAR/services/HelloWorld,     soapAction=DEFAULT}WSWS3010I: Info: Generating portType {http://mypackage}HelloWorldWSWS3010I: Info: Generating message {http://mypackage}sayHelloRequestWSWS3010I: Info: Generating message {http://mypackage}sayHelloResponseWSWS3010I: Info: Generating binding {http://mypackage}HelloWorldSoapBindingWSWS3010I: Info: Generating service {http://mypackage}HelloWorldServiceWSWS3010I: Info: Generating port HelloWorld

Java2WSDL에서 만들어진 유일한 파일은 WSDL 파일이다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


WSDL에서 서버 측 생성물과 SEI 생성하기

WSDL 파일은 웹 서비스를 생성하는데 매우 중요하다. J2EE 웹 서비스는 기본적으로 클래스 파일과 전개 디스크립터의 컬렉션이다. WSDL2Java 명령어는 다음과 같은 생성물을 만들어 낸다.

call "%WAS_HOME%\bin\WSDL2Java" -genJava overwrite -genXML overwrite -role server -container web -verbose -output . HelloWorld.wsdl

아래 내용들이 콘솔에 디스플레이 된다.

WSWS3185I: Info: Parsing XML file:  HelloWorld.wsdlWSWS3282I: Info: Generating .\mypackage\HelloWorld.java.WSWS3282I: Info: Generating .\mypackage\HelloWorldSoapBindingImpl.java.WSWS3282I: Info: Generating .\WEB-INF\webservices.xml.WSWS3282I: Info: Generating .\WEB-INF\ibm-webservices-bnd.xmi.WSWS3282I: Info: Generating .\WEB-INF\ibm-webservices-ext.xmi.WSWS3282I: Info: Generating .\WEB-INF\HelloWorld_mapping.xml.

생성된 파일들을 보라. 실제 구현 클래스는 HelloWorldSoapBindingImpl.java 이다. 여기에는 아래 내용이 포함된다.

package mypackage;public class HelloWorldSoapBindingImpl implements mypackage.HelloWorld{    public java.lang.String sayHello() throws java.rmi.RemoteException {        return null;    }}

sayHello 함수는 원격 클라이언트에서 호출될 수 있다. 이것을 SEI(HelloWorld)와 비교해 보라.

package mypackage;public interface HelloWorld extends java.rmi.Remote {    public java.lang.String sayHello() throws java.rmi.RemoteException;}

HelloWorldSoapBindingImpl은 실제 엔드포인트 구현이고 HelloWorld는 인터페이스이다. HelloWorldSoapBindingImpl은 HelloWorld를 구현한다.

WSDL2Java는 HelloWorldSoapBindingImpl을 만들었다. 이것은 이 구현의 뼈대가 된다. 현재 이것은 아무것도 수행하지 않는다. sayHello는 null만 리턴할 뿐이다. 개발자는 코드를 채워 구현을 완성해야 한다. 예를 들어, "return null"을 변경하여 스트링을 실행할 수도 있다. HelloWorldSoapBindingImpl.java를 수정하면 다음과 같이 된다.

package mypackage;public class HelloWorldSoapBindingImpl implements mypackage.HelloWorld{    public java.lang.String () throws java.rmi.RemoteException {        return "Hello World";    }}

구현을 완료했으니 모든 자바 클래스들이 컴파일 된다. 아래 명령어를 실행한다.

"%JAVA_HOME%\bin\javac" -extdirs "%WAS_CLASSPATH%;%WAS_EXT_DIRS%;." mypackage\*.java


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


WAR 파일의 패키징

웹 서비스는 J2EE 스팩의 일부이다. 이 서비스는 가능한 많이 현재 스팩들을 재사용 하려고 할 것이다. 한 가지 방법은 서블릿처럼 Web Archive(WAR) 파일로 패키징 하는 것이다. WAR 파일에서 WEB-INF 디렉토리는 퍼블릭에 직접 액세스 할 수 없는 파일들을 저장하는데 사용된다. 웹 서비스 WAR 파일의 경우 일반적인 구조는 다음과 같다.

  1. WEB-INF\classes\ - 컴파일된 클래스가 들어있다. (웹 서비스 구현과 인터페이스 클래스)
  2. WEB-INF\wsdl\ - 웹 서비스 WSDL 파일이 들어있다.
  3. WEB-INF\web.xml - WAR 파일 전개 디스크립터
  4. WEB-INF\webservices.xml - 웹 서비스 전개 디스크립터

이러한 엘리먼트들을 한데 모아서 웹 서비스 WAR를 직접 만들어 보자.

  1. 우선, classesin WEB-INF라는 디렉토리를 만든다. mypackage 디렉토리를 classes 디렉토리에 복사한다. 디렉토리 구조는 아래와 같아야 한다.
    WEB-INF\classes\mypackage\HelloWorld.classWEB-INF\classes\mypackage\HelloWorld.javaWEB-INF\classes\mypackage\HelloWorldSoapBindingImpl.classWEB-INF\classes\mypackage\HelloWorldSoapBindingImpl.java

  2. wsdl 디렉토리가 Java2WSDL 명령어를 사용하여 만들어 졌을 것이다. 이 WSDL 파일을 WEB-INF\wsdl\ 디렉토리로 복사한다. 이것은 WSDL 파일의 위치이다.
  3. WEB-INF 폴더 안에 web.xml 파일을 만든다.
    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd"><web-app id="WebApp"> <display-name>HelloWorldWAR</display-name> <servlet>  <servlet-name>mypackage_HelloWorldSoapBindingImpl</servlet-name>  <servlet-class>mypackage.HelloWorldSoapBindingImpl</servlet-class>  <load-on-startup>1</load-on-startup> </servlet></web-app>

    servlet 태그 안에 있는 엔트리들은 중요하다. 이 엘리먼트는 웹 서비스 엔드포인트 구현을 기술한다. servlet-name 엘리먼트 (mypackage_HelloWorldSoapBindingImpl)는 웹 서비스 구현의 식별자로서 작용한다. "servlet-class" 엘리먼트(mypackage.HelloWorldSoapBindingImpl)는 구현으로서 사용되는 WEB-INF\classes 디렉토리에 있는 클래스 파일을 구분한다. WEB-INF\webservices.xml로 바꾼다. 처음에 이 파일은 다음과 같다.
    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE webservices PUBLIC "-//IBM Corporation, Inc.//DTD J2EE Web services 1.0//EN"     "http://www.ibm.com/webservices/dtd/j2ee_web_services_1_0.dtd"><webservices>  <webservice-description>    <webservice-description-name>HelloWorldService</webservice-description-name>    <wsdl-file>WEB-INF/wsdl/HelloWorld.wsdl</wsdl-file>    <jaxrpc-mapping-file>WEB-INF/HelloWorld_mapping.xml</jaxrpc-mapping-file>    <port-component>      <port-component-name>HelloWorld</port-component-name>      <wsdl-port>        <namespaceURI>http://mypackage</namespaceURI>        <localpart>HelloWorld</localpart>      </wsdl-port>      <service-endpoint-interface>mypackage.HelloWorld</service-endpoint-interface>      <service-impl-bean>        <servlet-link>??SET THIS TO servlet-name ELEMENT OF web.xml??</servlet-link>      </service-impl-bean>    </port-component>  </webservice-description></webservices>

  4. servlet-link에 주목하라. 이 값을 mypackage_HelloWorldSoapBindingImpl로 변경한다. 이것은 웹 서비스를 web.xml 파일에 있는 엔트리로 연결한다. webservices.xml 파일은 다음과 같다.
    <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE webservices PUBLIC "-//IBM Corporation, Inc.//DTD J2EE Web services 1.0//EN"     "http://www.ibm.com/webservices/dtd/j2ee_web_services_1_0.dtd"><webservices>  <webservice-description>    <webservice-description-name>HelloWorldService</webservice-description-name>    <wsdl-file>WEB-INF/wsdl/HelloWorld.wsdl</wsdl-file>    <jaxrpc-mapping-file>WEB-INF/HelloWorld_mapping.xml</jaxrpc-mapping-file>    <port-component>      <port-component-name>HelloWorld</port-component-name>      <wsdl-port>        <namespaceURI>http://mypackage</namespaceURI>        <localpart>HelloWorld</localpart>      </wsdl-port>      <service-endpoint-interface>mypackage.HelloWorld</service-endpoint-interface>      <service-impl-bean>        <servlet-link>mypackage_HelloWorldSoapBindingImpl<servlet-link>      </service-impl-bean>    </port-component>  </webservice-description></webservices>

  5. WAR 파일을 만든다. 각자가 선호하는 zip 프로그램을 사용하여 WEB-INF 디렉토리에서 WAR 파일을 만든다. WinZip을 사용하고 있다면 다음과 같이 한다.
    • WEB-INF디렉토리를 오른쪽 클릭한다.
    • WinZip-->zip에 추가하기
    • HelloWorld.war 파일을 호출한다. 이 WAR 파일은 다음과 같다.


    그림 1. Administration Console 모습
    사용자 삽입 이미지

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


웹 서비스 전개

새로운 WAR 파일을 WebSphere Application Server Administration Console에 전개한다.Applications --> Enterprise Applications --> Install순으로 진행한다. Local Path가 HelloWorld.war의 위치를 지정하고 Context Root가 HelloWorldWAR를 지정한다.



그림 2. WinZip 모습
사용자 삽입 이미지

WSDL 파일이 만들어지면 위치 매개변수는 "http://localhost:9080/HelloWorldWAR/services/HelloWorld."로 설정된다. 따라서, WSDL 파일이 클라이언트를 생성하는데 사용되려면 Context Root는 "HelloWorldWAR"가 되어야 한다.

Next를 클릭하고 디폴트 사항에 대해서는 계속Next를 누른다. WAR 파일의 설치를 완료한다. 모든 변경 사항들을 저장하고 HelloWorld 애플리케이션을 직접 시작해 본다.

드디어, 웹 서비스 프로바이더가 완성되었다.


사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
위로


결론

Application Developer나 Rational Application Developer 같은 통합 개발 환경 없이 웹 서비스를 구현하기는 어려운 일이다. 하지만 IDE 마법사 안에서 실제로 어떤 일이 일어나는지 배워두는 것도 필요하다. Part 2에서는 웹 서비스를 호출하는 웹 클라이언트를 만들어 볼 것이다.

기사의 원문보기

신고
Posted by The.민군

HOWTO: SQL Server 2000 성능 데이터 보기

기술 자료 ID:283886
마지막 검토:2006년 1월 20일 금요일
수정:4.1
이 문서는 이전에 다음 ID로 출판되었음: KR283886

요약

이 문서에서는 Microsoft 기술 자료의 다음 문서에서 설명하는 작업에서 만든 추적 파일의 성능 데이터를 분석하는 데 사용할 수 있는 보기를 설명합니다.
283696(http://support.microsoft.com/kb/283696/)INF: SQL Server 2000 성능 및 활동 모니터링 작업
이러한 보기를 만들기 전에 추적 파일을 ActivityTrace라는 SQL Server 2000 테이블로 가져와야 합니다. 저장 프로시저trace_gettable의 스크립트를 사용하면 추적 파일의 데이터를 SQL Server 2000 테이블로 가져올 수 있습니다. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
283784(http://support.microsoft.com/kb/283784/)INF: SQL Server 2000 작업 데이터를 보는 방법
다음 보기를 사용하여 성능 데이터를 분석합니다.
v_sysperfinfo 보기는 sysperfinfo 테이블에서 추적에 의해 기록된 성능 카운터를 나열합니다.
v_BufferCacheHitRatio 보기는 버퍼 캐시 적중률을 계산합니다.
v_difference 보기는 최대 카운터 값과 최소 카운터 값의 차이를 나열합니다.
v_Access_methods 보기는 액세스 메서드 개체에 대한 모든 카운터를 나열합니다. 다른 카운터를 나열하려면 v_Access_methods 보기의 %:Access Methods%를 다른 개체로 변경합니다.
v_object_names 보기는 모든 성능 개체 이름을 나열합니다.

v_sysperfinfo 보기

CREATE      view v_sysperfinfo asselect top 100 percent  RowNumber,[servername],[starttime],substring(TextData,  1,40) as [object_name],substring(TextData, 41,40) as [counter_name],substring(TextData,81,35) as [instance_name],cast(substring(TextData,116,11) as int) as [cntr_value]  from ActivityTrace where EventClass = 83 order by  substring(TextData, 1,40) ,substring(TextData,41,40) ,substring(TextData,81,35) ,starttime

v_BufferCacheHitRatio 보기

CREATE  view v_BufferCacheHitRatio asselect top 100 percent a.starttime   , cast(substring(a.TextData,116,11) as int) as [hits]   , cast(substring(b.TextData,116,11) as int) as [base]   , cast(((cast(substring(a.TextData,116,11) as int) * 100)   / cast(substring(b.TextData,116,11) as int)) as numeric(6,3))  as [Buffer cache hit ratio] from ActivityTrace a join ActivityTrace b    on datepart(yy,a.starttime) = datepart(yy,b.starttime)  and datepart(mm,a.starttime) = datepart(mm,b.starttime)   and datepart(dd,a.starttime) = datepart(dd,b.starttime)   and datepart(hh,a.starttime) = datepart(hh,b.starttime)   and datepart(mi,a.starttime) = datepart(mi,b.starttime)   and datepart(ss,a.starttime) = datepart(ss,b.starttime)   and substring(a.TextData,41,27) = N'Buffer cache hit ratio     '   and substring(b.TextData,41,27) = N'Buffer cache hit ratio base' order by a.starttime

v_difference 보기

CREATE    view v_difference asselect top 100 percent       substring(TextData,  1,40) as [object_name]      ,substring(TextData, 41,40) as [counter_name]      ,substring(TextData,81,35)  as [instance_name]   ,max(cast(substring(TextData,116,11) as int)) as [maximum]   ,min(cast(substring(TextData,116,11) as int)) as [minimum]   ,max(cast(substring(TextData,116,11) as int))   -min(cast(substring(TextData,116,11) as int)) as [difference]      ,count(*) as [count]      ,datediff(mi,min(StartTime),max(StartTime)) as [minutes]  from ActivityTrace where EventClass = 83 group by       substring(TextData,  1,40)      ,substring(TextData, 41,40)      ,substring(TextData,81,35)having max(cast(substring(TextData,116,11) as int))   -min(cast(substring(TextData,116,11) as int)) > 0order by [difference] desc

v_Access_methods 보기

CREATE view v_Access_methods asselect top 100 percent substring(TextData,41,40) as [counter name],left(starttime,20) as [time],cast(substring(TextData,116,11) as int) as [counter value] from ActivityTrace where substring(TextData,1,40) like '%:Access Methods%' order by substring(TextData,41,40), starttime

v_object_names 보기

create view v_object_names asselect top 100 percent substring(TextData,charindex(':',TextData),25) as [object_name]  from ActivityTrace where EventClass = 83 group by  substring(TextData,charindex(':',TextData),25) order by [object_name]




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면Microsoft 뉴스 그룹(http://support.microsoft.com/newsgroups/default.aspx)에 참여하시기 바랍니다.
신고
Posted by The.민군

HOWTO: SQL Server 2000 성능 데이터 보기

기술 자료 ID:283886
마지막 검토:2006년 1월 20일 금요일
수정:4.1
이 문서는 이전에 다음 ID로 출판되었음: KR283886

요약

이 문서에서는 Microsoft 기술 자료의 다음 문서에서 설명하는 작업에서 만든 추적 파일의 성능 데이터를 분석하는 데 사용할 수 있는 보기를 설명합니다.
283696(http://support.microsoft.com/kb/283696/)INF: SQL Server 2000 성능 및 활동 모니터링 작업
이러한 보기를 만들기 전에 추적 파일을 ActivityTrace라는 SQL Server 2000 테이블로 가져와야 합니다. 저장 프로시저trace_gettable의 스크립트를 사용하면 추적 파일의 데이터를 SQL Server 2000 테이블로 가져올 수 있습니다. 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
283784(http://support.microsoft.com/kb/283784/)INF: SQL Server 2000 작업 데이터를 보는 방법
다음 보기를 사용하여 성능 데이터를 분석합니다.
v_sysperfinfo 보기는 sysperfinfo 테이블에서 추적에 의해 기록된 성능 카운터를 나열합니다.
v_BufferCacheHitRatio 보기는 버퍼 캐시 적중률을 계산합니다.
v_difference 보기는 최대 카운터 값과 최소 카운터 값의 차이를 나열합니다.
v_Access_methods 보기는 액세스 메서드 개체에 대한 모든 카운터를 나열합니다. 다른 카운터를 나열하려면 v_Access_methods 보기의 %:Access Methods%를 다른 개체로 변경합니다.
v_object_names 보기는 모든 성능 개체 이름을 나열합니다.

v_sysperfinfo 보기

CREATE      view v_sysperfinfo asselect top 100 percent  RowNumber,[servername],[starttime],substring(TextData,  1,40) as [object_name],substring(TextData, 41,40) as [counter_name],substring(TextData,81,35) as [instance_name],cast(substring(TextData,116,11) as int) as [cntr_value]  from ActivityTrace where EventClass = 83 order by  substring(TextData, 1,40) ,substring(TextData,41,40) ,substring(TextData,81,35) ,starttime

v_BufferCacheHitRatio 보기

CREATE  view v_BufferCacheHitRatio asselect top 100 percent a.starttime   , cast(substring(a.TextData,116,11) as int) as [hits]   , cast(substring(b.TextData,116,11) as int) as [base]   , cast(((cast(substring(a.TextData,116,11) as int) * 100)   / cast(substring(b.TextData,116,11) as int)) as numeric(6,3))  as [Buffer cache hit ratio] from ActivityTrace a join ActivityTrace b    on datepart(yy,a.starttime) = datepart(yy,b.starttime)  and datepart(mm,a.starttime) = datepart(mm,b.starttime)   and datepart(dd,a.starttime) = datepart(dd,b.starttime)   and datepart(hh,a.starttime) = datepart(hh,b.starttime)   and datepart(mi,a.starttime) = datepart(mi,b.starttime)   and datepart(ss,a.starttime) = datepart(ss,b.starttime)   and substring(a.TextData,41,27) = N'Buffer cache hit ratio     '   and substring(b.TextData,41,27) = N'Buffer cache hit ratio base' order by a.starttime

v_difference 보기

CREATE    view v_difference asselect top 100 percent       substring(TextData,  1,40) as [object_name]      ,substring(TextData, 41,40) as [counter_name]      ,substring(TextData,81,35)  as [instance_name]   ,max(cast(substring(TextData,116,11) as int)) as [maximum]   ,min(cast(substring(TextData,116,11) as int)) as [minimum]   ,max(cast(substring(TextData,116,11) as int))   -min(cast(substring(TextData,116,11) as int)) as [difference]      ,count(*) as [count]      ,datediff(mi,min(StartTime),max(StartTime)) as [minutes]  from ActivityTrace where EventClass = 83 group by       substring(TextData,  1,40)      ,substring(TextData, 41,40)      ,substring(TextData,81,35)having max(cast(substring(TextData,116,11) as int))   -min(cast(substring(TextData,116,11) as int)) > 0order by [difference] desc

v_Access_methods 보기

CREATE view v_Access_methods asselect top 100 percent substring(TextData,41,40) as [counter name],left(starttime,20) as [time],cast(substring(TextData,116,11) as int) as [counter value] from ActivityTrace where substring(TextData,1,40) like '%:Access Methods%' order by substring(TextData,41,40), starttime

v_object_names 보기

create view v_object_names asselect top 100 percent substring(TextData,charindex(':',TextData),25) as [object_name]  from ActivityTrace where EventClass = 83 group by  substring(TextData,charindex(':',TextData),25) order by [object_name]




Microsoft 제품 관련 기술 전문가들과 온라인으로 정보를 교환하시려면Microsoft 뉴스 그룹(http://support.microsoft.com/newsgroups/default.aspx)에 참여하시기 바랍니다.
신고
Posted by The.민군

Linux 및 Windows 환경을 위한 PHP, Oracle 10gInstant Client 설치

PHP 5.1.2 업데이트

저자: Christopher Jones, Consulting Technical Staff, Oracle Corporation
업데이트일: 2006년 1월

Oracle 10gInstant Client (무료로 다운로드가 가능합니다)는 PHP를 원격 오라클 데이터베이스에 연결하기 위한 가장 손쉬운 방법으로, 3 개의 라이브러리만 설치하면 사용이 가능합니다.

PHP에서 Oracle API의 액세스에 사용되는 Instant Client 라이브러리는 OCI8이라는 이름으로 불립니다 (이 이름은 Oracle8 버전에서 최초로 개발되면서 붙여진 것입니다). PHPOracle 8 함수를 이용하여 Oracle 8.1.7, 9.x, 10.x를 직접 호출할 수 있고, 또는PEAR MDB2ADOdb등의 추상화 클래스(abstraction class)를 함께 이용할 수도 있습니다.

구 버전의 PHP “oracle” 익스텐션을 Instant Client에서 이용하는 것도 가능하지만, 이 경우에는 (오라클에 의해 더 이상 지원되지 않는) 구 버전의 Oracle API가 사용됩니다. 이러한 이유로, PHP 커뮤니티와 오라클은 새로운 개발작업에서 이 익스텐션을 사용하는 것을 권장하지 않고 있습니다.

Apache 환경에서 PHP 4 또는 PHP 5와 함께 Instant Client를 사용하기 위한 방법이 아래에 설명되어 있습니다. (5.1.2와 OCI8 익스텐션에 관련한 상세한 정보는이 섹션을 참고하시기 바랍니다.) Instant Client에는 오라클 데이터베이스가 포함되어 있지 않으므로, 별도의 데이터베이스 환경이 미리 구축되어 있어야 합니다.

일반적으로 데이터베이스는 다른 머신에서 운영됩니다. 데이터베이스가 로컬에 설치된 경우에는, 필요한 오라클 컴포넌트가 이미 사용 가능하므로, Instant Client를 따로 설치할 필요가 없습니다.

소프트웨어 요구사항:

소프트웨어참고
Oracle Instant Client"Instant Client Package - Basic"을 다운로드합니다. Linux 환경의 경우, "Instant Client Package - SDK"를 함께 다운로드합니다.
Apache HTTPD ServerPHP 커뮤니티는 Apache 1.3을 권장하고 있습니다.
PHP - PHP Hypertext ProcessorVersion 4.3 또는 이후 버전

Windows 환경에서 PHP OCI8 Extension 활성화하기

Instant Client 바이너리는 PHP에 포함된 Windows용 바이너리를 보완하는 역할을 담당하게 됩니다.

  1. (installer build가 아닌) PHP 바이너리 zip 파일과 Apache를 다운로드합니다. PHP 매뉴얼의Windows 시스템 설치 가이드를 참고하여 설치 작업을 수행합니다. OTN의오픈 소스 개발자 센터에서 "Oracle, PHP, and Apache on Windows 2000/XP 환경의 Oracle, PHP, Apache 설치,"와 같은 유용한 기술정보를 참고하실 수 있습니다. 이 문서에는 Oracle 10g를 전체 설치하는 방법이 설명되어 있습니다 (Instant Client 설치 시에는 이 작업이 필요하지 않습니다).

    다음 단계로 진행하기 전에 PHP가 제대로 동작하는지 확인합니다. 이 단계에서는 오라클 연동 기능은 지원되지 않습니다.

  2. OTN의Instant Client 페이지에서 Instant Client Basic package for Windows를 다운로드합니다. zip 파일의 사이즈는 대략 30 MB 정도 됩니다.

  3. 서브디렉토리(예: c:\instantclient10_1)를 생성하고 zip 파일로부터 아래 라이브러리를 복사합니다:

    • oraociei10.dll
    • orannzsbb10.dll
    • oci.dll

    3개 파일의 총 용량은 약 80MB 정도 됩니다.

    PHP의 구 버전 oracle extension을 사용하려는 경우, oci.dll 대신 ociw32.dll을 복사합니다 (이 익스텐션을 활성화하려면 php.ini 파일에서 "extension=php_oracle.dll"로 설정합니다.)

  4. PATH 환경변수를 편집하여 “c:\instantclient10_1”가 다른 오라클 디렉토리의 앞에 위치하게 합니다.

    Windows 2000의 경우,시작 -> 설정 -> 제어판 -> 시스템 -> 고급 -> 환경 변수로 이동하여 시스템 변수 목록의 PATH를 편집합니다.

    tnsnames.ora 파일을 이용하여 Oracle Net 서비스 네임을 정의한 경우, tnsnames.ora를 c:\instantclient10_1로 복사하고 사용자 환경변수 TNS_ADMIN을 c:\instantclient10_1로 복사합니다. 디폴트 서비스 네임은 사용자 환경변수 LOCAL에 추가로 설정할 수 있습니다.

    NLS_LANG과 같은 Oracle globalization language 환경변수를 필요에 따라 설정합니다. 아무것도 설정되지 않은 경우, 디폴트 로컬 환경이 그대로 사용됩니다. 자세한 정보는An Overview on Globalizing Oracle PHP Applications문서를 참고하십시오.

    Unset unnecessary Oracle variables such as ORACLE_HOME and ORACLE_SID.

  5. php.ini를 편집하고 OCI8 익스텐션의 커멘트 기호를 삭제합니다:

    extension=php_oci8.dll

    extension_dir 항목에 PHP 익스텐션 DLL의 전체 경로를 설정합니다. PHP4의 경우 DLL은 PHP 소프트웨어의 “extensions” 서브디렉토리에 위치합니다. PHP5에서는 “ext” 서브디렉토리에 위치합니다.

  6. Apache를 재시작합니다.

익스텐션이 설정되었음을 확인했다면, 웹 서버에서 접근할 수 있는 위치에 간단한 PHP 스크립트(phpinfo.php)를 생성합니다.

<?php  phpinfo();?>

"http://" URL을 사용하여 브라우저에서 스크립트를 로드합니다. 브라우저 페이지의 "oci8" 섹션에서 "OCI8 Support enabled"라는 문구를 확인할 수 있어야 합니다.

Linux에서 PHP OCI8 Extension 활성화하기

Linux 환경에서 오라클 연결을 추가하려면, 먼저 PHP를 다시 컴파일해야 합니다.

OTN의오픈 소스 개발자 센터에서 "Linux에서 Oracle, PHP, Apache 설치하기",와 같은 유용한 기술정보를 참고하실 수 있습니다. 이 문서에는 Oracle 10g를 전체 설치하는 방법이 설명되어 있습니다 (Instant Client 설치 시에는 이 작업이 필요하지 않습니다.

  1. Apache를 다운로드하여 설치합니다. 사용자의 홈 디렉토리에 Apache를 설치하는 예가 아래와 같습니다:
    cd apache_1.3.31./configure --enable-module=so --prefix=$HOME/apache --with-port=8888makemake install

    $HOME/apache/conf/httpd.con을 편집하여 아래 항목을 추가합니다:

    AddType application/x-httpd-php        .phpAddType application/x-httpd-php-source .phps
  2. PHP를 다운로드하여 tar 압축을 풉니다.
  3. OTN의Instant Client 페이지에서 Basic/SDK Instant Client Package를 다운로드합니다. 두 RPM의 전체 크기는 약 30MB 가량 됩니다.
  4. root 사용자로 RPM을 설치합니다.
    rpm -Uvh oracle-instantclient-basic-10.1.0.3-1.i386.rpmrpm -Uvh oracle-instantclient-devel-10.1.0.3-1.i386.rpm

    첫 번째 RPM은 오라클 라이브러리를 /usr/lib/oracle/10.1.0.3/client/lib에 설치하고, 두 번째 RPM은 /usr/include/oracle/10.1.0.3/client에 헤더를 생성합니다.

  5. 백업 후이 패치를 PHP의 ext/oci8/config.m4에 적용합니다. 패치 라인 넘버는 PHP 4.3.9를 기준으로 하고 있습니다. (PHP 4.3.11와 5.0.4의 경우처럼)PHP bug 31084가 해결되었다면 이 패치를 적용할 필요는 없습니다.

    PHP 4.3.9 또는 4.3.10을 사용하는 경우에는 이 패치를 파일(예: php_oci8ic_buildpatch)에 저장한 후 아래와 같이 설치합니다:

    patch -u config.m4 php_oci8ic_buildpatch

    위 패치를 실행하면 새로운 PHP 설정 매개변수 --with-oci8-instant-client[=DIR]이 생성됩니다. Linux 운영체제는 기본적으로 RPM을 통해 설치된 Instant Client의 최신 버전을 사용합니다. 오라클 라이브러리의 경로를 지정함으로써 다른 버전을 사용하도록 할 수도 있습니다. 어떤 경우든 버전에 맞는 SDK 헤더가 자동적으로 적용됩니다.

    새로운 매개변수는 기존의 --with-oci8 매개변수를 대체합니다.

    참고: Linux 이외의 운영체제에서는, 사용자가 선택한 디렉토리에 Instant Client 패키지의 압축을 풀게 됩니다. --with-oci8-instant-client 매개변수를 사용하려면 이 디렉토리를 명시적으로 지정해 주어야 합니다 (예: --with-oci8-instant-client=/home/instantclient10_1) Instant Client SDK는 Basic Package와 같은 디렉토리에 압축을 풀어야만, 재구성된 configure 스크립트에서 헤더 파일의 서브디렉토리를 정확하게 찾을 수 있습니다.

  6. “configure” 스크립트를 최상위 PHP 디렉토리에서 rebuild 합니다.
    cd php-4.3.9rm -rf autom4te.cache config.cache./buildconf --force
  7. 새로운 옵션을 이용하여 configure를 실행합니다. 홈 디렉토리에 Apache를 설치한 환경에서의 실행 예가 아래와 같습니다.
    ./configure \      --with-oci8-instant-client \      --prefix=$HOME/php --with-apxs=$HOME/apache/bin/apxs \      --enable-sigchild --with-config-file-path=$HOME/apache/conf
  8. PHP를 rebuild합니다.
    makemake install
  9. php.ini 파일을 --with-config-file-path에서 지정된 위치에 복사합니다.
    cp php.ini-recommended $HOME/apache/conf/php.ini
  10. LD_LIBRARY_PATH를 /usr/lib/oracle/10.1.0.3/client/lib으로 설정하고 Apache를 재시작합니다.

    tnsnames.ora 파일을 이용하여 Oracle Net 서비스 네임을 정의한 경우, TNS_ADMIN을 파일이 위치한 디렉토리로 설정해 줍니다.

    Apache를 시작하기 전에 모든 오라클 환경 변수를 설정해 주는 것이 중요합니다. 스크립트의 예가 아래와 같습니다:

    #!/bin/shAPACHEHOME=/home/apacheLD_LIBRARY_PATH=/usr/lib/oracle/10.1.0.3/client/lib:${LD_LIBRARY_PATH}TNS_ADMIN=/homeexport LD_LIBRARY_PATH TNS_ADMINecho Starting Apache $APACHEHOME/apachectl start
익스텐션의 설정을 확인한 후, 웹 서버가 접근할 수 있는 위치에 간단한 PHP 스크립트(phpinfo.php)를 생성합니다.
<?php  phpinfo();?>

URL("http://localhost:8888/<path>/phpinfo.php”)을 사용하여 스크립트를 브라우저에 로드합니다. 브라우저 페이지의 "oci8" 섹션에서 "OCI8 Support enabled"라는 문구를 확인할 수 있어야 합니다.

오라클로의 연결

오라클 연결을 생성하려면 먼저 오라클 연결 정보를 OCILogon()에 전달해 주어야 합니다. Instant Client와 관련된 모든 툴은 데이터베이스 서버의 “원격”에 위치하며, 따라서 사용자 이름, 암호와 함께 Oracle Net connection identifier가 사용되어야 합니다. 기존에 구성된 오라클 데이터베이스에 대한 연결 정보는 외부에서 “well-known” 정보로 확인이 가능합니다. 새로 구성된 시스템에서는 데이터베이스 셋업 과정에서 오라클 설치 프로그램에 의해 설정됩니다. 인스톨러는 Oracle Net 설정 및 서비스 네임 생성 작업을 수행합니다.

새로운 데이터베이스에서 HR와 같은 샘플 스키마를 사용하려면 unlock 작업을 수행하고 암호를 입력해야 할 수 있습니다. 이를 위해 SQL*Plus에서 SYSTEM 사용자로 연결한 뒤 아래와 같이 실행해 줍니다:

ALTER USERusernameIDENTIFIED BYnew_passwordACCOUNT UNLOCK;
연결 정보를 PHP에 전달하는 방법에는 여러 가지가 있습니다. 먼저 Oracle 10g의 Easy Connect 신택스를 이용하여mymachine에서 실행 중인 the MYDB 데이터베이스 서비스의HR스키마에 연결하는 방법이 아래와 같습니다. 이 경우 tnsnames.ora 또는 다른 Oracle Network 파일이 필요하지 않습니다:
$c = OCILogon('hr', 'hr_password', '//mymachine.mydomain/MYDB');

Easy Connect 신택스 관련 오라클 문서(Using the Easy Connect Naming Method)를 참고하시기 바랍니다.

또는, /home/tnsnames.ora에 다음과 같은 내용이 포함된 경우:
MYDB = (DESCRIPTION =   (ADDRESS = (PROTOCOL = TCP)(HOST = mymachine.mydomain)(PORT = 1521))   (CONNECT_DATA =      (SERVER = DEDICATED)      (SERVICE_NAME = MYDB)    )  )

그리고 TNS_ADMIN 환경변수가 (Apache 시작 이전에) /home으로 설정된 경우, 연결 문자열을 아래와 같이 설정할 수 있습니다:

$c = OCILogon('hr', 'hr_password', 'MYDB');
환경변수 LOCAL(Windows) 또는 TWO_TASK(Linux)가 MYDB로 설정된 경우, MYDB로의 연결을 위한 문자열이 다음과 같습니다:
$c = OCILogon('hr', 'hr_password');

Oracle의 사용

기본적인 연결에 성공했다면, 간단한 스크립트(testoci.php)를 테스트해 볼 차례입니다. 사용자의 데이터베이스 환경에 맞게 연결 설정을 수정한 후 브라우저에서 스크립트를 로드합니다. HR 사용자가 소유한 모든 테이블의 목록을 표시하는 스크립트 예가 아래와 같습니다:

<?php$conn = OCILogon("hr", "hr_password", '//mymachine.mydomain:port/MYDB);$query = 'select table_name from user_tables';$stid = OCIParse($conn, $query);OCIExecute($stid, OCI_DEFAULT); while ($succ = OCIFetchInto($stid, $row)) {    foreach ($row as $item) {      echo $item." ";    }    echo "<br>\n"; } OCILogoff($conn); ?>
트러블슈팅

Oracle PHP Troubleshooting FAQ에서 오라클 연결에 관련한 유용한 정보를 확인하실 수 있습니다.

오라클의 SQL*Plus 커맨드라인 툴을Instant Client 페이지에서 다운로드하여 환경 및 연결 문제를 해결하는데 이용할 수 있습니다.SQL*Plus Instant Client Release Notes를 참고하시기 바랍니다.

SQL*Plus를 이용하여 환경을 점검하는 방법은 phpino.php 스크립트의 예와 동일합니다.

Windows 도움말

phpinfo.php 스크립트를 실행했을 때 “oci8” 섹션에서 "OCI8 Support enabled" 메시지를 확인할 수 없다면, php.ini 파일에서 "extension=php_oci8.dll" 항목의 주석 처리가 해제되었는지 점검합니다.

PATH가 잘못 설정되어 있거나 오라클 라이브러리를 찾을 수 없는 경우, Apache 시작 시 다음과 같은 경고 메시지가 표시됩니다: "The dynamic link library OCI.dll could not be found in the specified path." phpinfo() 페이지의 Environment 섹션에서, PHP에 의해 실제로 사용되는 PATH와 Oracle 변수의 값을 확인할 수 있습니다.

php.ini에 extension_dir 매개변수가 올바르게 설정되지 않은 경우 Apache 시작 시 다음과 같은 경고 메시지가 표시됩니다: "PHP Startup: Unable to load dynamic library php_oci8.dll."

Linux 도움말

config.m4가 올바르게 패치되었는지 확인합니다. “configure”의 실행에 실패한 경우, config.log 파일을 점검합니다. config.m4를 이전 상태로 되돌리고 캐시 파일을 제거한 후 “./buildconf --force and configure”를 실행한 다음, 발생한 문제가 패치 작업과 관련된 것인지 확인합니다.

“configure”의 타임스탬프가 현재 시점으로 설정되어 있는지 확인합니다. 캐시 파일을 모두 제거하고 필요한 경우 rebuild 작업을 수행합니다.

Apache를 시작하는 쉘에서 필요한 모든 Oracle 환경변수를 설정해 줍니다.

PHP 5.1.2 및 이후 버전

“re-factored” OCI8 익스텐션은 Instant Client를 위한 새로운 신택스를 지원합니다. re-factored 익스텐션은 PHP 5.1.2에 처음으로 포함되었으며, 이전 버전의 PHP의 경우pecl.php.net/package/oci8,pecl4win.php.net/ext.php/php_oci8.dll에서 다운로드할 수 있습니다.

Technical Note에 명시된 대로 Instant Client RPM을 설치했다면, PHP를 아래와 같이 설정해 줍니다:

./configure \    --with-oci8=instantclient,/usr/lib/oracle/10.1.0.3/client/lib \    --prefix=$HOME/php --with-apxs=$HOME/apache/bin/a pxs \    --enable-sigchild --with-config-file-path=$HOME/apache/conf
Instant Client Basic, SDK zip 파일을 사용하는 경우, 압축을 푼 디렉토리의 --with-oci8 옵션을 변경해 줍니다. 그 예가 아래와 같습니다:
--with-oci8=instantclient,$HOME/instantclient10_1
re-factored 버전이 올바르게 설치되었는지 점검하려면 phpinfo() 실행 결과를 확인하면 됩니다. “oci8.” 접두어로 시작되는 7가지 매개변수를 확인할 수 있을 것입니다 (이전 버전에서는 이 매개변수가 존재하지 않습니다).

결론

이 문서가 여러분에게 도움이 되었기를 바랍니다. 질문이나 의견은 OTNInstant Client또는PHP포럼에 올려 주시기 바랍니다.

신고
Posted by The.민군

DBA를 위한 Linux 쉘 스크립팅 입문
저자 Casimir Saternos

Linux 환경에서 오라클 데이터베이스를 설치, 운영, 유지보수 하는데 필요한 기본적인 bash 쉘 스크립트를 소개합니다.

아티클 관련 다운로드:
사용자 삽입 이미지Sample scripts
사용자 삽입 이미지Oracle Database 10g

게시일: 2005년 11월

지금으로부터 7년 전, 오라클은 Linux 운영체제를 위한 최초의 상용 데이터베이스를 발표하였습니다. 그 이후로, Oracle, Red Hat, Novell/SUSE 등의 벤더가 서로 협력하며 데이터베이스 및 애플리케이션 성능을 최적화한 Linux 커널을 개발해 왔습니다. 이러한 이유로, Oracle Database 10gfor Linux는 운영체제와 긴밀하게 연관된 개선 기능을 포함하고 있습니다. 이제 DBA들에게도 Linux 기반 시스템을 최적의 상태로 관리하기 위한 경험과 지식이 필요하게 되었습니다.

시스템 관리자와 DBA 사이에는 고전적인 역할의 구분이 이루어져 왔습니다. 하지만 실제 상황에서 이러한 구분이 항상 명확한 것은 아닙니다. 많은 IT 조직은 데이터베이스와 운영체제를 동시에 책임지는 직원들을 고용하기도 합니다. 또 오라클 데이터베이스 역시 운영체제의 리소스와 밀접한 연관성을 가지고 있으며, 주어진 환경과 긴밀한 통합을 이루도록 설계되어 있습니다.

또 많은 시스템 관리자와 DBA들은 자신들이 담당하는 업무를 자동화하기를 원하고 있습니다. 소프트웨어의 설치, 시스템 리소스의 모니터링, 시스템의 관리와 같은 반복적이고 오류 가능성이 높은 작업들은 자동화된 프로세스를 통해 처리하는 것이 훨씬 효율적입니다.

이러한 작업을 자동화하는 방법의 하나로 쉘 스크립팅을 활용할 수 있습니다. 시스템이 시작되고 셧다운 되는 과정에서 다양한 스크립트가 호출됩니다. 오라클 및 써드 파티 벤더가 제공하는 유틸리티들 역시 쉘 스크립트를 통해 호출됩니다. 쉘 스크립트는 쉽고 빠르게 개발할 수 있다는 장점 때문에 애플리케이션 프로토타입 개발을 위한 도구로 오랜 기간 활용되어 왔습니다. 시스템 관리자들은 쉘 스크립팅이 제공하는 기능들을 이용하여, 주어진 환경에 맞춤화된 솔루션을 개발하고 있습니다.

본 문서에서는, Linux 플랫폼에서 오라클 데이터베이스를 설치, 운영, 유지보수 하는데 필요한 기본적인 “bash” 쉘 스크립트를 소개합니다. 본 문서는 Linux 스크립트에 처음 입문하는 사용자, 또는 Linux를 처음 접하는 DBA를 대상으로 작성되었으므로, 경험이 많은 Linux 시스템 관리자들에게는 크게 도움이 되지 않을 수도 있음을 참고하시기 바랍니다.

쉘 스크립트란 무엇인가?

쉘 스크립트란 일련의 명령을 포함하는 텍스트 파일입니다. 사용자가 이 파일을 실행하면, 파일에 포함된 명령이 순서대로 실행되게 됩니다. 쉘(shell)이란 Linux 커널과의 커뮤니케이션을 위해 사용하는 커맨드라인 사용자 인터페이스를 지칭하는 용어로, C 쉘(csh), Korn 쉘(ksh), Bourne 쉘(sh), Bourne-Again 쉘(bash) 등이 널리 사용되고 있습니다. 쉘은 파일 또는 터미널로부터 입력된 라인을 읽어 해독 과정을 거친 후 커맨드를 실행하는 역할을 담당하며, 이러한 점에서 쉘 역시 커맨드의 일종으로 볼 수 있습니다. Bourne-Again (bash) 쉘은 위에서 언급된 쉘들의 기능을 대부분 포함하고 있으며, 본 문서에서도 bash 쉘을 이용하여 스크립트 작성 방법을 설명하게 될 것입니다.

스크립트 파일의 첫 번째 라인에는 스크립트를 실행할 때 어떤 쉘을 사용할 것인지 정의하게 됩니다. 그 예가 다음과 같습니다:

#!/bin/bash
쉘 스크립트를 사용하는 이유는 무엇인가?

DBA 경험이 어느 정도 있는 사용자라면 쉘 스크립팅이 갖는 가치에 대해 이미 잘 알고 있을 것입니다. 하지만 UNIX 시스템의 경험이 없는 사용자에게, 암호처럼 얽힌 쉘 커맨드는 무척 어지럽고 성가시게 보일 수도 있습니다. 또 한편으로, Oracle 10g가 데이터베이스 외부의 운영체제 레벨에서 데이터를 처리하기 위한 안정적인 플랫폼을 함께 제공하고 있기도 합니다.

하지만 쉘 스크립트를 사용해야 할 이유는 여러 곳에서 찾아볼 수 있습니다. 그 몇 가지 예가 아래와 같습니다:

  • 이미 구현된 스크립트를 관리해야 하는 경우.

  • 오라클 소프트웨어를 설치하기 전에 수행되는 시스템 셋업 작업을 자동화하고자 하는 경우: 예를 들어, OS의 초기 상태를 점검하고 소프트웨어 설치 이전에 필요한 조치사항을 리포트하는 스크립트를 작성할 수 있습니다. 또 오라클 데이터베이스에 필요한 OS 사용자/그룹을 생성하고 환경 변수를 설정해 줄 수도 있습니다.

  • 스크립트 대신 오라클 데이터베이스를 이용하여 스케줄 기반의 작업을 실행할 수도 있습니다. 하지만 데이터베이스가 “실행 중이지 않은” 상태에서 실행되어야 할 작업이 있을 수도 있습니다. 데이터베이스(또는 리스너, 데이터베이스 관련 프로세스 등)를 시작하거나 중단하는 스크립트를 작성할 수도 있습니다. 이러한 작업은 데이터베이스 내부적으로는 처리가 불가능한 것들입니다.

  • 데이터베이스의 상태를 모니터링하기 위한 메커니즘이 필요한 경우(예: 데이터베이스가 쿼리를 처리할 수 있는 상태인지 확인해야 하는 경우): 예를 들어 오라클과 직접적으로 연관되지 않은 프로세스와 리소스를 모니터링하는 스크립트를 작성하여 시스템의 상황을 보다 폭넓게 확인할 수 있습니다.

  • 백업의 자동화: Oracle Recovery Manager(RMAN)는 백업 스크립트의 개발을 위한 플랫폼 중립적인 유틸리티입니다. 쉘 스크립트에서 Oracle Recovery Manager를 호출하고 백업 및 복구 작업을 위해 활용할 수 있습니다.

  • 다양한 데이터베이스 제품을 동시에 지원해야 하는 환경: 여러 종류의 데이터베이스를 동시에 운영할 필요가 있을 수 있습니다. 단일 데이터베이스 제품으로 모든 요구사항을 만족하기 어려울 수도 있고, 특정 제품에 관련한 보안 관련 이슈가 제기될 수도 있습니다. 이러한 상황이라면, 특정 데이터베이스에 종속되지 않은 쉘 스크립팅을 활용하여 요구사항을 해결하는 것이 바람직할 것입니다.

쉘 스크립트의 적용이 바람직하지 않은 경우

오라클 데이터베이스에는 고전적인 RDBMS의 한계를 뛰어넘는 다양한 기능이 포함되어 있습니다. 다른 소프트웨어와 마찬가지로, 오라클 데이터베이스는 운영체제에서 제공되는 리소스를 사용합니다. 하지만 주변 환경을 인지하고 변경하는 능력은 다른 소프트웨어의 수준을 훨씬 뛰어넘습니다. SQL과 오라클의 고정 뷰(fixed view)를 이용하면 데이터베이스 내부로부터 시스템 전체를 조망하는 것이 가능합니다. 이에 반해, 쉘 스크립트는 데이터베이스 외부에서 바라본 시스템 뷰를 제공합니다. 쉘 스크립팅이 만병통치약이 될 수 없는 이유가 여기에 있습니다.

먼저, 운영체제 환경의 대부분을 데이터베이스 내부에서 모니터링하거나 변경하는 것이 가능하다는 사실을 인지할 필요가 있습니다. 오라클의 고정 뷰(fixed view, v$ 접두어를 가진 뷰)를 이용하면 서버(v$instance) 또는 데이터베이스가 실행중인 플랫폼(v$database)의 정보를 확인할 수 있습니다. 데이터베이스에 관련된 파일의 위치 및 속성도 같은 방법으로 확인이 가능합니다. 데이터파일(v$datafile, dba_data_files), temp 파일(v$tempfile, dba_temp_files), 리두 로그(v$logfile), 아카이브 로그(v$archived_log), 컨트롤 파일(v$controlfile) 등의 위치와 기타 속성을 데이터베이스로부터 직접 쿼리할 수도 있습니다. Flash Recovery Area($recovery_file_dest)에 대한 정보, 또는 init.ora 매개변수(db_recovery_file_dest, db_recovery_file_dest_size), 프로세스(v$process), 메모리(v$sga, v$sgastat) 등에 관련한 정보 역시 쉽게 확인이 가능합니다. 그 밖에도 다양한 PL/SQL 패키지가 제공되며, 하부 OS에 대한 액세스를 지원하는 Java/C 데이터베이스 오브젝트의 개발이 가능합니다.

데이터베이스 액세스가 빈번하게 요구되는 작업이라면, 스크립팅이 최선의 대안이 되기 어려울 것입니다. 뒷부분에서 설명하겠지만, SQL*Plus를 이용하여 스크립트에서 데이터베이스에 액세스하는 것이 가능합니다. 하지만 다른 언어를 이용하여 문제를 해결하는 것이 더 쉬울 가능성이 높습니다.

아래 표는 데이터베이스 내부로부터 접근 가능한 정보의 목록을 요약하고 있습니다:

서버/OS 정보

서버 정보의 확인

쿼리

설명

인스턴스가 실행 중인 서버의 이름

select host_name
from v$instance;

bash에서 같은 정보를 얻기 위해 사용할 수 있는 명령이 아래와 같음:

hostname

or

uname –n

운영 체제 플랫폼

select platform_name from v$database –-(10g)

아래 명령을 사용하여 같은 정보를 확인할 수 있음

uname –s

파일 정보

오라클 파일의 위치

쿼리

설명

컨트롤 파일

select name
from v$controlfile;

데이터베이스 컨트롤 파일의 위치. init.ora 파일의 control_files 매개변수에도 같은 정보가 정의되어 있음.

데이터파일

select file_name
from Dba_data_files;

데이터베이스 데이터파일의 위치

Temp 파일

select file_name
from Dba_temp_files;

데이터베이스 임시 파일의 위치

로그 파일

select member
from v$logfile;

리두 로그의 위치

아카이브 로그

select name
from v$archived_log

아카이브 리두 로그의 위치. init.ora 파일의 log_archive_dest_n 매개변수에도 같은 정보가 정의되어 있음. 데이터베이스가 아카이브 모드로 설정되지 않은 경우에는 쿼리 결과가 반환되지 않음.

Flash recovery area

select name
from v$recovery_file_dest

Oracle 10g에서 Flash Recovery Area를 위해 사용하는 디렉토리의 위치. init.ora 파일의 db_recovery_file_dest 매개변수에도 같은 정보가 정의되어 있음.

기타 매개변수에 정의된 파일 시스템 접근 위치

select *
from v$parameter

where value like '%/%'

or

value like '%/%';

쿼리 결과는 오라클 데이터베이스 버전에 따라 크게 달라질 수 있음. 반환되는 매개변수 값이 아래와 같음:

spfile
standby_archive_dest
utl_file_dir
background_dump_dest user_dump_dest
core_dump_dest
audit_file_dest
dg_broker_config_file1
dg_broker_config_file2

파일시스템 관련 경로 정보 표시

select directory_path from dba_directories

표준 데이터베이스 기능으로 포함되지 않은 파일에 액세스하기 위해 Oracle UTL_FILE_DIR 매개변수와 DIRECTORY 데이터베이스 오브젝트를 사용할 수 있음.

프로세스 정보

프로세서/프로세스

쿼리

설명

세션 프로세스

select p.spid, s.username, s.program

from v$process p, v$session s

where p.addr=s.paddrorder by 2, 3, 1

spid와 ps –ef 실행 결과를 조합하여, 특정 프로세스의 OS 정보와 데이터베이스 정보를 비교할 수 있음.

parallelism 관련 프로세스

select slave_name, status
from v$PQ_SLAVE

Parallelism을 이용하여 로드, 쿼리, 오브젝트 생성, 복구, 복제 등의 데이터베이스 작업 성능을 개선할 수 있음. parallel_threads_per_cpu 매개변수는 인스턴스의 디폴트 “degree of parallelism”을 정의하는데 사용됨.

메모리 정보

메모리

쿼리

설명

Program Global Area

select * from V$PGASTAT

pga_aggregate_target 매개변수는 서버 연결을 위해 사용되는 메모리 사이즈의 설정을 위해 사용됨.

vmstat, top 등의 Linux 유틸리티를 사용하여 메모리 사용 현황을 모니터할 수 있음.

System Global Area

select * from v$sga



SGA_MAX_SIZE, SGA_TARGET 매개변수는 Oracle Database 10g의 다이내믹 메모리 할당 기능을 설정하는 용도로 사용됨. 또 다른 매개변수를 이용하면 특정 목적을 위해 메모리를 수동으로 할당할 수 있음.

메모리 할당 내역을 모니터하기 위해 다양한 Linux 유틸리티를 활용할 수 있음.

BASH 스크립트

스크립트는 (사용자의 개입이 없는) 자동화된 프로세스의 일부로써, 또는 (사용자의 입력을 요구하는) 인터액티브한 작업의 일부로써 실행될 수 있습니다. 파일의 실행 권한을 갖고 있다면, 커맨드라인에서 파일 이름을 입력하여 직접 실행하는 것도 가능합니다. 파일의 실행 권한은 없는 대신 읽기 권한을 갖고 있는 경우에도sh명령을 이용하여 스크립트를 실행할 수 있습니다.

스크립트가 사용자의 입력 없이 실행되도록 프로그래밍된 경우, 다양한 호출 방법을 이용할 수 있습니다. 스크립트를 백그라운드에서 실행하여, 세션이 끊어진 경우에도 계속 실행되도록 하려는 경우는 아래와 같이 커맨드를 입력합니다:

nohup /path_to_dir/myscript_here.sh &
이 옵션은 오랜 실행시간을 갖는 스크립트를 실행할 때 유용하게 활용됩니다.at커맨드는 정해진 시간에 스크립트를 실행하는 명령,cron은 스케줄 기반으로 스크립트를 실행하기 위한 명령입니다.

지금부터 스크립트의 출력 전환, 루프, 조건부 로직, 변수 할당 등에 관련한 기초적인 내용을 설명하겠습니다.

print_args.sh.매개변수(argument)는 커맨드의 오른쪽에 위치하여 스크립트에 함께 전달되는 문자열을 의미합니다. 첫 번째 매개변수에 접근하기 위해서는 $1 변수가 사용됩니다. $0 변수는 스크립트의 이름을 저장하는 용도로 사용됩니다. $# 변수는 스크립트에서 사용되는 매개변수의 수를 의미합니다. 스크립트에서 전달되는 매개변수를 일괄적으로 확인하기 위해서는while루프와 shift 커맨드를 사용하는 것이 일반적입니다. 이 커맨드를 이용하면 매개변수 리스트에 존재하는 모든 매개변수를 순서대로 확인하는 것이 가능합니다.

while [ $# -ne 0  ]do        echo $1        shiftdone
스크립트가 파일 이름을 매개변수로 받고 (또는 파일 이름의 입력을 요구하고) 뒷부분에서 해당 파일을 읽는 작업을 수행하는 경우, 먼저 파일의 접근 및 읽기가 가능한지 확인하는 과정을 넣어 주어야 합니다. 예를 들어, 백업된 컨트롤 파일 중 하나를 선택하는 과정을 포함하는 복구용 스크립트의 경우, 아래와 같은 확인 과정이 필요합니다.
if [ ! -r $1 ]; then # not exists and is readable          echo "File $1 does not exist or is not readable."         exit;fi
실제로 파일에 대해 테스트를 수행하기 위한 코드가 아래와 같습니다.
if [ ! -r $1 ];
대괄호([]) 안의 컨텐트가 TRUE인 것으로 평가되는 경우, if와 fi 사이에 정의된 커맨드가 실행되게 됩니다. 실제 테스트할 내용은 대괄호 안에 정의됩니다. 느낌표는 NOT의 의미를 갖습니다.-r옵션은 파일이 읽기 가능한지를 점검합니다. 위 스크립트에서는 스크립트와 함께 전달된 첫 번째 매개변수를 테스트하고 있습니다. 다른 테스트 옵션(-d)을 사용하면, 입력된 항목이 디렉토리인지 확인할 수 있습니다 (is_a_directory.sh 참고).

do_continue.sh.다음은 여러 가지 목적으로 사용자 입력을 읽어 들이는 일련의 커맨드로 구성된 스크립트입니다. 데이터의 손실 또는 예기치 않은 에러가 발생할 수 있는 프로세스를 실행하기 전에, 다음 단계의 커맨드를 정말로 실행할 것인지 사용자의 확인을 거치는 절차가 필요할 수 있습니다. 아래 예제에서는 사용자가 정말로 계속하기를 원하는지 묻는 프롬프트를 띄운 후, 커맨드라인으로부터doContinue라는 이름의 변수를 읽어 들이고, 사용자가 입력한 값을 평가하고 있습니다. 사용자가 “y” 이외의 다른 값을 입력한 경우, 스크립트를 종료한다는 메시지를 사용자에게 띄운 후 스크립트의 나머지 부분을 실행하지 않고 바로 종료 처리합니다.

doContinue=necho -n "Do you really want to continue? (y/n) " read doContinueif [ "$doContinue" != "y" ]; then      echo "Quitting..."      exitfi
적절한 권한과 환경을 갖춘 사용자만이 스크립트를 실행할 수 있도록 하는 것은 매우 중요합니다. 이 경우 스크립트를 실행하는 사용자가 누구인지 확인하는 과정이 필요하게 됩니다. 커맨드를 역인용부호(‘) 문자로 둘러싸면, 커맨드의 실행 결과가 스크립트로 반환되도록 할 수 있습니다. 아래 예제는 whoami 명령을 사용하여 현재 로그온한 사용자를 반환하고, date 커맨드를 이용하여 날짜를 확인하고 있습니다.
echo "You are logged in as 'whoami'";if [ ‘whoami‘ != "oracle" ]; then  echo "Must be logged on as oracle to run this script."  exitfiecho "Running script at ‘date‘"
오라클 데이터베이스와 연동하도록 작성된 스크립트에서는 데이터베이스 암호와 같은 민감한 정보가 사용될 수 있습니다.stty –echo커맨드는 스크린 echo를 비활성화하여 읽기 작업 과정에서 입력된 정보가 스크린 상에 표시되지 않도록 합니다. 암호 정보를 읽어 들여 변수(아래 예제의pw)에 저장하고 난 뒤에는 다시stty echo명령을 사용하여 디스플레이를 활성화합니다.
stty -echo     echo -n "Enter the database system password:  " read pwstty echo
Oracle 스크립트

파일 중 일부는 오라클 설치환경에 지정된 위치에 존재합니다. 오라클 인벤토리는 /etc/oraInst.loc 파일을 통해 확인할 수 있습니다. /etc/oratab 파일은 서버에 설치된 데이터베이스(또는 다른 오라클 프로그램)을 확인할 때 유용합니다.

get_inv_location.sh.이 스크립트는 앞의 예제에 비해 덜 직관적입니다. 스크립트를 단계별로 나누어서 그 내용을 이해해 보기로 하겠습니다.

먼저 인벤토리 경로를 확인하기 위해서, (파일의 컨텐트를 출력하는)cat커맨드의 실행 결과를 (주어진 패턴과 일치하는 라인을 출력하는 유틸리티인)grep으로 파이프(pipe) 처리합니다. 예제에서는inventory_loc이라는 문자열을 포함하는 라인을 검색하고 있습니다.

cat /etc/oraInst.loc | grep inventory_loc
오라클이 2회 이상 설치되어 두 개 이상의 인벤토리 경로가 존재하는 경우, “#” 기호로 주석 처리된 라인을 제외하도록 설정할 수 있습니다.–v옵션은 주어진 패턴을 포함하는 라인을 제외하도록 합니다.
cat /etc/oraInst.loc |grep -v "#"|grep inventory_loc

위 커맨드의 실행 결과 예가 아래와 같습니다:

inventory_loc=/u01/oraInventory
“>” 리다이렉션을 사용하면 표준 출력을 파일로 재설정할 수 있습니다. 파일이 존재하지 않는 경우에는 생성됩니다. 또 파일이 이미 존재하는 경우에는 덮어쓰기 처리됩니다.

cat /etc/oraInst.loc|grep -v "#"|grep inventory_loc > tmp
인벤토리 위치를 확인했다면, 이제 등호(=) 기호 앞의 데이터를 제거할 차례입니다. 이번에는 cat 커맨드의 실행 결과를 (가변 길이의 필드를 분할하는 용도로 자주 사용되는 패턴-스캐닝 언어인) awk를 이용하여 여러 개의 토큰(token)으로 분할합니다. –F 옵션은 awk가 등호 기호를 구분기호(delimeter)로 사용하도록 설정하는데 이용됩니다. 그런 다음 두 번째 토큰($2), 다시 말해 등호 기호 오른쪽의 전체 문자열을 출력합니다. 결과적으로 인벤토리 경로(/u01/oraInventory)가 얻어집니다.
cat tmp | awk -F= '{print $2}'
원하는 결과가 얻어졌다면 임시 파일은 삭제 처리합니다.

rm tmp
list_oracle_homes.sh.데이터베이스의 ORACLE_HOME 경로를 확인하고자 하는 경우에는 여러 가지 방법이 활용 가능합니다. 데이터베이스 사용자로 로그인하여echo명령으로 $ORACLE_HOME 변수를 출력하는 것이 그 한 예입니다. 또는 /etc/oratab 파일의 내용을 검색하여 주어진 인스턴스와 연관된 이름을 가져올 수도 있습니다. 이 파일의 데이터베이스 엔트리는 아래와 같은 형식을 갖습니다.
$ORACLE_SID:$ORACLE_HOME:<N|Y>:
TESTDB를 ORACLE_SID로 갖는 ORACLE_HOME 엔트리 중 하나를 출력하기 위한 명령이 아래와 같습니다:
cat /etc/oratab | awk -F: '{if ($1=="TESTDB") print $2 }'

그렇다면 /etc/orainst 파일에 존재하는 모든 ORACLE_HOME 엔트리에 대해서 동일한 작업을 반복해 주어야 하는 경우에는 어떻게 해야 할까요? 아래 코드를 이용하면 리스트를 대상으로 한 반복 작업이 가능합니다.

dblist='cat /etc/oratab | grep -v "#" | awk -F: '{print $2 }''for ohome in $dblist ; do  echo $ohomedone
dblist변수는 어레이로 사용되고 있으며, 모든 ORACLE_HOME 경로가 이 변수에 저장됩니다. 코드의 반복 처리를 위해서for루프가 정의되었고, 각각의 엔트리는ohome변수에 저장된 후 표준 출력으로 echo 처리됩니다.

search_log.sh.오라클 소프트웨어에서 관리되는 여러 가지 로그 파일을 모니터하기를 원하는 경우를 생각해 봅시다. 데이터베이스 경고 로그(database alert log)에는 데이터베이스 운영 과정에서 매우 중요한 메시지가 기록됩니다. 또 제품이 설치/삭제되거나 패치가 적용되는 경우에도 별도의 로그 파일이 생성됩니다. 아래 스크립트는 매개변수로 전달된 파일에 대해 검색 작업을 수행하고, “ORA-“라는 문자열이 포함된 모든 라인을 지정된 수신자에게 이메일로 전달합니다.

cat $1 | grep ORA- > alert.errif [ 'cat alert.err|wc -l' -gt 0 ]then        mail -s "$0 $1 Errors" administrator@yourcompany.com < alert.errfi
위 코드는 alert.err 파일에 존재하는 단어의 수를 계산하고 있습니다. 단어 수(wc)가 0보다 큰(-gt) 경우, if 블록의 컨텐트가 실행되고 mail (또는send mail도 사용 가능합니다) 명령을 이용하여 메시지가 전달됩니다. 메시지의 제목에는 실행되는 스크립트($0), 검색되는 로그의 이름($1), 메시지 본분에서 검색 조건(ORA-)과 일치하는 라인의 수 등이 포함됩니다.

ORACLE_HOME, ORACLE_BASE, ORACLE_SID 등의 환경변수를 이용하면 Linux 환경에 저장된 오라클 리소스의 위치를 쉽게 확인할 수 있습니다. Oracle E-Business Suite 11i애플리케이션 인스턴스를 관리하는 경우라면, APPL_TOP, TWO_TASK, CONTEXT_NAME, CONTEXT_FILE 등의 환경변수를 추가로 활용할 수 있습니다. 주어진 환경에서 사용 가능한 환경변수의 전체 목록을 확인하려면, 아래 명령을 실행하여 결과로 저장된 파일(myenv.txt)을 확인합니다:

env > myenv.txt
환경 변수를 여러 가지 방법으로 조합하면, 검색하고자 하는 파일의 위치를 쉽게 확인할 수 있습니다. 예를 들어 경고 로그(alert log)의 위치는 아래와 같이 정의됩니다.
$ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log

본 문서에서 소개된 기본적인 방법을 잘 활용하여, 경고 로그(또는 다른 파일)를 주기적으로 검색하고, 새로 발견된 에러를 이메일로 전송하는 스크립트를 작성하고 스케줄링할 수 있습니다. 그런 다음 로그 컨텐트를 다른 파일에 저장하여, 가장 최근에 발생한 에러 메시지만을 이메일을 통해 전송할 수 있습니다.

Oracle Recovery Manager Scripts.Oracle Recovery Manager(RMAN)는 데이터베이스 백업 및 복구 관리를 위한 유틸리티입니다. RMAN을 이용하여 작성한 백업 스크립트는 플랫폼과 무관하게 동작하기 때문에, 이기종 플랫폼 환경의 관리 업무를 극적으로 단순화할 수 있습니다. RMAN은 하부 운영체제에 의해 호출된 후 스크립트를 전달하는 방식으로 동작합니다. 예를 들어 콜드 백업을 위한 스크립트(cold.sh)는 다음과 같은 내용으로 작성됩니다:

#!/bin/bashrman target / <<EOFshutdown immediate;startup mount;backup spfile;backup database;alter database open;delete noprompt obsolete;quit;EOF
첫 번째 라인은 스크립트가 bash 쉘을 사용함을 정의하고 있습니다. 두 번째 라인은 Oracle Recovery Manager를 호출하고 ($ORACLE_SID 환경변수에 정의된) 타겟 데이터베이스에 OS 사용자 계정으로 로그인함을 의미합니다. 두 번째 라인 마지막의 “<<EOF”는 이후 실행되는 커맨드가 RMAN에 의해 처리됨을 의미합니다. 그리고 마지막 라인의 EOF는 RMAN에 전달되는 커맨드의 마지막 부분임을 정의하고 있습니다. 마지막 라인이 처리된 후 RMAN은 데이터베이스를 셧다운하고 다시 시작하여 데이터베이스를 마운트한 후, 서버 매개변수 파일과 데이터베이스 컨텐트의 백업 작업을 수행합니다. 백업이 완료되면 데이터베이스가 오픈됩니다. 미리 정의된 보존정책의 기준보다 오래된 백업 파일은 자동 삭제됩니다. 백업 스크립트 작성에 관련한 자세한 정보는 RMAN 제품문서를 참고하시기 바랍니다.

야간 백업은 스케줄 기반으로 자동 실행되도록 설정하는 것이 일반적입니다. 위의 스크립트를 호출한 후 표준 출력을 지정된 이메일 주소로 전달하는 방법이 아래와 같습니다:

sh cold.sh | mail -s"Backup `date`" administrator@yourcompany.com

쉘 스크립트를 통해 다른 오라클 유틸리티를 실행하는 것도 물론 가능합니다.tnsping는 오라클 연결 식별자(Oracle connection identifier)가 리스너(listener)에 연결할 수 있는지 확인하는 유틸리티입니다. 데이터베이스 연결 문제를 점검하기 위해 이 유틸리티를 실행하는 예가 아래와 같습니다:

tnsping ptch04 |grep TNS-
데이터베이스 export/import (또는 data pump) 유틸리티 또한 스크립트에서 자주 활용되곤 합니다.

Database Installation.데이터베이스 셋업 과정에서 수반되는 작업의 대부분을 자동화하는 것도 가능합니다. Linux 운영체제에 Oracle 10g를 설치하기 전에, 여러 가지 테스트를 실행하여 패키지의 최소요구버전과 커널 매개변수 설정을 검증하는 작업이 필요합니다. 패키지의 버전은rpm커맨드와–q옵션을 사용하여 확인할 수 있습니다.

rpm -q compat-libstdc++

(“virtual” 또는 “pseudo” 파일시스템으로 구분되는) /proc 파일시스템을 이용하면 시스템의 다양한 설정을 확인할 수 있습니다. /proc 파일시스템에서는 실제 파일이 저장되지 않으며, 그 대신 런타임 시스템 정보가 파일의 형태로 조회될 수 있습니다. 예를 들어 /proc/meminfo는 시스템의 메모리 정보를 포함하고 있으며, “grep MemTotal /proc/meminfo” 명령을 통해 시스템의 전체 메모리 크기를 조회하는 것이 가능합니다. 여기에 앞에서 설명한awk를 적용하면, 킬로바이트 단위로 표시된 메모리 크기 정보를 추출해 낼 수 있습니다:

grep MemTotal /proc/meminfo | awk '{print $2}'
위와 같은 커맨드는 조회 결과에 따라 (시스템 업데이트 등의) 다른 작업이 요구되는 스크립트에서 유용하게 활용됩니다. 샘플 스크립트 중 10gchecks_kernel.sh와 10gchecks.sh는 현재 버전 및 설정과 오라클의 권장 버전/설정을 비교하고 있습니다.

데이터베이스 모니터링.ps커맨드를 이용하면 현재 프로세스 상태를 조회하고, 데이터베이스, 리스너, 스크립트 등의 프로세스가 실행 중인지 확인할 수 있습니다. 현재 서버에서 실행 중인 모든 데이터베이스의 목록을 확인하기 위한 스크립트가 아래와 같습니다:

echo "'ps -ef | grep smon|grep -v grep|awk '{print $8}'| awk -F \"_\" '{print$3}'`"
위 스크립트는 한 눈에 이해하기에는 다소 복잡한 감이 있습니다. 첫 번째로 사용된 명령인ps는, 현재 서버에서 실행 중인 모든 프로세스의 목록을 출력합니다 (-ef옵션은 모든 프로세스의 완전한 목록을 출력하도록 지정하고 있습니다). 다음으로grep은 SMON(Oracle System Monitor 백그라운드 프로세스)의 목록만을 추출하기 위해 사용됩니다. 또 스크립트에서 실행한grep커맨드에 연관된 프로세스도 목록에서 제외시킬 필요가 있습니다. 다음으로awk를 사용하여 리스트의 (시스템 프로세스 네임 정보- ora_smon_<oracle_sid>-에 해당하는) 8번째 컬럼을 추출해 냅니다.awk의 마지막 인스턴스는 “_” 기호를 검색 대상 구분문자로 사용하여,SMON 프로세스를 소유한 데이터베이스 네임을 출력합니다. 이때 “_” 기호를 큰 따옴표 안에 묶고 백슬래시(\) 기호를 앞에 붙여 주어야만 문자를 그대로 처리할 수 있습니다.

exec_sql.sh.앞에서 설명한 것처럼, 사용자가 sqlplus에 접근할 수 있는 경우라면 쉘 스크립트에서 데이터베이스를 조회하는 것도 가능합니다. 아래 예제는 현재 데이터베이스와 세션 연결을 맺고 있는 머신의 리스트를 반환하고 있습니다:

#!/bin/bashoutput='sqlplus -s "/ as sysdba" <<EOF       set heading off feedback off verify off       select distinct machine from v\\$session;       exitEOF'echo $output
이 스크립트는 다른 프로그램으로 커맨드를 입력한다는 점에서 앞의 RMAN 스크립트와 유사합니다. 로컬 운영체제 레벨에서 인증된 연결은 sysdba 계정으로 데이터베이스에 접속합니다. 메시지 출력을 단순화하기 위해, 이 스크립트에서는 SQL*Plus의 heading, feedback, verify 옵션을 비활성화하고 있습니다. 그리고 마지막으로 쿼리의 실행이 완료되면 SQL*Plus의 실행을 종료합니다.

뷰 네임의 “$” 기호 앞에 붙은 더블 백슬래시(\\)는 문자열 처리를 위한 에스케이프 구문(escape sequence)입니다. 첫 번째 백슬래시는 두 번째 슬래시를 에스케이프 처리하고, 두 번째 백슬래시는 “$” 기호를 에스케이프 처리하고 있습니다. (깔끔하지는 못하지만 기능적으로는 완벽한 방법입니다.).

앞에서 설명한 것처럼 데이터베이스에 빈번한 액세스를 요구하는 코드가 필요하다면, 쉘 스크립팅은 결코 최선의 대안이 될 수 없습니다. 이러한 경우라면 스크립트를 PL/SQL, (쉘 스크립팅과 매우 유사한 문법을 사용하는) Perl, Python, Java 또는 그 밖의 언어로 작성하는 방법을 먼저 고려해 보시기 바랍니다.

결론

쉘 스크립팅은 반복적이고 오류의 가능성이 높은 관리 업무를 자동화하기 위한 매우 효과적인 도구로 활용됩니다. 본 문서에서 제공된 예제들은 매우 다양한 형태로 활용 가능하지만, 실제 환경에서 바로 활용하기에는 설명이 부족한 감이 있습니다. 시스템마다 고려해야 할 사항이 다르고 특이한 구성이 존재하기 마련입니다. 관리자는 각 시스템 환경의 요구사항을 만족하는 독자적인 솔루션을 개발할 수 있어야 합니다.

신고
Posted by The.민군
미국의 911테러 이후 전세계 IT시스템의 화두는, 자연재해 또는 테러로 인해 서비스 손실을 입게 될 경우에도 이를 복구할 수 있는 Standby 시스템을 구축하는 것이 되었다. 서버뿐만 아니라 디스크 및 백업장비까지 손실되었을 경우에도 다른 지역에서 서비스를 기동할 수 있는 시스템 구성이 각광받게 된 것이다. 이러한 Standby시스템에서 오라클의 dataguard는 데이터 무손실을 구현할 수 있는 방법으로, 한국에서는 여러 금융기관에서도 사용하고 있다. 여기서는 dataguard에 대한 간단한 소개와 그 구성방법에 대해서 알아본다.

Part 1. dataguard 개요 및 아키텍처

  1)dataguard 란 무엇인가?
  2)switchover and failover
  3)standby DB의 종류
  4)dataguard의 서비스 종류
  5)protection mode
  6)dataguard의 시스템 구성(2가지 종류)

Part 2.standby DB 기동방법

Part 3. 시스템 구축 (실습)
  1)리스너 설정 및 기동
  2)tnsnames.ora 설정
  3)오라클 초기화 파라미터 설정
  4)primary DB를 online backup으로 standby DB 위치로 restore
  5)primary DB에서 standby control file을 생성해서 standby DB로 전송
  6)standby DB에서 사용할 control file을 배치
  7)standby DB 기동
  8)standby DB에 standby redo log file 생성
  9)primary DB에 standby redo log file 생성
  10)standby DB를 recovery managed mode로 기동
  11)log switch 적용
  12)primary DB 점검
  13)standby DB 점검
  14)primary DB 테이블스페이스 생성 및 데이터 입력
  15)standby DB예 데이터 입력 여부 확인
  16)takeover 하기
  17)서비스 원복(takeover)
  18)failover 하기

PartⅠ. dataguard 개요 및 아키텍처

 1) dataguard 란 무엇인가?

   - primary DB와 standby DB를 동기화시켜, primary DB가 하드웨어 장애 등의 문제가 생겼을 경우 standby DB로 failover 또는
     switchover 시킬 수 있는 시스템 구성을 말한다.
   - Oracle Net을 통해서 primary DB의 변경정보를 standby DB로 적용시켜 운영된다.

      사용자 삽입 이미지

 2) switchover and failover

   ① 자동실행이 아니라 DBA가 action을 취해야 한다.

   ② switchover
     - OS 작업 또는 서버 PM작업 시 사용(primary -> standby , standby -> primary)

   ③ failover
     - 디스크 fail 등 긴급상황에서 사용, dataguard 재구성 필요

 3) standby DB의 종류

   ① Physical standby database
     - block 대 block 기반으로 primary DB의 redo log를 적용시켜 standby DB를 동기화

   ② Logical standby database
     - 같은 schema 정의로 공유
     - primary DB의 sql 문장을 standby DB에 적용

 4) dataguard의 서비스 종류

   ① Log transport Services
     - primary DB에서 standby DB로 redo log 정보를 자동으로 전송

   ② Log Apply Services
     - redo log를 standby DB에 적용

   ③ Role Management Service
     - 데이터베이스는 primary/standby로 두 가지의 상대적으로 배타적인 role을 가진다.
       Role Management Service는 log transport service와 log apply service를 failover 또는 switchover의 상황에 동적으로
       변경할 수 있다.

 5) protection mode

   ① Maximum Protection - primary    DB와 standby DB의 redo log를 동기화 시킨다.
      standby DB가 네트워크 이상 등의 이유로 standby로의 전송이 안될 경우 primary DB를 halt시킨다.
      데이터는 서로 동기화되어 primary DB에서 commit을 하게 되면 standby DB에서 commit이 완료될 때까지 primary DB에서 commit 완료를 하지 않는다.
      성능에는 문제를 줄 소지가 있으나 failover 상황이 오더라도 데이터 손실은 없다. physical standby DB에만 가능하다.

   ② Maximum availability - Maximum Protection과 마찬가지로 primary DB와 standby DB를 동기화시킨다.
      단, standby DB가 네트워크 문제 등의 이유로 전송이 안될지라도 halt되지는 않는다.
      데이터는 maximum protection과 마찬가지로 primary DB에서 commit을 하게 되면 standby DB에서 commit이 완료될 때까지
      primary DB에서 commit 완료를 하지 않는다. 만약 standby DB가 unavailable상태일 경우 임시로 불일치 시킨다.
      또 다시 standby DB가 available하면 자동으로 동기화 시킨다. 성능에는 문제를 줄 소지가 있으나 failover 상황이 오더라도
      데이터 손실은 거의없다. physical standby, logical standby DB 모두 가능하다.

   ③ Maximum Performance - default protection mode이다. primary data에 대한 protection이 가장 낮다.
      primary database에 transaction이 수행되면 이것을 asynchronous 하게 standby DB에 적용한다.
      즉, maximum protection, maximum availability의 경우에는 standby DB에 적용(commit) 될 때까지 primary db의 transaction 이 적용(commit)되지 않았으나,
      Maximum Performance 모드에서는 비 동기화 시키므로 primary DB에서 standby DB가 transaction 적용이 끝날 때까지
      기다리지 않는다. 즉 standby db의 문제로 인해서 primary DB에 성능영향이 가지 않는다.
      단, failover시에는 약간의 데이터 손실을 가져올 수 있다.

 6) dataguard의 시스템 구성(2가지 종류)

  ① physical standby database 구성 (LGWR process를 사용한 Physical standby DB)
     Archiving to a Physical standby Destination Using the Logwriter Proces


      사용자 삽입 이미지


     - primary db의 LGWR 프로세스가 standby DB로 redo log를 보내고, standby DB의 RFS 프로세스가 redo log를 standby redo
      log에 적용시킨다. archiving되면 archived redo logs가 되고 이것을 MRP process가 standby DB에 적용시킨다.

   ② logical standby DB 구성
     Archiving to a Logical standby Destination Using the Logwriter Process

      사용자 삽입 이미지

     - logical standby DB는 primary DB에서 수행된 SQL문장을 LGWR프로세스가 standby DB로 보내고 RFS 프로세스가 받아서
      Archived redo logs에 쓴다. LSP (Logical standby process)가 standby DB에 적용시킨다.

     - primary DB에서 log switch가 일어나게 되면 standby DB의 RFS 프로세스에 이를 알려주어 log switch가 되도록 한다.

TOP
PartⅡ. standby DB 기동방법

  - 주의 standby db의 startup 방식을 보면 아래와 같다. 아래 그림을 기억해두면 편하다.
    사용자 삽입 이미지

   ① standby DB를 read only mode에서 managed recovery mode로 변경
     - 그대로 명령 또는 shutdown immediate 이후 재기동

     - 첫번째 방법

      SQL> alter database open read only;
      SQL> recover managed standby database disconnect; 

     - 두번째 방법

      SQL> shutdown immediate 
      SQL> startup nomount
      SQL> alter database mount standby database;
      SQL> recover managed standby database disconnect;

   ② shutdown 에서 managed recovery mode 로 변경

      SQL> startup nomount
      SQL> alter database mount standby database;
      SQL> recover managed standby database disconnect;

   ③ managed recovery mode 에서 read only mode 로 변경

      SQL> recover managed standby database cancel;
      SQL> alter database open read only;

   ④ read only standby DB 에서 managed recovery mode로 변경
      (먼저 standby DB에 연결된 모든 세션을 종료)

      SQL> recover managed standby database disconnect;

     - 만약 유저의 세션 때문에 실패할 경우

      SQL> shutdown immediate
      SQL> startup nomount
      SQL> alter database mount standby database;
      SQL> recover managed standby database disconnect;

TOP
PartⅢ. 시스템 구축 (실습)

  - 실습에서 사용 할 primary DB 이름은 MIN 이고, standby DB 이름은 STBY 이다.
  - 여기서는 하나의 서버에서 2개 DB를 구성하는 방법으로 수행한다.
  - 서로 다른 두 대의 서버에서도 같은 방법으로 구성 할 수 있다.
  - primary DB는 /data1/oradata/MIN에 구성되어 있다.
  - standby DB는 /data1/oradata/STBY에 구성되어 있다.

 1) 리스너 설정 및 기동

 아래와 같은 네트워크 설정을 해준다. 각 서버마다 설정해준다.
    - MIN DB에서 설정(primary DB)

vi $ORACLE_HOME/network/admin/listener.ora
smsvr1_MIN =
   (ADDRESS_LIST =
         (ADDRESS= (PROTOCOL= TCP)(Host= smsvr1)(Port=2001))
   )
SID_LIST_smsvr1_MIN =
 (SID_LIST =
   (SID_DESC =
     (ORACLE_HOME= /u/pkg/oracle/product/9.2.0)
     (SID_NAME = MIN)
   )
 )



  -STBY DB 에서 설정(physical standby DB)

vi $ORACLE_HOME/network/admin/listener.ora
smsvr1_STBY =
   (ADDRESS_LIST =
         (ADDRESS= (PROTOCOL= TCP)(Host= smsvr1)(Port=2002))
   )
SID_LIST_smsvr1_STBY =
   (SID_LIST =
    (SID_DESC =
     (ORACLE_HOME= /u/pkg/oracle/product/9.2.0)
    (SID_NAME= STBY)
   )
  )

 2) tnsnames.ora 설정

 tnsnames.ora 파일을 설정한다. 서로 네트워크가 가능하도록 하는데 이름을 재대로 써야 한다.
 초기화 파라미터에서 log_archvie_dest_2='service=STBY LGWR SYNC AFFIRM' 일 경우
 STBY는 tnsnames.ora 에서의 접속이름을 말한다.

- MIN DB 설정 primary DB에서 설정 ( standby DB로 가는 네트워크 구성)

vi $ORACLE_HOME/network/admin/tnsnames.ora
STBY =
  (DESCRIPTION =
     (ADDRESS = (PROTOCOL= TCP)(Host= smsvr1)(Port= 2002))
     (CONNECT_DATA = (SID = STBY))
  )



- STBY DB 설정, standby DB에서 설정 (primary DB로 가는 네트워크 구성)

vi $ORACLE_HOME/network/admin/tnsnames.ora
MIN=
  (DESCRIPTION =
     (ADDRESS = (PROTOCOL= TCP)(Host= smsvr1)(Port= 2001))
     (CONNECT_DATA = (SID = MIN))
  )

 3) 오라클 초기화 파라미터 설정

- MIN DB (primary DB)

vi $ORACLE_HOME/dbs/initMIN.ora

db_name=MIN
compatible=9.2.0
control_files=('/data1/oradata/MIN/control01.ctl','/data1/oradata/MIN/control02.ctl')
shared_pool_size=64M
db_cache_size=16M
undo_management=auto
background_dump_dest=/data1/oradata/MIN/bdump
user_dump_dest=/data1/oradata/MIN/udump
core_dump_dest=/data1/oradata/MIN/cdump
log_archive_start=true
log_archive_dest_1="location=/data1/oradata/MIN/archive1"
log_archive_format=%t_%s.arc

####데이터가드를위해서변경하지말것
remote_archive_enable=true
dg_broker_start=true
log_archive_dest_state_1=enable
log_archive_max_processes=3
standby_file_management=auto
db_file_name_convert='/data1/oradata/STBY','/data1/oradata/MIN'
log_file_name_convert='/data1/oradata/STBY','/data1/oradata/MIN'
standby_archive_dest='/data1/oradata/MIN/archive2'

##### standby DB이면열고, primary DB이면닫는다.
#fal_server=STBY
#fal_client=MIN
#lock_name_space=STBY

## primary DB이면열고, standby DB이면닫는다.
log_archive_dest_2='SERVICE=STBY LGWR SYNC'



- STBY DB (standby DB) -주의할 것은 DB이름은 MIN 이며 instance 이름과 SID는 STBY 이다.
즉, 기동을 할 때에도 ORACLE_SID=STBY 로 설정하여 기동한다.

vi $ORACLE_HOME/dbs/initSTBY.ora

db_name=MIN
compatible=9.2.0
control_files=('/data1/oradata/STBY/control01.ctl','/data1/oradata/STBY/control02.ctl')
shared_pool_size=64M
db_cache_size=16M
undo_management=auto
background_dump_dest=/data1/oradata/STBY/bdump
user_dump_dest=/data1/oradata/STBY/udump
core_dump_dest=/data1/oradata/STBY/cdump
log_archive_start=true
log_archive_dest_1="location=/data1/oradata/STBY/archive1"
log_archive_format=%t_%s.arc

### 데이터가드를 위해서 변경하지 말 것
remote_archive_enable=true
dg_broker_start=true
log_archive_dest_state_1=enable
log_archive_max_processes=3
standby_file_management=auto
db_file_name_convert='/data1/oradata/MIN','/data1/oradata/STBY'
log_file_name_convert='/data1/oradata/MIN','/data1/oradata/STBY'
standby_archive_dest='/data1/oradata/STBY/archive2'

## standby DB일 경우 아래를 열기, primary DB일 경우 닫기
fal_server=MIN
fal_client=STBY
lock_name_space=STBY

##primary DB이면 열고, standby DB이면 닫는다.
#log_archive_dest_2='SERVICE=MIN LGWR SYNC'

-초기화 파라미터 설정에서 주의해야 할 것을 먼저 보면,
standby_file_management=auto 로 되어 있어야 primary DB에서 물리적인 테이블스페이스 및 데이터파일 추가할 경우 standby DB에 자동으로 생성된다.

standby_file_management=auto로 되어 있을 경우
db_file_name_convert='/data1/oradata/STBY','/data1/oradata/MIN'

log_file_name_convert='/data1/oradata/STBY','/data1/oradata/MIN'
의 파라미터에서 ' A 부분','B 부분'에서 B부분이 자신의 primary DB의 경로를 말하고 A부분이 변환할 standby DB의 경로를 말한다. 파라미터를 확인해보자.

fal_server, fal_client 는 standby DB에서만 사용한다. fal_server는 primary DB를 설정하고 fal_client는 standby DB를 설정해둔다. 이것을 설정할 경우 primary DB와 standby DB에 redo log의 gap이 발생했을 경우 자동으로 맞추어주는 역할을 한다.
fal_server=MIN
fal_client=STBY
lock_name_space는 한 대의 서버에서 primary, standby DB를 운영할 경우 사 용한다. 앞에서 말한 바와 같이 primary , standby DB
db_name은 같으며 instance_name(SID)만 다를 뿐이다. 같은 DB이름을 가진 instance를 한 대의 서버에서 기동하기 위해서는
lock_name_space를 지정해 주어야 한다. 만약 두 대의 서버에서 구성한다면 lock_name_space파라미터는 지정할 필요가 없다.
이것은 standby DB에서만 지정한다.
lock_name_space=STBY

 4) primary DB를 online backup으로 standby DB 위치로 restore

   
<MIN DB primary DB>

- primary DB를 24시간 서비스 이므로 shutdown이 불가능한 것을 가정하에 구성한다.
- primary DB를 online backup으로 복사한다.
- online backup을 하는 것이므로 primary DB의 redo log는 standby DB로 전송하지 않는다. standby DB구성 시 자동으로
standby DB에서 redo log가 생성된다.
SQL> select tablespace_name, file_name, bytes/1024/1024 mega from dba_data_files; 
TABLESPACE_NAMEFILE_NAMEMEGA
------------------------------------------------------------------------------------------------------------
SYSTEM/data1/oradata/MIN/system01.dbf250
UNDOTBS/data1/oradata/MIN/undotbs.dbf100
USERS/data1/oradata/MIN/users01.dbf100
SQL> select name , bytes/1024/1024 mega from v$tempfile; 
NAMEMEGA
------------------------------------------------------------
/data1/oradata/MIN/temp01.dbf100

- 여기서는 cp 명령이 standby DB로 전송하는 것을 뜻한다. ftp로 primary db의 백업을 전송한다.
   SQL> alter tablespace system begin backup;
   SQL> !cp /data1/oradata/MIN/system01.dbf /data1/oradata/STBY/system01.dbf
   SQL> alter tablespace system end backup;
   SQL> alter tablespace undotbs begin backup;
   SQL> !cp /data1/oradata/MIN/undotbs.dbf /data1/oradata/STBY/undotbs.dbf
   SQL> alter tablespace undotbs end backup;
   SQL> alter tablespace users begin backup;
   SQL> !cp /data1/oradata/MIN/users01.dbf /data1/oradata/STBY/users01.dbf
   SQL> alter tablespace users end backup;

- tempfile은 그대로 복사를 한다. begin backup, end backup 이 필요 없다. 단 tempfile 이어야 한다.
   SQL> !cp /data1/oradata/MIN/temp01.dbf /data1/oradata/STBY/temp01.dbf

 5) primary DB에서 standby control file을 생성해서 standby DB로 전송

    <MIN DB primary DB>

- primary DB에서 standby control file을 생성해서 standby DB로 전송한다
   SQL> alter database create standby controlfile as '/data1/oradata/STBY/stbyctl.ctl';

 6) standby DB에서 사용할 control file을 배치

    <STBY DB standby DB의 control file>

- standby DB에서 사용할 control file을, standby DB의 초기화 퍼라미터(initSTBY.ora)파일에 있는 control file 위치에 배치한다.
SQL> !cp /data1/oradata/STBY/stbyctl.ctl /data1/oradata/STBY/control01.ctl
SQL> !cp /data1/oradata/STBY/stbyctl.ctl /data1/oradata/STBY/control02.ctl

 7) standby DB 기동

    <STBY DB standby DB 에서 수행>

- standby DB를 기동시킨다. startup mount standby database 라는 명령은 없다. nomount까지 기동한 후 standby DB로 mount를 한다.

   SQL> startup nomount
   SQL> alter database mount standby database;

 8) standby DB에 standby redo log file 생성

    <STBY DB standby DB에서 수행>

우리는 처음으로 standby DB를 구성하였으므로 standby redo log를 추가해 주어야 한다.
여기서 중요한 것은 primary redo log와 standby redo log가 같은 크기를 가지고 있어야 한다.
만약 다를 경우에는 차후에 ORA-16139 media recovery required
에러가 발생하면서 takeover나 failover가 정상적으로 수행되지 않을 수 있다.

SQL> select * from v$logfile;
GROUP#STATUS TYPEMEMBER

-----------------------------------------------------------------------

1ONLINE/data1/oradata/STBY/log01a.log
2ONLINE/data1/oradata/STBY/log02a.log
3

/data1/oradata/STBY/log03a.log

SQL> alter database add standby logfile
           '/data1/oradata/STBY/stbylog01a.log' size 10M;
SQL> alter database add standby logfile
           '/data1/oradata/STBY/stbylog02a.log' size 10M;
SQL> alter database add standby logfile
           '/data1/oradata/STBY/stbylog03a.log' size 10M;
SQL> select * from v$logfile;
GROUP#STATUSTYPEMEMBER
----------------------------------------------------------------------------------------
1ONLINE/data1/oradata/STBY/log01a.log
2ONLINE/data1/oradata/STBY/log02a.log
3ONLINE/data1/oradata/STBY/log03a.log
4STANDBY/data1/oradata/STBY/stbylog01a.log
5STANDBY/data1/oradata/STBY/stbylog02a.log
6STANDBY/data1/oradata/STBY/stbylog03a.log


9) primary DB에 standby redo log file 생성

    <MIN DB primary DB 에서 수행>
서버문제가 발생했을 경우 takeover를 해야 하므로 primary DB도 standby DB가 될 수 있기 때문에
미리 standby redo log를 만든다.

SQL> select * from v$logfile;
GROUP#>STATUS TYPEMEMBER
------------------------------------------------------------------------------------------------
1ONLINE/data1/oradata/MIN/log01a.log
2ONLINE/data1/oradata/MIN/log02a.log
3ONLINE/data1/oradata/MIN/log03a.log

SQL> alter database add standby logfile
          '/data1/oradata/MIN/stbylog01a.log' size 10M;
SQL> alter database add standby logfile
          '/data1/oradata/MIN/stbylog02a.log' size 10M;
SQL> alter database add standby logfile
          '/data1/oradata/MIN/stbylog03a.log' size 10M;

SQL> select * from v$logfile;
GROUP#STATUS TYPEMEMBER
-----------------------------------------------------------------------------
1ONLINE/data1/oradata/MIN/log01a.log
2ONLINE/data1/oradata/MIN/log02a.log
3ONLINE/data1/oradata/MIN/log03a.log
4STANDBY/data1/oradata/MIN/stbylog01a.log
5STANDBY/data1/oradata/MIN/stbylog02a.log
6

STANDBY/data1/oradata/MIN/stbylog03a.log

 10) standby DB를 recovery managed mode로 기동

    <STBY DB standby DB 에서 수행>

standby DB를 recovery managed mode로 변경한다.
standby DB서버에서 MRP 프로세스가 생긴다.

   SQL> recover managed standby database disconnect;

 11) log switch 적용

    <MIN DB primary DB 에서 수행>

standby DB를 구성하는 동안 primary DB와 gap이 생겼을 것이다.
current redo log를 적용시킨다.

   SQL> alter system archive log current;

 12) primary DB 점검

사용자 삽입 이미지

            PROCESS STATUS
          ------------- ---------------
          ARCH      CLOSING
          ARCH      CLOSING
          LGWR      WRITING

SQL> select dest_id "ID",destination,status,target,          schedule,process,mountid mid          from v$archive_dest order by dest_id;
=> destination 2번에 우리는 service=STBY로 설정하였다. STBY는 tnsnames.ora에 나오는 접속이름이었다. STATUS=VALID 상태이고 STANDBY 이어야 한다.

사용자 삽입 이미지
=> 아무런 에러도 나와서는 안된다. 여기에서 에러가 났다면 primary DB를 먼저 기동하고 standby DB를 기동했을 경우 발생할 수도 있으나, standby로 전송이 안된 것일 수도 있으므로 다른 것도 확인을 해보아야 한다. 만약 standby DB를 먼저 기동하고 recovery managed mode에서 MRP 프로세스를 띄우고 그리고 나서야 primary DB를 기동시켰다면 아래에서는 아무런 메세지도 나와서는 안된다. 예제에서는 primary DB를 먼저 기동했으므로 메세지가 발생했을 것이다.

       MESSAGE        TIMESTAMP
       --------------------------
       ---------------------------

SQL> select dest_id id,database_mode db_mode,recovery_mode,                protection_mode,standby_logfile_count "SRLs",                standby_logfile_active ACTIVE, archived_seq#                from v$archive_dest_status;
==> db_mode가 MOUNTED_STANDBY 이어야 한다. recovery_mode 가 managed가 되어 있어야 primary DB에서 전송된 redo log정보를 standby DB에 적용시킬 수 있다.

       ID DB_MODE        RECOVER PROTECTION_MODE     SRLsACTIVE ARCHIVED_SEQ#
       --- --------------- ------- -------------------- ---- ------ -------------
      1 OPEN           IDLE   MAXIMUM PERFORMANCE    0     0       45
      2 MOUNTED-STANDBY MANAGED MAXIMUM AVAILABILITY   2     0       45
      3 OPEN           IDLE   MAXIMUM PERFORMANCE    0     0        0

13) standby DB 점검
사용자 삽입 이미지
14) primary DB 테이블스페이스 생성 및 데이터 입력
       <MIN DB primary DB>
test 테이블스페이스를 만들고 테이블을 만들고 데이터를 넣어본다. 주의할 것은 db_file_name_convert 에서 나오는 것처럼 /data1/oradata/MIN 안에만 생성을 해야 한다. 그래야 standby DB에 데이터파일이 자동으로 생기게 된다.
또한 파라미터에서 standby_file_management=auto로 되어 있어야 standby DB에 테이블스페이스의 데이터파일이 생긴다.
SQL> create tablespace test datafile '/data1/oradata/MIN/test01.dbf' size 10M; SQL> select tablespace_name, file_name, bytes/1024/1024 mega from dba_data_files;

    사용자 삽입 이미지       

15) standby DB예 데이터 입력 여부 확인<STBY DB standby DB>
- primary DB에서 만든 테이블스페이스가 있는지 데이터는 들어갔는지 확인한다.
recovery managed mode를 해제하고 read only로 open한다.
SQL> recover managed standby database cancel; SQL> alter database open read only;
==> 정상적으로 primary DB에서 만든 테이블스페이스가 적용되었으며, test 라는 테이블에 데이터 insert가 정상적으로 된 것을 확인할 수 있다.
사용자 삽입 이미지

- 다시 recovery managed mode로 만들어서 primary 에서 전송된 redo log 정보가 standby DB에 적용되도록 한다. fal_server, fal_client 파라미터가 설정되어 있으므로 자동으로 gap이 생긴 부분을 맞추어 준다.
DB를 open 상태에서도 recovery managed mode로 변경이 가능하다.
SQL> recover managed standby database disconnect;
16) takeover
시스템 문제가 발생하였다. takeover를 수행한다.
①<MIN DB primary DB>
가장 먼저 primary DB를 standby로 변경을 한 후 standby DB를 primary DB로 변경 해야한다. standby DB를 primary로 먼저 변경하면 primary DB가 standby DB로될 때까지 기다리게 된다.
이제 primary DB를 standby DB로 변경한 후 기존의 primary DB를shutdown 한다.
SQL> alter database commit to switchover to physical standby with session shutdown wait; SQL> shutdown immediate
② <STBY DB standby DB>
standby DB를 primary DB로 바꾸고 shutdown 한다. 유저접속은 없으므로 with session shutdown 절은 안 들어가도 된다.
SQL> alter database commit to switchover to primary; SQL> shutdown immediate
③ 파라미터를 변경한다. # 을 붙인 것을 빼거나 추가해서 설정해준다.
<MIN DB primary DB>

vi $ORACLE_HOME/dbs/initMIN.ora
<
변경전>
#####standby DB
이면 열고, primary DB이면 닫는다.
#fal_server=STBY
#fal_client=MIN
#lock_name_space=STBY

##primary DB
이면 열고, standby DB이면 닫는다.
log_archive_dest_2='SERVICE=STBY LGWR SYNC'

<변경후>
#####standby DB
이면 열고, primary DB이면 닫는다.
fal_server=STBY
fal_client=MIN
lock_name_space=STBY

##primary DB이면 열고, standby DB이면 닫는다.
#log_archive_dest_2='SERVICE=STBY LGWR SYNC'


<STBY DB standby DB>
>vi $ORACLE_HOME/dbs/initSTBY.ora
<변경전>
##standby
이면 열고, primary DB이면 닫는다.
fal_server=MIN
fal_client=STBY
lock_name_space=STBY
##primary DB
이면 열고, standby DB이면 닫는다.
#log_archive_dest_2='SERVICE=MIN LGWR SYNC'

<변경후>
##standby
이면 열고, primary DB이면 닫는다.
#fal_server=MIN
#fal_client=STBY
#lock_name_space=STBY
##primary DB이면 열고, standby DB이면 닫는다.
log_archive_dest_2='SERVICE=MIN LGWR SYNC'



④ <MIN DB , new standby DB> - 새롭게 standby DB가 된 MIN DB를 recovery managed mode로 변경한다. SQL> startup nomount SQL> alter database mount standby database; SQL> recover managed standby database disconnect; SQL> select process, status from v$managed_standby; ==> MRP 프로세스 기동 확인

       PROCESS STATUS
       ---------------- ------------
       ARCH   CONNECTED
       ARCH   CONNECTED
      MRP0   WAIT_FOR_LOG
    RFS    WRITING
    RFS    ATTACHED

⑤ <STBY DB, new primary DB>     - new primary DB를 기동한다.     SQL> startup
- 확인하기 SQL> select i.instance_name, i.status instance_status, d.name dbname, d.database_role db_role, d.switchover_status switchover_status , d.protection_mode from v$database d, v$instance i;
=> 중요한 점검포인트 이다. TO_STANDBY 인지 확인한다.

   사용자 삽입 이미지

(17) 서비스 원복(takeover)다시 원복을 시킨다. STBY DB를 standby DB로 변경한 후 MIN DB를primary DB로 변경한다.

<STBY DB, new primary DB> - primary DB를 standby DB로 만들고 나서 standby DB를 primary DB로 만든다.
순서를 잊지 말자.
SQL> alter database commit to switchover to physical standby with session shutdown wait; SQL> shutdown immediate
<MIN DB new standby DB> - MIN DB를 primary DB로 변경한다. SQL> alter database commit to switchover to primary ; SQL> shutdown immediate
<MIN DB primary DB> - 초기화 파라미터를 변경한다.

vi $ORACLE_HOME/dbs/initMIN.ora
<원복시킨다>
#####standby DB이면 열고, primary DB이면 닫는다.
#fal_server=STBY
#fal_client=MIN
#lock_name_space=STBY

##primary DB이면 열고, standby DB이면 닫는다.
log_archive_dest_2='SERVICE=STBY LGWR SYNC'


<STBY DB standby DB>
vi $ORACLE_HOME/dbs/initSTBY.ora<원복시킨다>  ##standby이면 열고,  primary DB이면 닫는다.fal_server=MINfal_client=STBYlock_name_space=STBY
##primary DB
이면 열고, standby DB이면 닫는
.
#log_archive_dest_2='SERVICE=MINLGWR SYNC'

사용자 삽입 이미지


18) failover

- primary DB가 있는 건물이 무너지고 디스크 이상으로 인해서 DB 데이터파일이 손상되었다.
standby DB를 긴급하게 기동시켜야 한다. MIN DB를 shutdown abort로 Down시키고(디스크 fail 장애),
standby DB를 primary DB로 기동시킨다.

- failover을 한 후에 시스템을 복구해서 MIN DB를 primary DB, STBY DB를 standby DB로 원래대로 구성하려면 Dataguard를 재구성 해야 한다.

즉, failover을 했다면 failover이후에 new primary DB인 STBY DB를 통해서 MIN DB를 standby DB로 구성하고
takeover 시키면 된다.

<MIN DB primary DB>
-디스크장애상황
SQL> shutdown abort

<STBY DB standby DB>
- recovery managed mode를 해제(cancel)가 아닌 끝내도록(finish) 한다. primary DB로 변경한다.
SQL> recover managed standby database finish;
SQL> alter database commit to switchover to primary;
$ORACLE_HOME/dbs/initSTBY.ora 파일에서 primary DB로 파라미터를 설정하고 기동한다.
SQL> startup

<주의> 만약 standby DB인 STBY DB를 primary DB로 failover하던 도중 ORA-16139 media recovery required
에러가 나면서 recovery 하라고 나온다면?

이럴 경우엔 아래와 같은 명령을 사용하도록 한다.
Log stream을 standby DB에 적용하지 못한 경우에 발생할 수 있다.
이러한 사항은 여러 문제로 인해서 발생할 수 있으므로 발생했다면 오라클에 공식적으로 문의 해야한다.
아래와 같이 skip하면 skip하는 만큼의 gap을 DB에 적용하지 못할 수 있으니 주의해야 한다.
SQL> alter database recover managed standby database finish skip wait;
SQL> alter database commit to switchover to primary;
$ORACLE_HOME/dbs/initSTBY.ora 파일에서 primary DB로 파라미터를설정하고 기동한다.
SQL> startup
TOP
신고
Posted by The.민군

Windows 서버 시스템의 서비스 개요 및 네트워크 포트 요구 사항

기술 자료 ID:832017
마지막 검토:2006년 8월 21일 월요일
수정:22.0

요약

이 문서에서는 Microsoft Windows 서버 시스템에서 Microsoft 클라이언트 및 서버 운영 체제, 서버 기반 프로그램 및 프로그램 하위 구성 요소가 사용하는 필수 네트워크 포트, 프로토콜 및 서비스에 대해 설명합니다. 관리자와 지원 담당자는 이 Microsoft 기술 자료 문서를 참조하여 세그먼트화된 네트워크에서 Microsoft 운영 체제 및 프로그램의 네트워크 연결에 필요한 포트와 프로토콜을 결정할 수 있습니다.

이 문서의 포트 정보는 Windows 방화벽을 구성하는 데 사용할 수 없습니다. Windows 방화벽에 대한 자세한 내용은 Windows 방화벽 설정(Windows Firewall Settings) 기술 참조 문서를 참조하십시오.

Windows 서버 시스템에는 개발자와 IT(정보 기술) 전문가의 요구 사항을 충족하도록 설계된 포괄적인 통합 인프라가 포함되어 있습니다. 이 시스템은 정보 작업자가 신속하고 쉽게 정보를 얻고 분석하고 공유하는 데 사용할 수 있는 프로그램과 솔루션을 실행하도록 설계되었습니다. 이러한 Microsoft 클라이언트, 서버 및 서버 프로그램 제품은 다양한 네트워크 포트와 프로토콜을 사용하여 클라이언트 시스템 및 다른 서버 시스템과 네트워크를 통해 통신합니다. 전용 방화벽, 호스트 기반 방화벽 및 IPsec(인터넷 프로토콜 보안) 필터는 네트워크 보안에 필요한 중요 구성 요소입니다. 하지만 이러한 기술이 특정 서버에서 사용하는 포트와 프로토콜을 차단하도록 구성되어 있으면 해당 서버가 더 이상 클라이언트 요청에 응답하지 않습니다.

개요

다음은 이 문서에 포함되어 있는 정보에 대한 개요입니다.
이 문서의 "시스템 서비스 포트" 절에는 각 서비스에 대한 간략한 설명, 서비스의 논리 이름 및 각 서비스가 올바르게 작동하는 데 필요한 포트와 프로토콜이 나와 있습니다. 이 절은 특정 서비스에서 사용하는 포트와 프로토콜을 확인하는 데 도움이 됩니다.
이 문서의 "포트 및 프로토콜" 절에는 "시스템 서비스 포트" 절의 정보를 요약하는 표가 들어 있습니다. 이 표는 서비스 이름 대신 포트 번호를 기준으로 정렬되어 있습니다. 이 절을 통해 특정 포트에서 수신 대기하는 서비스를 신속하게 확인할 수 있습니다.
이 문서에서는 몇 가지 용어를 특정한 방식으로 사용합니다. 혼동을 피하기 위해 이 문서에서 이러한 용어를 사용하는 방식을 이해하고 있어야 합니다. 다음은 이러한 용어에 대한 설명입니다.
시스템 서비스: Windows 서버 시스템에는 Microsoft Windows 2000 Server 제품군, Microsoft Windows Server 2003 제품군, Microsoft Exchange 2000 Server 및 Microsoft SQL Server 2000과 같은 많은 제품이 포함되어 있습니다. 각 제품에는 많은 구성 요소가 포함되어 있으며 이러한 구성 요소 중 하나가 시스템 서비스입니다. 특정 컴퓨터에 필요한 시스템 서비스는 시작 시 운영 체제에 의해 자동으로 시작되거나 일반적인 작업 중 필요에 따라 시작됩니다. 예를 들어, Windows Server 2003, Enterprise Edition을 실행하는 컴퓨터에서 사용할 수 있는 시스템 서비스에는 서버 서비스, 인쇄 스풀러 서비스 및 World Wide Web 게시 서비스 등이 있습니다. 시스템 서비스마다 알기 쉬운 서비스 이름과 서비스 이름이 있습니다. 알기 쉬운 서비스 이름은 서비스 MMC(Microsoft Management Console) 스냅인과 같은 그래픽 관리 도구에 나타나는 이름이고, 서비스 이름은 명령줄 도구와 많은 스크립트 언어에서 사용되는 이름입니다. 시스템 서비스마다 하나 이상의 네트워크 서비스를 제공할 수 있습니다.
응용 프로그램 프로토콜: 이 문서에 나와 있는 응용 프로그램 프로토콜은 하나 이상의 TCP/IP 프로토콜과 포트를 사용하는 상위 수준 네트워크 프로토콜입니다. 응용 프로그램 프로토콜의 예에는 HTTP(Hypertext Transfer Protocol), SMB(서버 메시지 블록) 및 SMTP(Simple Mail Transfer Protocol)가 있습니다.
프로토콜: 응용 프로그램 프로토콜보다 낮은 수준에서 작동합니다. TCP/IP 프로토콜이 네트워크에서 장치 간 통신에 사용되는 표준 형식입니다. TCP/IP 프로토콜 제품군에는 TCP, UDP(User Datagram Protocol) 및 ICMP(Internet Control Message Protocol)가 포함됩니다.
포트: 시스템 서비스가 들어오는 네트워크 트래픽을 수신 대기하는 네트워크 포트입니다.
이 문서에서는 어떤 서비스가 다른 네트워크 통신 서비스를 사용하는지에 대해서는 설명하지 않습니다. 예를 들어, 많은 서비스가 Microsoft Windows에서 RPC(원격 프로시저 호출)나 DCOM 기능을 통해 동적 TCP 포트에 할당됩니다. 원격 프로시저 호출 서비스는 RPC나 DCOM을 사용하여 클라이언트 컴퓨터와 통신하는 다른 시스템 서비스의 요청을 조정합니다. 많은 다른 서비스가 서버 서비스에서 제공하는 프로토콜인 SMB나 NetBIOS(네트워크 기본 입/출력 시스템)를 사용합니다. HTTP나 HTTPS(Hypertext Transfer Protocol Secure)를 사용하는 서비스도 있습니다. 이러한 프로토콜은 인터넷 정보 서비스(IIS)에서 제공합니다. Windows 운영 체제의 아키텍처에 대한 자세한 내용은 이 문서에서 설명하지 않습니다. 이 주제에 대한 자세한 내용은 Microsoft TechNet과 MSDN(Microsoft Developer Network)에서 볼 수 있습니다. 많은 서비스가 특정 TCP 포트나 UDP 포트를 사용할 수 있지만 항상 한 서비스나 프로세스만 해당 포트에서 수신 대기할 수 있습니다.

전송을 위해 TCP/IP나 UDP/IP와 함께 RPC를 사용하는 경우 인바운드 포트는 필요에 따라 시스템 서비스에 빈번하게 동적으로 할당되고 포트 1024보다 상위의 TCP/IP 포트와 UDP/IP 포트가 사용됩니다. 이를 "임의의 RPC 포트"라고 비공식적으로 지칭하는 경우가 많습니다. 이러한 경우 RPC 클라이언트는 RPC 끝점 매퍼를 사용하여 서버에 할당된 동적 포트를 확인합니다. RPC 기반 서비스 중에는 RPC가 동적으로 포트를 할당하도록 하는 대신 특정 포트를 구성할 수 있는 것도 있습니다. 서비스와 관계없이 RPC가 동적으로 할당하는 포트의 범위를 작은 범위로 제한할 수도 있습니다. 이에 대한 자세한 내용은 이 문서의 "참조" 절을 참조하십시오.

이 문서에서는 이 문서의 끝에 있는 "본 문서의 정보는 다음의 제품에 적용됩니다." 절에 나열된 Microsoft 제품에 대한 시스템 서비스 역할과 서버 역할에 대해 설명합니다. 이 정보는 Microsoft Windows XP와 Microsoft Windows 2000 Professional에도 적용될 수 있지만 이 문서에서는 서버급 운영 체제를 중점적으로 다룹니다. 따라서 이 문서에서는 클라이언트 프로그램이 원격 시스템에 연결하는 데 사용하는 포트 대신 서비스가 수신 대기하는 포트에 대해 설명합니다.

시스템 서비스 포트

이 절에는 각 시스템 서비스에 대한 설명, 시스템 서비스에 해당하는 논리 이름 및 각 서비스에 필요한 포트와 프로토콜이 나와 있습니다.

Active Directory(로컬 보안 기관)

Active Directory는 LSASS 프로세스에서 실행되며 Windows 2000 및 Windows Server 2003 도메인 컨트롤러의 인증 및 복제 엔진을 포함합니다. 도메인 컨트롤러, 클라이언트 컴퓨터 및 응용 프로그램 서버에서는 트래픽을 캡슐화하는 데 터널링 프로토콜이 사용되지 않는 한 1024부터 65536까지의 임시 TCP 포트 범위 외에도 하드 코딩된 특정 포트를 통해 Active Directory에 네트워크로 연결해야 합니다. 캡슐화된 솔루션은 L2TP(계층 2 터널링 프로토콜)와 IPsec을 함께 사용하는 필터링 라우터의 뒤에 있는 VPN 게이트웨이로 구성될 수 있습니다. 이렇게 캡슐화된 시나리오에서는 아래 목록에 나오는 포트와 프로토콜을 모두 여는 것이 아니라 라우터를 통해 IPsec ESP(Encapsulating Security Protocol)(IP 프로토콜 50), IPsec NAT-T(Network Address Translator Traversal)(UDP 포트 4500) 및 IPsec ISAKMP(Internet Security Association and Key Management Protocol)(UDP 포트 500)를 허용해야 합니다. 마지막으로, Active Directory 복제에 사용되는 포트는 기술 자료 문서 224196, "특정 포트로 Active Directory 복제 트래픽 제한"에 설명된 대로 하드 코딩될 수 있습니다.

참고L2TP가 IPsec ESP로 보호되기 때문에 L2TP 트래픽에 대한 패킷 필터는 필요하지 않습니다.

시스템 서비스 이름:LSASS
응용 프로그램 프로토콜프로토콜포트
글로벌 카탈로그 서버TCP3269
글로벌 카탈로그 서버TCP3268
LDAP 서버TCP389
LDAP 서버UDP389
LDAP SSLTCP636
LDAP SSLUDP636
IPsec ISAKMPUDP500
NAT-TUDP4500
RPCTCP135
RPC 임의 할당 상위 TCP 포트TCP1024 - 65536

응용 프로그램 레이어 게이트웨이 서비스(Application Layer Gateway Service)

ICS(인터넷 연결 공유)/ICF(인터넷 연결 방화벽) 서비스의 하위 구성 요소인 이 서비스는 네트워크 프로토콜이 방화벽을 통과하여 인터넷 연결 공유 뒤에서 작동할 수 있도록 허용하는 플러그 인을 지원합니다. ALG(응용 프로그램 레이어 게이트웨이) 플러그 인은 포트를 열고 패킷에 포함된 데이터(예: 포트 및 IP 주소)를 변경할 수 있습니다. FTP(파일 전송 프로토콜)는 Windows Server 2003, Standard Edition과 Windows Server 2003, Enterprise Edition에 포함된 플러그 인을 사용하는 유일한 네트워크 프로토콜입니다. ALG FTP 플러그 인은 이러한 구성 요소가 사용하는 NAT(네트워크 주소 변환) 엔진을 통해 활성 FTP 세션을 지원하도록 설계되었습니다. ALG FTP 플러그 인은 NAT를 통과하여 포트 21로 향하는 모든 트래픽을 루프백 어댑터에서 3000~5000의 범위에 있는 개인 수신 대기 포트로 리디렉션하여 이러한 세션을 지원합니다. 그런 다음 ALG FTP 플러그 인은 FTP 제어 채널 트래픽을 모니터링하고 업데이트하여 FTP 플러그 인이 FTP 데이터 채널에 대한 NAT를 통해 포트 매핑을 전달할 수 있도록 합니다. FTP 플러그 인은 FTP 제어 채널 스트림에서 포트도 업데이트합니다.

시스템 서비스 이름:ALG
응용 프로그램 프로토콜프로토콜포트
FTP 제어TCP21

ASP.NET 상태 서비스(ASP.NET State Service)

ASP.NET 상태 서비스는 ASP.NET out-of-process 세션 상태를 지원합니다. ASP.NET 상태 서비스는 세션 데이터를 독립 프로세스로 저장합니다. 이 서비스는 소켓을 사용하여 웹 서버에서 실행되는 ASP.NET과 통신합니다.

시스템 서비스 이름:aspnet_state
응용 프로그램 프로토콜프로토콜포트
ASP.NET 세션 상태TCP42424

인증서 서비스(Certificate Services)

인증서 서비스는 핵심 운영 체제의 일부입니다. 인증서 서비스를 사용하여 기업은 자체 CA(인증 기관)의 역할을 수행할 수 있습니다. 이런 방식으로 기업은 S/MIME(Secure/Multipurpose Internet Mail Extensions), SSL(Secure Sockets Layer), EFS(파일 시스템 암호화), IPsec 및 스마트 카드 로그온과 같은 프로토콜과 프로그램의 디지털 인증서를 발급하고 관리할 수 있습니다. 인증서 서비스는 RPC와 DCOM을 통해 포트 1024보다 상위의 임의 TCP 포트를 사용하여 클라이언트와 통신합니다.

시스템 서비스 이름:CertSvc
응용 프로그램 프로토콜프로토콜포트
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

클러스터 서비스(Cluster Service)

클러스터 서비스는 서버 클러스터 작동을 제어하고 클러스터 데이터베이스를 관리합니다. 클러스터는 단일 컴퓨터의 역할을 하는 독립적인 컴퓨터의 집합입니다. 관리자, 프로그래머 및 사용자는 클러스터를 단일 시스템으로 인식합니다. 소프트웨어는 클러스터의 노드로 데이터를 배포합니다. 한 노드에 오류가 발생하면 다른 노드에서 오류가 발생한 노드가 제공하던 서비스와 데이터를 제공합니다. 노드가 추가되거나 복구되면 클러스터 소프트웨어가 일부 데이터를 이 노드로 마이그레이션합니다.

시스템 서비스 이름:ClusSvc
응용 프로그램 프로토콜프로토콜포트
클러스터 서비스UDP3343
RPCTCP135
클러스터 관리자UDP137
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

컴퓨터 브라우저(Computer Browser)

컴퓨터 브라우저 시스템 서비스는 네트워크에 있는 컴퓨터의 최신 목록을 관리하고 이 목록을 요청하는 프로그램에 목록을 제공합니다. 컴퓨터 브라우저 서비스는 Windows 기반 컴퓨터에서 네트워크 도메인과 리소스를 보는 데 사용됩니다. 브라우저로 지정된 컴퓨터는 네트워크에서 사용되는 모든 공유 리소스가 포함된 찾아보기 목록을 관리합니다. 네트워크 환경,net view명령 및 Windows 탐색기와 같은 이전 버전의 Windows 프로그램에는 모두 찾아보기 기능이 필요합니다. 예를 들어, Microsoft Windows 95를 실행하는 컴퓨터에서 네트워크 환경을 열면 도메인과 컴퓨터의 목록이 나타납니다. 이 목록을 표시하기 위해 컴퓨터는 브라우저로 지정된 컴퓨터에서 찾아보기 목록의 사본을 얻습니다.

시스템 서비스 이름:Browser
응용 프로그램 프로토콜프로토콜포트
NetBIOS 데이터그램 서비스UDP138
NetBIOS 이름 확인UDP137
NetBIOS 세션 서비스TCP139

DHCP 서버(DHCP Server)

DHCP 서버 서비스는 DHCP(동적 호스트 구성 프로토콜)를 사용하여 IP 주소를 자동으로 할당합니다. 이 서비스를 사용하여 DHCP 클라이언트의 고급 네트워크 설정을 조정할 수 있습니다. 예를 들어, DNS(Domain Name System) 서버 및 WINS(Windows 인터넷 이름 서비스) 서버와 같은 네트워크 설정을 구성할 수 있습니다. 하나 이상의 DHCP 서버를 설정하여 TCP/IP 구성 정보를 관리하고 이 정보를 클라이언트 컴퓨터에 제공할 수 있습니다.

시스템 서비스 이름:DHCPServer
응용 프로그램 프로토콜프로토콜포트
DHCP 서버UDP67
MADCAPUDP2535

분산 파일 시스템(Distributed File System)

DFS(분산 파일 시스템)는 LAN(Local Area Network)이나 WAN(Wide Area Network)에 있는 서로 다른 파일 공유를 단일 논리 네임스페이스로 통합합니다. DFS 서비스는 Active Directory 도메인 컨트롤러에서 SYSVOL 공유 폴더를 알리는 데 필요합니다.

시스템 서비스 이름:Dfs
응용 프로그램 프로토콜프로토콜포트
NetBIOS 데이터그램 서비스UDP138
NetBIOS 세션 서비스TCP139
LDAP 서버TCP389
LDAP 서버UDP389
SMBTCP445
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

분산 파일 시스템 복제(Distributed File System Replication)

DFSR(분산 파일 시스템 복제) 서비스는 공통된 복제 그룹에 포함된 컴퓨터 간에 파일 및 폴더 업데이트 내용을 자동으로 복사하는 상태 기반의 다중 마스터 복제 엔진입니다. DFSR은 Windows Server 2003 R2에 추가된 기능으로, DFSN(분산 파일 시스템 네임스페이스)에 참여하는지 여부에 관계없이 Windows Server 2003 R2 컴퓨터 간에 파일을 복제할 수 있도록 DFS 관리 도구를 사용하여 구성할 수 있습니다. DFSR은 SYSVOL 복제에 사용되지 않습니다.

시스템 서비스 이름:DFSR
응용 프로그램 프로토콜프로토콜포트
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

분산 링크 추적 서버(Distributed Link Tracking Server)

분산 링크 추적 서버 시스템 서비스는 볼륨 간에 이동되는 파일을 도메인의 각 볼륨에 대해 추적할 수 있도록 정보를 저장합니다. 분산 링크 추적 서버 서비스는 도메인의 각 도메인 컨트롤러에서 실행됩니다. 이 서비스를 통해 분산 링크 추적 클라이언트 서비스는 같은 도메인의 다른 NTFS 파일 시스템 볼륨으로 이동된 링크된 문서를 추적할 수 있습니다.

시스템 서비스 이름:TrkSvr
응용 프로그램 프로토콜프로토콜포트
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

분산 트랜잭션 코디네이터(Distributed Transaction Coordinator)

DTC(분산 트랜잭션 코디네이터) 시스템 서비스는 데이터베이스, 메시지 대기열, 파일 시스템과 같은 리소스 관리자, 트랜잭션으로 보호되는 다른 리소스 관리자와 여러 컴퓨터 시스템에 분산된 트랜잭션의 조정을 담당합니다. DTC 시스템 서비스는 트랜잭션 구성 요소가 COM+를 통해 구성되는 경우 필요할 뿐 아니라 여러 시스템에 분산되어 있는 메시지 대기열(MSMQ라고도 함)과 SQL Server 작업의 트랜잭션 대기열에도 필요합니다.

시스템 서비스 이름:MSDTC
응용 프로그램 프로토콜프로토콜포트
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

DNS 서버(DNS Server)

DNS 서버 서비스는 DNS 이름에 대한 쿼리와 업데이트 요청에 응답하여 DNS 이름 확인을 수행합니다. DNS 서버는 DNS 이름을 사용하여 식별되는 장치와 서비스를 찾고 Active Directory에서 도메인 컨트롤러를 찾는 데 필요합니다.

시스템 서비스 이름:DNS
응용 프로그램 프로토콜프로토콜포트
DNSUDP53
DNSTCP53

이벤트 로그(Event Log)

이벤트 로그 시스템 서비스는 프로그램과 Windows 운영 체제에서 생성하는 이벤트 메시지를 기록합니다. 이벤트 로그 보고서에는 문제 진단에 유용할 수 있는 정보가 포함되어 있습니다. 보고서는 이벤트 뷰어에서 볼 수 있습니다. 이벤트 로그 서비스는 프로그램, 서비스 및 운영 체제에서 보낸 이벤트를 로그 파일에 기록합니다. 이벤트에는 원본 프로그램, 서비스 또는 구성 요소에 특정한 오류뿐 아니라 진단 정보도 포함됩니다. 로그는 MMC 스냅인에서 이벤트 뷰어를 통해서 보거나 이벤트 로그 API를 통해 프로그래밍 방식으로 볼 수 있습니다.

시스템 서비스 이름:Eventlog
응용 프로그램 프로토콜프로토콜포트
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

Microsoft Exchange Server 및 Outlook 클라이언트(Microsoft Exchange Server and Outlook clients)

여러 버전의 Microsoft Exchange Server 및 Exchange 클라이언트에 다양한 포트 및 프로토콜 요구 사항이 있습니다. 이러한 요구 사항은 사용 중인 Exchange Server나 Exchange 클라이언트의 버전에 따라 달라집니다.

Outlook 클라이언트에서 Exchange 2003 이전 버전의 Exchange에 연결하려면 Exchange 서버에 대한 직접 RPC 연결이 필요합니다. Outlook에서 Exchange 서버에 설정된 RPC 연결은 먼저 RPC 끝점 매퍼(포트 TCP 135)에 접속하여 필요한 여러 끝점의 포트 매핑에 대한 정보를 요청합니다. 그런 다음 Outlook 클라이언트에서 이러한 끝점 포트를 직접 사용하여 Exchange 서버에 연결하려고 합니다.

Exchange 5.5에서는 클라이언트 통신에 두 개의 포트를 사용합니다. 하나는 정보 저장소용이고 다른 하나는 디렉터리용입니다. Exchange 2000 및 2003에서는 클라이언트 통신에 세 개의 포트를 사용합니다. 이러한 포트는 각각 정보 저장소용, 디렉터리 조회(RFR)용 및 DSProxy/NSPI용입니다.

대부분의 경우 이러한 두 개 또는 세 개의 포트는 TCP 1024-65534 범위에 임의로 매핑됩니다. 필요한 경우 임시 포트를 사용하지 않고 이러한 포트가 항상 정적 포트 매핑에 바인딩되도록 구성할 수 있습니다.

Exchange Server에서 정적 TCP 포트를 구성하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
270836(http://support.microsoft.com/kb/270836/)XCLN: Exchange 2000 정적 포트 매핑
Outlook 2003 클라이언트는 RPC를 사용하여 Exchange 서버에 대한 직접 연결을 지원합니다. 그러나 이러한 클라이언트는 인터넷을 통해 Windows Server 2003 기반 컴퓨터에서 호스팅되는 Exchange 2003 서버와도 통신할 수 있습니다. Outlook과 Exchange 서버 간에 RPC over HTTP 통신을 사용하면 인터넷에서 인증되지 않은 RPC 트래픽을 노출하지 않아도 됩니다. 대신 Outlook 2003 클라이언트와 Exchange Server 2003 컴퓨터 간의 트래픽이 TCP 포트 443(HTTPS)을 통해 HTTPS 패킷 내에 터널링됩니다.

RPC over HTTP를 사용하려면 Outlook 2003 클라이언트와 "RPCProxy" 장치 기능을 하는 서버 사이에서 TCP 포트 443(HTTPS)을 사용할 수 있어야 합니다. HTTPS 패킷은 RPCProxy 서버에서 종료되며 래핑되지 않은 RPC 패킷은 세 개의 포트에서 Exchange 서버로 전달됩니다. 이는 위에서 설명한 RPC 트래픽과 비슷한 방식입니다. Exchange 서버에서 이러한 RPC over HTTP 포트는 TCP 6001(정보 저장소), TCP 6002(디렉터리 조회) 및 TCP 6004(DSProxy/NSPI)에 정적으로 매핑됩니다. Outlook 2003에서는 정적으로 매핑된 이러한 끝점 포트를 사용하는 것을 알고 있으므로 Outlook 2003과 Exchange 2003 사이에서 RPC over HTTP 통신을 사용할 때는 끝점 매퍼를 노출할 필요가 없습니다. 또한 Exchange 2003 서버의 DSProxy/NSPI 인터페이스가 전역 카탈로그를 제공하므로 Outlook 2003 클라이언트에 이 기능을 노출할 필요가 없습니다.

특정 환경에서는 몇 가지 항목을 더 고려해야 할 수 있습니다. 자세한 내용과 Exchange 구현 계획에 유용한 정보를 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/korea/exchange/library/default.asp(http://www.microsoft.com/korea/exchange/library/default.asp)
자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
270836(http://support.microsoft.com/kb/270836/)XCLN: Exchange 2000 정적 포트 매핑
278339(http://support.microsoft.com/kb/278339/)Exchange 2000 Server에서 사용하는 TCP/UDP 포트
280132(http://support.microsoft.com/kb/280132/)XCCC: 방화벽을 통한 Exchange 2000 Windows 2000 연결
282446(http://support.microsoft.com/kb/282446/)Exchange 클러스터의 정적 포트에 대한 DSProxy 구성
827330(http://support.microsoft.com/kb/827330/)Office Outlook 2003에서 클라이언트 RPC over HTTP 연결 문제를 해결하는 방법
833401(http://support.microsoft.com/kb/833401/)Exchange Server 2003 단일 서버에서 RPC over HTTP를 구성하는 방법
Exchange Server는 SMTP, POP3(Post Office Protocol 3) 및 IMAP와 같은 다른 프로토콜도 지원할 수 있습니다.
응용 프로그램 프로토콜프로토콜포트
IMAPTCP143
SSL 상의 IMAPTCP993
POP3TCP110
SSL 상의 POP3TCP995
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호
RPCTCP135
RPC over HTTPTCP443
SMTPTCP25
SMTPUDP25
정보 저장소TCP6001
디렉터리 조회TCP6002
DSProxy/NSPITCP6004

팩스 서비스(Fax Service)

TAPI(Telephony API) 규격 시스템 서비스인 팩스 서비스는 팩스 기능을 제공합니다. 팩스 서비스를 사용하면 로컬 팩스 장치나 공유 네트워크 팩스 장치를 통해 데스크톱 프로그램에서 팩스를 보내고 받을 수 있습니다.

시스템 서비스 이름:Fax
응용 프로그램 프로토콜프로토콜포트
NetBIOS 세션 서비스TCP139
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호
SMBTCP445

파일 복제(File Replication)

FRS(파일 복제 서비스)는 공통된 FRS 복제 세트에 포함된 컴퓨터 간에 파일 및 폴더 업데이트 내용을 자동으로 복사하는 파일 기반 복제 엔진입니다. FRS는 공통된 도메인에 있는 Windows 2000 기반 및 Windows Server 2003 기반 도메인 컨트롤러 간에 SYSVOL 폴더의 내용을 복제하는 데 사용되는 기본 복제 엔진입니다. DFS 관리 도구를 사용하여 DFS 루트 또는 링크의 대상 간에 파일 및 폴더를 복제하도록 FRS를 구성할 수 있습니다.

시스템 서비스 이름:NtFrs
응용 프로그램 프로토콜프로토콜포트
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

Macintosh용 파일 서버(File Server for Macintosh)

Macintosh 컴퓨터 사용자는 Macintosh용 파일 서버 시스템 서비스를 사용하여 Windows Server 2003을 실행하는 컴퓨터에서 파일을 저장하고 액세스할 수 있습니다. 이 서비스가 해제되어 있거나 차단되어 있는 경우 Macintosh 클라이언트가 해당 컴퓨터에서 파일을 저장하거나 액세스할 수 없습니다.

시스템 서비스 이름:MacFile
응용 프로그램 프로토콜프로토콜포트
Macintosh용 파일 서버TCP548

FTP 게시 서비스(FTP Publishing Service)

FTP 게시 서비스를 사용하여 FTP 연결을 할 수 있습니다. 기본적으로 FTP 제어 포트는 21이지만, 인터넷 정보 서비스(IIS) 관리자 스냅인을 통해 이 시스템 서비스를 구성할 수 있습니다. 능동 모드 FTP에 사용되는 기본 데이터 포트는 제어 포트보다 하나 작은 포트로 자동으로 설정됩니다. 따라서 제어 포트를 포트 4131로 구성하면 기본 데이터 포트는 4130이 됩니다. 대부분의 FTP 클라이언트가 수동 모드 FTP를 사용합니다. 즉, 클라이언트가 처음에는 제어 포트를 사용하여 FTP 서버에 연결하고, FTP 서버가 1025~5000 사이의 상위 TCP 포트를 할당하면 클라이언트가 데이터 전송을 위해 FTP 서버에 두 번째 연결을 설정합니다. IIS 메타베이스를 사용하여 상위 포트의 범위를 구성할 수 있습니다.

시스템 서비스 이름:MSFTPSVC
응용 프로그램 프로토콜프로토콜포트
FTP 제어TCP21
FTP 기본 데이터TCP20
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

그룹 정책(Group Policy)

그룹 정책을 성공적으로 적용하려면 클라이언트에서 DCOM, ICMP, LDAP, SMB 및 RPC 프로토콜을 통해 도메인 컨트롤러에 접속할 수 있어야 합니다. 이러한 프로토콜이 하나라도 사용 불가능하거나 클라이언트와 관련 도메인 컨트롤러 간에 차단되어 있으면 정책이 적용되거나 새로 고쳐지지 않습니다. 컴퓨터와 사용자 계정이 서로 다른 도메인에 속해 있는 도메인 간 로그온의 경우, 클라이언트, 리소스 도메인 및 계정 도메인이 통신하는 데는 이러한 프로토콜이 필요할 수 있습니다. ICMP는 느린 연결이 검색될 때 사용됩니다. 느린 연결 검색에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
227260(http://support.microsoft.com/kb/227260/)사용자 프로필 및 그룹 정책을 처리할 때 느린 연결이 검색되는 방식
시스템 서비스 이름:Group Policy
응용 프로그램 프로토콜프로토콜포트
DCOMTCP + UDP1024 - 65534 사이의 임의 포트 번호
ICMP(ping)ICMP20
LDAPTCP389
SMBTCP445
RPCTCP135,1024 - 65534 사이의 임의 포트 번호

HTTP SSL

HTTP SSL 시스템 서비스는 IIS에서 SSL 기능을 수행할 수 있도록 합니다. SSL은 신용 카드 번호와 같은 중요 정보를 가로채는 것을 방지하기 위해 암호화된 통신 채널을 설정하는 데 대한 공개 표준입니다. 이 서비스는 다른 인터넷 서비스에서도 작동하도록 설계되었지만 주로 WWW(World Wide Web)에서 암호화된 전자 금융 트랜잭션을 수행하는 데 사용됩니다. 인터넷 정보 서비스(IIS) 관리자 스냅인을 통해 이 서비스의 포트를 구성할 수 있습니다.

시스템 서비스 이름:HTTPFilter
응용 프로그램 프로토콜프로토콜포트
HTTPSTCP443

인터넷 인증 서비스(Internet Authentication Service)

IAS(인터넷 인증 서비스)는 네트워크에 연결하는 사용자의 중앙 집중화된 인증, 권한 부여, 감사 및 계정 작업을 수행합니다. 이러한 사용자는 LAN이나 원격으로 연결되어 있을 수 있습니다. IAS는 IETF(Internet Engineering Task Force) 표준 RADIUS(원격 인증 전화 접속 사용자 서비스) 프로토콜을 구현합니다.

시스템 서비스 이름:IAS
응용 프로그램 프로토콜프로토콜포트
레거시 RADIUSUDP1645
레거시 RADIUSUDP1646
RADIUS 계정UDP1813
RADIUS 인증UDP1812

ICF(인터넷 연결 방화벽)/ICS(인터넷 연결 공유)(Internet Connection Firewall/Internet Connection Sharing)

이 시스템 서비스는 홈 네트워크나 소규모 사무실 네트워크에 있는 모든 컴퓨터에 대한 NAT, 주소 지정 및 이름 확인 서비스를 제공합니다. 인터넷 연결 공유 기능이 설정되어 있으면 한 컴퓨터가 네트워크에서 "인터넷 게이트웨이"가 되고 다른 클라이언트 컴퓨터들은 전화 접속 연결이나 광대역 연결과 같은 하나의 인터넷 연결을 공유할 수 있습니다. 이 서비스는 기본 DHCP 및 DNS 서비스를 제공하지만 모든 기능을 갖춘 Windows DHCP 또는 DNS 서비스에서 작동합니다. ICF와 인터넷 연결 공유가 네트워크의 나머지 컴퓨터에 대한 게이트웨이의 역할을 하는 경우 내부 네트워크 인터페이스의 개인 네트워크에 DHCP 및 DNS 서비스를 제공합니다. 이 시스템 서비스는 외부 지향 인터페이스에서는 이러한 서비스를 제공하지 않습니다.

시스템 서비스 이름:SharedAccess
응용 프로그램 프로토콜프로토콜포트
DHCP 서버UDP67
DNSUDP53
DNSTCP53

Kerberos 키 배포 센터(Kerberos Key Distribution Center)

Kerberos KDC(키 배포 센터) 시스템 서비스를 사용하면 사용자가 Kerberos 버전 5 인증 프로토콜을 사용하여 네트워크에 로그온할 수 있습니다. 다른 Kerberos 프로토콜 구현의 경우와 마찬가지로 KDC는 인증 서비스와 TGS(Ticket-Granting Service)를 제공하는 단일 프로세스입니다. 인증 서비스는 TGT(Ticket Granting Ticket)를 발행하고 TGS(Ticket-Granting Service)는 자체 도메인에서 컴퓨터에 연결하기 위한 티켓을 발행합니다.

시스템 서비스 이름:kdc
응용 프로그램 프로토콜프로토콜포트
KerberosTCP88
KerberosUDP88

라이선스 로깅(License Logging)

라이선스 로깅 시스템 서비스는 서버 CAL(클라이언트 액세스 라이선스) 모델에서 라이선스가 부여되는 Microsoft 서버 제품의 라이선스 관리에 도움이 되도록 설계된 도구입니다. 라이선스 로깅은 Microsoft Windows NT Server 3.51에서 도입되었습니다. 기본적으로 라이선스 로깅 서비스는 Windows Server 2003에서 해제되어 있습니다. 기존 설계 제약 조건과 변화하는 라이선스 조건 때문에 라이선스 로깅은 특정 서버나 기업 전반에서 사용되는 CAL의 총 수와 비교하여 구입할 CAL의 총 수를 정확하게 제공하지 못할 수 있습니다. 라이선스 로깅에서 보고한 CAL은 PUR(제품 사용권)과 Microsoft 소프트웨어 사용 조건의 해석과 충돌할 수 있습니다. 라이선스 로깅은 이후 버전의 Windows 운영 체제에는 포함되지 않을 것입니다. Microsoft Small Business Server 제품군 운영 체제의 사용자만 서버에서 이 서비스를 설정하는 것이 좋습니다.

시스템 서비스 이름:LicenseService
응용 프로그램 프로토콜프로토콜포트
NetBIOS 데이터그램 서비스UDP138
NetBIOS 세션 서비스TCP139
SMBTCP445

메시지 대기열(Message Queuing)

메시지 대기열 시스템 서비스는 Windows용 분산 메시징 프로그램을 만드는 데 사용되는 메시징 인프라와 개발 도구입니다. 이러한 프로그램은 유형이 다른 네트워크를 통해 통신할 수 있고 일시적으로 서로 연결하지 못할 수 있는 컴퓨터 간에 메시지를 보낼 수 있습니다. 메시지 대기열은 보안, 효율적인 라우팅, 트랜잭션 내부에서 메시지 전송 지원, 우선 순위 기반 메시징 및 보장된 메시지 배달 기능을 제공합니다.

시스템 서비스 이름:MSMQ
응용 프로그램 프로토콜프로토콜포트
MSMQTCP1801
MSMQUDP1801
MSMQ-DCTCP2101
MSMQ-MgmtTCP2107
MSMQ-PingUDP3527
MSMQ-RPCTCP2105
MSMQ-RPCTCP2103
RPCTCP135

메신저(Messenger)

메신저 시스템 서비스는 사용자, 컴퓨터, 관리자 및 경고 서비스와 메시지를 주고받습니다. 이 서비스는 Windows Messenger와 관련이 없습니다. 메신저 서비스를 해제하면 현재 네트워크에 로그온되어 있는 컴퓨터나 사용자에게 전송되는 알림을 받지 못합니다. 또한net send명령과net name명령이 더 이상 작동하지 않습니다.

시스템 서비스 이름:Messenger
응용 프로그램 프로토콜프로토콜포트
NetBIOS 데이터그램 서비스UDP138

Microsoft Exchange MTA 스택(Microsoft Exchange MTA Stacks)

Microsoft Exchange 2000 Server와 Microsoft Exchange Server 2003에서 MTA(메시지 전송 에이전트)는 혼합 모드 환경에서 Exchange 2000 Server 기반 서버와 Exchange Server 5.5 기반 서버 간의 이전 버전과 호환되는 메시지 전송 서비스를 제공하는 데 많이 사용됩니다.

시스템 서비스 이름:MSExchangeMTA
응용 프로그램 프로토콜프로토콜포트
X.400TCP102

Microsoft Operations Manager 2000

Microsoft Operations Manager(MOM) 2000은 종합적인 이벤트 관리, 사전 모니터링 및 경고, 보고 및 추세 분석 기능을 제공하여 엔터프라이즈 수준에서 작업을 관리합니다. MOM 2000 서비스 팩 1(SP1)을 설치하면 MOM 2000은 더 이상 일반 텍스트 통신 채널을 사용하지 않으며 MOM 에이전트와 MOM 서버 간의 모든 트래픽이 TCP 포트 1270을 통해 암호화됩니다. MOM 관리자 콘솔은 DCOM을 사용하여 서버에 연결합니다. 즉, 네트워크를 통해 MOM 서버를 관리하는 관리자는 임의의 상위 TCP 포트에 액세스할 수 있어야 합니다.

시스템 서비스 이름:one point
응용 프로그램 프로토콜프로토콜포트
MOM-ClearTCP51515
MOM-EncryptedTCP1270

Microsoft POP3 서비스(Microsoft POP3 Service)

Microsoft POP3 서비스는 전자 메일 전송 및 검색 서비스를 제공합니다. 관리자는 이 서비스를 사용하여 메일 서버에서 전자 메일 계정을 저장하고 관리할 수 있습니다. 메일 서버에 Microsoft POP3 서비스를 설치하면 사용자가 메일 서버에 연결한 다음 POP3 프로토콜을 지원하는 전자 메일 클라이언트(예: Microsoft Outlook)를 사용하여 전자 메일을 검색할 수 있습니다.

시스템 서비스 이름:POP3SVC
응용 프로그램 프로토콜프로토콜포트
POP3TCP110

MSSQLSERVER

MSSQLSERVER는 Microsoft SQL Server 2000의 시스템 서비스입니다. SQL Server는 강력하고 종합적인 데이터 관리 플랫폼을 제공합니다. 서버 네트워크 유틸리티를 사용하여 SQL Server의 각 인스턴스가 사용하는 포트를 구성할 수 있습니다.

시스템 서비스 이름:MSSQLSERVER
응용 프로그램 프로토콜프로토콜포트
TCP를 통한 SQLTCP1433
SQL ProbeUDP1434

MSSQL$UDDI

MSSQL$UDDI 시스템 서비스는 Windows Server 2003 제품군 운영 체제의 UDDI(Universal Description, Discovery, and Integration) 기능을 설치할 때 설치됩니다. MSSQL$UDDI는 엔터프라이즈에서 UDDI 기능을 제공합니다. SQL Server 데이터베이스 엔진은 MSSQL$UDDI의 핵심 구성 요소입니다.

시스템 서비스 이름:MSSQLSERVER
응용 프로그램 프로토콜프로토콜포트
TCP를 통한 SQLTCP1433
SQL ProbeUDP1434

Net Logon

Net Logon 시스템 서비스는 사용자와 서비스를 인증하기 위한 컴퓨터와 도메인 컨트롤러 간의 보안 채널을 관리합니다. 이 서비스는 도메인 컨트롤러로 사용자의 자격 증명을 전달하고 사용자의 사용자 권한과 도메인 보안 ID를 반환합니다. 일반적으로 이것을 창구 인증이라고 합니다. Net Logon은 구성원 컴퓨터나 도메인 컨트롤러가 도메인에 가입된 경우에만 자동으로 시작되도록 구성됩니다. Windows 2000 Server와 Windows Server 2003 제품군에서 Net Logon은 DNS에서 서비스 리소스 로케이터 레코드를 게시합니다. 이 서비스가 실행되면 서버 서비스와 로컬 보안 기관 서비스를 사용하여 들어오는 요청을 수신 대기합니다. Net Logon은 도메인 구성원 컴퓨터에서 명명된 파이프를 통한 RPC를 사용하고, 도메인 컨트롤러에서 명명된 파이프를 통한 RPC, TCP/IP를 통한 RPC, 메일 슬롯 및 LDAP(Lightweight Directory Access Protocol)를 사용합니다.

시스템 서비스 이름:Netlogon
응용 프로그램 프로토콜프로토콜포트
NetBIOS 데이터그램 서비스UDP138
NetBIOS 이름 확인UDP137
NetBIOS 세션 서비스TCP139
SMBTCP445

NetMeeting 원격 데스크톱 공유(NetMeeting Remote Desktop Sharing)

NetMeeting 원격 데스크톱 공유 시스템 서비스는 권한이 있는 사용자가 Windows NetMeeting을 사용하여 회사 인트라넷을 통해 다른 PC에서 Windows 바탕 화면에 원격으로 액세스할 수 있도록 허용합니다. NetMeeting에서 이 서비스를 명시적으로 설정해야 합니다. Windows 알림 영역에서 아이콘을 사용하여 이 기능을 해제하거나 종료할 수 있습니다.

시스템 서비스 이름:mnmsrvc
응용 프로그램 프로토콜프로토콜포트
터미널 서비스TCP3389

NNTP(Network News Transfer Protocol)

NNTP(Network News Transfer Protocol) 시스템 서비스를 사용하면 Windows Server 2003을 실행하는 컴퓨터가 뉴스 서버의 역할을 수행할 수 있습니다. 클라이언트는 Microsoft Outlook Express와 같은 뉴스 클라이언트를 사용하여 서버에서 뉴스 그룹을 검색하고 각 뉴스 그룹에서 문서의 머리글이나 본문을 읽을 수 있습니다.

시스템 서비스 이름:NNTPSVC
응용 프로그램 프로토콜프로토콜포트
NNTPTCP119
SSL 상의 NNTPTCP563

성능 로그 및 경고(Performance Logs and Alerts)

성능 로그 및 경고 시스템 서비스는 미리 구성된 일정 매개 변수에 따라 로컬 컴퓨터나 원격 컴퓨터에서 성능 데이터를 수집하고 이 데이터를 로그에 기록하거나 메시지를 발생시킵니다. 성능 로그 및 경고 서비스는 명명된 로그 수집 설정에 포함된 정보에 따라 각각의 명명된 성능 데이터 수집을 시작하고 중지합니다. 이 서비스는 적어도 하나의 성능 데이터 수집이 예약된 경우에만 실행됩니다.

시스템 서비스 이름:SysmonLog
응용 프로그램 프로토콜프로토콜포트
NetBIOS 세션 서비스TCP139

인쇄 스풀러(Print Spooler)

인쇄 스풀러 시스템 서비스는 모든 로컬 및 네트워크 인쇄 대기열을 관리하고 모든 인쇄 작업을 제어합니다. 인쇄 스풀러는 Windows 인쇄 하위 시스템의 중심입니다. 이 서비스는 시스템에서 인쇄 대기열을 관리하고 USB 포트, TCP/IP 프로토콜 제품군 등의 I/O(입/출력) 구성 요소 및 프린터 드라이버와 통신합니다.

시스템 서비스 이름:Spooler
응용 프로그램 프로토콜프로토콜포트
NetBIOS 세션 서비스TCP139
SMBTCP445

원격 설치(Remote Installation)

원격 설치 시스템 서비스를 사용하여 PXE(Pre-Boot eXecution Environment) 원격 부팅 가능 클라이언트 컴퓨터에 Windows 2000, Windows XP 및 Windows Server 2003을 설치할 수 있습니다. RIS(원격 설치 서버)의 주요 구성 요소인 BINL(Boot Information Negotiation Layer) 서비스는 PXE 클라이언트 요청에 응답하고 클라이언트 유효성 검사를 위해 Active Directory를 검사하고 서버에서 클라이언트 정보를 전달합니다. BINL 서비스는 Windows 구성 요소 추가/제거에서 RIS 구성 요소를 추가하거나 운영 체제를 처음에 설치할 때 RIS 구성 요소를 선택하면 설치됩니다.

시스템 서비스 이름:BINLSVC
응용 프로그램 프로토콜프로토콜포트
BINLUDP4011

RPC(원격 프로시저 호출)(Remote Procedure Call (RPC))

RPC(원격 프로시저 호출) 시스템 서비스는 데이터를 교환하고 다른 프로세스에 있는 기능을 호출할 수 있도록 하는 IPC(프로세스 간 통신) 메커니즘입니다. 다른 프로세스는 같은 컴퓨터, LAN 또는 원격 위치에 있을 수 있으며 WAN 연결이나 VPN 연결을 통해 액세스될 수 있습니다. RPC 서비스는 RPC 끝점 매퍼와 COM(구성 요소 개체 모델) 서비스 제어 관리자의 역할을 수행합니다. 많은 서비스가 RPC 서비스를 통해 성공적으로 시작됩니다.

시스템 서비스 이름:RpcSs
응용 프로그램 프로토콜프로토콜포트
RPCTCP135
RPC over HTTPTCP593

RPC(원격 프로시저 호출) 로케이터(Remote Procedure Call (RPC) Locator)

RPC(원격 프로시저 호출) 로케이터 시스템 서비스는 RPC 이름 서비스 데이터베이스를 관리합니다. 이 서비스가 설정되어 있으면 RPC 클라이언트가 RPC 서버를 찾을 수 있습니다. 이 서비스는 기본적으로 해제되어 있습니다.

시스템 서비스 이름:RpcLocator
응용 프로그램 프로토콜프로토콜포트
NetBIOS 세션 서비스TCP139
SMBTCP445

원격 저장소 알림(Remote Storage Notification)

원격 저장소 알림 시스템 서비스는 사용자가 보조 저장소 미디어에서만 사용할 수 있는 파일에서 쓰거나 읽을 때 사용자에게 이를 알립니다. 이 서비스를 중지하면 알림이 방지됩니다.

시스템 서비스 이름:Remote_Storage_User_Link
응용 프로그램 프로토콜프로토콜포트
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

원격 저장소 서버(Remote Storage Server)

원격 저장소 서버 시스템 서비스는 자주 사용되지 않는 파일을 보조 저장소 미디어에 저장합니다. 이 서비스를 중지하면 사용자가 보조 저장소 미디어에서 파일을 이동하거나 검색할 수 없습니다.

시스템 서비스 이름:Remote_Storage_Server
응용 프로그램 프로토콜프로토콜포트
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

라우팅 및 원격 액세스(Routing and Remote Access)

라우팅 및 원격 액세스 서비스는 다중 프로토콜 LAN-LAN, LAN-WAN, VPN 및 NAT 라우팅 서비스를 제공할 뿐 아니라 전화 접속과 VPN 원격 액세스 서비스도 제공합니다. 라우팅 및 원격 액세스 서비스는 다음 프로토콜을 모두 사용할 수 있지만 일반적으로는 일부만 사용합니다. 예를 들어, 필터링 라우터 뒤에 있는 VPN 게이트웨이를 구성하는 경우 한 기술만 사용할 수 있습니다. IPsec과 함께 L2TP를 사용하는 경우 라우터를 통해 IPsec ESP(IP 프로토콜 50), NAT-T(포트 4500에서 TCP) 및 IPsec ISAKMP(포트 500에서 TCP)를 허용해야 합니다.

참고NAT-T와 IPsec ISAKMP가 L2TP에 필요하지만 이러한 포트는 실제로 로컬 보안 기관에서 모니터링합니다. 이에 대한 자세한 내용은 이 문서의 "참조" 절을 참조하십시오.

시스템 서비스 이름:RemoteAccess
응용 프로그램 프로토콜프로토콜포트
GRE(IP 프로토콜 47)GREn/a
IPsec AH(IP 프로토콜 51)AHn/a
IPsec ESP(IP 프로토콜 50)ESPn/a
L2TPUDP1701
PPTPTCP1723

서버(Server)

서버 시스템 서비스는 네트워크를 통한 파일, 인쇄 및 명명된 파이프 공유와 RPC 지원 기능을 제공합니다. 서버 서비스를 통해 디스크 및 프린터와 같은 로컬 리소스를 공유할 수 있으므로 네트워크의 다른 사용자가 이러한 리소스에 액세스할 수 있을 뿐 아니라 로컬 컴퓨터에서 실행되는 프로그램과 다른 컴퓨터에서 실행되는 프로그램 간의 명명된 파이프 통신도 수행할 수 있습니다. 명명된 파이프 통신은 한 프로세스의 출력용으로 예약된 메모리가 다른 프로세스의 입력으로 사용되는 것을 말합니다. 입력을 받아들이는 프로세스는 컴퓨터에 로컬일 필요가 없습니다.

참고컴퓨터 이름을 WINS를 사용하여 다중 IP 주소로 확인하거나 WINS가 실패하여 DNS를 사용하여 컴퓨터 이름을 확인한 경우 NetBT(TCP/IP를 통한 NetBIOS)가 파일 서버의 IP 주소에 대해 ping을 시도합니다. 포트 139 통신은 ICMP(Internet Control Message Protocol)를 에코 메시지에 의존합니다. IPv6(Internet Protocol 버전 6)이 설치되어 있지 않은 경우 포트 445 통신도 이름을 확인할 때 ICMP에 의존합니다. 미리 로드된 Lmhosts 항목은 DNS 확인자를 무시합니다. Windows Server 2003 기반 또는 Windows XP 기반 시스템에 IPv6이 설치되어 있으면 포트 445 통신은 ICMP 요청을 트리거하지 않습니다.

시스템 서비스 이름:lanmanserver
응용 프로그램 프로토콜프로토콜포트
NetBIOS 데이터그램 서비스UDP138
NetBIOS 이름 확인UDP137
NetBIOS 세션 서비스TCP139
SMBTCP445

SharePoint Portal Server

SharePoint Portal Server 시스템 서비스를 사용하면 비즈니스 프로세스 전반에서 관련 정보를 이용할 수 있도록 사용자, 팀 및 지식을 완벽하게 연결하는 지능형 포털을 개발할 수 있습니다. Microsoft SharePoint Portal Server 2003은 단일 로그온 및 엔터프라이즈 응용 프로그램 통합 기능을 통해 다양한 시스템의 정보를 한 솔루션으로 통합하는 엔터프라이즈 비즈니스 솔루션을 제공합니다.

응용 프로그램 프로토콜프로토콜포트
HTTPTCP80
HTTPSTCP443

SMTP(Simple Mail Transfer Protocol)

SMTP(Simple Mail Transfer Protocol) 시스템 서비스는 전자 메일 전송 및 릴레이 에이전트입니다. 이 서비스는 원격 대상에 대한 전자 메일을 받아들이고 대기열에 저장하며 지정된 간격으로 검색합니다. Windows 도메인 컨트롤러는 사이트 간 전자 메일 기반 복제에 SMTP 서비스를 사용합니다. Windows Server 2003 COM 구성 요소의 CDO(Collaboration Data Object)는 SMTP 서비스를 사용하여 아웃바운드 전자 메일을 전송하고 대기열에 저장할 수 있습니다.

시스템 서비스 이름:SMTPSVC
응용 프로그램 프로토콜프로토콜포트
SMTPTCP25
SMTPUDP25

단순 TCP/IP 서비스(Simple TCP/IP Services)

단순 TCP/IP 서비스는 다음 프로토콜에 대한 지원 기능을 구현합니다.
Echo, 포트 7, RFC 862
Discard, 포트 9, RFC 863
Character Generator, 포트 19, RFC 864
Daytime, 포트 13, RFC 867
Quote of the Day, 포트 17, RFC 865
시스템 서비스 이름:SimpTcp
응용 프로그램 프로토콜프로토콜포트
ChargenTCP19
ChargenUDP19
DaytimeTCP13
DaytimeUDP13
DiscardTCP9
DiscardUDP9
EchoTCP7
EchoUDP7
QuotdTCP17
QuotedUDP17

SMS 원격 제어 에이전트(SMS Remote Control Agent)

SMS 원격 제어 에이전트는 Microsoft Systems Management Server(SMS) 2003의 시스템 서비스입니다. SMS 원격 제어 에이전트는 Microsoft 운영 체제의 변경과 구성 관리를 위한 종합적인 솔루션을 제공합니다. 이 솔루션을 사용하는 조직은 관련된 소프트웨어와 업데이트를 사용자에게 제공할 수 있습니다.

시스템 서비스 이름:Wuser32
응용 프로그램 프로토콜프로토콜포트
SMS 원격 이야기방TCP2703
SMS 원격 이야기방UDP2703
SMS 원격 제어(제어)TCP2701
SMS 원격 제어(제어)UDP2701
SMS 원격 제어(데이터)TCP2702
SMS 원격 제어(데이터)UDP2702
SMS 원격 파일 전송TCP2704
SMS 원격 파일 전송UDP2704

SNMP 서비스(SNMP Service)

SNMP 서비스를 사용하면 들어오는 SNMP(Simple Network Management Protocol) 요청을 로컬 컴퓨터에서 처리할 수 있습니다. SNMP 서비스에는 네트워크 장치에서 활동을 모니터링하고 네트워크 콘솔 워크스테이션에 보고하는 에이전트가 있습니다. SNMP 서비스는 네트워크 관리 소프트웨어를 실행하는 중앙에 위치한 컴퓨터에서 네트워크 호스트(예: 워크스테이션 또는 서버 컴퓨터, 라우터, 브리지 및 허브)를 관리하는 방법을 제공합니다. SNMP는 에이전트와 관리 시스템의 분산 아키텍처를 사용하여 관리 서비스를 수행합니다.

시스템 서비스 이름:SNMP
응용 프로그램 프로토콜프로토콜포트
SNMPUDP161

SNMP 트랩 서비스(SNMP Trap Service)

SNMP 트랩 서비스는 로컬 또는 원격 SNMP 에이전트에서 생성하는 트랩 메시지를 받은 다음 컴퓨터에서 실행되는 SNMP 관리 프로그램으로 전달합니다. SNMP 트랩 서비스는 에이전트에 대해 구성되는 경우 특정 이벤트가 발생하면 트랩 메시지를 생성합니다. 이러한 메시지는 트랩 대상으로 전송됩니다. 예를 들어, 알 수 없는 관리 시스템이 정보 요청을 보내면 인증 트랩을 시작하도록 에이전트를 구성할 수 있습니다. 트랩 대상에는 관리 시스템의 컴퓨터 이름, IP 주소 또는 IPX(Internetwork Packet Exchange) 주소가 포함됩니다. 트랩 대상은 SNMP 관리 소프트웨어를 실행하고 네트워크를 사용할 수 있는 호스트여야 합니다.

시스템 서비스 이름:SNMPTRAP
응용 프로그램 프로토콜프로토콜포트
SNMP 트랩 아웃바운드UDP162

SQL Analysis Server

SQL Analysis Server 시스템 서비스는 SQL Server 2000의 구성 요소입니다. SQL Analysis Server를 사용하여 OLAP 큐브와 데이터 마이닝 모델을 만들고 관리할 수 있습니다. SQL Analysis Server는 큐브나 데이터 마이닝 모델을 만들고 저장하기 위해 로컬 또는 원격 데이터 소스에 액세스할 수 있습니다.

응용 프로그램 프로토콜프로토콜포트
SQL Analysis ServicesTCP2725

SQL Server: 하위 수준 OLAP 클라이언트 지원

SQL Analysis Server 서비스가 하위 수준(OLAP Services 7.0) 클라이언트의 연결을 지원해야 하는 경우 SQL Server 2000에서 이 시스템 서비스를 사용합니다. SQL 7.0에서 사용하는 OLAP 서비스의 기본 포트는 다음과 같습니다.

응용 프로그램 프로토콜프로토콜포트
OLAP Services 7.0TCP2393
OLAP Services 7.0TCP2394

SSDP 검색 서비스(SSDP Discovery Service)

SSDP 검색 서비스는 SSDP(Simple Service Discovery Protocol)를 Windows 서비스로 구현합니다. SSDP 검색 서비스는 장치 유무 알림의 수신을 관리하고 캐시를 업데이트하며 이러한 알림을 처리되지 않은 검색 요청과 함께 클라이언트로 전달합니다. SSDP 검색 서비스는 클라이언트에서 이벤트 콜백의 등록을 받아들여 등록 요청으로 변환하고 이벤트 알림을 모니터링합니다. 그런 다음 등록된 콜백으로 이러한 요청을 전달합니다. 이 시스템 서비스는 호스팅된 장치에 정기적인 알림도 제공합니다. 현재 SSDP 이벤트 알림 서비스는 TCP 포트 5000을 사용합니다. 다음 Windows XP 서비스 팩에서부터는 TCP 포트 2869를 사용합니다.

참고이 문서를 작성하는 시점의 현재 Windows XP 서비스 팩 수준은 Windows XP 서비스 팩 1(SP1)입니다.

시스템 서비스 이름:SSDPRSR
응용 프로그램 프로토콜프로토콜포트
SSDPUDP1900
SSDP 이벤트 알림TCP2869
SSDP 레거시 이벤트 알림TCP5000

Systems Management Server 2.0

Microsoft Systems Management Server(SMS) 2003은 Microsoft 운영 체제의 변경과 구성 관리를 위한 종합적인 솔루션을 제공합니다. 이 솔루션을 사용하는 조직은 관련된 소프트웨어와 업데이트를 신속하고 비용 효율적으로 사용자에게 제공할 수 있습니다.
응용 프로그램 프로토콜프로토콜포트
NetBIOS 데이터그램 서비스UDP138
NetBIOS 이름 확인UDP137
NetBIOS 세션 서비스TCP139
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

TCP/IP 인쇄 서버(TCP/IP Print Server)

TCP/IP 인쇄 서버 시스템 서비스를 사용하면 LPD(Line Printer Daemon) 프로토콜을 통해 TCP/IP 기반 인쇄를 수행할 수 있습니다. 서버의 LPD 서비스는 UNIX 컴퓨터에서 실행되는 LPR(Line Printer Remote) 유틸리티에서 문서를 받습니다.

시스템 서비스 이름:LPDSVC
응용 프로그램 프로토콜프로토콜포트
LPDTCP515

텔넷(Telnet)

Windows의 텔넷 시스템 서비스는 텔넷 클라이언트에 ASCII 터미널 세션을 제공합니다. 텔넷 서버는 두 종류의 인증을 지원하고 다음 네 종류의 터미널을 지원합니다.
ANSI(American National Standards Institute)
VT-100
VT-52
VTNT
시스템 서비스 이름:TlntSvr
응용 프로그램 프로토콜프로토콜포트
텔넷TCP23

터미널 서비스(Terminal Services)

터미널 서비스는 클라이언트 장치가 서버에서 실행되는 Windows 기반 프로그램과 가상 Windows 데스크톱 세션에 액세스할 수 있는 다중 세션 환경을 제공합니다. 터미널 서비스를 사용하면 여러 사용자가 컴퓨터에 대화형으로 연결할 수 있습니다.

시스템 서비스 이름:TermService
응용 프로그램 프로토콜프로토콜포트
터미널 서비스TCP3389

터미널 서버 라이선스(Terminal Services Licensing)

터미널 서비스 라이선스 시스템 서비스는 라이선스 서버를 설치하고, 등록된 클라이언트가 터미널 서버(터미널 서버가 설정된 서버)에 연결될 때 클라이언트에 라이선스를 제공합니다. 터미널 서비스 라이선스는 영향을 적게 미치는 서비스로, 터미널 서버에 대해 발행된 클라이언트 라이선스를 저장한 다음 클라이언트 컴퓨터나 터미널에 발행된 라이선스를 추적합니다.

시스템 서비스 이름:TermServLicensing
응용 프로그램 프로토콜프로토콜포트
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호
SMB(명명된 파이프)TCP139, 445

터미널 서비스 세션 디렉터리(Terminal Services Session Directory)

터미널 서비스 세션 디렉터리 시스템 서비스를 사용하면 로드 균형이 조정되는 터미널 서버의 클러스터가 사용자의 연결 요청을 사용자가 이미 세션을 실행하고 있는 서버로 올바르게 라우팅할 수 있습니다. 사용자는 서버 클러스터에서 다른 세션을 실행하고 있는지 여부와 관계없이 사용할 수 있는 첫 번째 터미널 서버로 라우팅됩니다. 로드 균형 조정 기능은 TCP/IP 네트워크 프로토콜을 사용하여 몇몇 서버의 처리 리소스를 풀링합니다. 터미널 서버의 클러스터에서 이 서비스를 사용하여 여러 서버에 세션을 분산시킴으로써 단일 터미널 서버의 성능을 개선할 수 있습니다. 터미널 서비스 세션 디렉터리는 클러스터에서 연결이 끊어진 세션을 추적하고 사용자가 해당 세션에 다시 연결되는지 확인합니다.

시스템 서비스 이름:Tssdis
응용 프로그램 프로토콜프로토콜포트
RPCTCP135
임의로 할당된 상위 TCP 포트TCP1024 - 65534 사이의 임의 포트 번호

Trivial FTP 데몬(Trivial FTP Daemon)

Trivial FTP 데몬 시스템 서비스는 사용자 이름이나 암호를 필요로 하지 않으며 RIS(원격 설치 서비스)의 필수적인 부분입니다. Trivial FTP 데몬 서비스는 다음 RFC에서 정의하는 TFTP(Trivial FTP 프로토콜)에 대한 지원을 구현합니다.
RFC 1350 - TFTP
RFC 2347 - 옵션 확장
RFC 2348 - 블록 크기 옵션
RFC 2349 - 시간 제한 간격 및 전송 크기 옵션
TFTP는 디스크 없는 부팅 환경을 지원하도록 설계된 파일 전송 프로토콜입니다. TFTP 서비스는 UDP 포트 69에서 수신 대기하지만 응답은 임의로 할당된 상위 포트에서 이루어집니다. 따라서 이 포트를 설정하면 TFTP 서비스가 들어오는 TFTP 요청을 받을 수 있지만 선택된 서버가 해당 요청에 응답할 수 있는 것은 아닙니다. 이 서비스는 원하는 모든 원본 포트에서 이러한 모든 요청에 응답할 수 있으며 원격 클라이언트에서는 전송 중 해당 포트를 사용하게 됩니다. 통신은 양방향으로 이루어집니다. 방화벽을 통해 이 프로토콜을 설정해야 하는 경우에는 UDP 포트 69 인바운드를 여는 것이 유용할 수 있습니다. 그런 다음 서비스가 다른 포트에서 임시 통로를 통해 응답할 수 있도록 동적으로 허용하는 다른 방화벽 기능을 사용할 수 있습니다.

시스템 서비스 이름:tftpd
응용 프로그램 프로토콜프로토콜포트
TFTPUDP69

범용 플러그 앤 플레이 장치 호스트(Universal Plug and Play Device Host)

범용 플러그 앤 플레이 호스트 검색 시스템 서비스는 장치 등록 및 제어와 호스팅된 장치의 이벤트에 대한 응답에 필요한 모든 구성 요소를 구현합니다. 장치와 관련된 등록된 정보(설명, 수명 및 컨테이너)는 선택적으로 디스크에 저장되고 등록 후나 운영 체제가 다시 시작될 때 네트워크에서 알려집니다. 이 서비스에는 서비스 설명과 프레젠테이션 페이지뿐 아니라 장치에 서비스를 제공하는 웹 서버도 포함되어 있습니다.

시스템 서비스 이름:UPNPHost
응용 프로그램 프로토콜프로토콜포트
UPNPTCP2869

WINS(Windows 인터넷 이름 서비스)(Windows Internet Name Service (WINS))

WINS(Windows Internet Name Service)를 통해 NetBIOS 이름 확인을 수행할 수 있습니다. 이 서비스는 NetBIOS 이름을 사용하여 네트워크 리소스를 찾는 데 도움이 됩니다. WINS 서버는 모든 도메인이 Active Directory 디렉터리 서비스로 업그레이드되지 않았고 네트워크의 모든 컴퓨터에서 Windows 2000 이상이 실행되고 있지 않을 때 필요합니다. WINS 서버는 NetBIOS 이름 확인을 사용하여 네트워크 클라이언트와 통신합니다. WINS 복제는 WINS 서버 간에서만 필요합니다.

시스템 서비스 이름:WINS
응용 프로그램 프로토콜프로토콜포트
NetBIOS 이름 확인UDP137
WINS 복제TCP42
WINS 복제UDP42

Windows Media 서비스(Windows Media Services)

Windows Server 2003의 Windows Media 서비스는 Windows Media 서비스 버전 4.0 및 4.1에 포함된 다음 네 가지 서비스를 대체합니다.
Windows Media 모니터 서비스
Windows Media 프로그램 서비스
Windows Media 스테이션 서비스
Windows Media 유니캐스트 서비스
Windows Media 서비스는 Windows Server 2003 Standard Edition, Windows Server 2003 Enterprise Edition 및 Windows Server 2003 Datacenter Edition에서 실행되는 단일 서비스입니다. 이 서비스의 핵심 구성 요소는 COM을 사용하여 개발되었으며 특정 프로그램용으로 사용자 지정할 수 있는 융통성 있는 아키텍처를 갖고 있습니다. 이 서비스는 RTSP(Real Time Streaming Protocol), Microsoft Media Server(MMS) 프로토콜 및 HTTP를 비롯한 매우 다양한 제어 프로토콜을 지원합니다.

시스템 서비스 이름:WMServer
응용 프로그램 프로토콜프로토콜포트
HTTPTCP80
MMSTCP1755
MMSUDP1755
MS TheaterUDP2460
RTCPUDP5005
RTPUDP5004
RTSPTCP554

Windows 시간(Windows Time)

Windows 시간 시스템 서비스는 네트워크의 모든 Windows XP와 Windows Server 2003 기반 컴퓨터에서 날짜 및 시간 동기화를 관리합니다. 이 서비스는 정확한 시계 값이나 타임스탬프가 네트워크 유효성 검사와 리소스 액세스 요청에 할당되도록 NTP(네트워크 기간 프로토콜)를 사용하여 컴퓨터 시계를 동기화합니다. NTP를 구현하고 시간 공급자를 통합하면 Windows 시간 서비스가 안정적이고 확장 가능한 엔터프라이즈용 시간 서비스가 될 수 있습니다. 도메인에 가입되어 있지 않은 컴퓨터의 경우 외부 시간 원본과 시간을 동기화하도록 Windows 시간을 구성할 수 있습니다. 이 서비스가 해제되어 있으면 로컬 컴퓨터의 시간 설정이 Windows 도메인의 시간 서비스나 외부에 구성된 시간 서비스와 동기화되지 않습니다. Windows Server 2003에서는 NTP를 사용합니다. NTP는 UDP 포트 123에서 실행됩니다. 이 서비스의 Windows 2000 버전에서는 SNTP(단일 네트워크 기간 프로토콜)를 사용합니다. SNTP는 UDP 포트 123에서도 실행됩니다.

시스템 서비스 이름:W32Time
응용 프로그램 프로토콜프로토콜포트
NTPUDP123
SNTPUDP123

World Wide Web 게시 서비스(World Wide Web Publishing Service)

World Wide Web 게시 서비스는 IIS에서 등록된 프로그램과 웹 사이트의 등록, 관리, 모니터링 및 서비스 제공에 필요한 인프라를 제공합니다. 이 시스템 서비스에는 프로세스 관리자와 구성 관리자가 포함되어 있습니다. 프로세스 관리자는 사용자 지정 응용 프로그램과 웹 사이트가 있는 프로세스를 제어하고, 구성 관리자는 World Wide Web 게시 서비스의 저장된 시스템 구성을 읽고 Http.sys가 적절한 응용 프로그램 풀이나 운영 체제 프로세스로 HTTP 요청을 라우팅하도록 구성되었는지 확인합니다. 인터넷 정보 서비스(IIS) 관리자 스냅인을 통해 이 서비스에서 사용하는 포트를 구성할 수 있습니다. 관리 웹 사이트가 설정되어 있으면 TCP 포트 8098에서 HTTP 트래픽을 사용하는 가상 웹 사이트가 만들어집니다.

시스템 서비스 이름:W3SVC
응용 프로그램 프로토콜프로토콜포트
HTTPTCP80
HTTPSTCP443

응용 프로그램 프로토콜프로토콜포트
HTTPTCP80
HTTPSTCP443

포트 및 프로토콜

다음 표는 이 문서의 "시스템 서비스 포트" 절의 내용을 요약한 것입니다. 이 표는 서비스 이름 대신 포트 번호를 기준으로 정렬되어 있습니다.
포트프로토콜응용 프로그램 프로토콜시스템 서비스 이름
n/aGREGRE(IP 프로토콜 47)라우팅 및 원격 액세스
n/aESPIPsec ESP(IP 프로토콜 50)라우팅 및 원격 액세스
n/aAHIPsec AH(IP 프로토콜 51)라우팅 및 원격 액세스
7TCPEcho단순 TCP/IP 서비스
7UDPEcho단순 TCP/IP 서비스
9TCPDiscard단순 TCP/IP 서비스
9UDPDiscard단순 TCP/IP 서비스
13TCPDaytime단순 TCP/IP 서비스
13UDPDaytime단순 TCP/IP 서비스
17TCPQuotd단순 TCP/IP 서비스
17UDPQuotd단순 TCP/IP 서비스
19TCPChargen단순 TCP/IP 서비스
19UDPChargen단순 TCP/IP 서비스
20TCPFTP 기본 데이터FTP 게시 서비스
21TCPFTP 제어FTP 게시 서비스
21TCPFTP 제어응용 프로그램 레이어 게이트웨이 서비스
23TCP텔넷텔넷
25TCPSMTPSimple Mail Transfer Protocol
25UDPSMTPSimple Mail Transfer Protocol
25TCPSMTPExchange Server
25UDPSMTPExchange Server
42TCPWINS 복제Windows 인터넷 이름 서비스
42UDPWINS 복제Windows 인터넷 이름 서비스
53TCPDNSDNS 서버
53UDPDNSDNS 서버
53TCPDNS인터넷 연결 방화벽/인터넷 연결 공유
53UDPDNS인터넷 연결 방화벽/인터넷 연결 공유
67UDPDHCP 서버DHCP 서버
67UDPDHCP 서버인터넷 연결 방화벽/인터넷 연결 공유
69UDPTFTPTrivial FTP 데몬 서비스
80TCPHTTPWindows Media 서비스
80TCPHTTPWorld Wide Web 게시 서비스
80TCPHTTPSharePoint Portal Server
88TCPKerberosKerberos 키 배포 센터
88UDPKerberosKerberos 키 배포 센터
102TCPX.400Microsoft Exchange MTA 스택
110TCPPOP3Microsoft POP3 서비스
110TCPPOP3Exchange Server
119TCPNNTPNetwork News Transfer Protocol
123UDPNTPWindows 시간
123UDPSNTPWindows 시간
135TCPRPC메시지 대기열
135TCPRPC원격 프로시저 호출
135TCPRPCExchange Server
135TCPRPC인증서 서비스
135TCPRPC클러스터 서비스
135TCPRPC분산 파일 시스템
135TCPRPC분산 링크 추적
135TCPRPC분산 트랜잭션 코디네이터
135TCPRPC이벤트 로그
135TCPRPC팩스 서비스
135TCPRPC파일 복제
135TCPRPC그룹 정책
135TCPRPC로컬 보안 기관
135TCPRPC원격 저장소 알림
135TCPRPC원격 저장소 서버
135TCPRPCSystems Management Server 2.0
135TCPRPC터미널 서비스 라이선스
135TCPRPC터미널 서비스 세션 디렉터리
137UDPNetBIOS 이름 확인컴퓨터 브라우저
137UDPNetBIOS 이름 확인서버
137UDPNetBIOS 이름 확인Windows 인터넷 이름 서비스
137UDPNetBIOS 이름 확인Net Logon
137UDPNetBIOS 이름 확인Systems Management Server 2.0
138UDPNetBIOS 데이터그램 서비스컴퓨터 브라우저
138UDPNetBIOS 데이터그램 서비스메신저
138UDPNetBIOS 데이터그램 서비스서버
138UDPNetBIOS 데이터그램 서비스Net Logon
138UDPNetBIOS 데이터그램 서비스분산 파일 시스템
138UDPNetBIOS 데이터그램 서비스Systems Management Server 2.0
138UDPNetBIOS 데이터그램 서비스라이선스 로깅 서비스
139TCPNetBIOS 세션 서비스컴퓨터 브라우저
139TCPNetBIOS 세션 서비스팩스 서비스
139TCPNetBIOS 세션 서비스성능 로그 및 경고
139TCPNetBIOS 세션 서비스인쇄 스풀러
139TCPNetBIOS 세션 서비스서버
139TCPNetBIOS 세션 서비스Net Logon
139TCPNetBIOS 세션 서비스원격 프로시저 호출 로케이터
139TCPNetBIOS 세션 서비스분산 파일 시스템
139TCPNetBIOS 세션 서비스Systems Management Server 2.0
139TCPNetBIOS 세션 서비스라이선스 로깅 서비스
143TCPIMAPExchange Server
161UDPSNMPSNMP 서비스
162UDPSNMP 트랩 아웃바운드SNMP 트랩 서비스
389TCPLDAP 서버로컬 보안 기관
389UDPLDAP 서버로컬 보안 기관
389TCPLDAP 서버분산 파일 시스템
389UDPLDAP 서버분산 파일 시스템
443TCPHTTPSHTTP SSL
443TCPHTTPSWorld Wide Web 게시 서비스
443TCPHTTPSSharePoint Portal Server
443TCPRPC over HTTPExchange Server 2003
445TCPSMB팩스 서비스
445TCPSMB인쇄 스풀러
445TCPSMB서버
445TCPSMB원격 프로시저 호출 로케이터
445TCPSMB분산 파일 시스템
445TCPSMB라이선스 로깅 서비스
445TCPSMBNet Logon
464TCPKerberos Password V5Net Logon
500UDPIPsec ISAKMP로컬 보안 기관
515TCPLPDTCP/IP 인쇄 서버
548TCPMacintosh용 파일 서버Macintosh용 파일 서버
554TCPRTSPWindows Media 서비스
563TCPSSL 상의 NNTPNetwork News Transfer Protocol
593TCPRPC over HTTP 끝점 매퍼원격 프로시저 호출
593TCPRPC over HTTPExchange Server
636TCPLDAP SSL로컬 보안 기관
636UDPLDAP SSL로컬 보안 기관
993TCPSSL 상의 IMAPExchange Server
995TCPSSL 상의 POP3Exchange Server
1067TCP설치 부트스트랩 서비스설치 부트스트랩 프로토콜 서버
1068TCP설치 부트스트랩 서비스설치 부트스트랩 프로토콜 클라이언트
1270TCPMOM-EncryptedMicrosoft Operations Manager 2000
1433TCPTCP를 통한 SQLMicrosoft SQL Server
1433TCPTCP를 통한 SQLMSSQL$UDDI
1434UDPSQL ProbeMicrosoft SQL Server
1434UDPSQL ProbeMSSQL$UDDI
1645UDP레거시 RADIUS인터넷 인증 서비스
1646UDP레거시 RADIUS인터넷 인증 서비스
1701UDPL2TP라우팅 및 원격 액세스
1723TCPPPTP라우팅 및 원격 액세스
1755TCPMMSWindows Media 서비스
1755UDPMMSWindows Media 서비스
1801TCPMSMQ메시지 대기열
1801UDPMSMQ메시지 대기열
1812UDPRADIUS 인증인터넷 인증 서비스
1813UDPRADIUS 계정인터넷 인증 서비스
1900UDPSSDPSSDP 검색 서비스
2101TCPMSMQ-DC메시지 대기열
2103TCPMSMQ-RPC메시지 대기열
2105TCPMSMQ-RPC메시지 대기열
2107TCPMSMQ-Mgmt메시지 대기열
2393TCPOLAP Services 7.0SQL Server: 하위 수준 OLAP 클라이언트 지원
2394TCPOLAP Services 7.0SQL Server: 하위 수준 OLAP 클라이언트 지원
2460UDPMS TheaterWindows Media 서비스
2535UDPMADCAPDHCP 서버
2701TCPSMS 원격 제어(제어)SMS 원격 제어 에이전트
2701UDPSMS 원격 제어(제어)SMS 원격 제어 에이전트
2702TCPSMS 원격 제어(데이터)SMS 원격 제어 에이전트
2702UDPSMS 원격 제어(데이터)SMS 원격 제어 에이전트
2703TCPSMS 원격 이야기방SMS 원격 제어 에이전트
2703UPDSMS 원격 이야기방SMS 원격 제어 에이전트
2704TCPSMS 원격 파일 전송SMS 원격 제어 에이전트
2704UDPSMS 원격 파일 전송SMS 원격 제어 에이전트
2725TCPSQL Analysis ServicesSQL Analysis Server
2869TCPUPNP범용 플러그 앤 플레이 장치 호스트
2869TCPSSDP 이벤트 알림SSDP 검색 서비스
3268TCP글로벌 카탈로그 서버로컬 보안 기관
3269TCP글로벌 카탈로그 서버로컬 보안 기관
3343UDP클러스터 서비스클러스터 서비스
3389TCP터미널 서비스NetMeeting 원격 데스크톱 공유
3389TCP터미널 서비스터미널 서비스
3527UDPMSMQ-Ping메시지 대기열
4011UDPBINL원격 설치
4500UDPNAT-T로컬 보안 기관
5000TCPSSDP 레거시 이벤트 알림SSDP 검색 서비스
5004UDPRTPWindows Media 서비스
5005UDPRTCPWindows Media 서비스
6001TCP정보 저장소Exchange Server 2003
6002TCP디렉터리 조회Exchange Server 2003
6004TCPDSProxy/NSPIExchange Server 2003
42424TCPASP.NET 세션 상태ASP.NET 상태 서비스
51515TCPMOM-ClearMicrosoft Operations Manager 2000
1024-65534TCPRPC임의로 할당된 상위 TCP 포트
Microsoft는 Microsoft Excel 워크시트로 이 표의 정보를 제공합니다. 이 워크시트는 Microsoft 다운로드 센터에서 다운로드할 수 있습니다.
사용자 삽입 이미지지금 Port_Requirements_for_Microsoft_Windows_Server_System.xls 패키지 다운로드(http://go.microsoft.com/fwlink/?linkid=21179)(영문)

Active Directory 포트 및 프로토콜 요구 사항

공통 또는 외부 포리스트에 있는 응용 프로그램 서버, 클라이언트 컴퓨터 및 도메인 컨트롤러에는 사용자 및 컴퓨터가 시작한 도메인 가입, 로그온 인증, 원격 관리 및 Active Directory 복제 등의 작업이 올바르게 작동하도록 하는 종속 서비스가 있습니다. 이러한 서비스와 작업에는 특정 포트 및 네트워킹 프로토콜을 통한 네트워크 연결이 필요합니다.

다음은 구성원 컴퓨터와 도메인 컨트롤러가 상호 작용하거나 응용 프로그램 서버에서 Active Directory에 액세스하는 데 필요한 주요 서비스, 포트 및 프로토콜을 요약한 목록입니다.
1.Active Directory / LSA
2.인증 서비스(특정 구성에 필요)
3.컴퓨터 브라우저
4.DHCP 서버(구성된 경우)
5.분산 파일 시스템
6.분산 링크 추적 서버(선택적. 그러나 Windows 2000 컴퓨터에서는 기본적으로 설정됨)
7.분산 트랜잭션 코디네이터
8.DNS 서버(구성된 경우)
9.이벤트 로그
10.팩스 서비스(구성된 경우)
11.파일 복제
12.Macintosh용 파일 서버(구성된 경우)
13.HTTP SSL
14.인터넷 인증 서비스(구성된 경우)
15.Kerberos 키 배포 센터
16.라이선스 로깅(기본적으로 설정됨)
17.메신저
18.Net Logon
19.성능 로그 및 경고
20.인쇄 스풀러
21.원격 설치(구성된 경우)
22.RPC(Remote Procedure Call)
23.RPC(원격 프로시저 호출) 로케이터
24.원격 저장소 알림
25.원격 저장소 서버
26.라우팅 및 원격 액세스
27.서버
28.SMTP(Simple Mail Transfer Protocol)(구성된 경우)
29.SNMP 서비스
30.SNMP 트랩 서비스
31.TCP/IP 인쇄 서버
32.텔넷
33.터미널 서비스
34.터미널 서버 라이선스
35.터미널 서비스 세션 디렉터리
36.WINS
37.Windows 시간
38.World Wide Web 게시 서비스

참조

이 문서에서 설명하는 각 Microsoft 제품의 도움말 파일에는 프로그램을 구성하는 데 유용할 수 있는 추가 정보가 포함되어 있습니다. Windows Server 2003 도움말에는 특정 기술과 서버 역할을 구성하는 방법에 대한 단계별 지침이 들어 있습니다.

관련 항목에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
179442(http://support.microsoft.com/kb/179442/)도메인 및 트러스트를 위한 방화벽을 구성하는 방법

일반 정보

Windows Server 2003의 보안 방법에 대한 자세한 내용과 특정 서버 역할에 대한 예제 IPsec 필터는 "Windows Server 2003 보안 가이드"를 참조하십시오. 이 가이드를 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/technet/security/prodtech/windowsserver2003/w2003hg/sgch00.mspx(http://www.microsoft.com/technet/security/prodtech/windowsserver2003/w2003hg/sgch00.mspx)(영문)
운영 체제 서비스, 보안 설정 및 IPsec 필터링에 대한 자세한 내용은 "위협 및 대책 소개 - Windows 2003 Server 및 Windows XP용 보안 설정" 가이드를 참조하십시오. 이 가이드를 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/korea/technet/security/topics/serversecurity/tcg/tcgch00.mspx(http://www.microsoft.com/korea/technet/security/topics/serversecurity/tcg/tcgch00.mspx)
잘 알려진 포트의 포트 할당에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
174904(http://support.microsoft.com/kb/174904/)TCP/IP 포트 할당에 대한 정보
또한 Microsoft Windows NT 4.0 Resource Kit에서 "부록 B - MS TCP/IP에 대한 포트 참조"를 참조하십시오. 아래 Microsoft 웹 사이트에서 해당 파일을 직접 다운로드하십시오.
http://www.microsoft.com/resources/documentation/windowsnt/4/server/reskit/en-us/net/port_nts.mspx(http://www.microsoft.com/resources/documentation/windowsnt/4/server/reskit/en-us/net/port_nts.mspx)(영문)
또한 Windows 2000 Server Resource Kit에서 "TCP 및 UDP 포트 할당"을 참조하십시오. 아래 Microsoft 웹 사이트에서 해당 파일을 직접 다운로드하십시오.
http://www.microsoft.com/resources/documentation/windows/2000/server/reskit/en-us/default.asp(http://www.microsoft.com/resources/documentation/windows/2000/server/reskit/en-us/default.asp)(영문)
또한 Windows 2000 Resource Kit에서 "포트 할당 및 프로토콜 번호" 문서를 참조하십시오. 아래 Microsoft 웹 사이트에서 해당 파일을 직접 다운로드하십시오.
http://www.microsoft.com/resources/documentation/Windows/2000/server/reskit/en-us/Default.asp?url=/resources/documentation/windows/2000/server/reskit/en-us/cnet/cnfc_por_ZQYU.asp(http://www.microsoft.com/resources/documentation/Windows/2000/server/reskit/en-us/Default.asp?url=/resources/documentation/windows/2000/server/reskit/en-us/cnet/cnfc_por_ZQYU.asp)(영문)
IANA(Internet Assigned Numbers Authority)는 잘 알려진 포트의 사용을 조정합니다. 이 조직의 TCP/IP 포트 할당 목록을 보려면 다음 웹 사이트를 방문하십시오.
http://www.iana.org/assignments/port-numbers(http://www.iana.org/assignments/port-numbers)

원격 프로시저 호출 및 DCOM

DCOM에 대한 자세한 내용은 "방화벽에 DCOM 사용" 백서를 참조하십시오. 아래 Microsoft 웹 사이트에서 해당 파일을 직접 다운로드하십시오.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndcom/html/msdn_dcomfirewall.asp(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndcom/html/msdn_dcomfirewall.asp)(영문)
RPC에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/rpcank.asp(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/rpcank.asp)(영문)
방화벽에서 작동하도록 RPC를 구성하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
154596(http://support.microsoft.com/kb/154596/)방화벽에 사용할 RPC 동적 포트 할당을 구성하는 방법
RPC 프로토콜에 대한 자세한 내용과 Windows 2000을 실행하는 컴퓨터의 초기화 방법에 대한 자세한 내용은 "Windows 2000 시작 및 로그온 소통량 분석" 백서를 참조하십시오. 이 문서를 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/korea/TechNet/win2000/win2ksrv/w2kstart.asp(http://www.microsoft.com/korea/TechNet/win2000/win2ksrv/w2kstart.asp)

분산 트랜잭션 코디네이터

특정 범위의 포트를 사용하도록 DTC를 구성하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
250367(http://support.microsoft.com/kb/250367/)INFO: Microsoft DTC가 방화벽을 통해 작동하도록 구성

도메인 컨트롤러 및 Active Directory

Active Directory 복제 트래픽을 제한하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
224196(http://support.microsoft.com/kb/224196/)특정 포트로 Active Directory 복제 트래픽 제한
디렉터리 시스템 에이전트, LDAP 및 로컬 보안 기관에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ad/ad/directory_system_agent.asp(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ad/ad/directory_system_agent.asp)(영문)
LDAP 및 전역 카탈로그가 Windows 2000에서 작동하는 방식에 대한 자세한 내용을 보려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/resources/documentation/Windows/2000/server/reskit/en-us/Default.asp?url=/resources/documentation/windows/2000/server/reskit/en-us/distrib/dsbi_add_MHAU.asp(http://www.microsoft.com/resources/documentation/Windows/2000/server/reskit/en-us/Default.asp?url=/resources/documentation/windows/2000/server/reskit/en-us/distrib/dsbi_add_MHAU.asp)(영문)

Exchange Server

Exchange 2000 Server 및 Exchange Server 2003 MAPI 트래픽을 제한하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
270836(http://support.microsoft.com/kb/270836/)XCLN: Exchange 2000 정적 포트 매핑
Exchange 2000 Server에서 지원하는 네트워크 포트와 프로토콜에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
278339(http://support.microsoft.com/kb/278339/)Exchange 2000 Server에서 사용하는 TCP/UDP 포트
LDAP 통신에 다른 포트를 사용하도록 Exchange Server 5.5를 구성하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
224447(http://support.microsoft.com/kb/224447/)Exchange Server의 LDAP 포트 할당을 변경하는 방법
Exchange Server 5.5와 이전 버전의 Exchange Server에서 사용하는 포트에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
176466(http://support.microsoft.com/kb/176466/)XGEN: TCP 포트와 Microsoft Exchange: 자세한 논의

파일 복제 서비스

방화벽에서 작동하도록 FRS를 구성하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
319553(http://support.microsoft.com/kb/319553/)특정 정적 포트로 FRS 복제 트래픽을 제한하는 방법

인터넷 정보 서비스

IIS 4.0, IIS 5.0 및 IIS 5.1에서 사용하는 포트에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
327859(http://support.microsoft.com/kb/327859/)INFO: Inetinfo 서비스에서 잘 알려진 포트 이외의 추가 포트를 사용한다
FTP 작동 방식에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://www.microsoft.com/technet/treeview/default.asp?url=/technet/prodtechnol/windowsserver2003/proddocs/standard/wsa_ftp_modes.asp(http://www.microsoft.com/technet/treeview/default.asp?url=/technet/prodtechnol/windowsserver2003/proddocs/standard/wsa_ftp_modes.asp)(영문)

IPsec 및 VPN

Windows에서 IPSec 기본 면제를 구성하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
811832(http://support.microsoft.com/kb/811832/)일부 시나리오에서 IPSec 기본 면제를 사용하여 IPSec 보호를 무시할 수 있다
IPSec에서 사용하는 프로토콜과 포트에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
233256(http://support.microsoft.com/kb/233256/)방화벽을 통해 IPSec 트래픽을 사용하는 방법
L2TP 및 IPSec의 새로운 기능과 업데이트된 기능에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
818043(http://support.microsoft.com/kb/818043/)Windows XP 및 Windows 2000용 L2TP/IPsec NAT-T 업데이트

MADCAP(Multicast Address Dynamic Client Allocation Protocol)

MADCAP 서버 계획 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://technet2.microsoft.com/WindowsServer/en/Library/5396ded4-3318-4ca1-84c6-b85a1435d87d1033.mspx?mfr=true(http://technet2.microsoft.com/WindowsServer/en/Library/5396ded4-3318-4ca1-84c6-b85a1435d87d1033.mspx?mfr=true)(영문)

메시지 대기열

Microsoft Message Queuing에서 사용하는 포트에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
178517(http://support.microsoft.com/kb/178517/)MSMQ에서 사용하는 TCP, UDP 및 RPC 포트

Mobile Information Server

Microsoft Mobile Information Server 2001에서 사용하는 포트에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
294297(http://support.microsoft.com/kb/294297/)XCCC: Microsoft Mobile Information Server에서 사용하는 TCP/IP 포트

Microsoft Operations Manager

MOM에 대한 계획을 수립하고 MOM을 배포하는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://www.microsoft.com/technet/prodtechnol/mom/mom2000/default.mspx(http://www.microsoft.com/technet/prodtechnol/mom/mom2000/default.mspx)(영문)

Systems Management Server

SMS 2003에서 사용하는 포트에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
826852(http://support.microsoft.com/kb/826852/)Systems Management Server 2003에서 방화벽이나 프록시 서버를 통해 통신하는 데 사용하는 포트
SMS 2.0에서 사용하는 포트에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
167128(http://support.microsoft.com/kb/167128/)SMS: 원격 헬프데스크 기능에서 사용하는 네트워크 포트
방화벽을 통해 SMS를 구성하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
200898(http://support.microsoft.com/kb/200898/)방화벽을 통해 Systems Management Server 2.0을 사용하는 방법
SMS 2.0 원격 도구에서 사용하는 포트에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
256884(http://support.microsoft.com/kb/256884/)원격 제어에서 사용하는 TCP 및 UDP 포트가 SMS 2.0 서비스 팩 2에서 변경되었다

SQL Server

SQL Server 2000이 보조 인스턴스의 포트를 동적으로 결정하는 방식에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
286303(http://support.microsoft.com/kb/286303/)동적 포트 검색 중 SQL Server 2000 네트워크 라이브러리의 동작
OLAP용 SQL Server 7.0 및 SQL Server 2000에서 사용하는 포트에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
301901(http://support.microsoft.com/kb/301901/)INF: 방화벽을 통해 연결할 때 OLAP Services에서 사용하는 TCP 포트

터미널 서비스

터미널 서비스에서 사용하는 포트를 구성하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
187623(http://support.microsoft.com/kb/187623/)터미널 서버의 수신 대기 포트를 변경하는 방법

Windows에서 인터넷을 통한 통신 제어

Windows XP 서비스 팩 1(SP1)이 인터넷을 통해 통신하는 방법에 대한 자세한 내용은 "관리 환경에서 Windows XP Professional 서비스 팩 1 사용" 백서를 참조하십시오. 아래 Microsoft 웹 사이트에서 해당 파일을 직접 다운로드하십시오.
http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/xpmanaged/00_abstr.mspx(http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/xpmanaged/00_abstr.mspx)(영문)
Windows 2000 서비스 팩 4(SP4)가 인터넷을 통해 통신하는 방법에 대한 자세한 내용은 "관리 환경에서 Windows 2000 서비스 팩 4 사용" 백서를 참조하십시오. 아래 Microsoft 웹 사이트에서 해당 파일을 직접 다운로드하십시오.
http://www.microsoft.com/technet/prodtechnol/windows2000pro/maintain/w2kmngd/00_abstr.mspx(http://www.microsoft.com/technet/prodtechnol/windows2000pro/maintain/w2kmngd/00_abstr.mspx)(영문)
Windows Server 2003이 인터넷을 통해 통신하는 방법에 대한 자세한 내용은 "관리 환경에서 Windows Server 2003 사용" 백서를 참조하십시오. 아래 Microsoft 웹 사이트에서 해당 파일을 직접 다운로드하십시오.
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/ws03mngd/09_s3fil.mspx(http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/ws03mngd/09_s3fil.mspx)(영문)
신고
Posted by The.민군

SQL Server 2000 Analysis Services 클러스터를 SQL Server 2005 Analysis Services 클러스터로 마이그레이션

기술 자료 ID:910233
마지막 검토:2006년 4월 5일 수요일
수정:3.0
SQL Server Support Voice 칼럼

SQL Server 2000 Analysis Services 클러스터를 SQL Server 2005 Analysis Services 클러스터로 마이그레이션

사용자의 필요에 맞는 칼럼을 게시할 수 있도록 향후 기술 자료 문서 및 Support Voice 칼럼에서 다루었으면 하는 문제와 관심 있는 항목에 대한 의견을 보내주시기 바랍니다.요청(Ask For It)(http://support.microsoft.com/common/survey.aspx?scid=sw;en;1301&p0=&p1=&p2=&p3=&p4=)양식을 사용하여 의견이나 피드백을 보낼 수 있습니다. 이 칼럼 하단에도 이 양식에 대한 링크가 제공됩니다.
안녕하세요! 저는 Microsoft SQL Server Content 팀에서 SQL Server Support Voice 칼럼을 담당하고 있는 Sandy Yakob입니다. 간단히 제 소개를 하자면, 저는 Microsoft에서 10년간 근무하였으며 3년 전부터 SQL Server Content 팀과 함께 일하고 있습니다.

SQL Server Content 팀에서는 두 달에 한 번씩 새로운 칼럼을 꾸준히 제공하고 있습니다. 이달의 칼럼에는 SQL Server 2000 Analysis Services 클러스터를 SQL Server 2005 클러스터로 마이그레이션하는 방법이 수록되어 있습니다.

이 문서의 저자는 Lan Lewis-Beven씨입니다. Lan씨는 Microsoft에서 5년 넘게 SQL Server 클러스터링 및 Analysis Services를 지원하는 업무를 담당해 왔으며 Microsoft에 입사하기 전에는 Chapel Hill School of Medicine에 있는 North Carolina 대학에서 선임 네트워크 관리자로 근무하였습니다.

SQL Server 2000 Analysis Services 클러스터를 SQL Server 2005 Analysis Services 클러스터로 마이그레이션

다음 그림은 일반적인 Analysis Services 2000 클러스터를 보여줍니다. Analysis Services 2000은 클러스터 그룹의 일반 서비스로 설치되었으며 해당 리포지토리는 클러스터된 파일 공유에 있습니다.
사용자 삽입 이미지
자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
308023(http://support.microsoft.com/kb/308023/)Windows 2000 및 Windows Server 2003에서 SQL Server 2000 Analysis Services를 클러스터하는 방법
SQL Server 2000 Analysis Services 클러스터를 SQL Server 2005 Analysis Services 클러스터로 업그레이드할 수 있습니다. 이 문서에서는 다음과 같은 내용을 다룹니다.
업그레이드 계획
업그레이드 수행
업그레이드 확인

업그레이드 계획

업그레이드 옵션

다음 옵션 중 하나를 사용하여 SQL Server 2000 Analysis Services 클러스터를 SQL Server 2005 Analysis Services 클러스터로 업그레이드할 수 있습니다.
네트워크에 임시 서버를 할당합니다. 이렇게 하려면 다음과 같이 하십시오.
1.SQL Server 2000 Analysis Services 클러스터 서버를 백업한 다음 이 백업을 임시 서버에 독립 실행형 서버로 복원합니다.
2.독립 실행형 SQL Server 2000 Analysis Services 서버를 독립 실행형 SQL Server 2005 Analysis Services 서버로 업그레이드합니다.
3.SQL Server 2000 Analysis Services 클러스터를 제거합니다.
4.SQL Server 2005 Analysis Services 클러스터를 설치합니다.
5.임시 SQL Server 2005 Analysis Services 독립 실행형 서버를 백업한 다음 이 백업을 SQL Server 2005 Analysis Services 클러스터에 복원합니다.
추가 클러스터 공유 드라이브를 할당한 다음 기존 SQL Server 2000 Analysis Services 클러스터가 설치된 상태에서 SQL Server 2005 Analysis Services 클러스터를 설치합니다. SQL Server 2000 Analysis Services 클러스터를 SQL Server 2005 Analysis Services 클러스터로 직접 마이그레이션한 다음 SQL Server 2000 Analysis Services 클러스터를 제거합니다.
Microsoft Windows의 클러스터 노드에서 독립 실행형 서버로 만들 SQL Server 2000 Analysis Services 클러스터를 클러스터 해제합니다. 동일한 공유 드라이브에 SQL Server 2005 Analysis Services 클러스터를 설치합니다. 독립 실행형 SQL Server 2000 Analysis Services 서버를 SQL Server 2005 Analysis Services 클러스터로 마이그레이션합니다. SQL Server 2000 Analysis Services 독립 실행형 서버를 제거합니다.
첫 번째 옵션은 독립 실행형 Analysis Services 서버 업그레이드입니다. 이 문서에서는 첫 번째 옵션을 대략적으로 소개만 하고 두 번째 옵션과 세 번째 옵션을 중점적으로 다룹니다.

추가 고려 사항

기존 SQL Server 2000 Analysis Services 클러스터는 클라이언트 액세스용으로 Windows 클러스터 이름과 IP를 사용하지만 새 SQL Server 2005 Analysis Services 클러스터는 고유한 이름과 IP를 사용합니다. SQL Server 2005 Analysis Services 클러스터가 기존 SQL Server 2000 Analysis Services 클러스터와 동일한 이름을 사용하도록 하여 클라이언트 응용 프로그램 연결 문자열을 그대로 유지하려면 다음 사항을 고려하십시오.
Windows 클러스터에는 동일한 네트워크 이름을 사용하는 두 개의 리소스가 있을 수 없습니다. SQL Server 2005 Analysis Services 리소스가 SQL Server 2000 Analysis Services 이름을 유지할 수 있도록 하려면 클러스터 이름을 바꿔야 합니다.
Windows 클러스터 네트워크 이름을 쉽게 바꿀 수 있으며 컴퓨터를 다시 시작하지 않아도 됩니다. 그러나 이 클러스터 이름을 사용하는 다른 응용 프로그램이나 서비스가 있으면 해당 응용 프로그램 또는 서비스의 특성에 따라 각 응용 프로그램 또는 서비스를 개별적으로 처리해야 합니다. 예를 들어, 클러스터 파일 공유가 있으면 드라이브를 새 SQL Server 2005 Analysis Services 클러스터 그룹으로 이동해야 합니다. 이렇게 하고 나면 클러스터 파일 공유가 액세스용으로 동일한 네트워크 이름을 계속 사용할 수 있습니다.
클러스터된 SQL Server 2005 Analysis Services 서버는 명명된 인스턴스인 경우에도 클라이언트 액세스용으로 가상 서버 이름만 사용할 수 있습니다. 예를 들어, SQL Server 2005 Analysis Services 클러스터가 명명된 VirtualAS/Instance1인 경우 클라이언트는 VirtualAS를 서버 이름으로 사용하여 이 클러스터에 액세스할 수 있습니다.

업데이트 준비

업그레이드 옵션을 결정한 후에는 SQL Server 2005 업그레이드 관리자를 실행해야 합니다. 업그레이드 관리자는 기존 SQL Server 2000 Analysis Services 클러스터에서 문제가 있는지 검사한 다음 이러한 문제를 해결합니다. 업그레이드 관리자는 전용 분석기가 있는 독립 실행형 도구로, Analysis Services를 포함하여 각 SQL Server 구성 요소에 대해 실행되며 SQL Server 설치 프로그램을 실행하기 전에 잠재적인 문제를 확인하는 데 사용될 수 있습니다. 각 분석기는 해당 구성 요소에 대한 XML 보고서를 생성합니다. 업그레이드 관리자를 다운로드하려면 다음 Microsoft 웹 사이트를 방문하십시오.
http://www.microsoft.com/downloads/details.aspx?familyid=6107C27A-662C-4319-AFE7-B52D1568C30A(http://www.microsoft.com/downloads/details.aspx?familyid=6107C27A-662C-4319-AFE7-B52D1568C30A)(영문)
이 도구의 설치는 다음과 같이 간단합니다.
사용자 삽입 이미지
업그레이드 관리자를 설치하고 나면시작메뉴에서 시작할 수 있습니다. 이렇게 하려면시작을 누르고모든 프로그램,Microsoft SQL Server 2005 업그레이드 관리자를 차례로 가리킨 다음업그레이드 관리자를 누르십시오.
사용자 삽입 이미지
업그레이드 관리자 분석 마법사 시작을 누른 다음Analysis Services를 누릅니다. 가상 SQL Server 2000 Analysis Services 이름(클러스터 이름)을 입력합니다.
사용자 삽입 이미지
실행을 누른 다음 보고서 파일 위치를 확인합니다.
사용자 삽입 이미지
업그레이드 관리자가 완료되면보고서 시작을 눌러 보고서를 검토합니다. 업그레이드 관리자는 업그레이드를 수행하기 전이나 후에 문제를 해결해야 하는지 여부를 알려줄 뿐 아니라 경고 메시지를 표시하기도 합니다.
사용자 삽입 이미지
로그를 자세히 검토한 후 업그레이드를 수행하기 전에 해결해야 하는 문제가 있으면 이를 해결합니다.

업그레이드 수행

선택한 업그레드 옵션에 따라 다음 작업 중 하나 이상을 수행해야 할 수 있습니다.
Windows 클러스터 이름을 바꿉니다.
기존 SQL Server 2000 Analysis Services 클러스터가 설치된 상태에서 SQL Server 2005 Analysis Services 클러스터의 명명된 인스턴스를 설치합니다.
SQL Server 2000 Analysis Services의 클러스터를 해제한 다음 동일한 공유 드라이브에 SQL Server 2005 Analysis Services의 기본 인스턴스를 설치합니다.
SQL Server 2000 Analysis Services를 SQL Server 2005 Analysis Services로 마이그레이션합니다.
두 노드 모두에서 SQL Server 2000 Analysis Services 클러스터와 개별 Analysis Services 로컬 서버를 제거합니다.

Windows 클러스터 이름 바꾸기

클러스터 이름대화 상자에서 Windows 클러스터 이름을 바꿀 수 있습니다.매개 변수탭을 누른 다음이름 바꾸기를 누릅니다. 컴퓨터를 다시 시작할 필요가 없습니다.
사용자 삽입 이미지

기존 SQL Server 2000 Analysis Services 클러스터가 설치된 상태에서 SQL Server 2005 Analysis Services 클러스터의 명명된 인스턴스 설치

자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
910230(http://support.microsoft.com/kb/910230/)장애 조치 클러스터에 SQL Server 2005 Analysis Services를 설치하는 방법

SQL Server 2000 Analysis Services의 클러스터를 해제한 다음 동일한 공유 드라이브에 SQL Server 2005 Analysis Services의 기본 인스턴스 설치

자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
308023(http://support.microsoft.com/kb/308023/)Windows 2000 및 Windows Server 2003에서 SQL Server 2000 Analysis Services를 클러스터하는 방법

SQL Server 2000 Analysis Services를 SQL Server 2005 Analysis Services로 마이그레이션

마이그레이션 마법사는 SQL Server 2000 Analysis Services 데이터베이스 개체를 복사한 다음 SQL Server 2005 Analysis Services 서버에서 이 개체를 다시 만듭니다. 원본 데이터베이스는 그대로 유지되며 수정되지 않습니다. 새 데이터베이스가 완전히 작동하는지 확인한 후에는 기존 데이터베이스를 수동으로 삭제할 수 있습니다.

기본적으로 마이그레이션 마법사는 Program Files\Microsoft SQL Server\90\Tools\binn\VSShell\Common7\IDE 폴더에 있습니다.
사용자 삽입 이미지
클러스터된 SQL Server 2000 Analysis Services 이름(클러스터 이름)을 원본으로 제공하고 클러스터된 SQL Server 2005 Analysis Services 명명된 인스턴스 이름을 대상으로 제공합니다.
사용자 삽입 이미지
마이그레이션할 사용 가능한 사용자 데이터베이스는 자동으로 검색됩니다. 특정 데이터베이스만 마이그레이션하거나 모든 데이터베이스를 마이그레이션할 수 있습니다.
사용자 삽입 이미지
첫 번째 마이그레이션 단계는 "데이터베이스 유효성 검사"입니다. 로그에서 관련 정보를 검토하고 필요한 내용을 수정한 다음 이 단계를 다시 시작할 수 있습니다.
사용자 삽입 이미지
두 번째 단계는 "데이터베이스 개체의 마이그레이션"입니다.
사용자 삽입 이미지
마이그레이션이 완료된 후다음을 누르면 마이그레이션된 정보에 대해 개요를 볼 수 있습니다.
사용자 삽입 이미지

두 노드 모두에서 SQL Server 2000 Analysis Services 클러스터 및 개별 Analysis Services 로컬 서버 제거

두 노드 모두에서 SQL Server 2000 Analysis Services 클러스터와 개별 Analysis Services 로컬 서버 제거를 제거하는 방법에 대한 자세한 내용은 SQL Server 온라인 설명서를 참조하십시오.

업그레이드 확인

마이그레이션 마법사가 완료되면 SQL Server Management Studio에서 데이터베이스를 확인하고 SQL Server 2005 Analysis Services 클러스터에 연결한 다음 데이터베이스에 대한 쿼리를 실행하기 전에 원래 데이터 원본의 데이터베이스를 처리할 수 있습니다.
사용자 삽입 이미지
참고개별 데이터베이스 수정은 향후 문서에서 다룰 예정입니다.
신고
Posted by The.민군

"Hello Ajax"! How to Do the Ajax Thing with Oracle JDeveloper


by Frank Nimphius

Get an introduction to Ajax programming by creating a simple "Hello World".

Published May 2006

For sure, the world's most successful computer program is "hello world". Translations of it are available in almost every programming language and pattern.

"Ajax" is a community acronym used by the software industry for a set of related Web browser technologies, which, in combination deliver the rich client user experience for Web applications. The promise of Ajax is to close the usability gap that currently exist between browser based web applications and existing client-server desktop applications. In this article you'll learn how to translate "hello world" into Ajax, going from simple to more advanced in small steps.

About Ajax

"Ajax" stands forAsynchronous Javascript and XMLand is the heart of the "Web 2.0" paradigm. By one definition (there are several), Web 2.0 is shorthand for a new generation of Web applications that offer increased responsiveness and richness of UI components, moving Web applications closer to what users experience with client-server desktop clients. Ajax is not a software standard but rather describes of a set of technologies—including JavaScript, the Document Object Model (DOM), and the browser XmlHttpRequest object (XmlHttp object in IE)—that are used in combination to build interactive, browser-based user interfaces.

Because of the browser XmlHttpRequest object, Ajax applications can use asynchronous communication to retrieve data from the server. There is no 100 %-clear definition of what makes a Web application "Ajaxian." Therefore, the best way to look at Ajax is as a programming pattern to build the next generation of Web applications that bring us closer to what end users know from their client-server desktop clients. It is important to note that Ajax is not bound or related to J2EE and Java; rather, it can be used with .NET, PHP, CGI, and Perl as well. The good news about Ajax is that it doesn't require an example more complex than "hello world" to explain its principles.

This how-to provides you with a first-class, hands-on experience for building an Ajax type of application in J2EE with Oracle JDeveloper.

The technologies used within the exercises are:

  • JavaScript- The JavaScript language executes on the browser client and is in the core of Ajax. You use JavaScript to perform logical, mathematical and functional operations on the client side. Using The Document Object Model (DOM), JavaScript can be used to dynamically manipulate a Web page displayed in the browser.
  • Document Object Model (DOM)- A virtual tree representation of a HTML page document that is kept in the browser memory where it can be accessed using JavaScript. The DOM tree can be used to dynamically manipulate UI components of the current HTML page in the browser.
  • XmlHttpRequest- The XmlHttpRequest object is a browser-side API to access a remote server and is available in almost all of modern browsers. The XmlHttpRequest object enables a client to fetch new data from a remote server using httpGETorPOSTrequests without the need to navigate across pages. The server access can be programmed as synchronous or asynchronous, the latter using a JavaScript callback mechanism.
  • Style Sheets (CSS)- CSS is used to define the look and feel and the positioning and sizing of components on a server. Using external CSS resources, you can keep the visual appearance of an application independent from the representation of the view, which in the Ajax case mostly is built using JavaScript.
  • HttpServlet- The HttpServlet is used to simulate the server session to demonstrated behind the scene data fetching with Ajax.

Build an Ajax application with Oracle JDeveloper 10.1.3

Following the details listed in this section you build "Hello Ajax" incrementally starting with a static HTML client reading a text string from a server-side file. By the end of this how-to, you will have developed a Web page that reads its data from a servlet on the server, using a CSS style sheet to establish alternating background colors for the retrieved data rows. An input text field allows you to provide your input to the printed message. Download a complete Oracle JDeveloper 10.1.3 workspacehere.

사용자 삽입 이미지

Build a Synchronous Ajax page

1.

Open Oracle JDeveloper 10.1.3 and create a new application, by choosingFile > New > New Applicationfrom the JDeveloper menu and New Gallery. In the create dialog, type in the JDeveloper application name as "HelloAjax" and provide other information as needed. You don't need to select an application template because a default JDeveloper project is sufficient.

사용자 삽입 이미지

2.
Give the default JDeveloper project a name like "Ajaxprj".
3.
Open the JDeveloper New Gallery by choosingNewfrom the context menu on the Ajaxprj node.
4.

Create a new HTML pagehelloAjax.hml.Verify the helloAjax.html file is created in the public_html directory so it can be run by the embedded OC4J web container.

사용자 삽입 이미지


5.
Create a text filehelloAjax.txt. To create the text file, choose theGeneral > Simple Filesentry in the JDeveloper New Gallery.
6.
Create a JavaScript filehelloAjax.js.The JavaScript file can be created as an option of theWeb Tier > HTMLentry. Again, make sure both file are created in the public_html directory of the JDeveloper "Ajaxprj" project
7.

Open thehelloAjax.htmlfile in the source code view, set the cursor between the <head></head> elements and selectHtml Common > Scriptfrom the JDeveloper Component Palette (ctrl+shift+P). In the opened dialog, select thehelloAjax.jsfile entry.This creates a reference to the JavaScript in the html file to ensure the JavaScript code is available when the HTML page is loaded to the client.

사용자 삽입 이미지


8.

Open thehelloAjax.jsfile in the source editor and copy the following JavaScript code into it.

var xmlHttpRequestHandler= new Object();xmlHttpRequestHandler.createXmlHttpRequest = function(){  var XmlHttpRequestObject;  if(typeof XMLHttpRequest != "undefined"){   XmlHttpRequestObject = new XMLHttpRequest();  }  else if(window.ActiveXObject){   // look up the highest possible MSXML version   var tryPossibleVersions=["MSXML2.XMLHttp.5.0",
"MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp",
"Microsoft.XMLHttp"]; for(i=0; i< tryPossibleVersions.length; i++){ try{ XmlHttpRequestObject = new ActiveXObject(tryPossibleVersions[i]); break; } catch (xmlHttpRequestObjectError){ //ignore } } } return XmlHttpRequestObject;}

The JavaScript is a reusable code that initializes the XmlHttprequest object and returns a handle to the caller. TheXmlHttpRequestObjectvariable is created as a handler to thecreateXmlHttpRequestfunction. JavaScript allows object oriented programming to some degree and using a variable as a reference to a function avoids naming conflicts in case that a JavaScript file contains multiple functions with similar names.

TheXmlHttpRequestObjectvariable of thecreateXmlHttpRequestfunction is created to hold the XmlHttpRequest object reference. Following the code, you will notice that we look for the XmlHttpRequest object and the XmlHttp object. Though InternetExplorer and the rest of the browser world support XmlHttprequest objects, its named differently in InternetExplorer. If the first conditiontypeof XMLHttpRequest != "undefined"succeeds then the client browser is Mozilla, Safaris or any non IE browser that supports asynchronous JavaScript request and response.  If the conditionwindow.ActiveXObjectis true then the client browser is IE. The Microsoft browser also distinguishes its version of XmlHttp support and as a developer you should prefer using the latest available support. Thefor()loop tests the browser support for a specific XmlHttp version from newer versions to older versions and references the most recent version support in the XmlHttpRequest object reference.

Using the XmlHttpRequest object reference, you can issue server calls from a HTML page using JavaScript. Dependent on whether a request is issued synchronously or asynchronously, the browser waits for the server to respond or uses a JavaScript callback handler to notify the page about the server response. Following this hands-on, you will work with both options.

9.
Save your work.

10.
Open the helloAjax.txt file in JDeveloper and typehello Ajaxas a text message and save the file.
11.You are done with the pre-requisite work and can now focus on building the HTML page, which is the actual Ajax client. Open thehelloAjax.htmlfile in the source view editor.
12.

Place the cursor between the <head>...</head> elements and select theHtml Common > Scriptentry in the Component Palette. This time you don't reference an external JavaScript file but type the JavaScript code content directly into theContenttext area of the dialog. The following JavaScript code turns the static HTML file into a dynamic Ajax client, referencing thexmlHttpRequestHandlercreated in the helloAjax.js script.

function doTheAjaxThing(){  var PAGE_SUCCESS = 200;var requestObject = xmlHttpRequestHandler.createXmlHttpRequest();requestObject.open("Get","helloAjax.txt",false);  requestObject.send(null);if(requestObject.status==PAGE_SUCCESS){   var div_handle = document.getElementById("message");   //check if DIV element is found   if(div_handle){    div_handle.innerHTML+=''+requestObject.responseText;}  }  else{   alert ("Request failed");  }}

The functiondoTheAjaxThingis called from an input button on the HTML page and obtains the "hello Ajax" strings from the server side text file. After pressingOKon the Script dialog, the function is added to the HTML page header, wrapped in a pair of <script>...</script> elements. The difference between JavaScript code that is referenced from a file and JavaScript directly added on a page is that the former can be reused within many other HTML pages, which is why it should contain generic code only.

The script creates a variablerequestObjectthat obtains a handle to the XmlHttpRequest object using thexmlHttpRequestHandlerreference in the helloAjax.js file. Note that the page don't need to bother whether it runs in IE or Mozilla. Sorting out the browser type is deferred to the reusable JavaScript file. On therequestObjecthandle you call open() passing three arguments. The first arguments specifies the access, which can be any allowed server access like GET, POST or HEAD. The second argument references the URI source to read from. In this example the resource is a text file, later it will be a HttpServlet. Note that JavaScript security, also referred to as the JavaScript sandbox, doesn't allow you to access any other server than the one the code is downloaded from. The third argument is a Boolean type that defines whether the call should be synchronous (false) or asynchronous (true). Using synchronous requests will makes the browser wait for the serve to respond, which is not what you want to see happening in a production application when fetching lot of data from the server. You will use asynchronous server access later in this hands-on.

TherequestObject.send(null)>method call on the XmlHttp Request object sends the request to the server. If this was a POST request, then thenullargument value could be replaced with a list of request parameters that for the server to work with.

Because this example uses a synchronous server call, the browser waits for the server response before proceeding. The http code send by the server on success of the request is 200. The success condition is checked withrequestObject.status==PAGE_SUCCESSbefore the server response is read from the requestObject using a call torequestObject.responseText, which is method exposed on the XmlHttpRequest object. The rest of the code references aDIVHTML element on the page that is accessible through the DOM tree and that is used to display the server response.

Note:TherequestObject.responseTextis used to access plain text response from the server. To obtain XML formatted data, use the XMLHttpRequest object's responseXML method instead. For an example of how to use responseXML, see"A Hype-Free Introduction to Ajax". Applications that need to dynamically determine the response types can do this as follows:

var contentType =requestObject.getResponseHeader("content-type");

The possible returned content types are 'text/xml' or 'text/plain', indicating XML or plain text content.

13.

The remaining work left is to create a input button on the HTML page that calls the >doTheAjaxThingfunction and a<DIV>element that displays the result. In the code editor view of the helloAjax.html file, copy the following HTML source between the <body>...</body> elements.

<input type="button" value="Press Me"onclick="doTheAjaxThing();"/>
<divid="message">
</div>

Theonclickevent that is added to the input button calls thedoTheAjaxThingmethod on mouse click. The <DIV> element has anidattribute that is used to give the element a unique name so it can be accessed directly in the DOM tree.

14.

To avoid the browser caching the static HTML page, which can be annoying when testing Ajax pages, add the following line between the <head> and </head> element

<meta http-equiv="pragma" content="no-cache"></meta>
Note that you can have many <meta ...> elements set between the <head> elements. This one tells the browser not to cache this page and its content.

15.The HTML file now should look like this:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html> <head>  <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"></meta>  <title>Hello Ajax from file</title>  <script src="helloAjax.js" type="text/javascript"></script>  <script type="text/javascript">   function doTheAjaxThing(){     var PAGE_SUCCESS = 200;     var requestObject = xmlHttpRequestHandler.createXmlHttpRequest();     requestObject.open("Get","helloAjax.txt",false);     requestObject.send(null);     if(requestObject.status==PAGE_SUCCESS){        var div_handle = document.getElementById("message");        //check if DIV element is found        if(div_handle){           div_handle.innerHTML+='<br></'+'br>'+requestObject.responseText;        }     }     else{        alert ("Request failed");     }    }  </script> </head> <body>   <input type="button" value="Press Me" onclick="doTheAjaxThing();"/>   <DIV id="message"></DIV> </body></html>
16.

Save your work and run the HTML file.

사용자 삽입 이미지

17.

Press the button multiple times. The result should be as shown below.

사용자 삽입 이미지

Note that the page appends all strings read from the server. To prove that this ia Ajax, hit the page reload button and see all the string getting deleted from the page.

Congratulation, you created your first Ajax program!

Enhancing Your Ajax application

The following exercise is builds on the previous example and replaces the helloAjax.txt file with a Http Servlet. Because a servlet is more dynamic than a file in that it can contain logic to modify the format of the response based on pre-defined definitions, you use a CSS style sheet to color the returned rows alternating and also display a text typed in by the page user.

1.
Open theJDeveloper New Galleryusing theNewoption on theAjaxprjproject. Choose theCSS Filechoice of theWeb Tier > HTMLtree entry. Give the file a name ofhelloAjax.css, and again make sure it gets added under thepublic_htmldirectory.
2.
Delete the stylesheet code that JDeveloper generates by default
3.
Copy or type the following code into the stylesheet file and save it.
div.message b.red{  background-color: gray;  color: RED;  font-family: Arial, Helvetica, sans-serif;}
div.message b.green{ background-color: yellow; color: GREEN; font-family: Arial, Helvetica, sans-serif;}

Thediv.message b.redtag writes all <b> elements with a gray background color and a red font color that have a class attribute of "red" and that are embedded as a child element in a HTML <DIV> element with a class attribute of message. The <DIV> and <b> HTML elements are created dynamically as part of the server response returned to the asynchronous Ajax request.

4.

To create the Http Servlet, selectNewfrom the JDeveloper context menu and select theWeb Tier > Servletsentry. From the available items, chooseHTTP Servlet. Name the servlet classHelloAjaxand keep the default values for all other fields and dialogs. This will create a Http Servlet that is mapped to the/helloajaxname in the web.xml deployment descriptor.

5.
Add two instance fields
private int counter = 0;private String name="";

to the servlet, directly under theprivate static final String CONTENT_TYPE = "text/html; charset=windows-1252";field.

6.
Change the code of the servletdoGetmethod to look as follows
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{   ++counter;name = request.getParameter("name") != null?(String)request.getParameter("name"):null;//init cap   name="From "+name;   response.setContentType(CONTENT_TYPE);   PrintWriter out = response.getWriter();   if(counter % 2 == 0){out.println("<b class='green'>Hello Ajax "+name+" </b><br/>");}    else    {      out.println("<b class='red'>Hello Ajax "+name+" </b><br/>");    }    out.close();}
The servlet expects a request parameter "name" that contains the user input to append to the Hello Ajax message. Every even row is printed with a CSS class reference 'green' and every uneven row with a CSS class reference of 'red'. Because the XmlHttpRequest output is printed within a pair of <DIV></DIV> elements, the stylesheet to color the output addresses the <b> element asdiv b.greenordiv b.red. As you will later add the class="message" attribute to the HTML DIV element, the resulting CSS reference isdiv.message b.redanddiv.message b.green, which are the CSS names you defined earlier in the helloAjax.css file.

7.
Save your work.

.

8.
Open thehelloAjax.htmlfile in the JDeveloper code view editor.
9.

Change the content of the HTML <body> from

<body>  <input type="button" value="Press Me" onclick="doTheAjaxThing();"/>  <div id="message"></div></body>

to

<body><form name="form1" action="">
<input type="button" value="Press Me" onclick="doTheAjaxThing();"/>
<input type="text"id="name" name="name"/>
</form>
<div id="message" class="message"></div>

</body>

The HTML file now contains an additional text field for the user to type in a string for output. The name input field has anidattribute of "name", which makes it accessible from JavaScript using the browser DOM tree. The exact location of the text field isdocument.form1.name.

The last changes is theclassattribute, which is added to the <div>element to be addressed by the style sheet file.

10.Switch to the design view of the helloAjax.html file. Select thehelloAjax.cssentry in the Application Navigator and drag and drop it onto the HTML page. This creates a reference from the HTML page to the stylesheet at runtime.
11.
Again, open the helloAjax.html file in the source code view and look for thedoTheAjaxThing()method between the <head></head> element pair.
12.
Add the first  line highlighted in bold to the JavaScript function and replace the existingrequestObject.open()method call with the second highlighted code line.
function doTheAjaxThing(){  var requestObject;  var PAGE_SUCCESS = 200;var param="name="+(document.form1.name.value.length >0 ?document.form1.name.value:"nobody");requestObject = xmlHttpRequestHandler.createXmlHttpRequest();requestObject.open("Get","helloajax?"+param,false);requestObject.send(null);  ...

The first line creates a variable param that reads the value of the input text field. To make sure the value isn't left empty, JavaScript is used to test the length of the input string and if it is left blank, replaces it with "nobody".

TherequestObject.openmethod call is changed in that instead of the helloajax.txt file, it now refers tohelloajax, which is the server side web.xml name of the Http Servlet. Because the request is a GET request, thenamerequest parameter is appended to the servlet reference using a question mark '?'. As you see, from a XmlHttpRequest point of view, the change required to switch between calling a static file on the server and calling a servlet instead is minor.

13.

Optionally, change the HTML <tile> element in the header to

<title>Hello Ajax from servlet</title>
14.

Save your work and run thehelloAjax.htmlfile.

사용자 삽입 이미지

 

You will notice a slight delay the first time you run the application. This delay is caused by the initial startup time required by the servlet. This delay doesn't make a good impression to the users, which is why in the next section you are going to change the synchronous XmlHttpRequest call to an asynchronous call.

Making Your Ajax Application Asynchronous

Asynchronous requests allow the application user to continue his work in the browser while waiting for the server response. If the user cannot proceed with his work unless the server responded, then still using an asynchronous request is a better approach than synchronous call. For example, instead of the user staring at a pressed button, you can show him some nice "end-user entertainment" widgets, like a progress bar. For this part of the hands-on we are not going that far and instead only change the synchronous call to a asynchronous call.

1.

Replace the existing JavaScript section that the defines thedoTheAjaxThing()function in the helloAjax.html page with the following to make the request asynchronous:

<script type="text/javascript">  var requestObject;  var READY_STATE_COMPLETE = 4;  var PAGE_SUCCESS = 200;  function doTheAjaxThing(){    param="name="+(document.form1.name.value.length >0 ?document.form1.name.value:"nobody");    requestObject = xmlHttpRequestHandler.createXmlHttpRequest();    requestObject.onreadystatechange=onReadyStateChangeResponse;    requestObject.open("Get","helloajax?"+param,true);    requestObject.send(null);  }  function onReadyStateChangeResponse(){    var ready = requestObject.readyState;    var status = requestObject.status;    if(ready==READY_STATE_COMPLETE && status == PAGE_SUCCESS){     var div_handle = document.getElementById("message");     //check if DIV element is found     if(div_handle){       div_handle.innerHTML+='
'+requestObject.responseText; } } }</script>

The differences between this asynchronous request handling and the previous synchronous call are highlighted in bold. Because the browser doesn't wait for the server to respond, this example uses a JavaScript callback that is a function called by the XMLHttpRequest object on state change. There are four states of interest:

0
The request is initialized, which is the state before the open() method is called on the XmlHttRequestObject.
1
The request is ready to be sent.
2
The request was sent and is processed on the server.
3
The server processes the request
4
The response is complete and available for further client side handling

The state you are most interested in is indicated by a state value of 4. In the JavaScript function above, for better reading, this value is assigned to a variable JavaScript variable READY_STATE_COMPLETE. Don't confuse state with status. The state is returned by the XmlHttpRequest, while the status is a HTTP code that tells you about the requested access. If for example the requestObject status is 403 then you accessed a server resource that you are not authenticated or authorized for. This status for sure needs a different client handling than 200, which indicates a successful server access.

To register the JavaScript callback handleronReadyStateChangeResponsewith the XmlHttprequest object, you assign it as a value to the XmlHttpRequest onreadystate method,  requestObject.onreadystatechange=onReadyStateChangeResponse,which is one of the exposed functionality of the XmlHttpRequest object.

The JavaScript functiononReadyStateChangeResponse()can be named as you please, as long as the same name is assigned as a value to to requestObject.onreadystatechange. Before you can read the returned message body you need to perform the mentioned checks for the ready state to be 4 and the request status to be 200. The rest of the code is the same as in the examples before.

2.

Save your work and run the application. 

사용자 삽입 이미지

Note that still you see a delay between pressing the button and the server response, but this time the button is released immediately.


Basic Troubleshooting

The most common problems you find with Javascript is the misspelling of components and variables and the addressing of non-existing properties on a DOM component. There exist debuggers for JavaScript that you can get for free on the Internet. However, for "quick and dirty" debugging, you can use alert("test"); or document.write("test"); statements to print information on the client. On the server side you use the Oracle JDeveloper debugger for the Java code you access, or use System.out.println("test"); there as well.

Summary

This how-to aims to give you a first hands-on experience of how to work with Ajax in Oracle JDeveloper 10.1.3. As I mentioned in the introduction, there is not much required to program with Ajax. If you want to do more advanced Ajax programming, you will find yourself looking deeper into JavaScript, CSS, and http message codes. From the perspective of the XmlHttpRequest object, this is it: A simple object (or API) with a big impact on Web application development. Because no specific Ajax support is needed by an IDE, you can browse the Internet for more examples and existing javaScript libraries that you use within your application development using Oracle JDeveloper.

Although the technology involved in building Ajax applications has been around for years, Ajax as a pattern is new and a lot of growth is expected in this area. It should lead to more improved clients that eventually will become mainstream for all kinds of Web application developers, including those with a 4GL background.

Read More about Oracle and Ajax

Read and learn more about Oracle and Ajax! Visit ourAjax pageon the Oracle Technology Network (OTN) website.

신고
Posted by The.민군