'Root'에 해당되는 글 472건

  1. 2008.06.20 [Test 과정] Test 과정 Workshop이 드디어 끝나다.
  2. 2008.06.13 [Memory leak] Oracle의 OCI를 사용할 때 C Heap 과 관련된 OutOfMemoryError가 발생할 때
  3. 2008.06.04 [Java Basic] 자바 주석 (자바 코멘트) 관련 문서
  4. 2008.06.02 有口無言
  5. 2008.05.30 [Javascript] 자바 스크립트 객체 및 메소드 레퍼런스 사이트
  6. 2008.05.27 [Trouble Shooting] MS 문제 해결 클리닉
  7. 2008.05.15 [Java Basic] Regular Expression (정규식, 정규 표현식)의 형식
  8. 2008.05.14 [Java Basic] Regular Expression (정규식, 정규 표현식)의 기본
  9. 2008.04.30 [공지] 간만에 바람좀 쐬고 왔습니다.
  10. 2008.04.28 [Blog2Book] 자바 성능을 결정 짓는 코딩 습관과 튜닝 이야기 책에 대한 다양한 이야기들 1
  11. 2008.04.16 [Access Log 분석] Access log (웹 로그) 분석 툴
  12. 2008.04.16 [Good Article] C++로 돌아가는 자바를 읽고
  13. 2008.04.11 [Google Android-구글 안드로이드] 본격적으로 만들어 보기-5 Activity 추가하기~~~
  14. 2008.04.08 [Jennifer-제니퍼] 제니퍼 초 간단 사용법 1 - 제니퍼 설치하기
  15. 2008.04.02 [Spring] 초간단 Spring MVC 구현하기
  16. 2008.04.02 [Spring] Spring MVC에 대한 기초중의 기초
  17. 2008.04.02 [eclipse 팁] 이클립스의 신기한 기능
  18. 2008.04.01 [링크] 자바의 어노테이션 (Annotation)
  19. 2008.04.01 [Spring] AspectJ 에서의 Point cut (포인트 컷) 언어 정리
  20. 2008.04.01 [Spring] AOP 의 Proxy를 보다 쉽게 이해하기 위한 Proxy 패턴 예제
  21. 2008.04.01 [Spring] AOP(Aspect Oriented Programming) 란?
  22. 2008.03.31 [Spring] BeanFactory 와 ApplicationContext
  23. 2008.03.31 [Spring] Spring Framework의 scope
  24. 2008.03.31 [Spring] IoC와 DL과 DI
  25. 2008.03.31 [공지] Blog2Book 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기 책이 나온지도 한달이 되었네요.
  26. 2008.03.31 [eclipse] eclipse를 시작할때 JVM terminated exit code=-1 이 뜨면서 제대로 시작이 되지 않을때
  27. 2008.03.31 [Spring] Spring Framework (스프링 프레임웍) 이란?
  28. 2008.03.31 [Spring] Spring Framework의 등장배경
  29. 2008.03.28 [DevPartner] 메모리 프로파일링 하기
  30. 2008.03.27 [DevPartner] 성능 프로파일링 하기
2주동안 열나 고생항 워크샵이 끝났다.

영어로 작성해야 하는 문서들과 프리젠테이션... 정말 지겨웠다.

그래도 어학연수 갔다온 덕은 톡톡히 본것 같다.

점심마다 Rex Black 아저씨를 챙겨주는게 쉽진 않았지만,
뭐 영어 학원 다닌다는 느낌으로 1주일간 점심을 먹은거 같다. ㅋㅋ

렉스 아저씨에 대한 느낌을 간단히 적어보면...
농담도 많이하고,
키도 크고, (197 ...)
절대 이기려고 하면 안되는... 특히 이론적인 부분을 이야기 할 경우에느...
모든 것을 그냥 넘어가면 안되고, 반드시 근거를 대야 하는,
그리고 열나 바쁜 아저씨다.

쌓이 메일이 150통이라서 커피 마실 시간도 없단다.
(내 gmail에 쌓이는 spam보다 많다. - -);

여하튼 좋은 기회였다.

이제 남은건 다음주 월요일 저녁에 보는 시험을 패스하는 것 !!!
(걱정이다~~~)

Posted by tuning-java
,

http://www.jennifersoft.com/46/forum/page/3/show/1130.html

메모리 릭을 발생시키는 원인은 무척 많지만,
Oracle의 OCI를 사용할때 C Heap이 계속 누적되어 OutOfMemoryError가 발생할 수 있다고 한다.

데이터 건수가 적을때는 조금씩 쌓여도 간에 기별도 안가겠지만,
화면에서 제대로 처리하지 못하고 3만, 10만건을 조회하다가 오류가 발생하면 이러한 문제가 발생할 수도 있다.


 

Posted by tuning-java
,
http://java.sun.com/j2se/javadoc/writingdoccomments/

자바로 개발하다 보면, 주석을 잘 정리하지 않는 경우가 있는데
-나중에 내가 이 메소드를 왜 만들었는지,
-무슨 역할을 하는 클래스인지
를 기억 못하는 경우가 종종 있다.

그리고 추후에 Java doc 문서를 만들때 필요한 요소들을 모르면 제대로 된 문서가 생성되지 않는다.

위에 있는 링크를 참조하여, 반드시 자신의 클래스에 주석을 다는 버릇을 들이자.
특히 이 버릇은 정말 고치기 힘들다.

참고로 eclipse에서는 comment를 달기 위해서 해당 메소드나 클래스의 블록 안에서 Alt+Shift+J 를 누르면, 기본적인 주석이 생성된다.

public class A {
  //지점 1
  public void methodB () {
    //지점 2
  }
}

즉 지점 1에서 단축키를 누르면 클래스의 주석이 자동 생성되고,
지점 2에서 단축키를 누르면 메소드의 주석이 자동 생성된다.
Posted by tuning-java
,

有口無言.

Posted by tuning-java
,
http://msdn.microsoft.com/en-us/library/ms533050(vs.85).aspx

이 링크가 언제 변경될지는 모르겠지만...

모든 Explorer에서 사용되는 자바스크립트의 객체 및 메소드의 레퍼런스가 포함되어 있다.
Posted by tuning-java
,
http://www.microsoft.com/korea/technet/support/default.mspx

이메일을 좀처럼 보지 않는데, 오늘따라 눈에 띄는 메일이 있어서 열어보았다.

문제해결과 관련된 방법론까지 있다니... - -;

이런게 있으면 도움이 되긴 하겠지만,
정말 저 방법들을 모두 따를까 ?

관련 동영상들도 있는데, 나중에 시간나면 봐야겠다.

(시간이 날지 모르겠지만...)
Posted by tuning-java
,

자바 API에 있는 java.util.regex 패키지의 Pattern 클래스를 보면 정규식을 표현하는 Construct가 나와 있다.
http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html

아래 내용은 Java JDK에 있는 내용을 재 정리 한것이다. (시간이 되면 번역을 할까 생각중인데, 궂이 그럴필요가...)

가장 먼저 특수 문자에 대해서 알아보자. 각각의 8진수, 16진수, tab, 이스케이프 문자등을 나타내기 위해서는 다음과 같이 사용하면 된다.

x The character x
\\ The backslash character
\0n The character with octal value 0n (0 <= n <= 7)
\0nn The character with octal value 0nn (0 <= n <= 7)
\0mnn The character with octal value 0mnn (0 <= m <= 3, 0 <= n <= 7)
\xhh The character with hexadecimal value 0xhh
\uhhhh The character with hexadecimal value 0xhhhh
\t The tab character ('\u0009')
\n The newline (line feed) character ('\u000A')
\r The carriage-return character ('\u000D')
\f The form-feed character ('\u000C')
\a The alert (bell) character ('\u0007')
\e The escape character ('\u001B')
\cx The control character corresponding to x

그 다음에는 문자를 표현하는 방식을 보자. 특정 범위의 문자나 범위 이외의 문자는 다음과 같이 표시한다.

[abc] a, b, or c (simple class)
[^abc] Any character except a, b, or c (negation)
[a-zA-Z] a through z or A through Z, inclusive (range)
[a-d[m-p]] a through d, or m through p: [a-dm-p] (union)
[a-z&&[def]] d, e, or f (intersection)
[a-z&&[^bc]] a through z, except for b and c: [ad-z] (subtraction)
[a-z&&[^m-p]] a through z, and not m through p: [a-lq-z](subtraction)

위의  방식을 사용하여 정의할 수도 있겠지만, 다음과 같이 미리 정의된 문자열을 사용하면 보다 편하게 사용 가능하다.

. Any character (may or may not match line terminators)
\d A digit: [0-9]
\D A non-digit: [^0-9]
\s A whitespace character: [ \t\n\x0B\f\r]
\S A non-whitespace character: [^\s]
\w A word character: [a-zA-Z_0-9]
\W A non-word character: [^\w]

그리고, POSIX 문자열을 사용할 경우에는 다음과 같이 정의할 수 있다.
(참고로 POSIX가 뭔지 모르시는 분은 http://ko.wikipedia.org/wiki/POSIX 를 참조하시면 쉽게 이해 될것이다.)

\p{Lower} A lower-case alphabetic character: [a-z]
\p{Upper} An upper-case alphabetic character:[A-Z]
\p{ASCII} All ASCII:[\x00-\x7F]
\p{Alpha} An alphabetic character:[\p{Lower}\p{Upper}]
\p{Digit} A decimal digit: [0-9]
\p{Alnum} An alphanumeric character:[\p{Alpha}\p{Digit}]
\p{Punct} Punctuation: One of !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} A visible character: [\p{Alnum}\p{Punct}]
\p{Print} A printable character: [\p{Graph}\x20]
\p{Blank} A space or a tab: [ \t]
\p{Cntrl} A control character: [\x00-\x1F\x7F]
\p{XDigit} A hexadecimal digit: [0-9a-fA-F]
\p{Space} A whitespace character: [ \t\n\x0B\f\r]

자바의 Character 클래스와 같은 방식으로 사용하려면 다음과 같이 사용 가능하다.

\p{javaLowerCase} Equivalent to java.lang.Character.isLowerCase()
\p{javaUpperCase} Equivalent to java.lang.Character.isUpperCase()
\p{javaWhitespace} Equivalent to java.lang.Character.isWhitespace()
\p{javaMirrored} Equivalent to java.lang.Character.isMirrored()

유니코드를 처리하기 위해서는 다음과 같이 사용하면 된다. (한글에 대해서는 아직 테스트 해보지 않았다. ^^)

\p{InGreek} A character in the Greek block (simple block)
\p{Lu} An uppercase letter (simple category)
\p{Sc} A currency symbol
\P{InGreek} Any character except one in the Greek block (negation)
[\p{L}&&[^\p{Lu}]]  Any letter except an uppercase letter (subtraction)

각 경계값을 나타내는 것은 다음과 같이 할 수 있다.

^ The beginning of a line
$ The end of a line
\b A word boundary
\B A non-word boundary
\A The beginning of the input
\G The end of the previous match
\Z The end of the input but for the final terminator, if any
\z The end of the input

이제부터 정신을 바짝 차려야 하는데, 위의 각 방법을 조합해서 각 문자의 횟수를 다음과 같이 지정할 수 있다.
(이를 Greedy quantifiers라고 부른다.)

X? X, once or not at all
X* X, zero or more times
X+ X, one or more times
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m times

그리고, ? 와 +를 사용하여 각각 제외 및 포함의 의미를 나타낸다. 각 예는 다음과 같다.

Reluctant quantifiers
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}? X, exactly n times
X{n,}? X, at least n times
X{n,m}? X, at least n but not more than m times

Possessive quantifiers
X?+ X, once or not at all
X*+ X, zero or more times
X++ X, one or more times
X{n}+ X, exactly n times
X{n,}+ X, at least n times
X{n,m}+ X, at least n but not more than m times

논리 부분은 다음과 같이 표시한다.

XY X followed by Y
X|Y Either X or Y
(X) X, as a capturing group

특수 Construct는 다음과 같다.

(?:X) X, as a non-capturing group
(?idmsux-idmsux)  Nothing, but turns match flags i d m s u x on - off
(?idmsux-idmsux:X)   X, as a non-capturing group with the given flags i d m s u x on - off
(?=X) X, via zero-width positive lookahead
(?!X) X, via zero-width negative lookahead
(?<=X) X, via zero-width positive lookbehind
(?<!X) X, via zero-width negative lookbehind
(?>X) X, as an independent, non-capturing group

기타 관련 Construct들은 다음과 같다.

Back references
\n Whatever the nth capturing group matched

Quotation
\ Nothing, but quotes the following character
\Q Nothing, but quotes all characters until \E
\E Nothing, but ends quoting started by \Q

이 내용들에 대해서는 한번 쭉~~~ 읽어보면 이해가 되겠지만, 예제를 봐야지만 보다 더 쉽게 이해할 수 있으리라 생각된다.

다음 글에는 예제를 통해서 각 Regular Expression을 어떻게 사용하는지 정리하도록 하겠다.

Posted by tuning-java
,

String 데이터를 처리하기 위한 코딩을 할 때 알아두면 굉장히 도움 되는 것이 Regular Expression이다.

이게 뭔지도 모르신다면, 아래의 링크를 따라가서 한번 읽어 보시기를 권장한다.

http://java.sun.com/docs/books/tutorial/essential/regex/index.html

예를 들어 e-mail 주소나 URL의 정합성을 체크할 때 굉장히 편하게 사용할 수 있다.
Regular Expression을 주로 사용하는 언어들은 grep, Perl, Tcl, Python, PHP, awk 등이 있다.

Java 에서도 JDK 1.4 버젼부터 Regular Expression을 사용하기 시작했으며, java.util.regex.Pattern 클래스의 API 를 보면 Regular Expression에서 사용되는 패턴 구성을 볼 수 있다.

참고로,이미 만들어진 Regular Expression 들을 참조하고 싶다면, 아래의 사이트를 방문하기 바란다.
http://regexlib.com/

그럼 간단하게 Java를 이용해서 Regular Expression을 사용하는 방법에 대해서 알아보자.

import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexTester {

    public static void main(String[] args){
        RegexTester rt=new RegexTester();
        while(true) {
            rt.checkRegularExpression();
        }
    }
    public void checkRegularExpression() {       
        Scanner sc=new Scanner(System.in);
        System.out.print("Enter Regular expression pattern : ");
        String regex=sc.nextLine();
        while(check(regex));
    }
    public boolean check(String regex) {
        Scanner sc=new Scanner(System.in);
        System.out.print("Enter data: ");
        String data=sc.nextLine();
            Pattern samplePattern = Pattern.compile(regex);
            Matcher matcher = samplePattern.matcher(data);
            boolean found = false;
            while (matcher.find()) {
                System.out.format("Text \"%s\" is found : from index %d - to index %d.\n",
                    matcher.group(), matcher.start(), matcher.end());
                found = true;
            }
            if(!found){
                System.out.format("No match found.\n");
            }
            System.out.print("Check another data ? [Y or y] or Quit [Q or q] : ");
            String another=sc.nextLine();
            if(another.equals("Q") || another.equals("q")) {
                System.exit(0);
                return false;
            } else if(another.equals("Y") || another.equals("y")) {
                return true;
            } else {
                return false;
            }
    }

}

이 프로그램은 Regular Expression을 입력하고, 문자열을 입력하면 입력된 문자열중 Regular Expression과 맞는 (match되는) 문자열이 어떤것이 있는지를 화면에 뿌려준다.

실행 결과 예는 다음과 같다.

Enter Regular expression pattern : [abc]
Enter data: abcdefg
Text "a" is found : from index 0 - to index 1.
Text "b" is found : from index 1 - to index 2.
Text "c" is found : from index 2 - to index 3.
Check another data ? [Y or y] or Quit [Q or q] : y
Enter data:
No match found.
Check another data ? [Y or y] or Quit [Q or q] : y
Enter data: cbfhgft
Text "c" is found : from index 0 - to index 1.
Text "b" is found : from index 1 - to index 2.
Check another data ? [Y or y] or Quit [Q or q] : q

다음 글에는 Regular Expression을 어떻게 지정하는지 알아보자.

Posted by tuning-java
,
사용자 삽입 이미지

휴가 갔다오니 그새에도 책이 많이 팔렸더군요.
여러 의견들이 있지만, 겸허히 받아 들여야죠.
누구나 바라보는 View가 다르고, 완벽한 책은 없으니...

이제 날씨도 좋아졌는데, 시간적, 경제적 여유가 조금이라도 있으면,
나들이좀 갔다 오세요.
저도 바람 한번 쐬고 오니 좋더군요.


사용자 삽입 이미지

Posted by tuning-java
,

책이 나온지 거의 두달 되어가니 여러분들의 이야기들이 블로그에 올라와 있다.

좋은 리뷰도 있고, 좋지 않은 리뷰도 있네요. 모든 의견이 중요하다고 생각합니다.

단지, 이 책에서 부족하다고 생각들 하시는 튜닝의 기법이라든지, 툴에 대한 자세한 내용은 다음 책을 위해서 아껴 두었다고 너그럽게 생각해 주시면 감사하겠습니다.

이 책을 사려는 분들이나, 다양한 의견을 공유하시려는 분들은 아래의 링크를 클릭해 보시면 됩니다. ^^;

<<<<< Yes24 사이트의 주옥같은 리뷰들 보기 >>>>>

최종 update date : 2008. 05. 10.

Posted by tuning-java
,

전에 IIS 기반의 서버 로그를 분석하기 위한 Log Parser에 대해서 아주~~ 간단히 정리를 해 놓았었다.

Access log가 뭐고, 어떤 데이터가 있는지에 대해서는 제 책에 자세히 정리해 놓았으니 그 부분을 참조하시기 바랍니다.

그럼 이 Access log들을 어떻게 분석해야 할까?

보통 웬만큼 사용자가 있다는 사이트의 웹 로그는 1Gb가 넘는다. 그 1Gb가 넘는 데이터를 일일이 수작업으로 분석하기엔 너무 힘들다. (불가능하다.)

나는 필요한 데이터를 뽑아내기 위해서 로그 분석기를 직접 만들었는데, 그 분석기는 특정 데이터만 분석하기 때문에 다른 분들이 사용하기에는 적합하지 않아 여기에 올리진 않겠다. 그럼 어떤 분석 프로그램들이 있을까 ? 아래의 링크를 따라가 보면 여러 종류의 웹 로그 분석 툴의 목록을 볼 수 있을 것이다.
http://www.uu.se/Software/Analyzers/Access-analyzers.html 
직접 만드는 것 보다는 여기에 만들어 놓은 툴을 사용하는 것이 훨씬 낫다.

내가 가장 좋아하는 웹 로그 분석 툴은 다음과 같다.
awstat : http://awstats.sourceforge.net/ 
Analog : http://www.analog.cx
Webalizer : http://www.mrunix.net/webalizer

이 중 가장 최근까지 업데이트 된 툴은 awstat이다.  각 툴의 사용법은 각 사이트의 튜토리얼 문서를 참조하면 쉽게 알 수 있을 것이다.

Posted by tuning-java
,

IBM developerWorks 뉴스레터를 보다가 괜찮은 글을 하나 발견했다. 링크는 아래에...

http://www.ibm.com/developerworks/kr/library/dwclm/20080408/

내 생각도 이 글의 필자와 크게 다르지는 않다. 

예전부터 해온 생각이 "굳이 이렇게 자바를 확장할 필요가 있을까? "라는 것이다.

지금까지의 자바를 보다 안정적이고, 보다 빠르게 개선하는 것이 더 중요하다고 생각한다.

프로그래밍 언어의 버젼이 개발툴 버젼처럼 지속적으로 빠르게 올라갈 필요는 없다고 생각한다.

오히려 그 언어를 사용하는 "프레임웍"들을 보다 더 좋게 향상 시키는 것이 낫지 않을까?

Posted by tuning-java
,

이제 메인 화면에서 다른 화면으로 전환하는 Activity를 만들어보자.

(아마도 제가 쓰는 글을 계속 읽어오신 분들은 이 부분에 대해서 많이 궁금해 하셨을 것이라 생각한다. 그리고 물론 쉽지도 않다.)

다음과 같이 클래스를 하나 맹근다.

이제, 다음과 같이 소스를 작성하자.

package com.min.summary.layouts;

import android.app.Activity;
import android.os.Bundle;

import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.RelativeLayout;
public class RelativeTest extends Activity {
    RelativeLayout relativeLayout;
    LayoutParams lpFillFill=new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        relativeLayout=new RelativeLayout(this);
        relativeLayout.setLayoutParams(lpFillFill);
        setContentView(relativeLayout);
    }
}

그럼 바로 앞서 만든 MainButtonManager 클래스의 setButtons() 메소드에 다음과 같은 버튼을 만들자.

        Button relBut=new Button(parent);
        relBut.setText("Show relative layout");
        relBut.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                Intent intent = new Intent(parent,com.min.summary.layouts.RelativeTest.class);
                parent.startActivity(intent);

            }
        });
        parentLayout.addView(relBut, lpFillWrap);

intent 객체를 만들어서 부모에서 startActivity 메소드에 intent 객체를 넘겨주면 된다.
(정확하게 이렇게 intent객체를 만드는 이유에 대해서는 좀더 공부해 봐야겠다.)


이제 한번 실행해 볼까?

새로 추가된 버튼이 추가되었다. ㅋㅋ

한번 눌러보자.

어라? 이게 뭐야?
에러가 난다. 에러를 잘 읽어보자.


AndroidManifest.xml 파일에 내가 추가한 클래스를 선언한걸 못찾겠단다.
하래면 해야지머...

AndroidManifest.xml 파일을 더블클릭하면, 안드로이드 어플리케이션 설정 화면이 나타난다.
거기서 두번째 탭에 있는 Application을 클릭하자.
하단에 있는 Appilcation Nodes 에서 "Add..." 버튼을 클릭하자.
그 다음 나타나는 팝업 화면에선 Activity를 클릭하자.

여기서 일단 돌아가게하려면 입력해야 하는건 달랑 하나~~ "Class Name*" 이라고 되어 있는 곳에서 "Browse" 버튼을 클릭한다.

마지막으로 해야하는 것은 새로 만든 .layouts.RelativeTest 를 추가하는 것 뿐이다.

결과는 다음과 같다.

까만화면이닷~~~. - -;

왜냐하면, 아무것도 RelativeLayout에 추가하지 않았기 때문이다.

그러면 다음 글에는 RelativeLayout을 사용하는 방법에 대해서 알아보자.

Posted by tuning-java
,

참고로 이 설명은 [Blog2Book 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기] 책을 읽는 독자분들이 부록으로 제공되는 Jennifer를 보다 쉽게 사용할 수 있도록 작성되었으며, 설치시 임시 라이센스는 자동으로 생성되지 않고, Jennifer 사이트에서 요청하셔야 합니다. 요청 방법은 부록 CD에 정리되어 있습니다. 

제니퍼의 설치법을 알아보겠습니다. 뭐 매뉴얼 보면서 하시면 되겠지만, 보다 간단하게 설치할 수 있도록 알려 드리겠습니다. 왜냐하면, 제니퍼 설치 설명 파일을 보면 20 페이지가 넘게, 각 서버별 설정법이 나와 있습니다. 하나 하나 따라가기가 굉장히 짜증나는 작업이죠.

제니퍼의 버전이 2.5.X 에서 최근에 3.2 버전이 바뀌었습니다. 2.5.X 대의 버전과 3.X 대 버전의 가장 큰 차이점은 데이터를 DB에 넣는다는 점과 UI를 맘대로 커스터마이징 할 수 있도록 되어 있다는 것입니다. 그런데, 제 개인적으로는 2.5.X 대의 버전이 가장 안정화 되어 있다고 생각합니다.

제니퍼를 설치하려면 적어도 두대의 서버가 있어야 합니다. 제니퍼 서버(모니터링 데이터를 처리하는 서버)와 WAS 서버(모니터링되는 서버)가 필요합니다. 먼저 제니퍼 서버를 설정하는 방법을 알아보겠습니다.

-제니퍼 DB 설정

제니퍼 설치 위치의 /derby/bin/env.sh 파일을 열어 다음의 세팅을 합니다.
JAVA_HOME=/usr/jsdk142
제니퍼 설치 위치의 /derby/start.sh 파일을 수행하면, 제니퍼 DB가 수행됩니다.

 

-제니퍼 서버 설정

제니퍼 설치 위치의 /server/bin/tomcat.sh 파일을 열어 다음의 두가지 세팅을 합니다.
JAVA_HOME=/usr/jsdk142
JENNIFER_HOME=/home/Jennifer (2.5.X 대의 버전에서는 세팅할 필요 없음)

 

위의 설정을 마치셨으면, 제니퍼 설치 위치의 /server/bin/startup.sh 파일을 수행합니다.
정상적으로 설치를 완료 했을 경우 인터넷 익스플로러를 기동하여 아래의 url을 입력하면 제니퍼 서버로그인 화면이 나타납니다.

http://제니퍼서버IP:7900/

제니퍼 서버 설정이 완료되었으므로, 이제 WAS 설정을 알아보겠습니다.

 

1. WAS 서버 설정

제니퍼의 버젼이 2.X 대 거나 3.X 대 거나, WAS 서버가 어떤 것이든지 설치법은 그리 크게 차이 나지 않습니다. WAS 서버를 기동하기 위한 설정파일에 다음의 내용이 반드시 포함되도록 합니다. 반드시 이 세팅을 할 때에는 제니퍼를 사용하지 않고 서버가 기동되는 세팅을 반드시 백업해 놓으셔야 합니다.

2. jennifer.jar설정 : 어떤 jar 파일보다 앞에 jennifer.jar 파일을 클래스 패스에 지정한다.

3. Jennifer 구성파일설정 : w11.conf (구성 파일)을 자바 커맨드의 -Djennifer.config=/ 옵션을 사용하여 위치를 지정한다.

4. lwst30.jar 및 jennifersys.jar : 자바 커멘드의 -Xbootclasspath/p: 옵션을 사용하여 이 두가지 파일의 위치를 지정한다.

5. jennifer library 모듈설정 : 서버에 맞는 so파일을 libjennifer20.so로 파일명을 변경하여 서버의 수행 디렉토리로 복사한다.

 

이러한 설정이 완료되면, WAS를 restart하면 됩니다.

이러한 세팅이 완료되면, 이제 제니퍼를 사용하는 기본 환경 설정은 완료됩니다.

마지막으로 몇가지 팁을 알려드리겠습니다.

팁1)

제니퍼 서버와 WAS 서버 사이에 통신을 해야 하기 때문에, 두 서버 사이에 방화벽이 있을 경우 다음 Port를 열어야 합니다.
클라이언트 -->  제니퍼서버 : 7900(TCP) - 관리콘솔 서비스 용,  6701(TCP) - 애플릿 소켓통신용
제니퍼에이전트 --> 제니퍼서버 : 6901(UDP) - 실시간 데이터 전송, 6902(UDP) - (1초)데이터 전송, 6703(UDP) - 트랜잭션 데이터 전송
제니퍼서버 --> 제니퍼에이전트 : 머신내 유일포트 (7750 ~ ) 각 에이전트는 제니퍼서버 요청에 대한 작업을처리하기 위해 유일한 TCP포트를 바인딩 해야 합니다.

여기서 가장 밑에 있는 7750 port는 한 장비에 여러 컨테이너가 동작할 경우 w11.conf 파일과 같은 설정 파일을 여러 개 만들어 각 컨테이너당 유일한 포트를 사용하도록 수정해야 합니다.

 

팁2) w11.conf 파일 설정 - 1
agent_name : agent의 이름을 설정하며, 영어를 포함한 3단어만 사용 해야 합니다. 반드시하나의 제니퍼 서버당 유일한 값이어야 합니다.
agent_tcp_port : 각 WAS 장비당 유일한 포트 번호여야 합니다. 컨테이너가 여러 개일 경우만 변경하면 됩니다. 여러 WAS가 같은 값을 써도 상관 없습니다.
udp_server_host : 제니퍼 서버가 기동중인 IP를 명시해줍니다.

 

팁3) w11.conf 파일 설정 – 2
만약 X-internet이나 프레임웍을 쓸 경우 모든 요청이 aaa.do 나 requestName 과 같이 하나로 보이는 경우가 있습니다. 만약 요청 파라메터의 키가 cmd와 value라는 것이 있을 경우 w11.conf 파일의 다음 설정의 주석을 해제하고 설정하면 됩니다.
url_additional_request_keys=cmd,value

 

다음에는 Jennifer의 각 기능 소개를 해 드리겠습니다.

Posted by tuning-java
,

Eclipse를 사용하여 Spring MVC 을 구현하는 것에 대해서 알아보자.

일단 가장 먼저 Eclipse에서 Dynamic Web Project를 맹글자.
(이 부분은 다 알고 있으리라 생각하고 패쑤~~)

그 다음 맹글어진 프로젝트에서 WebContents 밑에 있는 web.xml을 열자.
web.xml 파일의 </web-app> 태그 위에 아래의 내용을 복사하여 붙이자.
-------------------------------------------------------------------
<servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>
   org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>
    /WEB-INF/action-servlet001.xml
   </param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>

 <servlet-mapping>
  <servlet-name>action</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>
------------------------------------------------------------------------
잘 붙였으면, 간단하게 내용을 살펴보자.
DispatcherServlet은 말 그대로 Servlet 클래스이기 때문에 web.xml에 추가한 것이고,
앞으로 모든이름.do를 호출하면 이와 관련된 클래스가 호출될 것이다.
중간에 action-servlet001.xml이라는게 아직 없다.
없으니 만들자...

WEB-INF 디렉토리 하단에 action-servlet001.xml 을 다음과 같이 만들자.
------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans  
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-2.5.xsd">

 <bean id="handlerMapping"
  class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
 
 <bean name="/test.do"   class="test.TestController">
  </bean>

</beans>
-----------------------------------------------------------------------------------
내용은 모른다고 치더라도 test.TestController 라는 클래스가 필요하다고 느낄것이다.
웹에서 test.do를 수행하면 해당 컨트롤러 클래스가 호출될 것이다.

test.TestController 클래스는 다음과 같다.
----------------------------------------------------------------------------------
package test;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class TestController implements Controller {
 public ModelAndView handleRequest(HttpServletRequest request,
   HttpServletResponse response) throws Exception
{
  System.out.println("TestController ==> handleRequest");
  return new ModelAndView("redirect:/index.html");
 }
}
-------------------------------------------------------------------------
이 소스에서는 다른 일은 안하고 "TestController ==> handleRequest"를 프린트하고
index.html로 forwarding 하도록만 되어있다.
그럼 마지막으로 이클립스의 WebContents 폴더 하단에 index.html을 하나 생성하자.
html의 body에는 다음과 같이 한번 넣어볼까?
-------------------------------------------------------------------------
<body>
Thank you for follow this tutorial. hahaha.
</body>
-------------------------------------------------------------------------
그럼 이제 코딩해야 할일은 다 끝났다.

하지만 두가지 일이 남아있다.
만든 클래스가 이클립스의 build 폴더에 생성이 되어있지 않으니,
eclipse 메뉴에서 Project --> Build All을 클릭하여 클래스를 빌드해야 한다.
(뭐~ 이게 자동으로 될 수도 있다.)

또 한가지 남은 것은
WEB-INF 하단의 lib 폴더에 Spring framework과 관련된 모든 jar를 집어 넣어 줘야 한다.
(이 방법도 여러분만의 방법이 있을 테니 자세한건 패스하고...
가장 간단한 것은 익스플로러에서 모든 jar를 선택하고 eclipse에 끌어 넣어주면 된다.)

정상적으로 작업이 되었다면
tomcat을 띄워서 해당WebApp/test.do 를 실행해보자.
Tomcat의 console에
"TestController ==> handleRequest"
가 출력되고,
화면에
Thank you for follow this tutorial. hahaha.
가 나타났다면,
초 간단 Spring MVC Framework 실습이 완료된 것이다.

이제 천천히 어려운 부분을 공부해 보자.

Posted by tuning-java
,

일단 본론에 들어가기 전에 MVC에 대해서는 다 알꺼라 생각한다. 몇줄만 적어보면

MVC는 Model, View, Controller의 약자로 예전의 UI, DB처리, 비즈니스 로직을 하나의 클래스나 파일에서 처리하던 것을 분리하는 것을 말한다.

간단하게 몇줄만 적었다. ㅋㅋ
그럼 Spring MVC 프레임웍에서 어떻게 사용자 요청이 처리되는지 알아보자.

1. 사용자의 요청이 오면 DispatcherServlet이라는 것이 받는다. 얘를 앞단 중계자라는 의미로 Front Controller라고 부른다.
2. 받은 것을 뭔가 매핑이 되어 있는 곳에서 적절한걸 찾아서 다른 곳으로 전달한다. 이 것을 핸들러라고 한다.
3. 전달 받은 데이터를 기반으로 DB에서 데이터를 얻어온 다음에 ModelAndView라는 객체에 저장해서 넘긴다고 한다.
4. 그 다음 DispatcherServlet이라는 놈에서 화면에 보여줄 View 와 Model 정보를 View Resolver라는 것을 통해서 View를 결정한다.
5. 해당 View에 데이터를 넘기고, View에서는 화면을 처리한 결과를 DispatcherServlet으로 넘긴다.
6. 마지막으로 화면으로 보내준다.

이 내용을 그림으로 표현한 것이 바로 아래 링크에 있다.
http://static.springframework.org/spring/docs/2.0.x/reference/mvc.html
마우스 스크롤이 어떻게 되어 있느냐에 따라서 다르겠지만, 한 3번 정도 스크롤하면 볼 수 있다. ^^;

자세한 구현 방법은 다음 글에 올리도록 하겠다.

Posted by tuning-java
,
만약 여러분의 클립보드에 다음의 내용이 있다고 치죠. (아래의 내용을 복사하거나 Ctrl-C 를 누른 경우)
//내용 시작
package test;
public class Test {
}
//내용 끝

이클립스에서 src 를 누른 후 Ctrl-V를 눌러보자.

그럼 짜잔~~~
하고 여러분의 이클립스에 클래스가 하나 추가되면서, 그 내용이 에디터에 나타날 것입니다.


Posted by tuning-java
,
자바의 어노테이션이란 것이 JDK 5.0 부터 생겨났기 때문에,
예전부터 자바를 하신분들은 이해하기가 다소 어려울 수 있다.
그럼 어노테이션이란건 왜 만들어서 사람을 귀찮게 할까 ?
궁금하다면, 다음의 글을 읽어보자.
(참고로 한글이다....)

http://www.ibm.com/developerworks/kr/library/j-annotate1/index.html


http://www.ibm.com/developerworks/kr/library/j-annotate2.html
Posted by tuning-java
,
* Test.*(..)
[리턴타입] [패키지.클래스].[메소드명](매개변수의 타입])
여기서는 모든 리턴타입을 갖는 Test 클래스의 모든 매개변수 타입의 모든 클래스에 적용하라.

여기서 *은 all 이라는 의미가 된다. 즉 Test.* 이라는 것은 Test 클래스의 모든 메소드를 처리하라는 의미가 되고, 다음과 같이 사용할 수 있다.

void Test.hello(..)
void Test.hello*(..)
void Test.hello(int,String)

hello* 이라는 것을 보면, 모든 hello로 시작하는 메소드에 대해서 처리하라는 의미가 된다.

그리고 매개 변수의 타입에서 ..을 쓰면 모든 매개변수 타입에 대한 처리를 하게 되고, 원하는 타입을 명시할 수도 있다.
Posted by tuning-java
,
먼저 아래의 간단한 소스를 읽어 보자.

package proxytest;
public interface ITempLogic {
 public String greet();
}
----------
package proxytest;
public class TempLogicImpl implements ITempLogic {
 public String greet() {
  return "Hi";
 }
}
----------
package proxytest;
public class TempLogicProxy implements ITempLogic {
 private ITempLogic itl=null;
 public TempLogicProxy(ITempLogic l) {
  itl=l;
 }
 public String greet() {
  System.out.println("before");
  String r=itl.greet();
  System.out.println("after");
  return r;
 }
 public static void main(String args[]) {
  ITempLogic l=new TempLogicProxy(new TempLogicImpl());
  System.out.println(l.greet());
 }
}
----------
 간단하게 소스에 대해서 설명을 하자면,
 ITempLogic이라는 인터페이스를 하나 만들고,
 해당 인터페이스를 구현한 TempLogicImpl 이라는 클래스를 하나 만들었다.
 구현된 TempLogicImpl 이라는 클래스를 감싸주는 TempLogicProxy라는 클래스를 만들어 주어서 그 클래스에서 TempLogicImpl을 대행하여 수행해준다.

Posted by tuning-java
,

AOP : Aspect Oriented Programming

관점지향 프로그래밍이다. 어플리케이션을 OOP 관점으로 모듈화하여 작성해도 다른 모듈에서 발생하는 횡단 관심을 해결하기 위한 방법이다.

횡단 관심 : 로깅 보안, 트랜젝션등 부가 기능을 의미하며,
기존의 프로그램을 최대한 수정하지 않고 원하는 부가기능을 처리하고자 하는것이다.

AOP로 구현시 핵심 모듈을 건들지 않기 때문에 재사용성과 유지보수성이 쉬워진다.

여기서 AOP의 단점은 성능에 영향을 준다는 것이다.

참고로 횡단 관심을 해결하기 위한 시점은 다음과 같다.

  1. 메소드 호출 이전 시점
  2. Exception이 발생된 시점
  3. 메소드 호출 이후 시점

여기서 시점을 point cut 이라고 하고, 포인트 컷에서 해야하는 동작을 Advice라고 한다.
point cut과 advice를 모아놓은 것을 Aspect 라고 한다.

advice의 종류

  • around advice : org.aopalliance.intercept.MethodInterceptor - 메소드 수행 전후, Exception을 모두 처리할 수 있다.
  • before advice : org.springframework.aop.MethodBeforeAdvice - 메소드 수행전 작업을 처리할 수 있다.
  • after advice : org.springframework.aop.AfterReturningAdvice - 메소드 수행후 작업을 처리할 수 있다.
  • throws advice : org.springframework.aop.ThrowsAdvice - Exception 발생시 작업을 처리할 수 있다.


결론적으로 AOP를 사용하게되면,
원하는 proxy 기반의 interceptor 를 XML 기반으로 지정할 수 있게 되고,
XML에 지정된 bean을 사용하도록 소스를 변경해 주면 proxy에서 처리하는 부분을 사용할 수 있다.

참고로 Spring 에서는 이러한 Aspect를 Java로 구현하기 위해서 다음과 같은 방법을 사용한다.
방법 1 : 스키마 기반의 구현
방법 2 : Anotation을 이용한 구현

Posted by tuning-java
,

ApplicationContext : 국제화 지원, 자원 로딩, 이벤트 발생

BeanFactory : custom 초기화 메소드와 소멸 메소드를 호출하여 빈의 라이프 사이클 관리가 가능하다.

ApplicationContext  = BeanFactory + 이벤트 메커니즘.
그러므로, 이벤트 처리를 위해서는 ApplicationContext  를 사용하여 Bean을 생성한다.

Bean의 life cycle.
 Bean 의 내부 초기화 메소드 호출
-> 커스텀 초기화 메소드

-> 작업

-> 커스텀 소멸자
-> 내부 소멸자
-> 소멸

단 내부 초기화와 소멸자 메소드는 건드리지 않는 것이 좋다.

만약 ApplicationContext 의 경우가 된다면
나머지는 동일하고, 작업 부분에 이벤트 처리가 추가된다고 생각하면 된다.

Posted by tuning-java
,

Spring framework에서 지정하는 scope의 종류는 5가지가 있다.

singleton : 기본. 단하나의 인스턴스만 존재

prototype : 매번 객체를 생성

request : WebApplicationContext를 통해서 생성했을 경우에만 사용가능. request 스코프를 가진다.

session : WebApplicationContext를 통해서 생성했을 경우에만 사용가능. request 스코프를 가진다.

global-session : WebApplicationContext를 통해서 생성했을 경우 포틀릿을 지원하는 컨텍스트에서만 사용가능.

뒤에 있는 두가지의 경우는 웹에서 사용하기 위한 scope이다.

대부분 위에 있는 singleton과 prototype을 사용한다고 한다.

Posted by tuning-java
,

IoC는 Inversion of Control 의 약자이다.
이는 프레임웍에서 클래스의 객체를 관리하는 구조라고 생각하면 된다.

IoC의 구현 방법은 DL과 DI 두가지가 있다.
DL : Dependency Lookup
DI : Dependencty Injection

DL은 JNDI를 이용하여 Lookup 하는 방식을 말하고, DI는 각 오브젝트에서 의존적인 resource나 collaborator에 대한 책임을 갖지 않고 컨테이너가 그 일을 담당하도록 하는 것이다.

DI는 다음과 같이 두가지로 나뉜다.
Setter Injection
Constructor Injection

Setter Injection은 JavaBeans의 Property 구조를 이용하며, 주로 이 방법을 사용한다. 두가지 중 어떤 방법을 사용할 지에 대해서는 개인의 취향을 따르거나, 프로젝트의 표준을 따라야 한다.


Posted by tuning-java
,

사용자 삽입 이미지

Blog2Book 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기
책이 나온지도 이제 한달이 되었습니다.

많은 분들이 제 책을 찾아 주셔서 감사할 따름입니다.
아마도 자바의 성능에 대해서 고민하고, 고생하시는 분들이 많다는 현실을 나타내는 것이 아닐까 생각되네요.

책을 보시면서 궁금했던 점에 대해서는 본 블로그의 방명록을 통해서 문의해 주시기 바랍니다.

(참고로 위에 있는 사진은 제가 바탕화면으로 사용중인 사진입니다.
제가 찍은 거에요 ^^)

Posted by tuning-java
,
이클립스가 유로파로 오면서 가끔 개길때가 있다.
다음과 같은 화면이 나타나면서...
사용자 삽입 이미지

이럴때에는 batch 파일을 만들거나,
바로가기를 만들어서 다음과 같이 수정해준다.

C:\eclipse\eclipse.exe -vmargs 512m

여러가지 옵션이 있지만,
이 옵션이 가장 간단하고 편한듯
Posted by tuning-java
,
여기에 있는 내용은 제가 교육 받으면서 필요한 부분에 대해서 정리를 해 놓은 것 입니다.
굉장히 심도가 얕기 때문에, 자세한 내용은 책을 활용하셔야 겠지요?


Spring Framework (스프링 프레임웍) 이란건 대체 무엇일까?

스프링 프레임웍을 한마디로 표현하자면
EJB 기반으로 개발을 하지 않고 POJO(Plain Old Java Object) 기반으로 개발을 하더라도 가볍고, 제어가 가능한 상호 관련이 적은, AOP (Aspect Oriented Programming. 관점지향 프로그래밍)을 지원하고, 컨테이너를 통해 라이프사이클을 관리하고, XML 기반으로 컴포넌트를 개발할 수 있도록 지원해주는 프레임웍이라고 할 수 있다.

(한마디로 표현하자니까 이해하기도 어려울 듯 하고, 열나 길다 - -;)

스프링 프레임웍은 다음과 같은 7개의 모듈로 되어 있다.
Spring Core
Spring Context
Spring DAO
Spring ORM
Spring AOP
Spring Web
Spring Web MVC

Core : DI 라는 Dependency Injection 기능을 제공한다.
Context : 컨텍스트라는 정보를 제공하는 설정을 관리한다. JNDI, EJB, 국제화, 스케줄링이 여기에 포함된다.
DAO : DB와 관련된 JDBC 코딩 부분을 처리해 주기 위한 JDBC 추상화 레이어를 제공한다.
ORM : JDO, Hibernate, iBATIS 등 O-R Mapping API를 위한 레이어를 제공한다.
AOP : 관점지향 프로그래밍을 제공한다.
Web : 웹 기반의 여러가지 기능을 제공한다.
Web MVC : Model과 View(Web form) 사이의 구분을 제공하기 위한 관련된 기능을 제공한다.

이제 스프링 프레임웍이 어떻게 되었는지 간단히 알아보았으니,
다음에는 IoC 컨테이너 부터 천천히 알아보자.
Posted by tuning-java
,
윤 머시기 강사가 이야기한

Spring Framework 가 만들어진 이유

Proxy의 불편함 => AOP 의 사용
JDBC의 불편함 => Spring JDBC
Web 프로그래밍의 불편함 => Spring MVC

기타 등등의 지금까지 Java 기반의 프로젝트를 하면서 불편한 점에 대해서
보완을 하기 위해서 만들어 졌다고 한다.
Posted by tuning-java
,

참고로 이 설명은 [Blog2Book 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기] 책을 읽는 독자분들이 부록으로 제공되는 DevPartner for Java를 보다 쉽게 사용할 수 있도록 작성되었으며, 설치시 14일간 기능의 제한이 없는 임시 라이센스가 생성됩니다.

nmshell을 이용해서 분석하기 위한 창을 띄우자. 참고로 본인은 다음과 같이 nmshell을 구동했다.

nmshell -mem -config Test

정상적으로 구동을 했다면, 다음과 같은 화면이 나타나게 될 것이다.

이제 3가지 기능중 한가지를 사용하면 된다. 제공되는 기능은 다음과 같다.

RAM Footprint : 현재 메모리에 올라와 있는 클래스의 정보를 볼 수 있다. (EJB를 많이 쓰거나 이것 저것 올라온게 많으면 서버가 맛탱이 갈 수 있으니 조심해서 사용하길 바란다.)

Object Lifetime Analysis : 임시 메모리를 어떤 클래스, 메소드, 라인에서 많이 사용했는지를 보여준다. 반드시 작업 시작전에 GC를 하는 것을 까먹지 말기 바란다.

Memory Leaks : 메모리를 릴리즈하지 않는 메모리 릭을 잡아준다. (솔직히 말하면, 쉽게 잡히진 않는다. ㅋㅋ)

이 기능 또한 설명하는데 오래걸리므로 자세한 내용은 패쑤

Posted by tuning-java
,

참고로 이 설명은 [Blog2Book 자바 성능을 결정짓는 코딩 습관과 튜닝 이야기] 책을 읽는 독자분들이 부록으로 제공되는 DevPartner for Java를 보다 쉽게 사용할 수 있도록 작성되었으며, 설치시 14일간 기능의 제한이 없는 임시 라이센스가 생성됩니다.

nmshell에 대해서도 봤으니, 이제 성능 프로파일링 하는 방법에 대해서 알아보자.
참고로 여기서 본인은

nmshell -perf -config Test

로 nmshell을 수행했다.

정상적으로 nmshell을 수행했다면, nmshell 창에서 해당 WAS나 어플리케이션을 시작하는 스크립트를 수행하자. 그러면 다음과 같은 화면이 나타난다.

예전에 광고에서 비트박스하는 방법을 알려주면서, 북치기 박치기만 잘하면 된다는 광고를 보았을 것이다. 그것처럼, DevPartner에서 성능 프로파일링을 하기 위해서는 두가지 버튼만 잘 누르면 된다.
그 버튼은 "Clear Collected Data" 와 "View Results" 버튼이다.

Clear Collected Data 버튼 : 지금까지 수집된 모든 데이터를 지운다.

View Result 버튼 : 지금까지 수집된 데이터를 보여준다.

쉽게 말하면, 어플리케이션을 구동하는 동안 수집된 정보는 필요가 없으므로, 화면을 수행하기 전에는 Clear Collected Data를 누른다. 그런 다음, 화면을 수행하고 나서는 View Result 버튼을 클릭하면 된다.

그러면 위와 같은 화면이 새로 나타나는데, 이제부터 수집된 데이터를 기반으로 분석을 하면 된다.

근데 책에서 몇번이고 강조를 했지만, 서버를 띄우고 나서 가장 처음 해당 화면을 수행할 때의 결과는 절대 사용하면 안된다. 잘못하면 정상적이지 못한 시스템 분석이 되기 때문에 첫번째 화면을 수행한 이후에는 반드시 Clear... 버튼을 클릭하고, 그 다음에 화면을 1회, 10회 ... 수행한 이후에 View Result 버튼을 눌러 결과를 확인하기 바란다.

결과를 확인하는 방법은 가장 어려운 부분중 하나인데, 이에 대해서는 직접 터득하시기를 권장한다. 왜냐하면, 말로 설명해도 한시간 이상 소요되는 작업이고, 아무리 말로 설명해도 이해하기가 쉽지는 않기 때문이다.

뭐 많은 분들이 원한다면 나중에 관련 내용이 추가 될 수도 있다. 

다음에는 메모리 프로파일링 하는 방법에 대해서 알아보겠다.

Posted by tuning-java
,