어제 :
오늘 :
총합 :

'공부합시다'에 해당되는 글 2건

  1. 그냥 이것저것 잡다한 팁 10 2009.12.31
  2. 시험 문제 복습 (추가) 15 2009.04.10

그냥 이것저것 잡다한 팁

from 기타 2009. 12. 31. 14:24

한해를 마무리하면서, 올해 일하면서 얻게 된 짜잘한 프로그래밍 팁들을 정리해봅니다.

오라클 관련
외부 조인 (Outer Join)을 할때 IN 연산 문제
오라클에서 외부 조인을 할때는 IN이나 OR 조건을 쓰지 못합니다.
실행할 때 에러가 나죠.
이걸 고치는 방법입니다.

SELECT * FROM TABLE1 A, TABLE2 B
WHERE A.ID = B.ID(+)
AND B.VALUE(+) IN ('X', 'Y')

이렇게 하면 외부조인에서는 IN이나 OR가 안된다고 에러가 납니다.
위의 쿼리를 다음과 같이 고쳐줍시다

SELECT * FROM TABLE1 A, TABLE2 B
WHERE A.ID = B.ID(+)
AND DECODE(B.VALUE(+), 'X', 1, 'Y', 1) = 1
 
이러면 정상적으로 외부 조인이 됩니다.

위의 필드명이나 값은 어디까지나 예제로 넣은 것이니 자기가 쓰는 데이터에 맞게 변형하시면 됩니다.

다들 쿼리보면 바로 이해할 정도는 되잖아요~?



통계함수에서의 PARTITION 사용
오라클에서 쓰는 통계함수... ROW_NUMBER() 라던가 RANK()라던가 DENSE_RANK()... 사용하기에 따라서 상당히 편하게 작업할 수 있게 해줍니다.
한 사람의 여러개의 데이터 중에서 가장 최초의 기록을 찾는다던가 할때 저는 주로 ROW_NUMBER()를 사용해 일련번호를 생성하고, 그 번호가 1인 기록만을 찾는 식으로 씁니다.
이때,
ROW_NUMBER() OVER (PARTITION BY A.REGNO1, A.REGNO2 ORDER BY A.REGDATE) AS rn
대충 이런 모양으로 쓸 수가 있는데요....
문제가 되는게 바로 이 PARTITION BY 부분.
역할은 대충 GROUP BY랑 비슷하게 그룹으로 묶어주는 역할을 하는데요... 위의 예제처럼 쓰다보니 가~끔 예상과는 다른 결과가 나오는 경우가 있더군요. (원인을 찾느냐고 좀 고생했습니다)
문제는, PARTITION BY 뒤에는 단지 표현식. 하나만 쓰라고 되어있네요....
그걸 바탕으로 수정한 결과물 ->
ROW_NUMBER() OVER (PARTITION BY A.REGNO1 || A.REGNO2 ORDER BY A.REGDATE) AS rn
이렇게 하면 REGNO1, REGNO2를 결합한 값으로 그룹을 만들고, 거기서 REGDATE 순으로 정렬하여 번호를 생성해 줍니다.
이건 REGNO1과 REGNO2가 고정길이값을 가졌다는 전제하이고요... 만일 필드길이를 정확히 알 수 없다면 RPAD나 SUBSTR 등을 조합해서 만들면 될겁니다.



자바스크립트 관련
parseInt의 문제

보통 문자에서 숫자로 변환할 때 parseInt를 많이 씁니다.
하지만 문제가 있는데, 예를 들어 데이터가 "0123"이라고 들어있을 때 이 값을 parseInt하면 숫자가 123이 나오는게 아니라 83이 나옵니다. 맨 앞에 나오는 0이라는 값 때문에 이것을 10진수가 아닌 8진수로 인식해서 변환했기 때문이죠. 물론 parseInt에 형식을 더 지정해 줄 수도 있지만... 귀찮으니 Number("0123") 이렇게 하면 바로 123으로 변환되서 나옵니다.
eval도 비슷하게 쓸 수 있지만, eval은 단순히 변환용으로 쓰기에는 너무 강력하니 추천하지 않습니다. 어떤 내용이 들어왔느냐에 따라 단순히 숫자 변환이 아니라, 함수를 실행시키거나 할 수도 있거든요...


함수인자 갯수를 동적으로 받기
자바스크립트에서 함수 인자를 받을 때 인자가 몇개 올지 모르는 경우....
인자를 동적으로 받을 수 있습니다.

function testFunc() {
    var args = this.testFunc.arguments;
    var i;

    for (i = 0; i < args.length; i++) {
        alert((i+1) + "번째 인자 : " + args[i]);
    }
}

위와 같은 방식으로 함수를 짜면
testFunc("A");
testFunc("A", "B", "C");
이렇게 다양하게 호출이 가능합니다.


엑셀 자동화에서의 팁
다른 프로그램(자바스크립트나 VB 등)에서 오피스 프로그램 등을 호출하고 제어할 수 있는데요
(엑셀의 경우 셀의 값을 지정한다거나 서식을 준다거나)
이때 최종적으로 파일 저장시에 약간의 문제가 생깁니다.
파일명을 test.xls라고 준다고 해도
파일 저장형식이 현재 컴퓨터에 깔려져 있는 엑셀의 버전에 맞춰지기 때문이죠.

최신 엑셀 프로그램이 깔려있다면... 저렇게 확장자를 xls로 지정해도 실제적으로 xlsx파일로 저장됩니다.
저는 개인적으로 xlsx는 좀 싫어하는데요...
기존 버전의 엑셀 쓰는데서는 열리지 않는 문제도 있고요... 제가 잘쓰는 WinM에서는 저 파일을 압축파일로 인식해 자동으로 압축파일 보기 모드로 들어가지거든요... (xlsx는 내부적으로는 zip으로 압축된 파일입니다)
따라서 파일 저장시에 "구버전 엑셀 XLS파일"로 형식을 지정해주는게 좋습니다.

자바스크립트에서 할 경우에는
var oXL = new ActiveXObject("Excel.Application");
var oWB = oXL.Workbooks.Add();
var oSheet = oWB.ActiveSheet;

.....(엑셀 처리 작업을 한다).....

// 최종 저장시에
oSheet.SaveAs(fileName, 56);

이런 식으로 해주면 됩니다.
파일 형식 번호 56번은 엑셀 97-2003 포맷을 의미합니다.
제가 실험해본 결과, 더 이전 버전에서는 셀 병합에서 약간 문제가 생기더군요.
그래서 엑셀 97-2003 포맷을 추천합니다.
비베 같은데서는 상수로 이름이 나오지만, 자바스크립트에서는 안나오니 그냥 저렇게 숫자로 지정~~

저장을 안하고 그냥 사용자에게 바로 보여줄 경우에는, 사용자가 알아서 저장하라고 하면 되겠죠? ~.~


아웃룩 자동화에서의 팁
오피스의 아웃룩 자동화를 통해 프로그램에서 바로 일정이나, 할 일 등을 지정할 수도 있습니다.
그런데 문제는 아웃룩 어플리케이션이 실행되어있지 않을 때 작업을 하면, 그 작업 내용이 날라간다는 겁니다.
사실 아웃룩이 내부적으로는 실행되는 중인데, 사용자 로그인 문제 때문에 데이터가 어느 계정에 저장될지가 불확실해서 이런 문제가 발생하는 거죠.
이 문제의 해결을 위해서는 해결 방법이 3가지 정도 있습니다.

1. 아웃룩이 실행되어 있지 않으면 아웃룩을 강제로 실행시켜준다.
...이렇게 정보를 쓴 곳도 종종 있지만... outlook.exe를 실행시키는 방식이라 뭔가 찜찜. 비추천.

2. 아웃룩 창을 강제적으로 디스플레이 시켜준다.
var ol = new ActiveXObject("Outlook.Application");
var olns = ol.GetNamespace("MAPI");
var objFolder = olns.GetDefaultFolder(9);   // 9는 아웃룩에서 일정의 폴더 번호
objFolder.Display();
이렇게 하면 아웃룩의 일정창이 디스플레이 되는데요.
이 상태에서 새 약속/행사 등을 저장하면 제대로 들어갑니다.
하지만 화면에 뭔가 뜨기 때문에, 백그라운드로 얌전히 하려는 사람에게는 비추.

3. 아웃룩에 사용자 계정 로그인을 한다.
var ol = new ActiveXObject("Outlook.Application");
var olns = ol.GetNamespace("MAPI");
olns.Logon("", "", false, false);


이렇게 하면 사용자프로필, 암호가 없는 상태로 로그인을 합니다.
이러면 기본 사용자 로그인 상태가 되겠죠?

이 상태로 새 작업을 만들고 저장하면, 기본 사용자의 일정 등에 작업이 추가가 됩니다.
(프로필명이나 암호가 지정되있다면, 그건 사용자에게 입력을 받으면 되겠죠)

최종적으로는 ol.Application.Quit(); 로 메모리에서 제거해주시는거 잊지마시구요.

이 방법을 쓰면 뭐가 일어났는지 사용자가 모르게, 아웃룩을 제어하는게 가능합니다.
nonVisible상태에서 작업이 다 끝나니까요...



--------------------------------------------------------------------------------
이런 것 말고도 다른 팁들도 있지만...
현재 일하는 곳에서 사용하는 프레임워크에 종속된 팁들도 있고 하니...
일단 범용으로 쓰이는 오라클이랑 자바스크립트에 대한 것만 살짝 올려봤습니다.

건전한 블로그에 맞는 건전한 한해 마무리 포스팅이였습니다. ^^
(아 근데 이 블로그를 IT 관련 블로그로 알고 오신 모님에게는... 볼 때마다 뭔가 뜨끔뜨끔)

,



시험 문제 복습 (추가)

from 기타 2009. 4. 10. 20:55

오늘 면접 본 회사에서 본 기술 시험 복습입니다.
원래 이런 글 올리면 댓글도 없고 이 블로그에 좀 안 어울리기도 합니다만, 이 블로그를 IT관련으로 생각하시는 분도 있고하니(...) 복습의 차원에서 한번 올려봅니다. (이런 블로그가 아닌데...)
회사 이름은 안 쓸게요. 그쪽에서 검색해서 들어오기라도 하면 낭패니(응?)

====================================================================================================
자바의 장점

치기 귀찮으니 이미지 파일로 대체


AJAX의 장단점

Ajax의 장점

1. 페이지 이동 없이 고속으로 화면을 전환

2. 서버 처리를 기다리지 않고 비동기 요청이 가능

3. PHP 및 Perl등의 서버 측 처리를 각 PC에 분산 가능

4. 수신하는 데이터의 양을 줄일 수 있음

5. 실시간 인터렉티브 성능이 올라감


Ajax의 단점

1. 크로스 브라우저 처리의 노하우가 필요

브라우저에 구현된 JavaScript에 의존한다는 것은, 각 브라우저 간에 좀처럼 완전히 동일하게는 되어 있지 않은 구현을 보완하기 위한 ‘크로스 브라우저 처리’를 피하고 넘어갈 수 없다는 말이다. 다만 예전 브라우저가 대부분 도태된 현재는 ECMA나 W3C와 같은 표준에 준거한 브라우저가 많아서, ‘DHTML브라우저 전쟁’ 때 정도의 문제는 아니다.


2. Ajax를 쓸 수 없는 브라우저에 대한 대책도 필요

JavaScript와 XMLHttpRequest를 사용할 수 없는 브라우저에서 동작할 수 없으므로 거기에 대한 대책이 필요하다.


3. JavaScript부분은 오픈소스이기 때문에 차별화가 어려움

서버 측은 어찌되었건 클라이언트 측은 JavaScript이기 때문에, 확실히 오픈 소스이다. 이것은 큰 장점인 동시에 이 부분에서 차별화를 꾀하지 않으면, 힘든 경쟁에 동참해야 한다는 단점도 있다.


4. Http클라이언트의 기능이 한정되어 있음

IE에는 크로스 도메인 시큐리티(cross domain security)모델이 채용되어 있습니다. 이것은 IE가 동일한 웹사이트로부터의 데이터에 대해 여러 개의 창이 열려 맞물려 돌아가는 경우, 보안상의 배려로 클라이언트의 접근에 ‘도메인’을 사용하여 관리하는 것입니다. 요청의 대상 URL은 요청을 하는 페이지와 같은 도메인에 있지 않으면 안됩니다.


5. 보안에 대한 주의가 불가피

페이지 이동 없이 서버와 통신을 한다는 것은 동시에 눈에 보이지 않는 이면에서 동작함을 뜻하기도 하므로, 전보다 더욱 신중한 보안상의 주의가 요구된다. 예를 들어, 수신데이터가 악의의 외부 입력으로부터 소통이 될 가능성이 없나 등을 늘 경계하고 있을 필요가 있다.


6. 현재의 처리 상황에 대한 정보가 필요

페이지 이동 없이 처리가 진행된다는 것은 사용자가 현재의 처리 상태를 못보고 지나칠 가능성 있다. 예를 들어 “ 수신이 끝나있는데, 아직도 처리가 안 끝나 있다고 생각이 들어 몇 번이고 클릭을 눌러버리는” 상황을 피하기 위해서도, “now loading”같은 표시를 응답 수신 시에 프로그레시브 바(progressive bar)등으로 나타내주는 것이 친절할 것이다. 또한, 주소란의 URL에 ‘#’으로 시작하는 해쉬를 추가로 적어 넣어, 명시적으로 페이지를 전환하는 방법도 있다.


7. 요청을 남발하면 역으로 서버 부하가 늘 수 있음

Ajax 장점의 대부분은 서버 측의 일을 줄이고 오늘날 성능이 좋은 무수한 클라이언트 pc에 작업을 나눠준다는, 서버 부하의 감소에 있다. 하지만 그 의도와는 반대로 요청이 너무 빈번하게 일어나서 서버 및 회선 부하를 늘려 버리는 일도 있을 수 있다. 경쾌한 동작을 실현하기 위해서 데이터 전송 량 요청회수, 서버부하 등에 대해서 종합적인 판단과 튜닝이 필요하다.



AJAX가 뭐냐하면 이 블로그에 댓글을 달때 페이지가 바뀌지 않고 바로 댓글이 달리죠? 그게 AJAX를 이용한 겁니다. 페이지 전환없이 웹 페이지를 변경시키는 기술이죠.


Struts의 특징

Struts 프레임워크의 특징은  Model 2를 기준으로(물론 사용하기에 따라 Model 1으로도사용가능합니다) 만들어져 있다.  수많은 라이브러리 class들이 기본적으로 내장 되어있고,  controller에 해당하는 파일이 xml 로 되어 있어서 context 가 추가되더라도 xml 파일만 추가해주면 바로 연결 해서 사용할 수 있다

• ActionServlet : 어떤 Action(비지니스 로직을 호출하는 역할을 하는 자바 클래스)를 사용할지 여부 등 스트럿츠 전반에 대한 설정을 저장하고 있는 struts-config.xml 파일을 읽어 저장하는 Servlet 클래스이다.
• RequestProcessor : 사용자의 요청을 받으면, struts-config.xml 설정에 따라 실제로 호출할 Action을 선택하고, request와 response 서블릿 객체를 이용해서 미리 선행작업을 하는 역할을 한다.
Action을 선택하는 방법은 바로 요청 URL에 있다.
예를 들어 사용자가 http://localhost:8080/login.do를 호출 했다면 “/login.do”를 인지하고 strutsconfig.xml에서 “/login”이라는 이름(“.do” 제외)으로 지정된 행동 지침관련 설정(<action>)을 찾아서 그에 따라 비지니스 로직을 실행시킨다.
• ActionForm : 사용자가 GET 혹은 POST 방식으로 넘긴 파라미터들을 저장하고 분석하여 알맞은 값이 들어왔는지 여부 등을 판단(유효성 검사)하는 Java Bean 이다. ActionForm은 있어도 되고 없어도 되며 ActionForm에서 각 파라미터가 유효성 검사를 통과하지 않으면 Action을 호출하지 않는다.
• Action : 비지니스 로직을 호출하는 부분이다. 실질적으로 자바 웹 서블릿과 같은 역할을 한다. 비지니스 로직은 Action에서 직접 수행하지 말고 따로 Model 전용 클래스로 만들어서 파라미터들을 넘겨 호출만 하는 형태로 작성한다.

JDBC
JDBC는 데이터베이스를 다루기 위한 자바 API(Application Programming Interface)이다
자바를 기반으로 하는 프로그램을 작성할 때 프로그래머에게 데이터베이스를 쉽게 다룰수 있게 합니다.
JDBC를 통해서 어떠한 DBMS일지라도 질의문을 던져서 데이터를 가져올 수 있습니다.

JDBC는 JDBC 인터페이스와 JDBC 드라이버로 구성
JDBC 인터페이스 : 데이터베이스와 연동되는 프로그램을 작성할 수 있게 하는 도구라 할 수 있습니다.
JDBC 드라이버 : JDBC 인터페이스를 구현하여 실제로 DBMS를 작동 시켜서 질의를 던지고 결과를 받습니다.

Oracle JOIN 예제

select e.employee_id, d.department_id from employees e
 join departments d on (e.employee_id = d.department_id)

이건 아는 거였는데 착각해서 살짝 실수했네요. 젠장.
====================================================================================================

긴장해서 실수도 좀 한거 같은데 결과는 모르겠습니다. 진인사대천명이라고 기다려보는 수 밖에...

,