'분류 전체보기'에 해당되는 글 2491건

  1. 2009.07.29 oracle 공백 제거
  2. 2009.07.29 [ JSP ] 게시판 페이징 처리 로직 JSP
  3. 2009.07.29 게시판용 페이징 클래스
  4. 2009.07.29 jeus 라이센스 확인 1
  5. 2009.07.27 JVM Memory 정리
  6. 2009.07.27 제우스 설정 방법 1
  7. 2009.07.24 좀 괜찮은 팁. 전송버튼 두번클릭 방지.
  8. 2009.07.24 SQL Injection 점검툴
  9. 2009.07.22 eclipse An error occurred while installing the items 1
  10. 2009.07.21 OWASP 10가지 웹 취약성
  11. 2009.07.20 Windows XP SP2에서 Windows 방화벽 서비스를 시작할 수 없다 1
  12. 2009.07.15 Web Application Stress Tool
  13. 2009.07.15 Fiddler2 - Installation Information 1
  14. 2009.07.15 [Linux] 리눅스 서버 점검 사항
  15. 2009.07.15 [Windows] SSH 터널링으로 메신저, 웹브라우징 하기
  16. 2009.07.15 [Windows] SSH 터널링 - putty의 plink 사용예
  17. 2009.07.15 file copy 빠르게 [TeraCopy ]
  18. 2009.07.14 윈도우용 tail
  19. 2009.07.14 win32 tail
  20. 2009.07.14 Maven 소개
  21. 2009.07.14 J2EE에서 한글
  22. 2009.07.14 http://java.sun.com/j2ee/1.4/docs/api/
  23. 2009.07.14 gmail 네임텍 만들기 ( 로고 만들기)
  24. 2009.07.14 데브피아 컬럼] DB 튜닝 이야기 - (2회) INDEX 과연 달면 빠른가?
  25. 2009.07.14 [데브피아 컬럼] DB 튜닝 이야기 - (1회) INDEX 과연 달면 빠른가?
  26. 2009.07.13 Process Explorer v11.33
  27. 2009.07.10 WebtoB + JEUS + web application
  28. 2009.07.10 JEUS 윈도우 서비스 등록 2
  29. 2009.07.10 - Windows 에서 WebtoB, JEUS의 서비스 등록 - 1
  30. 2009.07.09 DDos 공격 백신
02.Oracle/DataBase2009. 7. 29. 13:53
반응형

oracle 공백 제거

홍 길 동  -> 홍길동

홍   길동 -> 홍길동

SELECT RTRIM(REPLACE(필드명' ','')) FROM 테이블명;

Posted by 1010
05.JSP2009. 7. 29. 11:58
반응형

http://blog.naver.com/wldud_0729/150015317564

매번 페이징을 구현할 때마다, 한 두시간 씩 끙끙대는 것 같다.

생각을 의사코드로 적은 후에 그걸 코드화 하는 습관을 들여야하는데,

성질이 급해서 일단 생각을 코드화 해서 버그를 잡은 다음에.. 그제서야 의사코드로 적고 있다.

다음은 생각의 흐름를 정리해본 것이다.

************************************************************************************************


 총 데이터 수가 37개인 데이터를 페이징 처리 해보자.

 데이터는 DB에서 가져오거나 xml파일을 읽어올 것이다.

  페이지를 3 페이지씩 보여줄 수도 있고 [1] [2] [3] [다음]

 혹은 10페이지씩 보여줄 수도 있다. [1] [2] [3] [4] [5] ...[10] [다음]

 값 셋팅에 따라 달라질 수 있도록 페이지그룹 사이즈(pageGroupSize) 변수를 사용하겠다.

 셋팅할 수 있는 값이 페이지그룹 사이즈 말고 또 무엇이 있을까?

  한 페이지 당 보여주는 리스트 갯수도 변할 가능성이 많다.

 이것은 페이지 사이즈(pageSize) 변수로 놓자.

 그러면, 페이징 로직의 결과를 예측하기 위해서 이 두개의 변수에 값을 넣어보자.

less..

 총 데이터 갯수 (count): 37

 페이지그룹 사이즈 (페이지그룹을 몇개씩 묶을 것인가) : 3
 페이지 사이즈 (한 페이지 당 리스트 갯수): 4

 이렇게 셋팅을 할 경우, 나오는 결과는?

 총 페이지 수(pageCount)는 37 / 4 = 9.25 니까 10 페이지 되겠다.

  pageCount = (count / pageSize ) + ( count % pageSize == 0 ? 0 : 1); 

  => count % pageSize == 0 ? 0 : 1 이 수식을 풀어서 쓰면

            if(count % pageSize == 0)
                return 0;
            else
                return 1;

    이렇게 표현된다.

 =============================================================================
                                       
          [1][2][3]   [4][5][6]   [7][8][9]   [10]
 페이지그룹넘버(numPageGroup) :   - 1 -           - 2 -           - 3 -      - 4 -
 =============================================================================
 
 페이지 그룹은 위와같이 총 4개로 나올 것이다. (pageGroupCount : 4)

 이 페이지 그룹을 본 후, 현재페이지가 호출될 경우를 생각해보면

 5페이지가 호출된다면 numPageGroup이 2인 상태로 페이지바가 보여질 것이다.

 그렇다면, 호출된 현재페이지를 가지고 페이지그룹넘버를 구하고,

 페이지그룹넘버값으로 페이지바의 첫번째 페이지를 계산해보자.

 numPageGroup = 올림(currentPage/pageGroupSize)

  => int numPageGroup = (int) Meth.ceil ((double)currentPage/pageGroupSize)                   

 => numPageGroup : 올림(5/3) = 2

 startPage = (numPageGroup - 1)*pageGroupSize + 1;

 => stratPage : (2-1)*3+1 = 4

 이제 시작페이지를 가지고 마지막 페이지도 구해보자

 endPage = startPage + pageGroupSize -1 => 4+3-1 = 6

 이런식으로 시작페이지와 마지막페이지를 구했다면, for문을 돌려서 페이지바를 출력할 수 있을 것이다.

 그런데, 마지막 페이지그룹을 위 공식대로 계산하면 endPage가 12페이지가 나온다.

  총 페이지수가 10개인데 12페이지까지 출력되면 안 될것이다.

 따라서, if문 처리를 추가해주자.

 if( 마지막페이지 > 총페이지 )
  마지막페이지 = 총 페이지    => endPage = 10

************************************************************************************************

로직은 자바 클래스로, 출력부분은 JSTL 코드로 작성했는데.. 페이징 부분 코드는 다음과 같다.
 

[ 자바 클래스 ]

          //한 페이지 당 보여줄 글 갯수
17:         private final static int pageSize = 4;
18:         //페이지그룹안의 페이지 갯수 ex) [이전] 1 2 3 4 5 [다음] 일 경우 페이지 갯수는 5
19:         private final static int pageGroupSize = 3;

             String pageNum = request.getParameter("pageNum");//페이지 번호
25:
26:         if (pageNum == null) {
27:             pageNum = "1";
28:         }
29:        
30:         int currentPage = Integer.parseInt(pageNum);
31:         int startRow = (currentPage - 1) * pageSize + 1;//한 페이지의 시작글 번호
32:         int endRow = currentPage * pageSize;//한 페이지의 마지막 글번호
33:         int count = 0;
34:         int number=0;


35:         ArrayList articleList = new ArrayList();
36:         BoardDAO dbPro = BoardDAO.getInstance();//DB연동
37:         count = dbPro.getTotalCnt();//전체 글의 수
38:        
39:         if (count > 0) {       
40:                 if(endRow>count)
41:                         endRow = count;
42:             articleList = dbPro.select(startRow,endRow);//현재 페이지에 해당하는 글 목록
43:            
44:         } else {
45:             articleList = null;
46:         }
47:                
48:                 number=count-(currentPage-1)*pageSize;//글목록에 표시할 글번호
49:                
50:                 //페이지그룹의 갯수
51:                 //ex) pageGroupSize가 3일 경우 '[1][2][3]'가 pageGroupCount 개 만큼 있다. 
52:                 int pageGroupCount = count/(pageSize*pageGroupSize)+( count % (pageSize*pageGroupSize) == 0 ? 0 : 1);
53:                 //페이지 그룹 번호
54:                 //ex) pageGroupSize가 3일 경우  '[1][2][3]'의 페이지그룹번호는 1 이고  '[2][3][4]'의 페이지그룹번호는 2 이다.
55:                 int numPageGroup = (int) Math.ceil((double)currentPage/pageGroupSize);

          //해당 뷰에서 사용할 속성
57:         request.setAttribute("currentPage", new Integer(currentPage));
58:         request.setAttribute("startRow", new Integer(startRow));
59:         request.setAttribute("endRow", new Integer(endRow));
60:         request.setAttribute("count", new Integer(count));
61:         request.setAttribute("pageSize", new Integer(pageSize));

             request.setAttribute("number", new Integer(number));
63:         request.setAttribute("pageGroupSize", new Integer(pageGroupSize));
64:         request.setAttribute("numPageGroup", new Integer(numPageGroup));
65:         request.setAttribute("pageGroupCount", new Integer(pageGroupCount));
66:         request.setAttribute("articleList", articleList);
67:       
68:         return "./list.jsp";//해당 뷰


[ JSP 부분 ]

<c:if test="${count > 0}">
   <c:set var="pageCount" value="${count / pageSize + ( count % pageSize == 0 ? 0 : 1)}"/>
   <c:set var="startPage" value="${pageGroupSize*(numPageGroup-1)+1}"/>
   <c:set var="endPage" value="${startPage + pageGroupSize-1}"/>
  
   <c:if test="${endPage > pageCount}" >
     <c:set var="endPage" value="${pageCount}" />
   </c:if>
         
   <c:if test="${numPageGroup > 1}">
        <a href="./list.do?pageNum=${(numPageGroup-2)*pageGroupSize+1 }">[이전]</a>
   </c:if>


   <c:forEach var="i" begin="${startPage}" end="${endPage}">
       <a href="list.do?pageNum=${i}">[
        <font color="#000000" />
          <c:if test="${currentPage == i}">
          <font color="#bbbbbb" />
        </c:if>
        ${i}
       </font>]
       </a>
   </c:forEach>


   <c:if test="${numPageGroup < pageGroupCount}">
        <a href="./list.do?pageNum=${numPageGroup*pageGroupSize+1}">[다음]</a>
   </c:if>
</c:if>

출처 : Tong - 민뎅님의 java통

Posted by 1010
01.JAVA/Java2009. 7. 29. 11:54
반응형

출처 : http://theeye.pe.kr/82

게시판에서 쓸만한 페이징 클래스를 제작해 보았다. 문제 발견시 피드백 부탁드립니다^^


---------------------------------------------------------------------------------------
페이징 클래스 소스코드 :
---------------------------------------------------------------------------------------
public class PageNavigation {
   
   
private        boolean        isPrevPage;
   
private        boolean        isNextPage;
   
protected    int            nowPage;
   
protected    int            rowTotal;
   
protected    int            blockList;
   
protected    int            blockPage;
   
private        int            totalPage;
   
private        int            startPage;
   
private        int            endPage;
   
private        int            startRow;
   
private        int            endRow;
   
   
// 페이지를 계산하는 생성자
   
public PageNavigation(int nowPage, int rowTotal, int blockList, int blockPage) {
       
super();
       
       
// 각종 플래그를 초기화
        isPrevPage
= false;
        isNextPage
= false;
       
       
// 입력된 전체 열의 수를 통해 전체 페이지 수를 계산한다
       
this.totalPage    = (int) Math.ceil((double)rowTotal / (double)blockList);
       
       
// 현재 페이지가 전체 페이지수보다 클경우 전체 페이지수로 강제로 조정한다
       
if(nowPage > this.totalPage)
       
{
            nowPage
= this.totalPage;
       
}
       
       
// DB입력을 위한 시작과 종료값을 구한다
       
this.startRow    = (int) (nowPage - 1) * blockList;
       
this.endRow        = (int) this.startRow + blockList - 1;
       
       
// 시작페이지와 종료페이지의 값을 구한다
       
this.startPage    = (int) ((nowPage - 1) / blockPage) * blockPage + 1;
       
this.endPage    = (int) this.startPage + blockPage - 1;
       
       
// 마지막 페이지값이 전체 페이지값보다 클 경우 강제 조정
       
if(this.endPage > this.totalPage)
       
{
           
this.endPage = totalPage;
       
}
       
       
// 시작 페이지가 1보다 클 경우 이전 페이징이 가능한것으로 간주한다
       
if(this.startPage > 1)
       
{
           
this.isPrevPage = true;
       
}
       
       
// 종료페이지가 전체페이지보다 작을경우 다음 페이징이 가능한것으로 간주한다
       
if(this.endPage < this.totalPage)
       
{
           
this.isNextPage = true;
       
}
       
       
// 기타 값을 저장한다
       
this.nowPage = nowPage;
       
this.rowTotal = rowTotal;
       
this.blockList = blockList;
       
this.blockPage = blockPage;
   
}
   
   
public void Debug()
   
{
       
System.out.println("Total Page : " + this.totalPage + " / Start Page : " + this.startPage + " / End Page : " + this.endPage);
       
System.out.println("Total Row : " + this.rowTotal + " / Start Row : " + this.startRow + " / End Row : " + this.endRow);
   
}
   
   
// 전체 페이지 수를 알아온다
   
public int getTotalPage()
   
{
       
return totalPage;
   
}
   
   
// 시작 Row값을 가져온다
   
public int getStartRow()
   
{
       
return startRow;
   
}
   
   
// 마지막 Row값을 가져온다
   
public int getEndRow()
   
{
       
return endRow;
   
}
   
   
// Block Row 크기를 가져온다
   
public int getBlockSize()
   
{
       
return blockSize;
   
}
   
   
// 시작페이지값을 가져온다
   
public int getStartPage()
   
{
       
return startPage;
   
}
 
   
// 마지막 페이지값을 가져온다
   
public int getEndPage()
   
{
       
return endPage;
   
}
   
   
// 이전페이지의 존재유무를 가져온다
   
public boolean isPrevPage()
   
{
       
return isPrevPage;
   
}
   
   
// 다음페이지의 존재유무를 가져온다
   
public boolean isNextPage()
   
{
       
return isNextPage;
   
}
}

---------------------------------------------------------------------------------------
서블릿(Controller) 소스코드 :
---------------------------------------------------------------------------------------

// 리스트를 가져온다
if(request.getParameter("page") == null)
{
    nowPage
= 1;
}
else
{
    nowPage
= Integer.parseInt(request.getParameter("page"));
   
   
if(nowPage < 1)
   
{
        nowPage
= 1;
   
}
}
 
// 객체를 생성한다 (현재페이지, 전체글수, 페이지당표시할 글의수, 한번에 표시할 페이징블록수)    
PageNavigation pageNav = new PageNavigation(nowPage, rowTotal, 10, 5);
 
// 디버깅이 필요할시 사용한다. 안써도 됨
pageNav
.Debug();
 
// 시작Row값과 종료Row값을 넣어 쿼리문을 작성한다
sql
= "SELECT * FROM TableName ORDER BY no DESC LIMIT " + pageNav.getStartRow() + ", " + pageNav.getBlockSize();
 
// 뷰에게 넘길 값을 지정한다
request
.setAttribute("pageIsPrev",    pageNav.isPrevPage());    // 이전페이지 블록의 존재유무
request
.setAttribute("pageIsNext",    pageNav.isNextPage());    // 다음페이지 블록의 존재유무
request
.setAttribute("pageStart",    pageNav.getStartPage());// 시작페이지 번호
request
.setAttribute("pageEnd",        pageNav.getEndPage());    // 종료페이지 번호

---------------------------------------------------------------------------------------
jsp(View) 소스코드(EL표기법, JSTL사용) :
---------------------------------------------------------------------------------------

<div>
   
<center>
       
<c:if test="${pageIsPrev}">
           
<a href="index.do?page=${pageStart - 1}">prev</a>
       
</c:if>
       
<c:forEach var="page" begin="${pageStart}" end="${pageEnd}">
           
<a href="index.do?page=${page}">[${page}] </a>
       
</c:forEach>
       
<c:if test="${pageIsNext}">
           
<a href="index.do?page=${pageEnd + 1}">next</a>
       
</c:if>
   
</center>
</div>


---------------------------------------------------------------------------------------
결과 :
---------------------------------------------------------------------------------------
prev [11] [12] [13] [14] [15] next
Posted by 1010
98..Etc/70.JEUS2009. 7. 29. 10:40
반응형

- 라이센스 교체시 재 컴파일 필요함
  wscfl -i http.m (/jeus/webserver/config/http.m)
jeusadmin -fullversoin : 버전 체크
jeusadmin -licenseinfo : 라이센스 정보
jeusadmin -licensedue : 라이센스 기간 확인

Posted by 1010
01.JAVA/Java2009. 7. 27. 14:45
반응형
출처 : http://fly32.tistory.com/438

* JVM Memory 영역에 대한 설명


- Method Area : 메소드와 클래스 변수를 저장하기 위한 공간, 모든 프로그램에 의해 공유.
- Heap Area : 사용자가 생성하는 Java Object들이 저장되는 공간, 동적으로 할당하여 사용되어짐.
- Stack Area : 메소드 호출시 해당 메소드의 매개변수, 지역변수, 임시변수 등을 저장하기 위한 Stack 구조의 메모리.
- Native Heap Area : Java Object가 아닌 Native Object들이 거주하는 공간. OS 차원에서 결정.
- Permanent Space : Class에 대한 Meta 정보를 저장하는 공간. (Permanent Space는 Java Heap의 하위 영역)


* Java 실행 Option

1. -X Option (모든 VM에서 동작하지 않을 수 있는 비표준 option이며, 버젼별로 언급없이 변경되어질 수 있음)
-Xms : 초기 Heap size 설정
-Xmx : 최대 Heap size 설정
-Xss : 각 Thread에 할당되는 Stack size 설정
-Xmn : New 영역을 위한 Heap size 설정

2. -XX Option (올바른 동작을 위해 특정한 시스템 요구사항들이 있으며, 시스템 설정 파라미터에 대한 접근 권한이 요구됨)
-XX:PermSize : 초기 Permanent size 설정
-XX:MaxPermSize : 최대 Permanent size 설정

※ 참고 사이트 : http://blogs.sun.com/watt/resource/jvm-options-list.html
                           http://www.monosun.com/doc/hotspotvmoption.html


* Heap Size 구하기

long   heapSize   = Runtime.getRuntime().totalMemory();
String heapSizeMB = (heapSize / (1024*1024)) + "MB";


* 영역별 OutOfMemoryError 대처 방법

1. Heap Area
Exception in thread "main": java.lang.OutOfMemoryError: Java heap space
Exception in thread main: java.lang.OutOfMemoryError: Requested array size exceeds VM limit

원인 : Heap size의 부족으로 Java Object를 생성하지 못하여 발생
해결 : 1. -Xmx Option을 이용하여 최대 Heap size의 크기를 늘려줌
           2. Application 로직이 잘못되었거나 JDK나 WAS의 Bug로 인한 Memory 누수가 있는지 확인하여 수정
           3. finalize method에 의해 즉각적인 GC가 이루어지지 않으므로 로직 수정을 통해 해결

※ Object Allocation Profiling (Hprof)
java -Xrunhprof:heap=sites [Main Class]
java -Xrunhprof:heap=sites,doe=n [Main Class] (Thread Dump 생성)


2. Permanent Space
Exception in thread "main": java.lang.OutOfMemoryError: Perm Gen space'

원인 : Permanent 저장 공간이 부족하여 발생.
          JSP -> Servlet 변환, Reflection을 사용하여 동적으로 로딩되는 Class가 많은 경우에 발생할 수 있으며,
          WAS의 Class Reloading 기능이 자주 실행 될 경우에도 발생할 수 있음.
해결 : -XX:PermSize, -XX:MaxPermSize Option을 이용하여 크기를 늘려줌

※ Class Loading Monitoring
java 실행시 -verbose:gc을 사용하여 Class가 Loading 되는 것을 Monitoring


3. Native Heap Area
java.lang.OutOfMemoryError: request bytes for . Out of swap space?
java.lang.OutOfMemoryError: (Native method)'
java.lang.OutOfMemoryError: unable to create new native thread

원인 : Native Heap memory가 부족하여 발생
해결 : 1. Physical memory를 초과할 경우 Virtual Memory를 요청하여 필요한 메모리를 확보하게 되는데,
             이 과정에서 오류가 발생할 경우 OS가 제공하는 툴을 통해 이를 모니터링 하고
             이 공간 자체가 부족할 경우 크기를 늘려줌
          2. -Xmx Option을 이용하여 Heap Area 공간을 줄이고 Native Heap Area 공간을 늘림
          3. Thread Stack Space가 부족한 경우 Thread의 수를 줄이거나,
              -Xss Option을 통해 Thread별 Stack Size를 줄여줌
              (단, Thread별 Stack Size를 과도하게 줄였을 경우 Stack Overflow Error가 발생할 수 있음)



참고 사이트 : http://ukja.tistory.com/61
                      http://2005elc.elancer.co.kr/eTimes/page/eTimes_view.html?str=c2VsdW5vPTIwODY=
Posted by 1010
98..Etc/70.JEUS2009. 7. 27. 14:30
반응형

제우스 설정 방법 몇 가지 (JEUS 6.0 기반)


이는 티맥스소프트에 AS 요청을 하면 원격으로 작업해주고 알려주는데, 체크시 자주 이용하는 것이라 정리하였다.



*. DB Close 가 정상적이지 않는 부분을 추적할 때 JEUSMain.xml 설정
<invocation-manager-action>Warning</invocation-manager-action>
<!--invocation-manager-action>AutoClose</invocation-manager-action-->

-> Warning 으로 설정하면 로그 파일에 DB Close 가 정상적이지 않는 파일의 이력이 나타남.
-> AutoClose 으로 설정하면 비정상인 소스를 자동 닫는 기능을 수행하나 디버깅이 안됨. 따라서 정상가동전에는 반드시

     Warning 상태로 테스트해야 함.


*. DB Connection 유실 있는 소스를 리눅스 콘솔에서 찾는 방법
[tmax@WEMS WEMS]$ grep "RequestURI" Jeus*20090312*.log
[2009.03.12 17:04:06][0][b168] [container1-42] [MGR-0107] RequestURI : /cewolf
[2009.03.12 17:04:14][0][b168] [container1-22] [MGR-0107] RequestURI : /cewolf
[2009.03.12 17:04:18][0][b168] [container1-32] [MGR-0107] RequestURI : /cewolf
[2009.03.12 17:04:19][0][b168] [container1-33] [MGR-0107] RequestURI : /cewolf
[2009.03.12 17:04:23][0][b168] [container1-26] [MGR-0107] RequestURI : /cewolf
[2009.03.12 17:04:35][0][b168] [container1-33] [MGR-0107] RequestURI : /cewolf
[2009.03.12 17:05:15][0][b168] [container1-30] [MGR-0107] RequestURI : /cewolf
[2009.03.12 17:05:22][0][b168] [container1-36] [MGR-0107] RequestURI : /cewolf

-> RequestURI 라는 예약어를 통해 관련 소스를 찾을 수 있음.


*. DB ConnectionPool 상태 보기
[tmax@WEMS WEMS]$ ja // 제우스 콘솔로 화면 전환
JEUS 6.0 (Fix#4) Jeus Manager Controller
WEMS>dsinfo 혹은 WEMS>dsinfo -i 5 -k 999 // 파라미터 의미: i(internal), k(repeat)


Connection pool information for engine container 'WEMS_container1'

----------------------------------------------------------------------------------
| id |        name | min | max | active | idle | disp | total | wating | working |
----------------------------------------------------------------------------------
|  1 | jdbc/source |   5 |  15 |      15 |    0 |    0 |     15 |   true |    true |
----------------------------------------------------------------------------------

disp : disposable connection, total = active + idle + disp
-> 컨넥션 풀로 설정한 정보를 제공하여 준다. 필요시 JEUSMain.xml에서 갯수를 변경할 수 있음


*. 제우스 쓰레드 상태 보기, 응답속도, 메모리 관련
[tmax@WEMS WEMS]$ ja // 제우스 콘솔로 화면 전환
JEUS 6.0 (Fix#4) Jeus Manager Controller


WEMS>ti

< ContainerName : WEMS_container1 >
-- Thread State [webtob1-hth0(localhost_9900)] --
[webtob1-hth0(localhost:9900)-w00][waiting, wt=84007 ms]
[webtob1-hth0(localhost:9900)-w01][waiting, wt=84004 ms]
[webtob1-hth0(localhost:9900)-w02][waiting, wt=84003 ms]
[webtob1-hth0(localhost:9900)-w03][waiting, wt=84000 ms]
[webtob1-hth0(localhost:9900)-w04][waiting, wt=84000 ms]
[webtob1-hth0(localhost:9900)-w05][waiting, wt=83996 ms]
[webtob1-hth0(localhost:9900)-w06][waiting, wt=83995 ms]
[webtob1-hth0(localhost:9900)-w07][waiting, wt=83993 ms]
[webtob1-hth0(localhost:9900)-w08][active, rt=111992 ms] /aaa/bbb/test.jsp
[webtob1-hth0(localhost:9900)-w09][waiting, wt=83990 ms]
[webtob1-hth0(localhost:9900)-w10][waiting, wt=83989 ms]
[webtob1-hth0(localhost:9900)-w11][waiting, wt=83986 ms]
[webtob1-hth0(localhost:9900)-w12][waiting, wt=83986 ms]
[webtob1-hth0(localhost:9900)-w13][waiting, wt=83882 ms]

-> active 상태가 장시간 지속되는 관련 소스는 반드시 체크되어야 함.


WEMS>st  -r // 요청에 대한 처리시간을 제공
< ContainerName : WEMS_container1 >
< request information(MyGroup/wems) >
   - total requests          : 19
   - total processing time   : 26023 ms
   - average processing time : 1369 ms


WEMS>st -m // 현재 사용중인 JVM 메모리 정보 제공
< ContainerName : WEMS_container1 >
< memory information >
VM Total Memory    = 648740864 Bytes
VM Free Memory     = 510449952 Bytes


*. 제우스 덤프 (AS 요청시 이 정보가 제공하면 빨리 처리될 수 있음.)
-> 아래와 같이 하면 로그 파일에 덤프가 수행됨

 

[tmax@WEMS WEMS]$ ja // 제우스 콘솔로 화면 전환하여 컨테이너의 pid값을 얻음.
JEUS 6.0 (Fix#4) Jeus Manager Controller

WEMS>pidlist
node or container : WEMS, pid : 25195
node or container : WEMS_container1, pid : 25248


[tmax@WEMS WEMS]$ kill -3  25248 // 콘솔상태에서 덤프실행 10초간격 3회 정도

-> 이를 수행하면 로그 파일에 덤프 정보가 수집됨.


*. OutOfMemoryError: PermGen Space 에러가 발생하였을 경우의 JEUSMain.xml 설정
-> Permsize를 조금 크게 하여 가동시킨다. 테스트 운영이나 스트레스 테스트 툴을 이용해 에러가 발생하지

     않는 값으로 최종 설정하면 된다.

<engine-container>
    <name>container1</name>
    <invocation-manager-action>Warning</invocation-manager-action>
    <command-option>
           -Xms512m -Xmx1024m -Djava.awt.headless=true
          -XX:PermSize=512m -XX:MaxPermSize=1024m
    </command-option>
    <sequential-start>true</sequential-start>
    <engine-command>
        <type>servlet</type>
        <name>engine1</name>
    </engine-command>
</engine-container>

Posted by 1010
반응형

출처 : http://www.hof.pe.kr/wp/archives/322/

좀 괜찮은 팁. 전송버튼 두번클릭 방지.

글내용작성하고 전송버튼 누를때 수전증 또는 머리와 따로 노는 손가락때문에 타닥~ 두번 클릭이 되는 수가 있습니다. 또는 전송버튼 누르고 전송 완료페이지로 넘어갈때 시간이 걸릴때 "혹시 안눌렀나?" 하고 또한번 누르는 수가 있는데… 이것을 방지하기 위한 팁~~ (특히 설치형 블로그중에 코멘트삭제기능이 없는 경우에 적용하면 대략 괜찮음)

(누르면 없어집니다. 가만히 기다려도 안나옵니다.-_-)
소스 : <input type="submit" onClick="this.style.visibility='hidden'" value="눌러요~ 잇힝!" /> (누르면 비활성화 되어 다시 누를수 없게 됩니다.)
소스 : <input type=submit onclick="this.disabled=true" value="이것도 눌러요~ 잇힝!">
Posted by 1010
98..Etc/Etc...2009. 7. 24. 09:17
반응형
SQL Injection 점검툴

Posted by 1010
56. Eclipse Etc.../Eclipse2009. 7. 22. 15:46
반응형


An error occurred while installing the items
  session context was:(profile=epp.package.jee, phase=org.eclipse.equinox.internal.provisional.p2.engine.phases.Install, operand=null --> [R]com.android.ide.eclipse.adt 0.9.1.v200905011822-1621, action=org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.InstallBundleAction).
  Error while loading manipulator.
  Error while loading manipulator.

사용자 삽입 이미지



eclipse update error



subeclipse 를 설치해서 에러를 잡을수있다.
subeclipse 설치는 알아서 하시길...
Posted by 1010
90.개발관련문서2009. 7. 21. 09:18
반응형

OWASP 10가지 웹 취약성에 대한 한글문서입니다.

출처: 네이버 시큐리티플러스
Posted by 1010
카테고리 없음2009. 7. 20. 16:37
반응형
중요 이 문서에서는 레지스트리 수정 방법을 설명합니다. 레지스트리를 수정하기 전에 해당 레지스트리를 백업하는 것이 좋습니다. 또한 문제가 발생할 경우 레지스트리를 복원하는 방법을 알고 있어야 합니다. 레지스트리 백업, 복원 및 수정 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
256986  (http://support.microsoft.com/kb/256986/ ) 고급 사용자를 위한 Windows 레지스트리 정보

이 페이지에서

모두 확대 | 모두 축소

현상
Microsoft Windows XP 서비스 팩 2(SP2)를 설치한 후 Windows 방화벽 서비스를 시작할 수 없습니다. 특히, 다음과 같은...

Microsoft Windows XP 서비스 팩 2(SP2)를 설치한 후 Windows 방화벽 서비스를 시작할 수 없습니다. 특히, 다음과 같은 현상이 하나 이상 나타납니다.
  • 제어판의 서비스 목록에 Windows Firewall/Internet Connection Sharing (ICS)이 표시되지 않습니다.
  • 서비스 목록에 Windows Firewall/Internet Connection Sharing (ICS)이 표시되지만 이 서비스를 시작할 수 없습니다.
  • Windows 방화벽 설정에 액세스하려고 하면 다음과 같은 오류 메시지가 나타납니다.
    원인을 알 수 없는 문제 때문에 Windows에서 Windows 방화벽 설정을 열 수 없습니다.

원인
이 문제는 SharedAccess.reg 파일이 없거나 손상되었기 때문에 발생합니다. SharedAccess.reg 파일은 Windows 방화벽...

이 문제는 SharedAccess.reg 파일이 없거나 손상되었기 때문에 발생합니다. SharedAccess.reg 파일은 Windows 방화벽 서비스를 나타냅니다.

참고 Windows XP SP2의 Windows 방화벽 서비스는 이전 버전의 Windows XP에서는 인터넷 연결 방화벽(ICF)입니다.

해결 방법
이 문제를 해결하려면 다음 방법 중 하나를 사용하십시오. 방법 1: "Setup API InstallHinfSection" 함수를 호출하여 Wi...

이 문제를 해결하려면 다음 방법 중 하나를 사용하십시오.

방법 1: "Setup API InstallHinfSection" 함수를 호출하여 Windows 방화벽 설치

Windows 방화벽을 설치하려면 다음과 같이 하십시오.
  1. 시작, 실행을 차례로 누르고 cmd를 입력한 다음 확인을 누릅니다.
  2. 명령 프롬프트에서 다음 명령줄을 입력한 다음 Enter 키를 누릅니다.
    Rundll32 setupapi,InstallHinfSection Ndi-Steelhead 132 %windir%\inf\netrass.inf
  3. Windows를 다시 시작합니다.
  4. 시작, 실행을 차례로 누르고 cmd를 입력한 다음 확인을 누릅니다.
  5. 명령 프롬프트에서 다음 명령을 입력한 후 Enter 키를 누릅니다.
    Netsh firewall reset
  6. 시작, 실행을 차례로 누르고 firewall.cpl을 입력한 다음 Enter 키를 누릅니다. Windows 방화벽 대화 상자에서 사용(권장)을 누른 다음 확인을 누릅니다.

방법 2: 레지스트리에 Windows 방화벽 항목 추가

경고 레지스트리 편집기나 다른 방법을 사용하여 레지스트리를 잘못 수정하면 심각한 문제가 발생할 수 있습니다. 이 문제를 해결하려면 운영 체제를 다시 설치해야 할 수도 있습니다. Microsoft는 이러한 문제의 해결을 보증하지 않습니다. 레지스트리 수정에 따른 모든 책임은 사용자에게 있습니다.

레지스트리에 Windows 방화벽을 추가하려면 다음과 같이 하십시오.
  1. 다음 텍스트를 메모장에 복사한 다음 Sharedaccess.reg라는 이름으로 파일을 저장합니다.
    Windows 레지스트리 편집기 버전 5.00
    
    [-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess]
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess]
    "DependOnGroup"=hex(7):00,00
    "DependOnService"=hex(7):4e,00,65,00,74,00,6d,00,61,00,6e,00,00,00,57,00,69,00,\
      6e,00,4d,00,67,00,6d,00,74,00,00,00,00,00
    "Description"="Provides network address translation, addressing, name resolution and/or intrusion prevention services for a home or small office network."
    "DisplayName"="Windows Firewall/Internet Connection Sharing (ICS)"
    "ErrorControl"=dword:00000001
    "ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\
      74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,\
      00,76,00,63,00,68,00,6f,00,73,00,74,00,2e,00,65,00,78,00,65,00,20,00,2d,00,\
      6b,00,20,00,6e,00,65,00,74,00,73,00,76,00,63,00,73,00,00,00
    "ObjectName"="LocalSystem"
    "Start"=dword:00000002
    "Type"=dword:00000020
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Epoch]
    "Epoch"=dword:00002cd0
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters]
    "ServiceDll"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,\
      00,74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,\
      69,00,70,00,6e,00,61,00,74,00,68,00,6c,00,70,00,2e,00,64,00,6c,00,6c,00,00,\
      00
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy]
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile]
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile\AuthorizedApplications]
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\DomainProfile\AuthorizedApplications\List]
    "%windir%\\system32\\sessmgr.exe"="%windir%\\system32\\sessmgr.exe:*:enabled:@xpsp2res.dll,-22019"
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile]
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications]
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile\AuthorizedApplications\List]
    "%windir%\\system32\\sessmgr.exe"="%windir%\\system32\\sessmgr.exe:*:enabled:@xpsp2res.dll,-22019"
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Setup]
    "ServiceUpgrade"=dword:00000001
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Setup\InterfacesUnfirewalledAtUpdate]
    "All"=dword:00000001
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SharedAccess\Enum]
    "0"="Root\\LEGACY_SHAREDACCESS\\0000"
    "Count"=dword:00000001
    "NextInstance"=dword:00000001
  2. Sharedaccess.reg를 두 번 눌러 이 파일의 내용을 레지스트리에 추가하고 Windows 방화벽 항목을 만듭니다.
  3. Windows를 다시 시작합니다.
  4. 시작, 실행을 차례로 누르고 cmd를 입력한 다음 확인을 누릅니다.
  5. 명령 프롬프트에서 다음 명령을 입력한 후 Enter 키를 누릅니다.
    Netsh firewall reset
  6. 시작, 실행을 차례로 누르고 firewall.cpl을 입력한 다음 확인을 누릅니다.
  7. 사용할 Windows 방화벽 설정을 구성합니다.
이러한 방법으로 문제가 해결되지 않으면 Windows XP SP2를 다시 설치하십시오.

추가 정보
Windows 방화벽 서비스가 시작되었는지 확인하려면 다음과 같이 하십시오. 시작, 실행을 차례로 누르고 services.msc를 입력한 다음...

Windows 방화벽 서비스가 시작되었는지 확인하려면 다음과 같이 하십시오.
  1. 시작, 실행을 차례로 누르고 services.msc를 입력한 다음 확인을 누릅니다.
  2. 서비스 목록에서 Windows Firewall/Internet Connection Sharing (ICS)을 찾습니다. 서비스 상태가 시작됨인지 확인합니다.
  3. 이 서비스 기능을 사용하는 방법에 대한 자세한 내용을 보려면 동작 메뉴에서 도움말을 누릅니다.

현재 상태
Microsoft는 "본 문서의 정보는 다음의 제품에 적용됩니다." 절에 나열한 제품에서 이 문제를 확인했습니다....

Microsoft는 "본 문서의 정보는 다음의 제품에 적용됩니다." 절에 나열한 제품에서 이 문제를 확인했습니다.

참조
Windows XP 서비스 팩 2에서 Windows 방화벽을 사용하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조...

Windows XP 서비스 팩 2에서 Windows 방화벽을 사용하는 방법에 대한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조하십시오.
875357  (http://support.microsoft.com/kb/875357/ ) Windows XP 서비스 팩 2에서 Windows 방화벽 설정 문제 해결
892199  (http://support.microsoft.com/kb/892199/ ) Windows XP 서비스 팩 2에서 Windows 방화벽 서비스를 시작할 수 없다
Windows XP SP2에서 Windows 방화벽 문제를 해결하는 방법에 대한 자세한 내용은 다음 Microsoft 웹 사이트를 참조하십시오.
http://technet.microsoft.com/en-us/library/bb457029.aspx (http://technet.microsoft.com/en-us/library/bb457029.aspx) (영문)
Posted by 1010
반응형

Web Application Stress Tool

Brief Description
The Microsoft web stress tool is designed to realistically simulate multiple browsers requesting pages from a Web site.

On This Page

Quick Details
File Name: setup.exe
Version: 1.0
Date Published: 12/26/2002
Language: English
Download Size: 9.6 MB
Estimated Download Time:
 24 min

Overview

The Microsoft WAS web stress tool is designed to realistically simulate multiple browsers requesting pages from a web site. You can use this tool to gather performance and stability information about your web application. This tool simulates a large number of requests with a relatively small number of client machines. The goal is to create an environment that is as close to production as possible so that you can find and eliminate problems in the web application prior to deployment.

 Top of page

Posted by 1010
반응형
Fiddler2 - Installation Information

Install Fiddler2 (~500kb)

...or, click here to install the latest v2.x BETA version.

System Requirements

Windows 2000 / XP / 2003 / Vista with Microsoft .NET Framework v2.0 or later
10 megabytes disk space / 800mhz processor (Screams at 2.4ghz)
128 megabytes RAM (512mb+ highly recommended)
 

Note: The legacy product Fiddler v1.3, for users of the .NET Framework v1.1, remains available here.

Complementary Tools

Notification of Updates

Upon booting, Fiddler will check for new versions by hitting a web service on this server.  If you'd prefer to only check for updates manually, set the option in Tools | Fiddler Options.

Version History

See the change log.

Posted by 1010
61.Linux2009. 7. 15. 11:41
반응형
출처 : http://simples.kr/bbs/board.php?bo_table=03_2&wr_id=68&page=2


1. SUID 점검하기.(root 소유의 SetUID및 SetGID 파일들 점검
    #find / -user root -perm -4000 -print (SetUID)
    #find / -user root -perm -2000 -print (SetGID)
    #find / -user root -perm -4000 -print -xdev

2. 파티션별 디스크사용량 점검
    #df -h

3. 파일무결성 점검.
    - tripwire 설치 수 실행

4. 백도어 설치여부 점검.(/dev 체크 및 rootkit 점검)
    #find /dev -type f -exec ls -l {} \;
    #./chkrootkit
   
5. 현재 열려진 포트 및 응답가능한 포트 점검.

    #netstat -atp | grep LISTEN
       (사용 프로토콜 : TCP인가? 또는 UDP인가?
       사용중인 포트번호
       서버와 연결된 IP 및 도메인명
       생성 PID
       서비스중인 프로세스명
       현재 응답가능상태인가?
    #lsof | grep LISTEN
       (현재 서비스 중인 프로세스명(데몬명)
           현재 생성중인 PID번호.
       현재 서비스중인 프로세스의 소유자
       프로토콜 버전 : Ipv4 또는 Ipv6
       TCP 또는 UDP의 여부
       응답가능 상태인가?

6. 실생중인 프로세스 및 데몬점검.(프로세스의 생성관계)

    #pstree

7. 시스템 운용상황 점검.

   #top -d2

8. 백업점검.

9. 스팸메일 점검.(메일큐 디렉토리 점검)

  #cd /var/spool/mqueue    (동일한 날짜, 동일한 사이즈를 가진 다수 파일구분)

10. Core 점검.
 
 #find / -name core -exec ls -l {} \;
 
 서버내에 긴급한 이상이 발생하였을 경우나 시스템의 정확한 분석을 위해
 서버의 메모리 상태를 순간적으로 dump 받는 경우의 파일
 
 
11. 파일용량 점검

 #repquota -av -ag
 #df -h

12. 최근 서버 접속자 점검.

  #vi /var/log/secure
  #last -n 10  
   - 최근 10번째까지의 접속기록을 확인.

13. 계정별 최후접속기록 점검.
   
   #lastlog
    -lastlog는 현재 /etc/passwd에 존재하는 모든 계정을 대상으로 하여 언제 마지막으로 서버에 접속을 했는가를 확인.
     Mail, adm, bin 등의 계정들은 모두 "** Never logged in **" 이라고 되어 있는것이 정상.

 

14. 현재 서버접속자 보기

   #w (telnet)
   #ftpwho(ftp)

15. root명령어 사용기록 점검.

   #vi /root/.bash_history  (.set nu)
   #cat /root/..bash_history | wc -l    (1000라인 이상 되어야 정상)

16. 계정별 사용명령어파일 점검.

   #find / -name .bash_history -exec ls -l {} \;    (각 계정별 .bash_history 파일의 존재여부)
   #find / -name .bash_history -exec cat {} \;     (파일의 내용까지 모두 확인해 볼 수 있음)

17. root소유자 점검(UID와 GID가 0인 사용자 점검)

   #cat /etc/passwd | grep 0:0

18. 서버내에 중요한 디렉토리 점검

   - /etc/xinetd.d/    (xinetd로 서비스되는 인터넷서비스 파일들이 존재하는 디렉토리)
   - /etc/rc.d/           (부팅에 관계된 파일) (파일들을 복사 후 파일용량등을 비교하기) (커널패닉의원인)
   - /etc/rc.d/init.d/ (부팅시에 특정 서비스나 데몬들을 시작시키는 스키립트 파일)

19. .rhosts 파일 점검

   #find / -name .rhosts -exec ls -l {} \;
   #find / -name .rhosts -exec cat {} \;
    - 원격에서 패스워드등의 확인과정없이 바로 접속하기 위해서 사용되는 파일
       

20. 메모리사용량 점검.

   #free -m
   #cat /proc/meminfo   (free 와 top 는 이 파일을 참조하여 보여준다.)
   #top -d2

21. 중요 관리자용명령어 점검.

       아래의 명령어들을 퍼미션을 100으로 설정한다. 변경 후 퍼미션 변경여부를 확인.
       
   #chmod 100 /usr/bin/top
   #chmod 100 /usr/bin/pstree
   #chmod 100 /usr/bin/w
   #chmod 100 /bin/ps
   #chmod 100 /usr/bin/who
   #chmod 100 /usr/bin/find
   #chmod 100 /bin/df
   #chmod 100 /bin/netstat
   #chmod 100 /sbin/ifconfig
   #chmod 100 /usr/sbin/lsof
   #chmod 100 /usr/bin/make
   #chmod 100 /usr/bin/gcc
   #chmod 100 /usr/bin/g++
   #chmod 100 /usr/bin/c++

22. su 명령어를 이용한 root권한 사용자 점검.

   su 명령어의 사용내역을 확인할 수 있음.

   #cat /var/log/messages | grep root

23. 최근 n 일전 변경된 파일 점검. (단위는 일)

   #find / -ctime -1 -print | more

25. find 를 이용한 특정파일 점검하기.

   .exec 파일찾기
   #find / -name '.exec' -exec cat {} \; -print

   #.forward 파일체크
   #find / -name '.forward' -exec cat {} \; -print
   
   write 퍼미션이 있는 파일(디렉토리)찾기
   #find / -type f  \( -perm -2 -o -perm -20 \) -exec ls -lg {} \;
   #find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \;
   
   SteUID SetGID 체크하기
   #find / -type f \( -perm -004000 -o -perm -002000 \) -exec ls -lg {} \;

   /dev 체크
   #find /dev -type f -exec ls -l {} \;
   
   소유자없는 파일 및 디렉토리 찾기
   #find / -nouser -o -nogroup -print
   
   원격리모트 접속허용 파일(.rhosts)찾기
   #find / -name .rhosts -print
   
   최근 변경된 파일들 찾기.(파일or디렉토리) 단위는 일
   #find / -ctime -20 -type f or d
   
   현재 서버에서 열려진 포트 및 접근저보 점검
   #netstat -an | grep LISTEN   (포트들과 열결되어 있는 실행데몬들을 확인)
   #lsof | grep LISTEN   (좀 더 자세히 확인)

26. 관리자용 명령어 퍼미션 수정하기.

   #chmod 100 /usr/bin/top
   #chmod 100 /usrbin/pstree
   #chmod 100 /usr/bin/w
   #chmod 100 /bin/ps
   #chmod 100 /usr/bin/who
   #chmod 100 /usr/bin/find
   #chmod 100 /bin/df
   #chmod 100 /bin/netstat
   #chmod 100 /sbin/ifconfig
   #chmod 100 /usr/sbin/lsof
   #chmod 100 /usr/bin/make
   #chmod 100 /usr/bin/gcc
   #chmod 100 /usr/bin/g++
   #chmod 100 /usr/bin/c++

27. 중요한 파일퍼미션과 소유권 제한 및 점검.

   #chmod 644 /etc/service
   #chmod 600 /etc/xinetd
   #chmod 644 /etc/mail/aliases
   #chmod 600 /etc/httpd/conf/httpd.conf
   #chmod 644 /var/log/wtmp
   #chmod 644 /var/run/utmp
   #chmod 644 /etc/motd
   #chmod 644 /etc/mtab
   #chmod 600 /etc/syslog.conf
   
   #/etc, /usr/etc, /bin, /usr/bin, /sbin, /usr/sbin
   
   #chmod 1777 /tmp
   #chmod 1777 /var/tmp
       
28. umask 값 확인하기.

   root의 umask 값 확인하기.
   #umask
   022 -->파일은 644 디렉토리는 755로 생성됨.
   027 -->파일은 640 디렉토리는 750로 생성됨.

29. /dev 에 device 파일 이외의 것이 존재하고 있는지 확인.

   #find /dev -type f -exec ls -l {} \;

30. 일반사용자의 명령어 패스

   #/usr/local/bin:usr/local/mysql/bin:/home/hosting/bin/
    일반사용자가 사용가능한 명령어를 모두 이것에 둠.

31. 관리자의 명령어 패스

   #:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/bin

   #/X11:/usr/X11R6/bin:/usr/kerberos/bin:/root/bin

32. 특정 그룹만의 su 사용권한 허용하기

   #vi /etc/group  (wheel구릅에 su 사용권한을 가질 유저 추가하기)
   #wheel:x:10:root,cream

   #vi /etc/pam.d/su (두줄 추가하기)

   #auth        sufficient        /lib/security/pam_rootok.so
   #auth        required                /lib/security/pam_wheel.so allow group=wheel

   #vi /var/log/message 에서 확인

33. chmod 400 /etc/shadow

34. 시스템 기본로그파일.

   - /var/log/messages
   - /var/log/secure
   - /var/log/wtmp
   - /var/run/utmp
   - /var/log/lastlog

35. utmp, wtmp, lastlog 파일

   utmp파일 : 현재시스템에 접속해 있는 사용자의 정보를 가지고 있음.
   
   #strings utmp | more
   
   정보 이용 명령어
   login(1), who(1), init(8), last(8), lastcomm(8)
   
   wtmp파일 : 처음부터 접속했던 모든 사용자의 로그인정보와 로그아웃정보를 가지고 있음.
   
   #strings wtmp | more
   
   정보 이용 명령어
   login(1), who(1), init(8), last(8), lastcomm(8)
   
   lastlog 파일
   
   가장 최근에 로그인한 정보를 저장함.
   
   last 라는 명령어로 확인할 수 있음.

36.  패스워드 유출대처방안(웹)

       perl을 이용한 방법.


   AllowOverride FileInfo AuthConfig Limit
   Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
   Options Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI
   Options Indexes SymLinksIfOwnerMatch IncludesNoExec
   
       Order allow,deny
       Allow from all
   
   
       Order deny,allow
       Deny from all
   


       SSI의 exec 명령어를 이용하는 방법

#    AddType text/html .shtml
#    AddHandler server-parsed .shtml

27. PortSentry를 이용한 실시간 해킹방어 구현.(잘못 사용할시 서버접속 안됨)

   #tar -xvzf portsentry-1.1.tar.gz
   #make linux
   #make install
   
   #/usr/local/psionic/portsentry/portsentry -tcp
   #/usr/local/psionic/portsentry/portsentry -udp
   #/usr/local/psionic/portsentry/portsentry -stcp
   #/usr/local/psionic/portsentry/portsentry -atcp
   #/usr/local/psionic/portsentry/portsentry -stdp
   
   #vi /etc/hosts.deny 점검.

28. Chkrootkit 로 백도어 점검.

  #tar -xvzf chkrootkit.tar.gz
  #make sense
  #./chkrootkit     (점검명령어)

29 ping 을 이용한 DOS 공격 막는 방법.

   #vi  /etc/sysctl.conf
   #net.ipv4.icmp_echo_ignore_broadcasts = 1
   
   #sysctl -w
   #/etc/rc.d/init.d/network restart
   #sysctl -a | grep ignore_broadcasts

30. Nmap를 이용 포트스켄 하여 해킹가능성 체크.

   #nmap -sS -p80 211.42.48.110 -O -v www.armian.net
 
 #nmap -sS -O -v 211.42.48.114



출처
http://blog.naver.com/osang1997.do?Redirect=Log&logNo=40009100812 
=============================================================================
iptables -A INPUT -s 211.63.89.95 -p icmp -j DROP

// 모든 패킷 DROP
iptables -A INPUT -s 0/0 -j DROP

iptables -A OUTPUT -f -d 192.168.1.1 -j DROP

// TCP option --syn A에서 B서버로 나가는 패킷은 되고 B에서 A로 들어오는 패킷은 막는다.
iptables -p TCP -s 192.168.1.1 --syn

iptables -A INPUT -p tcp ! --sport 0:1024 --dport 25 -J ACCEPT

// UDP flooding 예방책
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F INPUT
iptables -F OUTPUT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp ! --dport 53 -m state --state NEW -j DROP

// 웹해킹 대응방법
[root@wowsecurity dev]# chmod 700 /usr/bin/wget /usr/bin/lynx /usr/bin/curl
modsecurity 사용

// 한국에서의 ftp만 허용하고 나머지 국가에서의 접속은 차단하고자 할 때
iptables -A INPUT -p tcp --dport 21 -m geoip --src-cc KR -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j DROP
또는 iptables -A INPUT -p tcp --dport 21 -m geoip ! --src-cc KR -j DROP

// 동시접속 제한
iptables -A INPUT -m recent --name badguy --rcheck --seconds 300 -j DROP
iptables -A INPUT -p tcp --syn --dport 25 -m connlimit --connlimit-above 5                     -m recent --name badguy --set -j DROP
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15                     ?connlimit-mask 24 -j DROP
iptables ?A INPUT ?m psd ?j DROP

// VPN
Gateway - to Gateway 방식
Host-to-Gateway 방식

// tacacs 설정
Router(config)# tacacs-server host x.x.x.x
Router(config)# tacacs-server key cisco
Router(config)# enable use tacacs

switch>(enable) set authentication login tacacs
switch>(enable) set tacacs server x.x.x.x
switch>(enable) set tacacs key cisco

// NTP
장시간 상이한 시간설정으로 분석에 어려움, 시간동기화를 시켜줘야 함

// no login : 원격에서 passwd 없이 접근 가능 단 passwd가 설정되어야 한다.
// no login local : passwd 설정 필요없다.

// anti-spam
# vi /etc/mail/access
spammer.org REJECT
x.x.x.0 RELAY

# makemap has /etc/mail/access.db < /etc/mail/access

// sendmail 환경파일 초기화
# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

// tcpwrapper 텔넷 설정하기
# vi /etc/inetd.conf
telnet stream tcp nowait root /usr/sbin/in.telnetd in.telnetd
위 문장을 다음과 같이 수정
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd

# vi /etc/hosts.deny
ALL:ALL

# vi /etc/hosts.allow
telnetd : x.x.x.x

# service inetd restart

// PAM 설정하기
# vi /etc/security/limits.conf
* hard maxlogins 6
@users hard maxlogins 4

// FIND
find / -type f \( -perm -4000 -o -perm -2000 \) -ls // SETUID SETGID 파일들 검색
find / -type f -exec grep 'hack' {} /dev/null \n; // hack 단어를 포함한 파일 검색
find / -user 427 -print // 소유자 UID가 427인 파일을 보여줌
find / -perm -0002 -type d -print // 일반유저가 쓰기권한이 있는 DIR을 보여줌
find / -nouser -o -nogroup -print // 유저나 그룹이 없는 파일을 보여줌

chattr +i - 추가/변경/삭제 불가능
chattr +a - 추가만 가능
chattr +A - 파일에 대한 atime 즉 접근시간 속성을 변경할수 있다.

// proc 제어
echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
-> spoofing을 막기 위해 source route 패킷을 허용하지 않는다. 소스 라우팅을 허용할 경우 악의적인 공격자가 ip 소스라우팅을 사용해서 목적지으 ㅣ경로를 지정할 수 있고 원래 위치로 돌아오는 경로도 지정할 수 있다.

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
-> smurf 공격에 악용될 수 있으므로 broadcast 주소를 통한 icmp echo에 대해 응답하지 않도록 한다.

echo "0" > /proc/sys/net/ipv4/ip_forward
-> 해당시스템을 통해 다른 시스템으로 패킷의 포워딩 되지 않도록 한다.(라우터나 게이트웨이가 아닐경우)

echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
-> icmp redirect 허용하지 않는다. 허용할 경우 공격자가 임의의 라우팅 테이블을 변경할 수 있어 자신이 의도하지 않은 경로로 트랙픽이 전달될 수있다.

echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
-> 스푸핑된 패킷이나 소스라우팅, redirect 패킷에 대해 로그파일 남긴다.

echo "1" > /proc/sys/net/ipv4/tcp_syncookies
-> syn flooding 공격에 대응하기 위해 syncookies기능을 켠다.

echo -e "32768\t61000" > /proc/sys/net/ipv4/ip_local_port_range
-> local port 범위 지정

echo "1024" > /proc/sys/net/ipv4/tcp_max_syn_backlog
-> backlog queue 사이즈를 늘려 공격에 대응한다.

stunnel
openssl must be installed.
xinetd.conf
service pop3s
{
server = /usr/local/sbin/stunnel
server_args = /usr/local/etc/stunnel/stunnel.conf
}
service ssmtp
{
}

// zone transfer
dig @ns.wowsecurity.net. wowsecurity.net axfr
host -l kunsan.ac.kr dns.kunsan.ac.kr

-> master 는 slave에서만 zone transfer를 허용할 필요가 있다.
slave는 다른 3, 4차 slave서버에 zone transfer를 제공하는 것이 아니라면 모든 zone transfer를 차단해야할것이다.

//ssh에서 tcp-wrapper 사용하기
./configure --with-libwrap

// mysql 3306으로의 접속차단
on compiling, --skip-networking
max_user_connections 설정 제한
show processlist

// 한 IP에서 동시에 telnet 접속 2회 하는거 제한
iptables -A INPUT -p tcp --syn --dport 23 -m connlimit-above 2 -j REJECT

// FTP 접속 제한하기
<Limit Login>
Order deny,allow
Deny from x.x.x.x
Allow from All

// SMURFFING 대책
TCP/IP 대신 암호화로 전송한다.(IP 위조는 사실상 어려움)
VLAN 사용
IP FILTERING (IP와 MAC주소를 고정한다.)
PORT SECURITY (MAC FLOODING 대비)

// 설정
SET PORT SECURITY 3/1 ENABLE MAC ADDRESS

// 나프타 : TCP로 메모리 고갈(실제 사용자의 IP주소로 공격함)

// smurf 대책 - 증폭네트워크딴에서 icmp echo reply 패킷에 대한 차단 or 어느정도의 대역폭만 허용

// no ip redirects - icmp redirect 차단

// ingress <-> egress

// blackhole
Posted by 1010
98..Etc/Etc...2009. 7. 15. 11:39
반응형

출처 : http://simples.kr/bbs/board.php?bo_table=03_2&wr_id=77&page=2

다른 메신저, 웹브라우저에서도 다음과 같이 Proxy 설정 해 주시면 됩니다.

기본적으로 외부에 ssh 연결이 가능한 시스템이 있어야 합니다.



Posted by 1010
98..Etc/Etc...2009. 7. 15. 11:38
반응형

출처 : http://simples.kr/bbs/board.php?bo_table=03_2&wr_id=79

Contents
1 이 문서가 필요한 곳
2 필요한 것
3 방법
3.1 ssh -R 에 대해
3.2 ssh -L 에 대해
3.3 접속
4 실제의 예 1 (ssh서비스 이용하기)
4.1 my_office_pc 에서
4.2 my_home_adsl_pc 에서
5 실제의 예 2 (터미널 서비스 이용하기)
5.1 my_office_pc 에서
5.2 my_home_adsl_pc 에서
6 맺는 말
7 질문과 답변
8 토론


작성 : 김원일


[edit]1 이 문서가 필요한 곳 ¶


회사나 가정에서 작업하던 환경을 그대로 쓰고 싶지만 vpn 이나 firewall 등의 제한으로 외부에서 접근하기가 쉽지 않은 경우가 있다. proxy 가 있거나 vpn 이라면 별 다른 문제가 없을 수도 있겠으나 firewall 같은 경우 넷웍 관리자에게 요청하지 않는 이상, 또는 요청한다고 해도 그다지 쉽게 허가를 얻지 못할 것이다. vpn 이라고 해도 외부의 누군가에게 잠깐 내부의 자원을 이용하게 하기위해 자신의 vpn 접속 방법을 가르쳐 주는 것도 양심상, 보안상 그다지 권장하고 싶은 일은 아니다. 이 문서는 그러한 경우 외부에서 접근 가능한 ssh계정을 이용해 터널을 만들어 vpn, firewall 외부에서 그 안쪽으로 접근을 가능하게 하는 방법이다.


[edit]2 필요한 것 ¶


OpenSSH (ssh protcol 2 이상을 가정)
vpn 및 firewall 외부에 ssh 로 접속이 가능한 계정
임은재님이 작성하신 ssh Howto, ssh + mini proxy 등을 미리 읽어 두는 것이 도움이 된다.


[edit]3 방법 ¶


[edit]3.1 ssh -R 에 대해 ¶
ssh -R 은 원격서버의 특정 포트를 자신이 접근 가능한 서버 및 포트 (이문서에서는 vpn 안쪽의 자신의 서버 또는 작업을 하려는 서버)로 포워딩 하는 것이다. ssh -L 의 역이라고 봐도 무방하다 (ssh -L 에 대해서는 ssh mini proxy 문서를 참조하자)


vpn 또는 firewall 안쪽의 PC 에서


ssh -R port:host:hostport ssh_user@ssh_server


와 같은 명령을 사용한다.


ssh_server서버에 ssh_user라는 계정으로 접속하되 port로 지정한 포트로 들어오는 패킷을 host의 hostport로 포워딩한다는 것이다. 언뜻 알기 어렵지만 차근 차근 이해해 보자.


port : ssh_server에서 열 포트 번호다. (여기서 ssh_user가 ssh_server의 루트가 아니라면 1024번 이상의 포트번호를 지정해야 한다)
host : vpn 및 firewall 안쪽에 있는 우리가 바깥에서 사용할 서버의 ip 또는 이름이다. (꼭 안쪽에 있을 필요는 없다. ssh -R ... 명령을 내리는 자신의 컴퓨터에서 접근 가능해야 한다)
hostport : 위의 host 에서 우리가 이용하려는 서비스가 열려있는 포트 번호다. (역시 접근 가능해야 한다)


이상과 같이 하면 hostname의 loopback 주소(127.0.0.1)에서 port를 리스닝하게 된다. nestat -nl 로 확인해보라. loopback 주소로만 listening하는 것은 sshd 설정상 기본이다.
[edit]3.2 ssh -L 에 대해 ¶
이제 우리가 원하는 우회로의 반은 열린 셈이다. 나머지 반을 열어보자.


ssh -L localport:localhost:port ssh_user@ssh_server


이 명령은 vpn 또는 firewall 바깥의 환경에서 쓰이게 된다. 즉 집이나 외부업체의 회의실 또는 외딴 섬마을 학교의 pc실에서 쓰인다는 것이다.


localport : 현재 작업 중인 컴퓨터에서 열릴 포트이다. (netstat -nl 에서 Listen 중인 것으로 나타날 것이다)
localhost : 말 그대로 localhost라고 적는 것이다. 127.0.0.1 도 무방하다. 여기서 localhost 는 ssh_server의 루프백 주소를 가리킨다.
port : ssh -R 에서의 port 와 같다.


이제 모든 우회로가 열렸다!


[edit]3.3 접속 ¶


우회로를 이용하는 건 다음과 같다.


telnet localhost localport (telnet 서비스를 우회해서 접속할 경우)
http://localhost:localport/ (http 서비스의 경우)
ssh -p localport localhost (ssh 서비스의 경우)
smbclient -p localport localhost (삼바 서비스의 경우)


즉 모든 접속은 localhost로 ssh -L 에서 지정한 localport를 이용하게 된다.


[edit]4 실제의 예 1 (ssh서비스 이용하기) ¶
여기서는 실제로 명령어를 다루는 예를 들겠다. 다음과 같은 컴퓨터들이 등장한다.


my_office_pc (IP : 224.20.X.22 under Firewall)
ssh_server (IP : 210.32.X.221)
my_home_adsl_pc (IP: 61.78.X.226)


지금 시각은 오후 5:32분, 내일 오전까지 끝내야할 작업이 거의 다 끝나가지만 잔업은 하기 싫다. 집에서 작업하고 싶지만 방화벽 때문에 외부에서는 접속할 수가 없는 처지다.


[edit]4.1 my_office_pc 에서 ¶


my_office_pc ~$ ssh -R 22:localhost:22 210.32.X.221
myaccout@210.32.X.221's password: _ <-- ssh_server 패스워드 입력

ssh_server ~$ _


이제 짐을 싸고 정리한 후 퇴근한다!


[edit]4.2 my_home_adsl_pc 에서 ¶


my_home_adsl_pc ~$ ssh -L 2222:localhost:22 210.32.X.221
myaccout@210.32.X.221's password: _ <-- ssh_server 패스워드 입력
ssh_server ~$ _


다른 터미널을 열고


my_home_adsl_pc ~$ ssh -p 2222 localhost
myaccout@localhost`s password: _ <-- my_office_pc 의 패스워드 입력
my_office_pc $ _ <--- 사무실에 ssh 로 연결 되었다!!!


마무리 작업을 하고 맥주 한잔!


[edit]5 실제의 예 2 (터미널 서비스 이용하기) ¶


여기서는 실제로 명령어를 다루는 예를 들겠다. 다음과 같은 컴퓨터들이 등장한다.


my_office_pc (IP : 224.20.X.22 under Firewall,Windows XP)
ssh_server (IP : 210.32.X.221)
my_home_adsl_pc (IP: 61.78.X.226)


지금 시각은 오후 5:45분, 내일 오전까지 끝내야할 작업이 거의 다 끝나가지만 잔업은 진짜!! 하기 싫다. 집에서 작업하고 싶지만 방화벽 때문에 외부에서는 접속할 수가 없는 처지다.


[edit]5.1 my_office_pc 에서 ¶
지금의 사무실의 컴퓨터는 윈도우 환경이다. 윈도우에서는 별도의 ssh 프로그램이 필요하다.


putty (터널링이 가능한 최신 버젼)
plink (putty 의 자매 프로그램, windows console 에서 사용 가능하다. plink -R 또는 plink -L 로 unix 에서와 유사하게 사용한다.
ssh (cygwin 환경에서 사용가능)


plink 를 사용해보기로 하자.


> plink -R 3389:localhost:3389 210.32.X.221
myaccout@210.32.X.221's password: _ <-- ssh_server 패스워드 입력

ssh_server ~$ _


이제 짐을 싸고 정리한 후 퇴근한다!


[edit]5.2 my_home_adsl_pc 에서 ¶
집의 PC는 linux 또는 rdesktop 을 사용해야 한다. 이유는 MS에서 제공하는 windows용 terminal client는 별도로 IP를 확인하기 때문에 인증이 이루어지고도 사용은 불가능하다.


my_home_adsl_pc ~$ ssh -L 3389:localhost:3389 210.32.X.221
myaccout@210.32.X.221's password: _ <-- ssh_server 패스워드 입력
ssh_server ~$ _


다른 터미널을 열고


my_home_adsl_pc ~$ rdesktop localhost:3389 (포트번호는 생략가능)
//rdektop에서 my_office_pc의 윈도우 계정 패스워드 입력
//rdesktop이 시작된다.


마무리 작업을 하고 맥주 한잔!


[edit]6 맺는 말 ¶
원래는 친구 회사의 PC에서 작업을 하기 위해서 이런 방법을 생각해 보았다(어디까지나 친구 본인의 요청에 의해서). 꽤 귀찮아 보이지만 어쩔 수 없는 상황에서는 유용하리라고 생각한다. 외부에 ssh계정이 있어야 하는 단점이 있긴 하지만 그런 경우에는 각자의 집에 ssh 서비스를 이용하는 방법도 있으므로 큰 문제는 없으리라 생각한다.


[edit]7 질문과 답변 ¶
Q: IP 공유기를 사용하고 있습니다. 사설망 IP로도 접근 가능한 방법이 있나요?


A: 네. 공유기 아래의 사설망으로도 위 방법을 사용하면 가능합니다. 하지만 공유기라면 DMZ 설정이나 port forwarding이 더욱 간단하겠지요. 이 문서는 공유기나 방화벽, vpn 설정을 고칠 수 없는 일반 유저를 위한 내용입니다.


Q: 잘 사용한 후, 열어둔 터널을 닫고 싶습니다. 어떻게 해야 하나요?


A: 아~. ssh -R/-L 로 열어둔 터미널에서 나오면 되는군요.


[edit]8 토론 ¶


Posted by 1010
반응형

파일복사가 느린경우 대안... 동적버퍼사이즈를 조정해 비동기복사와 같은 효과

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


TeraCopy is a compact program designed to copy and move files at the maximum possible speed, providing the user a lot of features:

  • Copy files faster. TeraCopy uses dynamically adjusted buffers to reduce seek times. Asynchronous copy speeds up file transfer between two physical hard drives.
  • Pause and resume file transfers. Pause copy process at any time to free up system resources and continue with a single click.
  • Error recovery. In case of copy error, TeraCopy will try several times and in the worse case just skips the file, not terminating the entire transfer.
  • Interactive file list. TeraCopy shows failed file transfers and lets you fix the problem and recopy only problem files.
  • Shell integration. TeraCopy can completely replace Explorer copy and move functions, allowing you work with files as usual.
  • Full Unicode support.

Download TeraCopy – Free for Home Users

TeraCopy Pro

You can also buy a Pro version of the program that lets you do the following:

  • Select files with the same extension/same folder
  • Remove selected files from the copy queue
  • Get free updates and priority support
  • More features coming soon!

Buy TeraCopy Pro – 30-Day Money Back Guarantee

Posted by 1010
반응형
리눅스나 유닉스 계열을 사용하신다면 tail 명령어를 아실겁니다.
tail은 기본적으로 파일의 마지막 부분을 보여주는 유틸입니다.
(Man 페이지에는 tail -- display the last part of a file 로 설명이 나옵니다.)

파일의 마지막 부분을 보여주는 기능이 있다보니 로그를 보는데 아주 유용합니다.
가령 웹(네트워크)서버에 로그 파일을 tail로 걸어놓고 보면 디버깅이나 프로그래밍할때 많은 도움을 줍니다.

아쉬운게 윈도우용은 tail이 없어서 윈도우상에서 Tomcat + Eclipse 작업을 할땐 로그 보기가 여간 불편한게 아닙니다. 이런 불편함을 덜고자 tail과 유사한 mTail 이라는 프로그램이 있습니다.


사용법은 간단합니다. 출력할 file을 선택하고 우측 위의 start를 누릅니다. 그러면 tail 처럼 log가 죽죽 올라가지요



Posted by 1010
반응형

로그 파일을 모니터링할 때 UNIX 의 tail -f 보다 좋은 것은 없는 것 같습니다. 그런데 Windows 에는 tail 명령 자체가 없기 때문에 난감한 경우가 있습니다. Tail for Win32 라는 괜찮은 녀석이 있습니다. 키워드 하이라이트, 메일 알림 등 추가 기능들도 꽤 괜찮은 편이라, 예전에 소개한 TailXP 보다 더 추천하고 싶습니다.

홈페이지, 다운로드: http://tailforwin32.sourceforge.net/

Tail for Win32

This is the homepage of Tail for Win32 - the Windows version of the UNIX 'tail -f' command.

Tail for Win32 is used to monitor changes to files; displaying the changed lines in realtime. This makes Tail ideal for watching log files.

Tail has a plugin architecture, which allows notifications to occur when certain keywords are detected in monitored files. At the moment a MAPI plugin is available, and work is in progress on an SMTP version.

Features

A few features of Tail:

  • Watch multiple files in realtime

  • Detect keyword matches, and highlight occurences

  • Send mail notifications on keyword matches by SMTP or MAPI

  • Plugin architecture allows you to write specialised handlers

  • Can process files of any size on all types of drive (local or networked)

Download

A number of downloads are available:

  • The binary package: a precompiled version, ready to go out of the box. The ZIP file contains the runnable EXE and a readme.

  • The source package: everything you need to build and modify Tail

  • The 'Devel' package: a snapshot of my development version at the time of the upload. Only download the 'Devel' package if you don't mind sofware that doesn't really 100% work...

Please go to Tail's SourceForge project page to download.

Contribute

If you find Tail for Win32 useful, then why not donate a little to show your appreciation. Even a small amount will be very gratefully received! If you're happy to leave a comment when you donate, I'll add you to the supporters page.

Donate to this project

Alternatively, why not keep my iPod or bookshelf happy with an item from my Amazon wishlist? (I dread to think what that list says about me!)

Tail's License

Tail is OpenSource and is licensed under the GPL. In a nutshell, this allows you to give Tail away free or for a cost, but to do so you must also give the source away with it.

Posted by 1010
반응형

Maven 소개

메이븐은 아파치 소프트웨어 재단의 최상급 오픈소스 프로젝트이며 원래는 자카르타 터빈(Jakarta Turbine) 프로젝트의 복잡한 빌드 과정을 관리하기 위해 만들어졌다.  현재 버전 2까지 나오면서 메이븐은 단일 팀 프로젝트에 최적화된 빌드 도구에서 대부분의 소프트웨어 개발 시나리오에 꼭 필요한 범용 빌드 관리 시스템까지 다양하게 사용하고 있다.


사용자 삽입 이미지http://whitebear.tistory.com/60

Maven 설치와 사용

javacan 블로그의 휼륭한 글

Maven 기초 사용법

maven 기반 archetype 생성 예제

maven local repository 변경

 

Maven Life-cycle

Maven은 빌드과정을 Phases와 Goal로 life-cyle을 구성한다.

Phases

compile -> test -> package -> install -> deploy

Phases & goal

maven은 플러그인 기반으로 동작하는데 phase에 해당하는 연결된 플러그인의 goal이 실행된다.


process-resources / resources:resources

compile    compiler:compile

process-classes

process-test-resources / resources:testResources

test-compile / compiler:testCompile

test / surefire:test

prepare-package

package / jar:jar



Maven의 의존관계

Maven 의존 관계 라이브러리 이용

 

Eclipse 에서 Maven 활용

 

Maven 주요 goals

apache maven eclipse plugin

Maven Jetty Plugin

 

 

Maven profiling

개발 환경마다 설정 정보를 다르게 가져가야 할 경우에, 각각의 개발환경에 적합한 설정 정보를 관리하는 기능으로 profile을 이용한다.

실행 프로파일 설정
  1.           <settings>
    ...
    <activeProfiles>
    <activeProfile>profile-1</activeProfile>
    </activeProfiles>
    ...
    </settings>



 <profiles>
  <profile>
   <id>jboss4.2.2.GA</id>
   <activation>
    <activeByDefault>true</activeByDefault>
   </activation>
   <properties>
    <deployPath>
     c:/dev/java/jboss-4.2.2.GA/server/default/deploy/${artifactId}.war/
    </deployPath>
   </properties>
  </profile>
  <profile>
   <id>tomcat5x</id>
   <properties>
    <deployPath>c:/dev/java/apache-tomcat-5.5.25/webapps/${artifactId}</deployPath>
   </properties>
  </profile>
 </profiles>

          <project>
...
<profiles>
<profile>
<id>appserverConfig-dev</id>
<activation>
<property>
<name>env</name>
<value>dev</value>
</property>
</activation>
<properties>
<appserver.home>/path/to/dev/appserver</appserver.home>
</properties>
</profile>

<profile>
<id>appserverConfig-dev-2</id>
<activation>
<property>
<name>env</name>
<value>dev-2</value>
</property>
</activation>
<properties>
<appserver.home>/path/to/another/dev/appserver2</appserver.home>
</properties>
</profile>
</profiles>
..
</project>
프로파일 실행
          mvn groupId:artifactId:goal -P profile-1,profile-2
          
프로파일 중지
          mvn groupId:artifactId:goal -P !profile-1,!profile-2
          
실행환경 저장
          실행환경별로 <resouce/>에서 디렉토리별로 클래스, 설정화일을 관리
          
           
          
  1.           mvn -Denv=dev integration-test
    <resource><directory>src/main/resources-${environment}</directory></resource>

http://maven.apache.org/guides/introduction/introduction-to-profiles.html

참고자료
Posted by 1010
05.JSP2009. 7. 14. 10:57
반응형

J2EE에서 한글

공식처럼 대부분의 사이트가 EUC-KR 인코딩을 사용한다. 그런데 EUC-KR이 올바른 한글 인코딩일까?

결론은 아니다. EUC-KR로는 한글을 모두 표현할 수 가 없다. 똠방각하, 펲시콜라 이런 글자가 안되는 한글 페이지라니... EUC-KR에서는 ?방각하 ?시콜라 처럼 보여진다. google에서 펲시콜라를 입력해보라, 아니 이 블로그만 보더라도... 어처구니없이 외국사이트보다도 세종대왕의 자손들이 만들고 운영하는 사이트들에서 한글이 제대로 쓰여지고 있지 않다.
완성형, 조합형으로까지 거슬러 올라가 전산상의 한글 구현에 대해서 구구절절 읊지 않더라도 한글 자모로 구성 가능한 문자가 표현되지 않는 character set이나 encoding을 사용하는 것은 올바른 습관이 아니라고 본다.

여타의 기술 자료나 QnA 등에서 그래도 앞서나간 사람들이 jsp한글...tomcat 한글... 이런 글에 몽땅 EUC-KR로 기술하고있는 것은 문제라고 생각한다.

마땅히 한글 표현이 우수한 UTF-8를 사용해야한다. 한글 뿐만 아니라 국제화를 고려한다면 더더욱.

Tomcat에서 contentType을 UTF-8으로 하는 경우 jsp 파일은 UTF-8인콩딩으로 작성되어야한다. Eclipse를 사용한다면 문서의 Properties에서 수정할 수 있다. UTF-8인경우 한글 출력 및 post로 submit된 한글 값도 문제가 없지만 get 으로 전송된 파라미터 값은 한글이 깨진다.

Tomcat의 url decoding 과정에서 한글 처리에 문제가 있다.

String qry = request.getQueryString();
msg = URLDecoder.decode(qry.split("msg=")[1],"UTF-8");
out.println(msg)

처럼 직접 url decoding을 하면 get 전송된 한글도 정상적으로 출력된다.

request.getParameter()에서 UTF-8으로 decoding되지 않는 문제를 ... 음. 시간이 날 때 좀 더 파헤쳐보면 해법을 찾을 수 있을 거 같다.
꼭 찾아야지.
Posted by 1010
05.JSP2009. 7. 14. 10:55
반응형
Posted by 1010
90.개발관련문서2009. 7. 14. 10:44
반응형
Posted by 1010
02.Oracle/DataBase2009. 7. 14. 10:22
반응형
출처: http://www.devpia.com/DevStudy/Lecture/OffLineDetail.aspx?nSemiID=1431&lectype=evt

데브피아에 DB 튜닝관련 컬럼 연재가 2회차가 올라왔습니다. ^^

 지난회에는 인덱스를 생성했으나 컬럼의 가공, 내부적 변형, null과의 비교, 부정형 조건등으로 인하여 인덱스를 사용하지 못하는 경우를 보았다.
그럼 과연 인덱스를 타기만 하면 무조건 빠를까?
불행하게도 그렇지 않다. 대부분의 경우는 빠르겠지만 경우에 따라서는 인덱스를 타기 때문에 느려지는 경우가 많이 발생한다.

EMPLOYEE에 성별 컬럼을 추가하고 절반정도 되게 남성과 여성을아래와 같은 분포도로 넣었다.

SELECT GENDER , COUNT(*) CNT, ROUND(COUNT(*) / 15132,3)*100 RATIO FROM EMPLOYEES
GROUP BY GENDER;

G
----
F
M
CNT
--------
7590
7542
RATIO
---------
50.2
49.8
 
그리고 아래와 같은 INDEX를 생성하였다.
CREATE INDEX IDX_GENDER ON EMPLOYEES(GENDER);
그러면 이제 2개의 SQL의 수행 결과를 보자.
첫번째 경우는 INDEX를 탄경우다.
아래와 같이 HINT를 주어서 OPTIMIZER의 PLAN을 고정하였다.
/*+ INDEX(E IDX_GENDER) */ 는 E라는 별명의 테이블에 IDX_GENDER이라는 INDEX를 이용하여 테이블에 데이터를 가져오라는 뜻이다.
SELECT /*+ INDEX( E IDX_GENDER) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE GENDER = 'M'
GROUP BY GENDER

Call
----------
Parse
Execute
Fetch
----------
Total

Count
----------
1
1
2
----------
4
CPU Time
----------
0.000
0.000
0.030
----------
0.030
Elapsed Time
-------------
0.000
0.000
0.026
-------------
0.026
Disk
----------
0
0
0
----------
0
Query
----------
0
0
127
----------
127
Current
----------
0
0
0
----------
0
Rows
----------
0
0
1
----------
1
Misses in library cache during parse: 0
Optimizer goal: RULE
Parsing user: SCOTT (ID=54)

Rows
----------
0
1
7542
7542
Row Source Operation
---------------------------------------------------
STATEMENT
SORT GROUP BY NOSORT (cr=127 pr=0 pw=0 time=25567 us)
TABLE ACCESS BY INDEX ROWID EMPLOYEES (cr=127 pr=0 pw=0 time=15176 us)
INDEX RANGE SCAN IDX_GENDER (cr=16 pr=0 pw=0 time=61 us)OF IDX_GENDER (NONUNIQUE)
두번째 경우는 INDEX를 타지 않은 경우다.
아래와 같이 HINT를 주어서 OPTIMIZER의 PLAN을 고정하였다.
/*+ FULL(E) */ 는 E라는 별명의 테이블을 할 때 테이블 전체를 다 읽어서 처리(FULL TABLE SCAN)하라는 뜻이다.
SELECT /*+ FULL(E) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE GENDER = 'M'
GROUP BY GENDER

Call
----------
Parse
Execute
Fetch
----------
Total

Count
----------
1
1
2
----------
4
CPU Time
----------
0.000
0.000
0.010
----------
0.010
Elapsed Time
-------------
0.000
0.000
0.014
-------------
0.015
Disk
----------
0
0
0
----------
0
Query
----------
0
0
115
----------
115
Current
----------
0
0
0
----------
0
Rows
----------
0
0
1
----------
1
Misses in library cache during parse: 0
Optimizer goal: RULE
Parsing user: SCOTT (ID=54)

Rows
----------
0
1
7542
Row Source Operation
---------------------------------------------------
STATEMENT
SORT GROUP BY NOSORT (cr=115 pr=0 pw=0 time=14410 us)
TABLE ACCESS FULL EMPLOYEES (cr=115 pr=0 pw=0 time=181 us)
인덱스를 탄 경우는 0.03초가 걸렸고 인덱스를 타지 않은경우는 0.01초가 걸렸다.
인덱스를 타서 3배나 더 느려졌다!. 이것이 가능한가? 그러면 왜 인덱스를 탔는데도 시간이 더 걸리는 것인가?
이유는 Disk io에 있다. 일반적으로 Full table scan을 할때는 한번에 1개의 block씩 i/o를 하지 않고 muti block를 한번에 요구한다. 그 이유는 읽을 양이 많다고 미리 가정하기 때문이다. 따라서 Oracle의 경우 db_file_multiblock_read_count라는 파라미터가 있고 일반적으로 8또는 16을 설정한다. 만약 16이라면 한번 I/O에 16개의 BLOCK을 읽어오게 되는것이다.
따라서 EMPLOYEE 115BLOCK을 한번에 16개씩 읽으면 약 8번의 IO 요청으로 완료가 된다.
그러나 Index를 사용할 경우 index를 사용하면 기본적으로 대량의 io가 발생할 것이라고 가정하지 않기 때문에 1개의 block씩 i/o를 하게 된다.
따라서 16개의 index block과 115개의 block의 물리적 i/o가 발생한다 16+115를 하면 총 131번의 물리적 io가 발생하게 되는것이다. 논리적으로는 인덱스 1개보고 테이블 1개 블락을 읽고를 7542번+1번을 하게되는 것이다. 마지막 1번은 다음에 더 이상 ‘M’이 없는지 확인하기위해서 1번 더 읽는다. 어째든 인덱스를 사용되는 것이 더욱 느리다는 것이다. 현지 EMPLOYEES 테이블은 15132건이다. 만약 이 데이터가 많아진다면 차이는 점점 더 많이 날것이다.

그러면 어느정도은 INDEX를 타고 어느 정도는 Full Table Scan이 오히려 더 좋은가?
시스템의 성능또는 데이터의 양에 따라 차이가 조금씩있으나 일반적인 기준은 있다.
아래 TYPE이라는 컬럼에 A-F까지 값을 가지고 있으며 가각 49.8%부터 0.9%까지의 분포를 가지는 값들을 가지고 있다.
SELECT TYPE , COUNT(*) CNT, ROUND(COUNT(*) / 15132,3)*100 RATIO FROM EMPLOYEES
GROUP BY TYPE;

T
--------
A
B
C
D
E
F
CNT
--------
7542
4533
1515
799
603
140
RATIO
---------
49.8
30
10
5.3
4
0.9
아래는 예제로 사용되었던 SQL과 그에 따른 응답시간을 비교한 표이다.

FTS(Full Table Scan) SQL
SELECT /*+ FULL(E) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE TYPE = 'F'
GROUP BY GENDER;

Rows
--------
0
1
140
Row Source Operation
---------------------------------------------------
STATEMENT
1 HASH GROUP BY (cr=115 pr=0 pw=0 time=6925 us)
140 TABLE ACCESS FULL EMPLOYEES (cr=115 pr=0 pw=0 time=10323 us)
INDEX(Index Scan) SQL
SELECT /*+ INDEX(E IDX_TYPE) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE TYPE = 'F'
GROUP BY GENDER;

Rows
--------
0
1
140
140
Row Source Operation
---------------------------------------------------
STATEMENT
HASH GROUP BY (cr=87 pr=0 pw=0 time=3227 us) 140
TABLE ACCESS BY INDEX ROWID EMPLOYEES (cr=87 pr=0 pw=0 time=2956 us)
INDEX RANGE SCAN IDX_TYPE (cr=2 pr=0 pw=0 time=539 us)OF IDX_TYPE (NONUNIQUE)
 
결과를 보자 약 15132건의 테이블을 ACCESS하는데 10%이상이 되는 경우는 FTS이 더빠르고 10%이하인 경우는 INDEX를 타는 경우가 더 빠르다.
10% 미만일때는 INDEX를 타고 10%가 넘으면 인덱스를 안타게 할수 있는가?
결론적으로 가능하다.
아래 SQL을 보자 2개의 SQL을 UNION ALL로 결합하고 비교조건을(굵은색)을 줌으로서 논리적 비교를 통해서 실제로 FTS의 조건은 타지 않고 INDEX쪽만 수행하도록 하였다.
아래 수행결과를 보면 INDEX를 타는 곳에서만 ROWS가 나온 것을 알수있다.
SELECT /*+ FULL(E) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE TYPE = 'F'
   AND TYPE IN ( 'A','B','C')
GROUP BY GENDER
UNION ALL
SELECT /*+ INDEX(E IDX_TYPE) */ GENDER, COUNT(*), AVG(SALARY)
FROM EMPLOYEES E
WHERE TYPE = 'F'
   AND TYPE IN ( 'D','E','F')
GROUP BY GENDER;

Rows
--------
0
1
0
0
0
1
140
140
Row Source Operation
---------------------------------------------------
STATEMENT
UNION-ALL (cr=87 pr=0 pw=0 time=2743 us)
HASH GROUP BY (cr=0 pr=0 pw=0 time=235 us)
FILTER (cr=0 pr=0 pw=0 time=8 us)
TABLE ACCESS FULL EMPLOYEES (cr=0 pr=0 pw=0 time=0 us)
HASH GROUP BY (cr=87 pr=0 pw=0 time=2477 us)
TABLE ACCESS BY INDEX ROWID EMPLOYEES (cr=87 pr=0 pw=0 time=2328 us)
INDEX RANGE SCAN IDX_TYPE (cr=2 pr=0 pw=0 time=205 us)OF IDX_TYPE (NONUNIQUE)
그렇나 이렇게 프로그램을 한다면 프로그램이 힘들어 질것이다. 따라서 현재 Optimizer들은 실제 값에 따라서 FTS이 유리한지 아니면 INDEX SCAN이 유지한지 값을 보고 PLAN이 바뀌도록 되어있다. 물론 이를 위해서는 컬럼에 대한 분포도 정보를 DB가 가지고 있어야 한다. 이는 ANALYZER를 통해서 DB가 취득하게 된다.

그럼 이제 간단하다 10%이상에 데이터를 INDEX를 타면 속도가 오히려 느려지므로 10%이하의 데이터를 찾고자 할 때만 INDEX를 생성하면 간단하게 해결될것이다!
그러나 과연 그럴까?
INDEX를 생성하면 일반적으로 SELECT의 속도는 향상을 보지만 반대로 INSERT,UPDATE,DELETE는 저하되게 된다.
위에 도표를 보면 INDEX의 숫자가 증가함에 따라서 속도가 느려지는 것을 알수 있다. 즉, 인덱스의 생성으로 SELECT는 빨라질수도 있고 느려질수도 있다. 그러나 DML(INSERT,UPDATE,DELETE)는 항상 느려진다. 따라서 INDEX를 무작정 다는 것은 DML 성능을 느리게 한다.
그럼 어떤 기준으로 인덱스를 생성할지 말지를 결정할 것인가?
아래 2가지 시간을 고령하자.
이익시간 = INDEX생성으로 빨라진시간 * 수행 QUERY수
비용시간 = INDEX생성으로 느려진 INSERT시간 * INSERT수행횟수
                + INDEX생성으로 느려진 UPDATE시간 * UPDATE수행횟수
                + INDEX생성으로 느려진 DELETE시간 * DELETE수행횟수

이익시간이 비용시간 보다 크다면 인덱스를 생성하는 것이 좋을 것이다. 반대로 이익시간 < 비용시간 보다 작다면 인덱스를 만드는 것이 손해보는 경우다.
이런 경우라면 인덱스를 만들면 안되는 것이 유리하다 할수 있다. 그러나 반드시 그런 것은 아니다. 그것은 수행 시간을 고려해야한다. 낮에일반적으로 QUERY가 빠르게 수행되고 주로 밤에 BATCH에서 DML이 수행되고 있다고 가정할 때 DML이 더 느려지는 것이 그렇게 문제가 되지 않는다면 INDEX를 생성할 수도 있는것이다. 어디까지나 Application 사용의 관점에서 효율적인 것을 찾는 것이 중요하다.
인덱스를 사용하여 손해보는 경우는 아래와 같다.

  • 같은 값이 많은 컬럼
    • INDEX를 타면 10%이상 선택하는 경우
    • 예) 남녀성별등..
  • 조회보다 DML의 부담이 큰 경우
    • 이익시간 < 비용시간 경우
    • 그러나 이때도 사용환경을 고려하여 인덱스를 생성할 수 있다.
  • 데이터가 적은 테이블
    • 일반적으로 db_file_multiblock_read_count보다 적은 수의 BLOCK을 가진테이블은 INDEX를 타지 않는 것이 빠르다.
    • 그러나 integrity를 위해서 PK와 FK는 달아야 한다.

이번 회에는 INDEX를 타서 오히려 손해를 보는 경우와 그를 방지하는 방법을 보았다.
인덱스를 생성한다고 인덱스를 반드시 타는 것도 아니며 또한 인덱스를 탄다고 반드시 빠른 것도 아니다. 따라서 INDEX의 생성과사용 전략은 그렇게 쉬운 문제가 아니다. 빠른 시스템을 위해서는 고려할 점이 많다는 것이다. 물론 필자가 다룬 것은 테이블중에 일반테이블과 일반 INDEX에 대해서만 다루었기때문에 PARTITION이나 BITMAP같은 다른 구조의 인덱스에서는 다른 특성을 가진다. 그러나 이러한 것은 대용량이나 DW의 특수한 용도에 사용되므로 대부분의 경우에는 고려하지 않아도 크게 문제되지 않을 것이다.

못조록 필자의 글이 독자들에게 도움이되는 길이기를 바라면서 이글을 마무리하고자 한다.
마지막으로 당부 드리고 싶은 말은 SQL을 작성하시고 항상 PLAN을 확인하시기 바랍니다.
PLAN에 익숙해지고 OPTIMIZER를 이해할 때 비로소 OPTIMIZER가 여러분의 심부름꾼이 될수 있기때문이다.


Posted by 1010
02.Oracle/DataBase2009. 7. 14. 10:21
반응형
출처: http://www.devpia.com/DevStudy/Lecture/OffLineDetail.aspx?nSemiID=1429&lectype=evt

데브피아에 DB 튜닝관련 컬럼 연재가 올라왔네요. 내용이 괜찮아서 퍼왔습니다.

  필자가 처음에 SQL을 배울 때 SQL이 상당히 이상했다. 원하는 것만 요구할 뿐 어떻게 가져오라는 정보가 SQL에는 없었기 때문이다. FILE레벨의 I/O까지 코딩에 익숙한 필자에게 절차가 없다는 것이 오희려 더 이상했던 것이다.
물론 상세한 과정이 필요하지 않으므로 편리하고 좋았다 그러나 어떻게 가져오는지는 알지못하고 단지 사용할 뿐이었다.
그러나 SQL이 PLAN이라는 실행 계획을 만들고 그에 따라 가져오게 된다는 사실은 안것은 한참 뒤에 일이었다.
결국은 내가 하지않은 일을 Optimizer라는 프로그램이 대신 해주고 있는 것이 아닌가? 그래서 정말 고마운 놈이라고 생각했었다. 그러나 밑는 도끼에 발등을 찍힌다는 말이 있지 않은가?
Plan에 index를 달아주어도 Index를 사용하지 않고 full table scan만 하고 있으니 당체 속도가 나지를 않았다.
이래저래 해서 나중에 알게되었지만 결국 컬럼의 변형을 가하면 index를 사용하지 못한다는 것이다. 우리가 직접 사용하지는 않지만 결국 우리가 SQL을 사용한다는 것은 Optimizer라는 놈에게 SQL의 수행을 부탁하는 것이다. 따라서 우리가 Optimizer에 대해서 잘 안다면 SQL을 좀더 효율적으로 수행하도록 할 수 있지 않은가!
그러면 인덱스를 달았을 때 Optimizer가 index를 사용하지 못하는 경우를 통해서 우리가 애써(?)생성한 인덱시가 무용지물이 되지 않도록 해보자.
아래예제에 사용할 TABLE LAYOUT이다.
EMPLOYEES
---------
Rows=15,132
Empty Blocks=7
Chain Count=0
Avg Space Freelist Blocks=0
Sample Size=15,132
Partitioned=NO

Blocks=121
Avg Space=885
Avg Row Length=51
Freelist Blocks=0
Last Analyze=2009/05/04
Column Name
---------------
EMP_ID
MGR_ID
LAST_NAME
FIRST_NAME
HIREDATE
JOB
SALARY

Nullable
-----------------


NOT NULL
Column Type
-----------------
VARCHAR2(40)
VARCHAR2(40)
VARCHAR2(24)
VARCHAR2(14)
DATE
VARCHAR2(24)
NUMBER(7,2)
Distinct
-----------------
15,132
679
9,443
3,579
3,903
53
3,267
Buckets
------------------
75
75
75
75
75
53
75
INDEX
--------------------------------------------------------------------------------------
IDX_GENDER : GENDER
      Type=NORMAL, Uniq=No, Distinct=2, Rows=15,132, Last Analyze=2009/05/04
IDX_HIREDAT : HIREDATE
      Type=NORMAL, Uniq=No, Distinct=3,903, Rows=15,132, Last Analyze=2009/05/04
IDX_JOB : JOB
      Type=NORMAL, Uniq=No, Distinct=53, Rows=15,129, Last Analyze=2009/05/04
IDX_SALARY : SALARY
      Type=NORMAL, Uniq=No, Distinct=3,267, Rows=15,132, Last Analyze=2009/05/04
IDX_TYPE2 : TYPE
      Type=NORMAL, Uniq=No, Distinct=6, Rows=15,132, Last Analyze=2009/05/04
PK_EMP_ID : EMP_ID
      Type=NORMAL, Uniq=No, Distinct=15,132, Rows=15,132, Last Analyze=2009/05/04
필자가 여러군데 튜닝을 하면서 가장 많이 본것중에 하나는 INDEX를 달았으나 쓰지 못하게 되는 경우이다. 대표적인 경우가 아래와 같이 날짜타입(HIREDATE)에 TO_CHAR를 씌운 경우이다.
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE TO_CHAR(HIREDATE,'YYYYMMDD') = '19980518';
물론 INDEX는 아래와 같이 생성되어있다.
CREATE INDEX IDX_HIREDATE ON EMPLOYEES(HIREDATE);
우리가 원하는 것은 INDEX를 타고 테이블을 가져오기를 바란것이었다.

그러나 실제 PLAN은 아래와 같이 나온다.
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=28 Card=151 Bytes=3K)
1 0 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=28 Card=151 Bytes=3K)
TABLE ACCESS (FULL) 이란 뜻은 INDEX를 타지 않고 테이블을 처음부터 끝까지 읽어서 찾는다는 뜻이다. 한마디로 10건이며 10건읽고 100만건이면 100만건을 다 읽어야 결과가 나온다는 말이다.

OPEN시에는 빠르던 시스템이 시간이 지날수록 느려지는 결정적인 역할을 하는 것이 바로 위와 같은 경우이다. 그럼 어떻게 해야 제대로 인덱스를 사용할 수 있을가?
일단 간단히 SQL의 수정으로 해결할수 있다. HIREDATE는 날짜 타입이다.
따라서 인덱스를 HIREDATE로 했을 때 인덱스를 타기위해서는 INDEX를 생성한것에 변형을 주어서는 안된다.
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE HIREDATE = TO_DATE('19980518')
따라서 간단하게 위와 같이 고치면 INDEX를 사용하게된다.
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=4 Bytes=92)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (TABLE) (Cost=3 Card=4 Bytes=92)
2 1 INDEX (RANGE SCAN) OF 'IDX_HIREDATE' (INDEX) (Cost=1 Card=4)
물론 결과도 빠르게 나온다 그러나 중요한 점이 있다 결과가 같을까?
운이 좋으면 결과가 같을 것이고 대부분의 경우는 결과가 틀리다.
왜 그럴까?
날짜 타입은 날짜와 시분초의 정보도 가지고 있다. 따라서 TO_DATE(‘19980518’)라는 말은 정확히 1998년5월18일 0시0분0초라는 뜻이다. 그래서 우리가 원하는 1998년5월18일자와는 차이가 있다.
따라서 1998년5월18일 0시0분1초 ~ 23시59분59초까지의 데이터는 나오지 않게되는것이다.
이것은 튜닝할 때 유의할 점이다. 결과를 같게 유지해야하는것이다. 이 상황을 알고있다면 방법은 간단하다.
아래아 같이 고치면 빠른시간에 원하는 결과를 얻을 수 있을 것이다.
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE HIREDATE BETWEEN TO_DATE('19980518'||'00:00:00','YYYYMMDD HH24:MI:SS')
AND TO_DATE('19980518'||'23:59:59','YYYYMMDD HH24:MI:SS')
비슷하지만 함수의한 변형이 아닌 간단한 연산에의한 변형의 경우도 마찬가지이다.
$1000의 인센티브를 더주면 $10000이 넘는 사람을 찾는 SQL을 만들어보자.
아마 아래와 같을 것이다.
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE SALARY + 1000 > 100000;
물론 INDEX는 아래와 같이 만들었다.
CREATE INDEX IDX_SALARY ON EMPLOYEES(SALARY);
그러나 PLAN을 보자
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=29 Card=757 Bytes=13K)
1 0 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=29 Card=757 Bytes=13K)
인데스를 타지 못한다. 왜일까. 간단한 연산이지만 SALARY컬럼에 가공을 했기 때문에 OPTIMIZER는 인덱스를 타는 것을 포기해버린다.
따라서 우리가 기초적인 수학 실력을 발휘해서 이항을 해준다면 아래와 같은 조건이 될것이다.
SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE SALARY > 100000 - 1000;
이경우에 PLAN을 보자.
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=1 Bytes=17)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (TABLE) (Cost=3 Card=1 Bytes=17)
2 1 INDEX (RANGE SCAN) OF 'IDX_SALARY' (INDEX) (Cost=2 Card=1)
재미 있게도 이번에 제대로 된 인덱스를 탄다. Optimizer가 바보 같다는 생각이 들지 않는가?
물론 바보같다. 그러나 OPTIMIZER나름대로 깊은 고민이 있다. 아주 잛은 시간내에 OPTIMIZER는 많은 경우의 수를 타진해야한다. 따라서 이항연산과 같은 것 까지 검토하면 너무 많은 시간을 소모하게 된다 따라서 그런부분은 포기한것이다.

또다른 경우중에 하나가 DB의 내부적인 변형이다. 이는 개발자가 의도하지 않게 문제를 야기하는 경우이다.
여기 PK 조건으로 검색하는 SQL이 있다.
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE EMP_ID = 200383;
그러나 PLAN은 아래와 같이 나왔다.
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=29 Card=1 Bytes=19)
1 0 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=29 Card=1 Bytes=19)
분명히 아래와 같은 INDEX를 생성하였다.
CREATE INDEX PK_EMP_ID ON EMPLOYEES(EMP_ID);
왜 인덱스를 안타는 것일까?
그 이유은 OPTIMIZER의 내부 변형 규칙에 있다.
일반적으로 비교를 하려면 두개의 데이터 형이 같아야 한다.
그런데 EMP_ID는 VARCHAR2(40)이다 그리고 비교하려는 것은 200383이라는 숫자이다.
따라서 숫자와 문자는 비교할수 없기 때문에 내부적으로 변형이 이루어진다.
문자보다 숫자가 우선순위가 높아서 문자와 숫자를 비교하게되면 문자쪽이 숫자로 변형되어 비교하게 되는 것이다.
따라서 위의 SQL은 OPTIMIZER는 아래와 같은 SQL로 수행하게된다.
EMP_ID를 TO_NUMBER(EMP_ID) = 2000393과 같이 처리하게 된다.
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE TO_NUMBER(EMP_ID) = 200383;
이는 처음 예제에서 날짜 컬럼에 TO_CHAR를 씌원것과 같은 효과이다. 따라서 이문제를 해결하기위해서는 반대쪽, 즉 2000293을 문자로 변환해주면 문자대 문자의 비교이므로 내부적 변형이 발생하지 않게된다.
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE EMP_ID = ‘200383’;
 
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=19)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMPLOYEES' (TABLE) (Cost=2 Card=1 Bytes=19)
2 1 INDEX (RANGE SCAN) OF 'PK_EMP_ID' (INDEX) (Cost=1 Card=1)
아래 SQL을 보자 JOB에 NULL인 조건을 검색하는 것이다.
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE JOB IS NULL
아래 SQL을 보자 JOB이 NULL인 조건을 검색하는 것이다.
물론 아래와 같은 JOB INDEX를 생성하였다.
CREATE INDEX IDX_JOB ON EMPLOYEES (JOB);
아래 PLAN을 보자 왜 IDX_JOB INDEX를 타지 못하는가?
Execution Plan
--------------------------------------------------------------------------------
0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=29 Card=3 Bytes=63)
1 0 TABLE ACCESS (FULL) OF 'EMPLOYEES' (TABLE) (Cost=29 Card=3 Bytes=63)
이경우에는 Oracle의 경우 일반적으로 index를 생성할 때 null값은 index항목에 넣지 않는다. 따라서 null은 index에 없기 때문에 null조건을 준다면 그것은 index를 탈수 없다.
따라서 위와 같은 경우 반드시 index를 타려거든 job컬럼을 NOT NULL로 설정하고 NUL대신 특정값 (예를 들면 : ‘NOT ASSIGN’ ) 으로 설정하고 QUERY를 아래와 같이 수정한다면 인덱스를 탈수 있을 것이다.
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE JOB = ‘NOT ASSIGN’;
아래 SQL를 하나 더 보자
SELECT LAST_NAME,FIRST_NAME
FROM EMPLOYEES
WHERE JOB NOT IN ( 'INSTRUCTOR','STAFF');
이번의 NULL을 비교한것도 아닌데 INDEX를 사용하지 못한다. 이것은 일반적인 INDEX가 =이나 <, > , BETWEEN조건에 만 인덱스를 탈수 있고 부정형으로 비교했을때는 인덱스를 탈수 없기때문이다.
생각해보자 어떤 것을 순서대로 정리해 놓았는데 그것이 아닌 것을 찾으려고 한다면 전체를 다 읽어봐야지만 아니것을 알수 있지 않은가?
따라서 가급적 프로그램 구성에서 부정형 조건이 들어가게 한다는 것은 성능을 저하시킬 가능성이 매우 높기 때문에 이런 조건이 되지 않도록 설계단설계부터 고려해야한다.

이상은 간단하게 INDEX를 주었을 때 일반적으로 INDEX를 타지 못하는 경우를 든것이다. 사실 위예 예처럼 실제 프로젝트에서 많은 부분이 INDEX를 생성하고도 OPTIMIZER의 특성을 몰라서 INDEX를 쓰지 못한채 APPLICATION이 돌고 있다. 이는 곧바로 자원의 과도 사용으로 나타나고 느린 응답시간으로 나타나게 된다. 항상 시스템을 OPEN하고 마음을 조리지 않으려면 내가 생성된 INDEX를 잘 탈수 있게 내가 SQL을 잘 작성했는지 검토해 보기 바란다.
아래 4개의 항목은 반드시 기억해 두기 바란다.
인덱스를 사용하지 못하는 경우는 아래와 같다.
  • 인덱스 컬럼에 변형이 일어난 경우
    • WHERE TO_CHAR(HIREDATE,'YYYYMMDD') = '19980518';
    • WHERE SALARY + 1000 > 100000;
  • 내부적인 변형이 일어난 경우
    • WHERE EMP_ID = 200383;
  • NULL을 비교하였을 경우
    • WHERE JOB IS NULL;
  • 부정형으로 조건을 기술한 경우
    • WHERE JOB NOT IN ( 'INSTRUCTOR','STAFF');

물론 이 경우 이외에 Optimizer의 판단에 따라서 인덱스를 사용하지 못하는 경우도 있다. 그러나 대부분의 경우에는 위에 항목을 만족한다면 원하는 index를 타는 효율적인 sql작성에 좋은 기준이 될것이다. 마지막으로 sql을 작성한후 반드시 plan을 확인해 보기 바란다.
실제 plan이 어떻게 되는냐를 확인해보지 않으면 무심코 과거의 실수를 답습할 수 있기때문이다

Posted by 1010
반응형

Process Explorer v11.33

By Mark Russinovich

Published: February 4, 2009

 Download Process Explorer (1.6 MB)

Introduction

Ever wondered which program has a particular file or directory open? Now you can find out. Process Explorer shows you information about which handles and DLLs processes have opened or loaded.

The Process Explorer display consists of two sub-windows. The top window always shows a list of the currently active processes, including the names of their owning accounts, whereas the information displayed in the bottom window depends on the mode that Process Explorer is in: if it is in handle mode you'll see the handles that the process selected in the top window has opened; if Process Explorer is in DLL mode you'll see the DLLs and memory-mapped files that the process has loaded. Process Explorer also has a powerful search capability that will quickly show you which processes have particular handles opened or DLLs loaded.

The unique capabilities of Process Explorer make it useful for tracking down DLL-version problems or handle leaks, and provide insight into the way Windows and applications work.


Download Process Explorer
(1.6 MB)


Run Process Explorer now from Live.Sysinternals.com


Posted by 1010
98..Etc/70.JEUS2009. 7. 10. 19:12
반응형

WebtoB + JEUS + web application

1. WebtoB 설치
1.1 설치파일, 라이센스(license.dat)준비
1.2 라이센스 적용 : webtoB4.1\license\license.dat
2. WebToB 실행
2.1 실행파일생성(wsconfig) --> 환경파일 컴파일 : wscfl -i [환경파일]
2.2 실행 : wsboot --> wsboot -w (handler가 process들을 확인하며 booting->안정적인 booting)
2.3 종료 : wsdown --> wsdown -i (질의를 던지지 않고 바로 down)
2.4 웹서비스 테스트 : http://127.0.0.1:8080/
3. WebToB 환경설정 파일 : sample.m
3.1 가상홍스트 추가하기
*VHOST
vhost1 DOCROOT="D:/TmaxSoft/edu01", HOSTNAME="test.tmax.co.kr",
NODENAME="Impression32", PORT="80"
3.2 윈도우의 hosts 파일에 등록하기
D:\WINDOWS\system32\drivers\etc\hosts 파일에 등록
3.3 환경파일 컴파일 : wscfl -i sample.m
3.4 기동중인 webtob 다운 후 재부팅 : wsdown -i / wsboot
3.5 테스트
NODE절 포트 수정 확인 :
http://127.0.0.1:80/
가상호스트 추가 확인 : http://test.tmax.co.kr:80/
4. WebtoB 관리 툴 : wdadmin
4.1 wi : 웹투비의 기본 정보 출력
4.2 ci : 접속한 클라이언트의 정보 출력
ci -s : 접속한 클라이언트의 수 출력
cfg : 웹투비의 환경설정 내용 확인
cfg -n : 노드 환경설정 내용 확인
si : 웹투비의 서비스 목록 출력
st -v : 웹투비의 서비스 상태 출력
st -p : 웹투비의 프로세스 상태 출력
repeat(r) : 웹투비의 명령을 반복적으로 수행하여 모니터링 효과를 냄
ex) r -i 2 -k 10 si
5. JEUS 설치
5.1 JEUS 설치파일, 라이센스
5.2 라이센스 적용 : D:\TmaxSoft\JEUS5.0\license\license파일적용
6. JEUS 실행
6.1 Two-step 부팅
: 서버실행 - jeus
: 엔진실행 - JEUS의 웹관리자
웹관리자주소 :
http://127.0.0.1:9744/webadmin
포트번호지정 : 기본Base port(9736) + 8
포트번호변경 : bin/jeus.properties.cmd
JEUS/config/vhost.xml 의 포트번호를 변경합니다.
웹관리자 계정 : administrator
패스워드 : jeusadmin
노드선택 --> 제어 --> 부트

6.2 One-step 부팅
: 부트명령(jboot.bat) --> jeus -xml -Uadministrator -Pjeusadmin
: 종료명령(jdown.bat) --> jeusadmin [노드명] -Uadministrator -Pjeusadmin jeusexit

6.3 JEUS 웹서비스 테스트
:
http://127.0.0.1:8088/
7. JEUS의 환경설정 파일
7.1 JEUS\config\JEUSMain.xml : JEUS서버 전체의 환경 설정
7.2 EJBMain.xml : EJB엔진에 대한 환경 설정
7.3 JMSMain.xml : JMS엔진에 대한 환경 설정
7.4 WEBMain.xml : Servlet엔진에 대한 환경 설정
web.xml : 웹의 컨텍스트를 만들때 컨텍스트의 환경설정
7.5 WSMain.xml : WS엔진에 대한 환경 설정
1. JEUS에서 web application 서비스하기
1.1 물리적 Context 생성
C:\tmaxsoft\edu01
|----WEB-INF
web.xml(NODE의 servlet engine에서 가져옴)
1.2 JEUS에 Context 등록
웹관리자 로그인 --> J2EE 어플리케이션 모듈배치 --> 절대경로
--> ~~~~ --> 배치(2단계배치[J2EE어플리케이션모듈], 영구배치[J2EE어플리케이션모듈배치])
1.3 서비스 실행
:테스트를 위한 jsp파일 생성(test.jsp)
:http://127.0.0.1:8088/edu01/test.jsp
8088 : http_listener port
edu01: 배치한 모듈명
test.jsp :
실습) edu02 컨텍스트 생성, 실행 웹 어플리케이션 파일 test02.jsp --> http://127.0.0.1:8088/edu02/test02.jsp
2. JEUS container 관리
2.1 생성 : 서블릿 엔진 생성(리스너ID, 리스너PORT 지정)
2.2 서블릿 엔진 테스트 --> http://127.0.0.1:8089/edu01/test.jsp
3. WebtoB와 JEUS연동하기
3.1 WebtoB 설정 : sample.m 파일에 추가
3.2 JEUS 설정 : 해당 컨테이너의 webtob 리스너 연결 설정
3.3 연동 설정 테스트 --> http://127.0.0.1:80/edu01/test.jsp
4. 실 습
WebtoB의 가상호스트 vhost1 과 JEUS의 container1에 webtob2 리스너 추가, 연동.
http://test.tmax.co.kr:80/edu01/test.jsp
4.1 WebtoB 설정 추가
4.2 JEUS container1에 webtob2 리스너 추가
5. JEUS에서 서블릿 실습
5.1 서블릿 코드 작성 : HelloWorldServlet.java
5.2 컴파일 : jeus.jar 파일 경로 지정후
javac -d . HelloWorldServlet.java
5.3 JEUS에서 실행 --> http://127.0.0.1:8088/edu01/servlets/HelloWorldServlet
web.xml 문서의 WorkServlet 은 /servlets/* 로 매핑되어 있음
1. WAR 파일 생성하기
1.1 패키징하기 : JeusBuilder 사용
- 파일명 : wartest.war
서블릿명 : Hello
서블릿 클래스 : tmax.HelloWorldServlet
URI 패턴지어 : /helloworld
Contextpath(url에서 context호출) : /hello
1.2 JEUS에 패키징한 모듈 배치하기
- JEUS 웹관리자 --> J2EE 어플리케이션 모듈 배치 --> 모듈배치 --> ~~~ --> 배치(2단계 배치, 영구배치)
http://1273.0.0.1:8088/Hello (/Context를 정의, /Context는 모듈에 하나존재)
1.4 실 습
파일명 : wartest2.war
서블릿명 : Hello2
서블릿 클래스 : tmax.HelloWorldServlet
URI 패턴지정 : /helloworld2/
Contextpath : /hello2
<결과확인>
http://127.0.0.1:8088/hello2/Hello2 , http://127.0.0.1:8088/hello2/helloworld2/
2. DB 연동
2.1 DataBase 정보 확인
- 서버 IP : 192.169.10.5
- 접속계정 : oracle/dkzkepal(아카데미)
- sql접속계정 : sqlplus edu01~edu32/edu01~edu32
- SID 명 : ORA10G
- 테이블 생성 : TmaxTest
create table TmaxTest ( name varchar(20), address varchar(20) );
- 데이터 입력 :
Insert into TmaxTest values('장동건','서울'); Insert into TmaxTest values('강호동','부산');
- commit;

2.2 드라이버 준비 및 JEUS 서버 등록
- JDBC 드라이버 : ojdbc14.zip
- 오라클 JDBC 드라이버 다운로드 사이트 :
http://www.oracle.com/global/kr
- JEUS 등록 : D:\TmaxSoft\JEUS5.0\lib\datasource\ojdbc14.jar
2.3 DataSource 설정
- JEUS 웹관리자 -> JEUS 매니저 리소스 -> JDBC -> 새 JDBC 데이터 소스 생성
2.4 실 습
로그인 실행 테스트 : MVC
login.jsp (presentation 로직 : View)
loginCheck.jsp (business 로직 : Control)
TmaxLogin (data : Model)
아이디 : tmax 비밀번호 : 1234
***************************************************************************************************************
*** webToB
***************************************************************************************************************
*VHOST
vhost11 DOCROOT="c:/xxx/webapps/test/",
NODENAME = "web1",
HOSTNAME = "test.com",
PORT = "80"
vhost12 DOCROOT="c:/xxx/webapps/test/",
NODENAME = "web1",
HOSTNAME = "www.test.com",
PORT = "80"

* SVRGROUP
vhost11g NODENAME = "web1", SVRTYPE = JSV,Vhostname="vhost11"
vhost12g NODENAME = "web1", SVRTYPE = JSV,Vhostname="vhost12"

* SERVER
test SVGNAME = vhost11g, MinProc = 20, MaxProc = 20, HttpInBufSize=0
wwwtest SVGNAME = vhost12g, MinProc = 20, MaxProc = 20, HttpInBufSize=0

***************************************************************************************************************
*** JEUS
***************************************************************************************************************
container.xml 에 두개의 contextgroup을 생성하여 각각의 RegistrationID 를 test, wwwtest 로 하여 연동
***************************************************************************************************************
웹모듈(application) 추가하기
1) %JEUS_HOME%\config\노드명\JEUSMain.xml 수정
- 아래내용 추가
<application>
<absolute-path>폴더위치</absolute-path>
<name>애플리케이션명</name>
<path>\</path>
<deployment-type>COMPONENT</deployment-type>
<web-component/>
<deployment-target>
<target>
<engine-container-name>컨테이너명</engine-container-name>
<web-context-group>
<name>MyGroup</name>
</web-context-group>
</target>
</deployment-target>
<classloading>ISOLATED</classloading>
<class-ftp-unit>JAR</class-ftp-unit>
</application>
2) JEUS 재시작
3) 해당폴더\WEB-INF/web.xml 생성 확인
4) 해당폴더\WEB-INF/jeus-web-dd.xml 생성 확인
<?xml version="1.0" encoding="UTF-8"?>
<jeus-web-dd xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
<context-path>/</context-path>
<enable-jsp>true</enable-jsp>
<auto-reload>
<enable-reload>false</enable-reload>
<check-on-demand>false</check-on-demand>
</auto-reload>
<max-instance-pool-size>-1</max-instance-pool-size>
<url-rewriting>false</url-rewriting>
<enable-default-login>false</enable-default-login>
<webinf-first>false</webinf-first>
<jndi-properties>
<local-bindings>false</local-bindings>
</jndi-properties>
</jeus-web-dd>
============================================================================================================
JDBC
*Class Loading : Class.forName();
->class를 사용하는 방법

*Connection 생성방법 2가지
-DBCP를 사용안함 (Driver class를 로드하여 DB에 접근)
public Connection connectDbms() {
Connection con = null;
Properties env = new Properties(); //사용자 환경변수 객체

try {
env.load(new FileInputStream("d:\\java\\day6\\db.properties"));
Class.forName(env.getProperty("driver")); // JDBC 드라이버용 클래스 로드
} catch (ClassNotFoundException e) {
e.printStackTrace();
return null;
}catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}

// 1. DB Connection 얻기
String url = env.getProperty("url");
//"jdbc:oracle:thin:@127.0.0.1:1521:ORCL"; // JDBC 전용 URL 형식으로 기술
// thin = type4(순수java)
String user = env.getProperty("user"); //"scott";
String password = env.getProperty("password"); //"tiger";

try {
con = java.sql.DriverManager.getConnection(url, user, password);
System.out.println("****** Connect to DBMS! *******");
} catch (SQLException e) {
e.printStackTrace();
return null;
}
return con;
}
-DBCP 사용 (server.xml, web.xml에 Container에 대한 코드 추가)
try{
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
ds = (DataSource)envCtx.lookup("jdbc/EmployeeDB");
}catch(NamingException ne){
ne.printStackTrace();
}
1. Servlet의 init()메소드에서 DataSource를 생성하여 인자로 넘겨 connection 가져오기
-Servlet 마다 DataSource 생성
2. ServletContextListener에서 한번만 생성하여 인자로 넘김
-DataSource 한번만 생성해도 됨(Servlet마다 DataSource를 생성하지 않음)
3. ServletContextListener에서 생성한 DataSource를 Single tone pattern으로 사용
-class에서도 single.getAttribute()로 DataSource를 얻어 올 수 있음

*statement
상속관계
Statement <---------- PreparedStatement <------------- CallableStatement
(가장 보편적인 처리) (binding 변수를 통해 빠를 sql처리) (가장 특화 function, procedure호출)
->Statement
String sql = "select age from test1 where id='syh1011'";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);

->PreparedStatement
String sql = "select age from test1 where ?=?";
PreparedStatement pstmt = con.prepareStatementStatement(sql);
pstmt.setString(1, "id");
pstmt.setString(2,"syh1011");
ResultSet rs = pstmt.executeQuery();
->CallableStatement
String sql = "select anem from salary";
PreparedStatement pstmt = conpreparedStatement(sql);
CallableStatement sctmt = con.prepareCall("{call adjust(?,?)}");
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
cstmt.setString(1, rs.getString("name"));
cstmt.setFloat(2, (float)0.05);
cstmt.executeUpdate();
}
executeQeury(String sql) : SQL문이 select일 경우
executeUpdate(String sql): SQL문이 insert, update, delete문 등일 경우
execute(String sql) : SQL문을 알지 못할 경우
->장점, 단점
*ResultSet, getXXX()로 Column값 얻기, Type별로 다른 method사용
getXXX(int columnindex) : columnIndex의 값을 XXX타입으로 반환
getXXX(String columnName): columnName의 값을 XXX타입으로 반환
*Transaction 처리
Transaction의 4가지 특성(ACID)
*원자성(Atomicity)
*일관성(Consistency)
*고립성(Isolation)
*지속성(Durability)
con.setAutoCommit(false); ->true : transaction을 시작하지 않겠다. ->false: transaction을 시작하겠다.
setAutoCommit(false)와 commit(), rollback()사이의 operation들에 대한 transaction 처리
-> con.commit(); -> con.rollback();
***********************************************************************************************************
#####
##### DOMAIN 절
#####
# 독립적인 WebtoB 시스템의 전반적인 환경 설정을 할 수 있다.
*DOMAIN
# 도메인 네임은 string 형식으로 31자까지 사용 가능.
# 다른 절들의 string 항목도 이와 동일하다.
webtob1

#####
##### NODE 절
#####
# WebtoB를 이루는 각 Node들에 대한 구체적인 환경 설정을 할 수 있다.
# 필수 항목으로 WebtobDir, ShmKey, DocRoot 항목을 설정해야 있다.
*NODE
# 실제 등록된 호스트의 이름을 말하며, UNIX의 경우 "uname -n" 명령으로 각 Host의 이름을 확인할 수 있다.
# Node명은 반드시 UNIX의 경우 "/etc/hosts"(Windows의 경우 C:\WINNT\system32\drivers\etc) 파일에 등록되어 있어야 한다.
# 하나의 Domain은 하나 이상의 Node로 이루어지므로, NODE절에는 최소한 하나 이상의 Node 이름이 정의되어야 한다.
WebServer
# WebtoB가 설치되어 있는 Home Directory 의 절대 경로명이다.
# 환경변수로 정의되는 WEBTOBDIR 과 동일한 값으로 설정하면 된다.
WebtobDir = "/data2/wbqam/webtob",
# Shared Memory Segment를 가리키는 값이다.
# 32768 ~ 262143 범위 내에서 다른 업무에 사용되는 키값과 충돌이 나지 않게 Shared Memory의 Key값을 설정 하면 된다.
ShmKey = 78100,
# WebtoB가 웹을 통해 서비스하는 모든 문서를 포함하는 Root Directory 의 절대 경로를 설정한다.
DocRoot="/data2/wbqam/webtob/docs",
# HTTP Request Handler) Process의 개수를 설정한다.
# Hth하나당 약 800개 이상의 Client를 수용할 수 있다.
# Default Number 설정은 1 이며, 최대 20개 까지 지정할 수 있다.
Hth = 2,
# WebtoB가 Listen하는 Port를 지정한다.
# 일반적으로 Web Server는 80 Port 이용하므로 설정하지 않을경우 default 값으로 80으로 설정된다.
# 최대 100개의 포트를 동시에 지정하여 사용할 수도 있다.
# Listen 항목과 동시에 운영할 수 없으며, Port보다 Listen항목에서 지정되는 Port가 우선순위가 높아
# 동시에 지정하면 Port항목은 무시 된다.
Port = "8100,8200",
##### User, Group 설정
# WebtoB에서 시스템의 보안을 위하여 WebtoB의 실제 실행 Process에 대한 권한 설정을 할 수 있다.
# 설정한 권한으로 Process가 실행되기 위해서는 반드시 root 권한으로 WebtoB를 실행해야 한다.
# 설정된 Group의 권한으로 WebtoB가 요구를 수행하게 된다.
# Client 요구를 수행하기 위하여 Group 설정을 권장한다.
# Group 설정은 Unix계열의 OS에서만 지원한다.
Group = "nobody",
# 설정된 User의 권한으로 WebtoB가 요구를 수행하게 된다.
# Client 요구를 수행하기 위하여 User 설정을 권장한다.
# User 설정은 Unix계열의 OS에서만 지원한다.
User = "nobody",
# 관리자의 정보를 나타낸다.
# 관리자에게 연락할 수 있는 e-mail address를 설정할 수 있다.
Admin = "wbqam@tmax.co.kr",
# Http Response Header의 host name field에 기록될 값을 설정할 수 있다.
HostName = "www.tmax.co.kr",
# 해당 서버의 HostName를 적어 준다.
# 특별히 $(NODENAME)이라고 적어주면, 자동으로 해당 서버의 HostName가 적용된다.
# 한글 노드명을 사용하거나 긴 노드명을 사용할 경우 NodeName 을 설정한다.
NodeName = "$(NODENAME)"
# MultiNode 설정시 각 Node들 간의 연결 Port 번호를 지정한다.
# MultiNode 설정시 반드시 지정해 주어야 한다.
# default 설정은 7777 번이다.
# NodePort = 7777,
# WebtoB와 Servlet 수행 Server간의 연결 Port 번호를 지정한다.
# default 설정은 9999 번이다.
JSVPort = 9100,
# Multi Node 구성시 Node 관리 차원에서 Node간 통신을 위한 Port번호를 지정한다.
# 위의 NodePort와는 달리 이것은 관리 Process 중 하나인 wsracd Daemon에서 사용하는 Port번호이다.
# default 설정은 3333 번이다.
RacPort = 4455,
# WebtoB는 Server 내부 Caching의 한 Entry의 크기로서 기본단위는 Kbyte이다.
# default size는 128 Kbyte 이다.
CacheSize = 128,
# Cache의 총 Hashing Key 엔트리 개수를 설정한다.
# default 개수는 128개 이다.
CacheEntry = 256,
# HTML file에 대한 cache refresh time을 설정한다.
# default 설정은 0 second 이다.
CacheRefreshHtml = 60,
# DirIndex에 대한 cache refresh time을 설정한다.
# default 설정은 0 second 이다.
CacheRefreshDir = 60,
# 사용자가 웹사이트에 접속한 후, 다른 웹페이지를 읽어 들이기 위해 곧 다시 접속을 시도 할 경우
# 불필요한 시간 지연이 없도록 하려면 이 항목을 지정함으로써 접속을 단절하지 않고 유지할 수 있다.
KeepAlive = Y,
# 커넥션 설정후 일정 개수의 요구는 커넥션을 유지한 상태로 서비스를 하고 커넥션을 끊도록 하는데,
# 커넥션을 끊기 전에 들어주는 요구의 개수를 지정한다.
# default 설정은 9999 이다.
KeepAliveMax = 10,
# 하나의 Client가 불필요하게 커넥션을 오래 잡고 있는 경우를 막기 위해
# 다음 Request 까지 일정 시간 이상이 되면 커넥션을 끊을 수 있도록 설정할 수 있다.
# default 설정은 60 second 이다.
KeepAliveTimeout = 30,
# 사용자의 최대 접속시간을 지정한다.
# default 설정은 300 second 이다.
Timeout = 100,
# WebtoB를 통해 사용자별로 동시에 서비스 하려는 경우 설정한다.
# 값이 설정이 되면 각 사용자의 directory를 찾아서 서비스 한다.
UserDir = "public_html",
# WebtoB를 통해 응용 프로그램을 바로 호출하는 경우 해당 프로그램이 위치할 디렉토리를 설정한다.
# 경로명은 절대 경로와 WEBTOBDIR을 기준으로 한 상대 경로를 사용할 수 있다.
AppDir = "/data2/wbqam/webtob/ap",
##### Log Directory
# WebtoB에서는 기본적으로 Log 정보를 남기기 위하여 설정한다.
# 환경파일에 따로 설정하지 않을경우 WEBTOBDIR/log 디렉토리에 기록이 된다.
# 로그가 기록될 디렉토리가 없을경우 booting시 에러가 나므로, 실제 존재하는 디렉토리여야 한다.
# 경로명은 절대 경로와 WEBTOBDIR을 기준으로 한 상대 경로를 사용할 수 있다.
# 시스템 메시지가 기록될 Directory의 경로명을 설정한다.
# Default Path는 (WEBTOBDIR)/log/syslog 이다.
SysLogDir = "/data2/wbqam/webtob/log/syslog",
# 사용자 메시지가 기록될 Directory의 경로명을 설정한다.
UsrLogDir = "/data2/wbqam/webtob/log/usrlog",
# Service Directory로 요청이 올대 기본적으로 서비스되는 파일 이름을 설정한다.
# 기본 설정은 index.html 이다.
IndexName = "indexname.html",
# Service Directory에 요구를 보낼 때의 동작을 지정한다.
# Options에 지정할수 있는 서비스와 기능들을 아래와 같다.
# Service: HTML, CGI, SSI, PHP, JSV
# Function: INDEX, INCLUDE
# 모든 기능을 이용하려면 "+ALL", 모든 기능을 이용하지 않으려면 "-ALL"을 설정할 수 있다.
Options = "+Index",
# Client가 보내는 Request Method에 대한 정의를 할 수 있다.
# HEAD, GET, POST, OPTIONS 등을 설정을 할 수 있으며, 사용하고 싶지 않을경우 "-Option" 으로 설정하면 된다.
# 참고로 HTTP Method CONNECT, DELETE, GET, HEAD, OPTIONS, POST, PUT, TRACE 등이 있다.
Method = "GET,POST,HEAD,-OPTIONS",
# 여러개의 IP Address를 가진 Server에서 자신이 원하는 IP로만 서비스 하기를 원할때 지정한다.
# 여러개의 아이피와 포트를 지정할 수도 있다.
# Port항목과 Listen 항목을 동시에 지정하는 경우 Port에 지정한 Port는 무시된다.
# Listen="192.168.1.43:8300",
# DIRINDEX절에서 설정하는 디렉토리 인덱스의 이름을 적어준다.
DirIndex = "diridx_def"
# 접속 Client가 사용 언어를 지정하지 않았을 경우
# Server쪽에서 지정된 언어 순서대로 Multiview request 등의 처리가 이루어지도록 한다.
LanguagePrio = "kr",
# LOGGING절에서 설정하는 Logging Name을 설정하며, 해당 설정에 해당하는 Log를 남기게 되는 것이다.
Logging = "log1",
# LOGGING절에서 설정하는 Logging Name을 설정하며, 해당 설정에 따라 Error Log를 남기게 된다.
ErrorLog = "log2",
# WebtoB에서 특정 정보를 읽어 들일 필요가 있는 경우 이용된다.
# EnvFile = "WebtoB.env",
# WebtoB에서 SSL을 이용할 때 Y 로 설정한다.
# default 설정은 N 이다.
# SslFlag = Y,
# SslFlag = Y 상태일때 적용이 되며, SSL절에 설정한 Ssl Name를 지정한다.
# SSLNAME = "ssl_def",
# 서버 프로세스에 속한 노드의 최대 동시 접속자 수를 설정한다.
MaxUser = 4000,
# WebtoB 내부 프로세스의 접근권한을 설정한다.
# Default 설정은 0700 이다.
# IpcPerm = 0744,
# 접속을 기다리는 큐(queue)의 길이를 제한하는 것으로,
# 서버가 대량의 접속 시도를 한꺼번에 날려주는 TCP SYN해킹을 당하고 있다면 유용하게 사용 될수 있을 것이다.
# default 설정은 511 이다.
ListenBacklog = 100,
# TCP 전송 Buffer의 크기를 설정하는 것으로, 이 항목을 이용하면 특정한 환경에서 동작 속도를 향상시킬 수 있다.
# default 설정은 0이며, 0의 값은 OS default값을 사용함을 의미한다.
SendBufferSize = 4096,
# 클라이언트의 요청시 HTTP 프로토콜을 통해 서버가 제공할 수 있는 Request Body 크기를 바이트 단위로 정의하는 것으로,
# 0의 값은 크기에 제한이 없음을 의미한다.
# default 설정은 0 bytes 이다.
LimitRequestBody = 20000,
# 클라이언트의 요청시 허용되는 HTTP Request header field의 수를 설정한다.
# 0의 값은 제한이 없음을 의미한다.
# default 설정은 100 이다.
LimitRequestFields = 20,
# 클라이언트의 요청시 허용되는 각 HTTP Request header field의 크기를 설정한다.
# 최대 허용되는 값은 8190이다.
# default 설정은 8190 bytes 이다.
LimitRequestFieldSize = 300,
# 클라이언트의 요청시 허용되는 HTTP Request line의 최대 크기를 설정한다.
# 최대 허용되는 값은 8190이다.
# default 설정은 8190 이다.
LimitRequestLine = 4000,
# HTTP 응답 헤더의 Server에 관한 정보를 어떻게 다룰지 결정한다.
# "Off", "Prod[uctOnly]", "Min[imal]", "OS", "Full", "Custom=xxx/x.x" 등을 설정할 수 있다.
ServerTokens = "Minimal",
# HTTP 요청으로부터 해당 Server와 Service를 결정할때, URI절과 EXT절의 우선순위를 결정한다.
# Vhost절에 이 항목이 설정되지 않은 경우는 Node절에 설정된 값이나 기본값을 Vhost가 따르게 된다.
# default 설정은 "uri,ext" 이다.
ServiceOrder = "ext,uri",
# HTTP header의 Content-Type에 character set 설정이 없는 Request에 응답에 추가될 character set의 이름을 설정한다.
# "On"(ISO-8859-1), "Off"(설정안함), "_charset_"(사용자 기술) 중 하나를 설정할 수 있다.
# 여러 절에서 적용되는 우선 순위는 Node < Vhost < SvrGroup < Directory 순이다.
DefaultCharset = "Off",
# MIME-Type을 결정할 수 없는 문서의 Default Content-Type을 설정한다.
# Default Content-Type은 SvrGroup, Vhost, Node절의 순으로 결정된다
DefaultMimetype = "text/html",
# Web Server에서 내부 프로세스간 IPC통신을 하기 위해서 기본적으로 특정 포트(6666)를 사용하는데,
# IPCBasePort항목을 통해 해당 포트를 변경할 수 있다.
# 현재 Windows에서만 지원된다. (UNIX의 경우 PIPE통신)
# default 설정은 6666 이다.
# IpcBasePort = 6667,
# EXPIRES절의 설정한 Expires이름을 설정한다.
Expires = "exp11, exp12, expdef1",
# TCPGW 절에 설정한 tcpgw 이름을 설정한다.
TcpGW = "tcpgw_full",
# ERRORDOCUMENT절에 설정한 ErrorDocument 이름을 설정한다.
ErrorDocument = "404",
# WebtoB 내부 프로세스 통신을 위한 socket생성 디렉토리를 설정한다.
# default 설정은 $WEBTOBDIR/path 이다.
PathDir="/data2/wbqam/webtob/path",
##### 멀티노드 구성시 아래와 같이 추가적으로 노드를 정의한다.
#tmaxi1
# WEBTOBDIR="/data/wbqam/webtob",
# SHMKEY = 78100,
# DOCROOT="/data/wbqam/webtob/docs",
# APPDIR="/data/wbqam/webtob/ap",
# PORT = "8100",
# HTH = 2,
# LOGGING = "log5",
# ERRORLOG = "log6",
# HostName = "www.tmax.co.kr",
# RACPORT = 4455,
# NodePort = 7787
**********************************************************************************************************
1. WebToB의 가상호스트 설정
1.1 환경설정파일(sample.m)을 추가, 컴파일
*VHOST
vhost1 HostName="test.tmax.co.kr",
DOCROOT="C:/TmaxSoft/edu02", # 웹서비스 파일 위치 지정
NODENAME="respect04",
PORT="80", # URL 이름이 같은 경우 포스번호를 다르게 설정해야 함. 현재는 호스트네이임이 다르므로 포스번호가 같아도 상관없다
IndexName="test.html", # Wellcome page 설정
KeepAlive=Y, # KeepAlive와 KeepAliveTimeout은 같이 사용해야 함(set 구성)
KeepAliveTimeout=30

1.2 윈도우 hosts 파일에 가상호스트 설정 (실제 서비스할 경우 DNS서버에 추가)
(C:\WINDOWS\system32\drivers\etc\hosts)
추가 => 127.0.0.1 test.tmax.co.kr
1.3 기동 후 테스트
1) sample.m 컴파일(wscfl -i sample.m)
2) ws 재기동
3) C:/TmaxSoft/edu02에 test.html 추가
4) 웹에서 test.html 확인 url=http://test.tmax.co.kr
# 알아둡시다
- sample.m에서 정의된 *NODE는 localhost(127.0.0.1)이다.
- sample.m에서 정의되지 않은 기본설정 확인은 wsadmin에서 cfg명령어로 확인한다
cfg -n : Node 환경설정
cfg -vh : vhost 환경설정 (sample.m에 *VHOST가 정의 되었을 때만 사용)
- 기본설정을 변경할 경우 cfg에서 보여진 명령어를 sample.m에 재정의한다
- DOCROOT의 디렉토리 구분은 ''이 아니라 '/'로 구분한다
2. WebToB의 가상호스트와 JEUS연동설정
2.1 가상호스트를 인식 시키기 위한 WebToB설정
sample.m에 정의
*SVRGROUP
v_jsvg NODENAME = "respect04", SVRTYPE = JSV, VHOSTNAME="vhost1" #가상호스트에서 인식
*SERVER #컨테이너 그룹명과 연동정의 및 몇개의 프로세스 사용할 것인가 정의
v_MyGroup SVGNAME = v_jsvg, MinProc = 10, MaxProc = 20 # 가상호스트 MyGroup
2.2 JEUS 설정
2.2.1 웹관리자 이용 시
1) 새 웹 리스너 생성
경로 : 서블릿엔진 - MyGroup - 웹리스너
2) 설정
- Listener Id : alias 명
- PORT : 기존 webtob 포트번호와 다르게 설정
- 스레드풀 : max, min은 sample.m *SERVER에서 정의한 내용과 동일하게 처리
- Webtob Address : 해당 Listener와 연결되는 WebtoB서버의 IP어드레스
- Registration Id : sample.m *SERVER에서 정의한 그룹ID
- Webtob Home : C:\TmaxSoft\WebtoB4.1 => webtob가 설치되어 있는 home 디렉토리
2.2.2 서블릿 WEBMain.xml 정의
<webtob-listener>
<listener-id>v_webtob1</listener-id>
<port>9901</port>
<thread-pool>
<min>10</min>
<max>20</max>
</thread-pool>
<scheme>http</scheme>
<registration-id>v_MyGroup</registration-id>
<webtob-home>C:\TmaxSoft\WebtoB4.1</webtob-home>
</webtob-listener>

3. 컨테이너 추가 (웹관리자) 후 WebToB 연동
3.1 새 엔진 컨테이너 생성
- Name : container3
- ID, BasePort
- 서블릿 엔진 : engine2
- 리스너 ID/서버 채널 이름 : http2 (#http 리스너를 반드시 추가하세요.)
- 리스너/서버 채널 포트 : 8087
3.2 새 어플리케이션 모듈 배치 - 모듈 선택
- 2단계 배치
- 영구배치는 J2EE 어플리케이션 모듈 배치에서 영구배치를 클릭 시
에디터아이콘을 선택하여 영구 모듈 디플로이 컨테이너대상을 설정
3.3 추가한 컨테인너 서블릿 WEBMain.xml 정의
<?xml version="1.0" encoding="UTF-8"?>
<web-container xmlns="http://www.tmaxsoft.com/xml/ns/jeus">
<context-group>
<group-name>MyGroup</group-name>
<webserver-connection>
<http-listener>
<listener-id>http2</listener-id>
<port>8087</port>
<output-buffer-size>8192</output-buffer-size>
<thread-pool>
<min>10</min>
<max>20</max>
</thread-pool>
</http-listener>
<webtob-listener>
<listener-id>v_webtob1</listener-id>
<port>9901</port>
<thread-pool>
<min>10</min>
<max>20</max>
</thread-pool>
<scheme>http</scheme>
<registration-id>v_MyGroup</registration-id>
<webtob-home>C:\TmaxSoft\WebtoB4.1</webtob-home>
</webtob-listener>
</webserver-connection>
</context-group>
</web-container>

4. 서블릿 작성/실행하기
4.1 HelloWorldServlet.java 작성
==============================================================================
package tmax;
import! java.io.*;
import! javax.servlet.*;
import! javax.servlet.http.*;
public class HelloWorldServlet extends HttpServlet
{
protected void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException,
java.io.IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hellow World Sample</title>");
out.println("</head>");
out.println("<body>");
out.println("<center><h1>Hello World!!!</h1></center>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
================================================================================
4.2 컴파일
C:\TmaxSoft\edu01\WEB-INF\classes>javac -d . H*.java
4.3 실행
http://127.0.0.1:8088/edu01/servlets/tmax/HelloWorldServlet

4.4. web.xml에 서블릿명 추가(HelloWorld)
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>tmax.HelloWorldServlet</servlet-class>
<load-on-startup>-1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/helloworld/</url-pattern>
</servlet-mapping>
4.5 실행
http://127.0.0.1:8088/edu01/HelloWorld

5. WebToB에서 서블릿을 실행하기 위한 url 설정
5.1 sample.m 파일 수정
*URI
uri2 Uri = "/edu01/", Svrtype = JSV #url에 edu01이 들어간 문자는 서블릿을 실행하게 한다
5.2 실행
Posted by 1010
98..Etc/70.JEUS2009. 7. 10. 18:35
반응형




1. WebtoB윈도우 서비스 등록

명령프롬프트 창에서
cd %WEBTOB_HOME%\bin
srvinstall



2. WebtoB윈도우 서비스 제거
먼저 로드되어 있는 webtob를 down한다.
srvremove



3. jeus윈도우 서비스 등록
%JEUS_HOME%\bin\jeus.ini 파일의 내용을 확인한 후

명령프롬프트 창에서
cd %JEUS_HOME%\bin
svcinstall jeus.ini administrator PASSWORD -hotspot



4. jeus윈도우 서비스 제거
먼저 로드되어 있는 jeus를 down한다.
svcremove -list 해서 먼저 현재 운영중인 서비스를 확인한 다음
svcremove jeus(:서비스명)


hanho9@gmail.com

Posted by 1010
98..Etc/70.JEUS2009. 7. 10. 18:25
반응형
- Windows 에서 WebtoB, JEUS의 서비스 등록 -
 
 
- jboot.bat(Jeus Start 배치)
  C:\>jeus -xml -Uadministrator  -P3gcorecom
 
- jdown.bat(Jeus Shutdown 배치)
  C:\>jeusadmin  'hostname'  jeusexit  -Uadministrator  -P3gcorecom
 
 
<WebtoB 등록하기>
 
1.      서비스 등록을 위한 환경
 
Windows의 Edition별 서비스 등록 가능 여부
 
WebtoB 3.1.5
WebtoB 3.1.6
Windows NT
O
O
Windows 2000
O
O
Windows XP
O
O
Windows 2003
O
O
 
             WebtoB의 버젼별 서비스 등록을 위한 파일
WebtoB 3.1.5
WebtoB 3.1.6
Description
srvinstall.exe
svcinstall.exe
서비스 등록(설치)
srvloader.exe
svcloader.exe
서비스에서 WebtoB 구동
srvremove.exe
svcremove.exe
서비스 제거
 
2.      Windows Platform에서 WebtoB의 서비스 등록
 
1. WebtoB 설치
 - 인스톨 과정을 거쳐 설치
 
2. System 환경변수에 WEBTOBDIR 추가
 - 시스템 속성 > 고급 > 환경변수 > 시스템 변수 에 WebtoB Home Directory 추가
 
3. > cd %WEBTOBDIR%\bin
 - WebtoB 의 실행파일들이 있는 디렉토리로 이동
 
4. > svcinstall.exe %WEBTOBDIR%
 - Windows 에서 WebtoB의 서비스 등록
 
3.      Windows Platform에서 WebtoB의 서비스 등록 확인
 
1. Process 확인
 - 작업관리자에서 wsm, hth, htl 프로제스가 보인다.
 
2. Port 확인
 - netstat –na 에서 80 Port에서 LISTENING하는지 확인
Proto  Local Address          Foreign Address        State
TCP    0.0.0.0:80                  0.0.0.0:0                 LISTENING
 
3. wsadmin tool 확인
 - wsadmin으로 console tool에 들어가서 st –s 명령어로 서비스가 정상적으로 등록되어
 있는지 확인
 
4.      Windows Platform에서 WebtoB의 서비스 제거
 
1. > cd %WEBTOBDIR%\bin
 - WebtoB 실행 파일들이 있는 디렉토리로 이동
 
2. > svcremove.exe
 - Windows 에서 WebtoB 서비스 제거
 
<JEUS 등록하기>
 
1.      서비스 등록을 위한 환경
 
Windows의 Edition별 서비스 등록 가능 여부
 
JEUS 4.2
Windows NT
O
Windows 2000
O
Windows XP
O
Windows 2003
O
 
             WebtoB의 버젼별 서비스 등록을 위한 파일
JEUS 4.2
Description
svcinstall.exe
서비스 등록(설치)
jeusloader.exe
서비스에서 WebtoB 구동
svcremove.exe
서비스 제거
 
2.      Windows Platform에서 JEUS의 서비스 등록
 
1. JEUS 설치
 - 인스톨 과정을 거쳐 설치
 
2. System 환경변수에 JDK_HOME 추가
 - 시스템 속성 > 고급 > 환경변수 > 시스템 변수 에 J2SDK Home Directory 추가
 
3. > cd %JEUS_HOME%\bin
 - JEUS 의 실행파일들이 있는 디렉토리로 이동
 
4. >svcinstall.exe  administrator    jeusadmin      -h
                              <username>    <password>
 - Windows 에서 JEUS의 서비스 등록
 
3.      Windows Platform에서 JEUS의 서비스 등록 확인
 
1. Process 확인
 - 작업관리자에서 java 프로제스가 2개 보여야 한다.
 
2. Port 확인
 - netstat –na 에서 BASE Port에서 LISTENING하는지 확인 (default : 9736)
Proto  Local Address          Foreign Address        State
TCP    0.0.0.0:9736            0.0.0.0:0              LISTENING
 
3. jeusadmin tool 확인
 - jeusadmin으로 console tool에 들어가서 allenglist 명령어로 서비스가 정상적으로 등록되어
 있는지 확인
 
4.      Windows Platform에서 JEUS의 서비스 제거
 
1. > cd %JEUS_HOME%\bin
 - JEUS 실행 파일들이 있는 디렉토리로 이동
 
2. > svcremove.exe
 - Windows 에서 JEUS 서비스 제거
Posted by 1010
반응형
Posted by 1010