달력

3

« 2024/3 »

  • 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
  • 31
2014. 5. 19. 16:40

Spring 의 SimpleJdbcCall 이용시 에러. 그거/Java2014. 5. 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' 카테고리의 다른 글

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. 5. 8. 17:46

JavaScript Unit Test - QUnit 그거/기타2014. 5. 8. 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. 8. 9. 17:45

JSP 의 EL 과 JSTL 그거/Java2013. 8. 9. 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
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. 6. 21. 17:07

오라클 리스너 에러 그거/DB2013. 6. 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. 5. 2. 15:54

enum 사용하기 그거/Java2013. 5. 2. 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
자바 소스 디컴파일 해보기.  (0) 2013.04.11
Runtime Data Access  (0) 2012.07.30
NoClassDefFoundError vs ClassNotFoundException  (0) 2011.10.11
:
Posted by 뽀기
2013. 4. 30. 14:46

테이블 데이터 복사 그거/DB2013. 4. 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. 4. 11. 15:05

자바 소스 디컴파일 해보기. 그거/Java2013. 4. 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
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 뽀기
2012. 7. 30. 10:06

Runtime Data Access 그거/Java2012. 7. 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 뽀기