달력

11

« 2019/11 »

  •  
  •  
  •  
  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
2014.05.19 16:40

Spring 의 SimpleJdbcCall 이용시 에러. 그거/Java2014.05.19 16:40

spring 을 이용하여 Oracle 의 Stored procedure 를 호출하는데,

계속 인수가 맞지 않다고 에러를 뱉어낸다.

Junit test 돌려보면 지극히 정상인데.. 시스템에서는 에러를 내고 있으니. 당췌 원인을 알 수가 없다는.

jdbc driver 문제인가, 아니면 사용중인 library 가 문제인가.

여기 저기 뒤져보고.. 별 짓을 다 해봐도 안됐다는...


시스템 담당자에게 procedure 생성 script 달라고 해서 원인 분석


o. junit  test 환경

 - local db 에 abc user 로 접속

 - abc user 가 procedure 생성

 - test 수행 시 abc user 로 수행

 - procedure 정상 호출됨


o. system 환경

 - remote db 에 def user 로 접속

 - dba user 가 procedure 생성

 - dba user 가 생성한 procedure 에 대해 def user 에 synonym 생성

 - 생성된  procedure 에 대해서 def user 에 실행권한 부여

 - def user 로 procedure 호출

 - 인수가 맞지 않다고 오류 발생


마지막이란 심정으로다가, system 환경을 local 에서 재현해봄.

1. local db 에 def user 생성

2. abc user 가 생성한 procedure 에 대해 def user 에 synonym 생성

3. abc user 가 생성한 procedure 에 대해 def user 에게 실행권한 부여

4. def user 로 procedure 호출

=> 인수가 맞지 않다고 오류 발생


드디어 원인 발견!


실제 procedure 를 실행하는 db user 는 synonym 을 보고 있기 때문에,

다른 db user 가 생성한 procedure에 대한 meta 정보를 못가져오는듯 하다.

(짐작임)


그래서, SimpleJdbcCall 사용할 때 withSchemaName("abc") 을 하니 잘 되더란!

끝.

'그거 > Java' 카테고리의 다른 글

Spring 의 SimpleJdbcCall 이용시 에러.  (0) 2014.05.19
JSP 의 EL 과 JSTL  (0) 2013.08.09
enum 사용하기  (0) 2013.05.02
자바 소스 디컴파일 해보기.  (0) 2013.04.11
Runtime Data Access  (0) 2012.07.30
NoClassDefFoundError vs ClassNotFoundException  (0) 2011.10.11
Posted by 뽀기

댓글을 달아 주세요

2014.05.08 17:46

JavaScript Unit Test - QUnit 그거/기타2014.05.08 17:46


QUnit 이란?

JavaScript 개발에 사용하기 위한 Unit Test Framework


QUnit 은 어디서?

http://qunitjs.com/


QUnit 을 시작하려면?

필요한 파일은 qunit-1.14.0.js, qunit-1.14.0.css

아래 내용으로 html 파일 작성.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>QUnit Example</title>
<link rel="stylesheet" href="qunit-1.14.0.css">
</head>
<body>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
<script src="qunit-1.14.0.js"></script>
<script src="tests.js"></script>
</body>
</html>

test.js 파일은 QUnit 이용해서 Unit Test 를 하기 위한 script 파일.


QUnit 으로 테스트 하려면?

test.js 파일에 아래와 같이 코딩.

1
2
3
test( "hello test", function() {
ok( 1 == "1", "Passed!" );
});

기본적으로 test("테스트명", function() { ... }); 형식으로 이루어져 있음


위 코딩 내용은

line 1 : "hello test" 를 실행하겠음

line 2 : ok( 1 == "1", "Passed!"); 를 실행하겠음

여기에서 line 2 의 ok(state, msg) 는 JUnit 에서의 assert 류의 method 와 동일함

즉, state 인 1 == "1" 가 true 이면 msg 출력.


더 많은 assert 류의 function 은 여기(클릭)에서 확인 가능



결과는 아래와 같음.

QUnit Example

Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36

Tests completed in 931 milliseconds.
1 assertions of 1 passed, 0 failed.

  1. hello test (01, 1) Rerun9 ms


위의 1. hello test (0,1,1) 는 차례대로 실패 0개, 1개 성공, 1개 Assert 수행 을 나타냄


async 방식의 javascript 도 테스트 할 수 있고, callback 도 처리 가능하며,

다른 툴에 포함되서 사용될 경우를 대비한 QUnit callback API 도 제공한다.

보다 자세한 사항은 여기(클릭)에서~

Posted by 뽀기

댓글을 달아 주세요

2013.08.09 17:45

JSP 의 EL 과 JSTL 그거/Java2013.08.09 17:45

안쓰던거 쓰려니 몸이 고생....이 아니라 머리가 고생 -_-;


환경은 이렇다.

tomcat 6.0, servlet 2.4, jstl 1.1.2


JSTL 을 쓰려고 아래와 같이 코딩했다.


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<%

String a = "str";

%>


<body>

<c:out value="${a}"/>


값이 안나온다. 젠장

별 뻘짓을 다 해도 데이터가 안나옴. ㅡㅡ;

아래와 같이 하니 나옴.


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<c:set var="a" value="str"/>


<body>

<c:out value="${a}"/>


그렇다.

EL, JSTL 요놈들은 <% %> 에서 일반 변수 선언한건 안된다.

찾아보니,

<c:set/> 요놈이 page, request, session, application 4 영역에 attribute 를 저장하는 놈이다.

EL을 사용하려면 <c:set/> 을 이용해 지정한 변수만 사용가능하다는.. 

그렇지 않으면, 위 page, request, session, application 영역의 변수만 사용가능하다는거다.


다른 예제.


<%

String a = "DDDD:l";

pageContext.setAttribute("id", "lucky");

session.setAttribute("age", "36");

application.setAttribute("team", "FW");

request.setAttribute("name", "Choi");

%>


위와 같이 설정하고,


<c:set var="str" value="<%= a %>"/>

<%= a %><br>

a = ${a}<br>

a = <c:out value="${str}" default="none"/> <br>

a = ${str}<br>


id= ${id}<br>

age= ${age}<br>

name= ${name}<br>

team= ${team}<br>


<c:out value="id=${id}"/><br>

<c:out value="age=${age}"/><br>

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

<c:out value="team=${team}"/><br>


요걸 찍어보면 아래와 같은 결과가 나옴.

DDDD:l
a = 
a = DDDD:l 
a = DDDD:l

id= lucky
age= 36
name= Choi
team= FW

id=lucky
age=36
name=Choi
team=FW


끝.

'그거 > Java' 카테고리의 다른 글

Spring 의 SimpleJdbcCall 이용시 에러.  (0) 2014.05.19
JSP 의 EL 과 JSTL  (0) 2013.08.09
enum 사용하기  (0) 2013.05.02
자바 소스 디컴파일 해보기.  (0) 2013.04.11
Runtime Data Access  (0) 2012.07.30
NoClassDefFoundError vs ClassNotFoundException  (0) 2011.10.11
TAG c:out, c:set, EL, jstl
Posted by 뽀기

댓글을 달아 주세요

2013.06.21 17:07

오라클 리스너 에러 그거/DB2013.06.21 17:07

퇴근 5분전에 회사에서 보안 뭐시기 때문에 프로그램을 설치하라 그래서 설치하고 퇴근..

다음날 와서 보니.. PC 에 설치한 Oracle DB 에 접속이 안되는 문제가...


원인을 확인해보니. listener 가 죽어있다..

서비스에서 아무리 재시작을 해도 계속 죽는다...


프로그램 설치 후에 발생한 문제라서, 보안 담당자한테 물어봤더니

"PC 의 호스트네임이 바뀝니다" 라는... 이런 써글..


product\11.2.0\dbhome_1\NETWORK\ADMIN 경로에 보면


listener.ora 파일이 있는데,


LUCKYDB_LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = LUCKY_SVR)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )


원래 이랬던 내용이다..


리스너에서 PC 의 호스트네임을 사용한다는...


그래서 아래와 같이 바뀐 호스트네임으로 바꿔주고.


LUCKYDB_LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = XXXXDDBB)(PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

    )

  )



lsnrctl LUCKYDB_LISTENER start

했더니.. 잘 뜨네...

근데 문제는!!!

EM(Enterprise Manager)가 뜰 생각을 않는다..

이건 뭘 고쳐야 되는겨.. 아쒸.. ㅜㅜ


Posted by 뽀기

댓글을 달아 주세요

내부적으로 사용할 코드 만들면서 정리합니다.


사용법부터 보면 아래와 같습니다.

아래와 같이 템플릿 코드가 보여줄 태그를 설정하고

<tbody id="showList">

</tbody>


기본 템플릿 코드를 아래와 같이 설정한다.

<script id="listTemplate" type="text/x-lucky-template">

<tr>

<td><a href="merong.jsp">{{name}}</a></td>

<td>{{tel}}</td>

<td>{{address}}</td>

<td>{{email}}</td>

<td>{{age}}</td>

</tr>

</script> 

데이터와 매핑시키는 부분은 {{name}} 형식과 같이 필드명의 왼쪽에 {{, 오른쪽엔 }} 를 붙여준다.

실제 사용은 아래와 같이 한다.

var listData = [

{

"name" : "lucky",

"tel" : "010-1111-1234",

"address" : "서울",

"email" : "mail@mail.com",

"age" : "10"

},

{

"name" : "lucky2",

"tel" : "010-1111-1234",

"address" : "서울",

"email" : "mail@mail.com",

"age" : "100"

}

];

var codes = $("#listTemplate").html();

Template.render(codes, listData, "showList");


구현 소스는 아래와 같습니다.

Template = new function() {

this.tplTagRegExp = /\{\{[a-zA-Z0-9]*\}\}/gi;

};


/**

 * 화면에 list template 을 그림

 * 

 * @param {String} templateCode HTML 코드 작성용 템플릿 코드

 * @param {Object} mappingData 템플릿 코드에 매핑시킬 데이터 객체

 * @param {String} showId 데이터가 매핑된 템플릿 코드를 뿌려줄 화면 객체의 ID

 */

Template.render = function(templateCode, mappingData, showID) {

var codes = "";

for(var i = 0 ; i < mappingData.length ; i++ ) {

var rowData = mappingData[i];


var tmpStr = templateCode.replace(this.tplTagRegExp, function($1) {

var tag = $1.substring(2, $1.length-2);

var data = rowData[tag];

if( data ) {

return data;

} else {

return "";

}

});

codes += tmpStr;

}


$("#" + showID).append(codes);

};


정규표현식과 javascript 는 참 재밌습니다.

근데, 어렵습니다. ㅡㅡ;


Posted by 뽀기

댓글을 달아 주세요

2013.05.02 15:54

enum 사용하기 그거/Java2013.05.02 15:54

enum 잘 안썼는데..  걍 정리해봄.


1. 단순 상수로 사용하기

public enum Gender { MALE, FEMALE };

public static void main(String[] args) {

System.out.println(Gender.MALE);

}


# 출력 #

MALE



2. 값 설정해서 사용하기

public enum Gender {

MALE(1), FEMALE(2);

private int value;

private Gender(int value) {

this.value = value;

}

public int getValue() {

return this.value;

}

}


public static void main(String[] args) {

System.out.println(Gender.MALE);

System.out.println(Gender.MALE.getValue());

}


# 출력 #

MALE

1



3. method override 해서 사용하기

public enum Gender {

MALE(1), FEMALE(2);

private int value;

private Gender(int value) {

this.value = value;

}

public int getValue() {

return this.value;

}

public String toString() {

switch(value) {

case 10 :

return "MAN";

case 20:

return "WOMAN";

default :

return "???";

}

}

}


public static void main(String[] args) {

System.out.println(Gender.MALE);

System.out.println(Gender.MALE.getValue());

System.out.println(Gender.FEMALE);

System.out.println(Gender.FEMALE.getValue());

}


# 출력 #

MAN

10

WOMAN

20



4. switch/case 에 사용하기

public enum Gender {

MALE(1), FEMALE(2);

private int value;

private Gender(int value) {

this.value = value;

}

public int getValue() {

return this.value;

}

public String toString() {

switch(value) {

case 10 :

return "MAN";

case 20:

return "WOMAN";

default :

return "???";

}

}

}


public static void main(String[] args) {

Gender male = Gender.MALE;

switch(male) {

case MALE:

System.out.println("MAN~~~");

break;

case FEMALE:

System.out.println("WOMAN~~~");

break;

default :

System.out.println("UHM.....");

break;

}

}


# 출력 #

MAN~~~


'그거 > Java' 카테고리의 다른 글

Spring 의 SimpleJdbcCall 이용시 에러.  (0) 2014.05.19
JSP 의 EL 과 JSTL  (0) 2013.08.09
enum 사용하기  (0) 2013.05.02
자바 소스 디컴파일 해보기.  (0) 2013.04.11
Runtime Data Access  (0) 2012.07.30
NoClassDefFoundError vs ClassNotFoundException  (0) 2011.10.11
Posted by 뽀기

댓글을 달아 주세요

2013.04.30 14:46

테이블 데이터 복사 그거/DB2013.04.30 14:46

A 테이블

ID        VARCHAR2 (63) NOT NULL,

CONTENT   VARCHAR2 (1000) NOT NULL,

CRE_DATE      DATE NOT NULL,

UPD_DATE      DATE NOT NULL,

TYPE      VARCHAR2 (5) NOT NULL,

USER_ID       VARCHAR2 (63),

GUBUN     CHAR (1),

ETC           VARCHAR2 (10),

DOMAIN_ID     VARCHAR2 (63) DEFAULT 'DEFAULT' NOT NULL


A 테이블의 데이터

ID 

CONTENT 

CRE_DATE 

UPD_DATE 

TYPE 

USER_ID 

GUBUN 

ETC 

DOMAIN_ID 

 EX00001

내용 

2013/04/30 

 2013/04/30

 ERROR

LUCKY 

DOMAIN1 

 EX00002

내용 

2013/04/30 

 2013/04/30 

 ERROR

 LUCKY 

U

N

DOMAIN2 

... 

... 

... 

... 

... 

 ...

 ...

 ...

.. 

 EX00100

 내용 

 2013/04/30 

 2013/04/30 

 ERROR

 LUCKY 

U

N

DOMAIN1 



위와 같은 상황에서


A 테이블의 데이터 중에 DOMAIN_ID 가 'DOMAIN1' 인 데이터를 B 테이블을 새로 만들어서 복사하고자 할 경우


create table B 

as

select 

ID, CONTENT, CRE_DATE, UPD_DATE, TYPE, USER_ID, GUBUN, ETC, DOMAIN_ID

from A where domain_id = 'DOMAIN1'


구문을 사용하면 된다.



이걸 이용해서, A 테이블에서 DOMAIN_ID 가 'DOMAIN1' 인 데이터에 대해서 

DOMAIN_ID 를 'DOMAIN2' 로 A 테이블에 복사하고자 할 경우에는


1. DOMAIN1 데이터를 B 테이블에 임시 복사

2. B 테이블의 데이터를 A 테이블에 DOMAIN2 로 변경해서 복사


를 하면 된다.



QUERY 는 아래처럼~


create table B as select * from a where domain_id = 'DOMAIN1';

insert into A values(id, content, cre_date, upd_date, type, user_id, gubun, etc, domain_id)

   select id, content, sysdate, sysdate, type, user_id, gubun, etc, 'DOMAIN2' from B;


==> 더 간단하게는... 아래와 같이~



insert into A values(id, content, cre_date, upd_date, type, user_id, gubun, etc, domain_id)

   select id, content, sysdate, sysdate, type, user_id, gubun, etc, 'DOMAIN2' from A where domain_id = 'DOMAIN1';



Posted by 뽀기

댓글을 달아 주세요

2013.04.11 15:05

자바 소스 디컴파일 해보기. 그거/Java2013.04.11 15:05


서버에 있는 class 파일과 PC 에 있는 class 파일의 크기가 달라서

서버의 class 파일과 PC의 class 파일을 decompile 해서 비교하다 보니 아래와 같이 알 수 없는 문장(?)들이 있어서


        break MISSING_BLOCK_LABEL_361;

        Exception exception;

        exception;

        if(bw != null)

            bw.close();

        throw exception;

        if(bw != null)

            bw.close();

그래서, decompile 테스트 해봤다.


BufferedReader br = null;

try {

System.out.println("try >>");

br = new BufferedReader(new InputStreamReader(System.in));

br.readLine();

System.out.println("try <<");

} catch(Exception e) {

System.out.println("catch >>");

e.printStackTrace();

System.out.println("catch <<");

} finally {

System.out.println("finally >>");

if( br != null ) {

try { 

System.out.println("finally try >>");

br.close(); br = null; 

System.out.println("finally try <<");

} catch(Exception ignr) {

System.out.println("finally catch");

}

}

System.out.println("finally <<");

}

System.out.println("000");

ArrayList list = new ArrayList();

for(int i = 0; i < list.size();) {

Object o = list.get(0);

break;

}

System.out.println("111");


int j = 0;

if( j < list.size() ) {

Object o = list.get(0);

}

System.out.println("222");


for(int i = 0; i < list.size(); i++) {

Object o = list.get(i);

}

System.out.println("333");


위의 자바 소스를 컴파일 한 후 class 파일을 디컴파일 해보면 아래와 같다.


        BufferedReader bufferedreader = null;

        System.out.println("try >>");

        bufferedreader = new BufferedReader(new InputStreamReader(System.in));

        bufferedreader.readLine();

        System.out.println("try <<");

        System.out.println("finally >>");

        if(bufferedreader != null)

            try

            {

                System.out.println("finally try >>");

                bufferedreader.close();

                bufferedreader = null;

                System.out.println("finally try <<");

            }

            catch(Exception exception)

            {

                System.out.println("finally catch");

            }

        System.out.println("finally <<");

        break MISSING_BLOCK_LABEL_234;

        Exception exception1;

        exception1;

        System.out.println("catch >>");

        exception1.printStackTrace();

        System.out.println("catch <<");

        System.out.println("finally >>");

        if(bufferedreader != null)

            try

            {

                System.out.println("finally try >>");

                bufferedreader.close();

                bufferedreader = null;

                System.out.println("finally try <<");

            }

            catch(Exception exception2)

            {

                System.out.println("finally catch");

            }

        System.out.println("finally <<");

        break MISSING_BLOCK_LABEL_234;

        Exception exception3;

        exception3;

        System.out.println("finally >>");

        if(bufferedreader != null)

            try

            {

                System.out.println("finally try >>");

                bufferedreader.close();

                bufferedreader = null;

                System.out.println("finally try <<");

            }

            catch(Exception exception4)

            {

                System.out.println("finally catch");

            }

        System.out.println("finally <<");

        throw exception3;

        System.out.println("000");

        ArrayList arraylist = new ArrayList();

        int i = 0;

        Object obj;

        if(i < arraylist.size())

            obj = arraylist.get(0);

        System.out.println("111");

        i = 0;

        if(i < arraylist.size())

            obj = arraylist.get(0);

        System.out.println("222");

        for(int j = 0; j < arraylist.size(); j++)

        {

            Object obj1 = arraylist.get(j);

        }


        System.out.println("333");

        return;


디컴파일한 소스를 보면 finally 가 3번이나 나온다.

그리고, 1번만 실행되는 for문(2번 이상 실행되지 않는 for문)은

알아서 for 문의 조건만 포함한 if문으로 변경된다.


아. 젤 위에 있는 이상한 문장(?)들은 catch 와 finally 에 있는 코드들인듯 하돠.

뭐 새로울 건 없지만, 소스 분석하다가 재밌어서 올려봄.. ㅡ,.ㅡ;

'그거 > Java' 카테고리의 다른 글

JSP 의 EL 과 JSTL  (0) 2013.08.09
enum 사용하기  (0) 2013.05.02
자바 소스 디컴파일 해보기.  (0) 2013.04.11
Runtime Data Access  (0) 2012.07.30
NoClassDefFoundError vs ClassNotFoundException  (0) 2011.10.11
Eclipse 에서 Maven 이용해서 remote repository 에 deploy 하기  (0) 2011.10.05
Posted by 뽀기

댓글을 달아 주세요


1. html 파일 소스 코드

        function uploadPhoto(imageURI) {

            var options = new FileUploadOptions();

            options.chunkedMode = false;

            options.fileKey="file";

            options.fileName=imageURI.substr(imageURI.lastIndexOf('/')+1);

            options.mimeType="image/jpeg";


            var params = new Object();

            params.value1 = "test";

            params.value2 = "param";


            options.params = params;

        

            var fileTransfer = new FileTransfer();

            fileTransfer.upload(

imageURI, 

"http://192.168.1.3:8080/MobileServer/upload.jsp", 

win, 

fail, 

options

);

        }


2. 서버 소스 코드

ServletFileUpload upload = new ServletFileUpload(factory);

// maximum size before a FileUploadException will be thrown

upload.setSizeMax(5000000);


List<?> fileItems = null;

try{

fileItems = upload.parseRequest(request);

}catch(FileUploadException fue){

fue.printStackTrace();

}


if( fileItems != null ) {

System.out.println();

FileItem fi = null;

for (Object obj : fileItems) {

fi = (FileItem) obj;

if (fi.isFormField()) {

parseFormField(fi);

System.out.println("@" + fi);

} else {

storedFileName = "/upload/_android_" + fi.getName();

fi.write(createStoredFile(storedFileName));

}

}

}


3. 서버쪽 library 파일

 - commons-fileupload-1.2.1.jar

 - commons-httpclient-3.1.jar

 - commons-io-2.0.1.jar


4. 주의할 점

 - 오류가 발생할 경우 FileUploadOptions 의 checkedMode 를 false 로 한다.(꼭 false 로 하지 않아도 된다)

   o chuckedMode

      true  : 서버쪽에 파일을 stream 으로 전송함(HTTP header 에 content-length 설정 안됨)

      false :  파일을 전송하기 전에 메모리에 올려놓고 전송함(HTTP header 에 content-length 설정됨)

 - FIleTransferError.CONNECTION_ERR 오류가 발생할 경우 서버쪽의 로그를 잘 뒤져본다.

   (서버쪽에서 Exception 이 발생해도 이 에러가 발생함)

Posted by 뽀기

댓글을 달아 주세요

  1. 2013.05.27 21:53  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

2012.07.30 10:06

Runtime Data Access 그거/Java2012.07.30 10:06

Java 의 변수 구분


- Class Variables

- Member Variables

- Parameter Variables

- Local Variables


- Class Variable

static 변수. Class 에 속해 있는 변수.

Method Area 의 Class Variable 영역에 할당.

모든 Thread 에 의해 공유.


- Member Variable

instance 변수. instance 에 속해 있는 변수


- Parameter Variable

method 의 매개변수. method 에 속해 있는 변수.

변수의 정보는 Method Area 의 Method Information에 포함.

JVM Stacks 에 할당.


- Local Variable

Parameter Variable 과 동일한 부류. method 내에서 정의되는 변수.

Local Variable 은 Parameter Variable 과 같이 Method Information 에 변수 정보가 위치하고 JVM Stacks 에 할당.


Class VariableArrange {

static int ci = 3 ;    // Class Variable

int mi = 4;            // Member Variable


void method(int pi, String ps) {    // Parameter Variable

int li = 5;                            // Local Variable

}

}



중요!!!

Parameter Variable 과 Local Variable 은 Thread Safe 변수.

사용자가 Method 내에서 선언한 Local Variable 의 값에 대해 다른 Thread 의 접근이 불가능.

JVM Stacks 는 다른 Thread 에 의해 접근이 불가능하기 때문.


- 출처 : Java Performance Fundamental (김한도 지음) -

Posted by 뽀기

댓글을 달아 주세요