2007년 12월 23일 일요일
2007년 12월 19일 수요일
MBIT 성격 검사
성격검사를 해보니 ENTP형이라고 나오네요.
나온걸 적어보자면 음....
참고로 클리랑 자료실에서 다운받아서 해봤습니다.
댓글에 홈피 주소가 나와있길래 무언가하고 봤더니 허허.. 웃음만 나오네요;;
그냥 재미삼아 한번 해보세요 ^^
MBTI_성격_검사_프로그램.zipMBTI 성격 검사
민첩하고 독창적이며 안목이 넓으며 다방면에 관심과 재능이 많다.
독창적이며 창의력이 풍부하고 넓은 안목을 갖고 있으며 다방면에 지능이 많다.
풍부한 상상력과 새로운 일을 시도하는 솔선력이 강하며 논리적이다.
새로운 문제나 복잡한 문제에 해결 능력이 뛰어나며 사람들의 동향에 대해 기민하고 박식하다.
그러나 일상적이고 세부적인 일을 경시하고 태만하기 쉽다.
즉, 새로운 도전이 없는 일에는 흥미가 없으나 관심을 갖고 있는 일에는 대단한 수행능력을 가지고 있다.
발명가, 과학자, 문제해결사, 저널리스트, 마케팅, 컴퓨터 분석 등에 탁월한 능력이 있다. 때로 경쟁적이며 현실보다는 이론에 더 밝은 편이다.
* 일반적인 특성 *
한번들은 얘기를 또 듣는 건 싫어한다
5대양 6대주가 활동 무대 이건 싫어한다
여자인 경우 치마를 두른 남자 같다
복잡한 문제일수록 쉽게 해결한다
마음만 먹으면 못하는 것이 없다
전공이 여러 가지이다
굉장히 다재다능하고 능력이 있다
단어 하나로 2시간도 이야기 한다
초, 중, 고등학교 의 규칙생활이 힘들 수 있다
일상적인 일에 쉽게 싫증을 느낀다
007 제임스 본드형 이다
인간관계가 자유롭다
똑같은 강의를 반복 못한다
관심분야는 대단히 박식 관심 없는 분야는 대단히 무식
경쟁심이 많다
일상적이고 반복되는 일은 지루하고 힘들어 한다
항상 새로운 것을 추구한다
빠뜨리거나 빼먹는 일이 많다
다른 누구의 권유나 참견은 질색이다
자기의 판단에 따라 행동한다
끈기 있게 한 가지 일에 몰두하지 못한다
말을 나오는 대로 막할 수 있다
처음 보는 사람과도 금방 친해진다
팔방미인, 눈썰미가 좋다
길게 설명하는 건 짜증난다
* 개발해야할점 *
말을 할 때 저 사람이 어떻게 느낄 까 먼저 생각하는 것이 필요일의 끝마무리에 대한 인내심이 필요
타인에 대한 칭찬, 격려, 인정이 필요
2007년 12월 17일 월요일
테이블 스페이스 & 사용자 생성
맨날 까묵네;;;
-- 테이블 스페이스 조회
SELECT TABLESPACE_NAME, STATUS, CONTENTS
FROM DBA_TABLESPACES;
-- 테이블 스페이스 생성
CREATE TABLESPACE TS_ZEPHOME
DATAFILE 'D:\ORACLEDATA\TS_ZEPHOME.dbs' SIZE 20M
DEFAULT STORAGE (INITIAL 128K NEXT 64K PCTINCREASE 10);
-- 사용자 생성
CREATE USER zephome IDENTIFIED BY ORACLE
DEFAULT TABLESPACE TS_ZEPHOME
TEMPORARY TABLESPACE TEMP;
-- 사용자 수정
ALTER USER zephome IDENTIFIED BY 비밀번호;
-- 사용자 조회
SELECT USERNAME, USER_ID
FROM DBA_USERS;
-- 권한 설정 (CONNECT, VIEW, SP ....)
GRANT CONNECT, RESOURCE TO ZEPHOME;
2007년 12월 5일 수요일
이클립스 플러그인 - DBedit
Eclipse Plugin - DbEdit
1. 설치
- http://sourceforge.net/projects/dbedit
- download 받은 후 features, plugins 폴더에 있는 파일을 eclipse의
features, plugins 폴더로 복사 후 eclipse를 재 시작하면 인식이 됩니다.
- 재 시작 한 후 Customize Perspective에서 DbEdit관련 항목을 선택합니다.
2. MySQL 드라이버 eclipse상에 설치
- http://www.mysql.com
- MySQL Connector/J 링크를 클릭하고 zip파일을 다운 받아 압축을 풉니다.
- "mysql-connector-java-5.0.4-bin.jar" 파일을 복사하여 "이클립스폴더/lib"에 갖다 붙입니다.
- 모든 자바 Application에서의 드라이버 인식
"mysql-connector-java-5.0.4-bin.jar" 파일을 복사하여 "C:\jdk1.5.0\jre\lib\ext"에 갖다 붙입니다.
3. DBEdit 설정
- [Window - Customize Perspective - Shortcuts] Database 선택
- [Window - Customize Perspective - Commands] Dbedit로 시작하는 메뉴 전부 선택
- [Window - Preferences - DbEdit - SQL Editor - Annotations(주석)]에서
"errors"관련 옵션을 전부 선택 해제합니다.
4. MySQL 접속
- [Connection - Configure]에서 'New'버튼을 클릭합니다.
- JDBC Driver: org.gjt.mm.mysql.Driver
- Server URL: jdbc:mysql://127.0.0.1:3306/DB명?useUnicode=true&characterEncoding=euckr
- USER : 아이디
- Classpath - add Archive 에서 이클립스폴더\lib\mysql-connector-java-5.1.5-bin 설정
2007년 12월 3일 월요일
사용하지 않는 인덱스 통계 찾기
출처 [DBGuide]
다음 쿼리를 응용하시면 사용하지 않는 인덱스를 쉽게 찾아 낼 수 있습니다. 아래 쿼리는 적어도 최근 15일간 사용이 없는 인덱스와 통계를 찾아내는 쿼리입니다.
/*
테이블별 인덱스에 대한 통계가 마지막으로 업데이트된 날짜 찾기
이종희 2003.10.
정원혁 2004.8.
*/
SELECT USER_NAME( OBJECTPROPERTY( i.id, 'OwnerID' ) ) AS Owner
,OBJECT_NAME( i.id ) AS [Table]
, i.name AS [Index]
,CASE INDEXPROPERTY( i.id , i.name , 'IsClustered') WHEN 1 THEN 'Y' ELSE '' END AS IsClustered
,CASE INDEXPROPERTY( i.id , i.name , 'IsUnique' ) WHEN 1 THEN 'Y' ELSE '' END AS IsUnique
,STATS_DATE( i.id , i.indid ) AS LastUpdatedDate
,dPages * 8. /1024 AS MB
FROM sysindexes AS i
WHERE OBJECTPROPERTY( i.id, 'IsMSShipped' ) = 0
AND 1 NOT IN ( INDEXPROPERTY( i.id , i.name , 'IsStatistics' )
, INDEXPROPERTY( i.id , i.name , 'IsAutoStatistics' )
, INDEXPROPERTY( i.id , i.name , 'IsHypothetical' ) )
AND i.indid BETWEEN 1 And 250
-- AND dPages > 100 --작은 크기 테이블 무시
AND (STATS_DATE( i.id , i.indid ) < getdate() - 15
OR STATS_DATE( i.id , i.indid ) IS NULL) --15일 이전까지도 업데이트 안된 것
ORDER BY Owner, [Table], [Index]
블로그 트랙백의 구현
이글은 트랙백의 기본개념보다는 windows + asp 환경에서의 기술적 구현을 위해 간단하게 작성된 소스입니다. 따라서 트랙백의 기본개념을 이해하신후 소스를 보시는것이 도움이 되실것입니다.또한 보다 확장적인 서비스를 위해서는 아래 소스외에 더 많은 부분을 추가하셔야 합니다.
1. 트랙백 핑 받기
<%
'변수 처리
bidx = Request("bidx")
strTitle = Request("title")
strExcerpt = Request("excerpt")
strURL = Request("url")
'콘텐츠 타입
Response.ContentType = "text/xml"
'변수 확인
If strURL="" or strTitle = "" or bidx = "" Then
Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>"
Response.Write "<response>"
Response.Write "<error>1</error>"
Response.Write "<message>Not Enough Arguments.</message>"
Response.Write "</response>"
Response.End
End If
'내 블로그에 글이 있는지 확인
If 해당글의수 = 0 Then
Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>"
Response.Write "<response>"
Response.Write "<error>1</error>"
Response.Write "<message>Not Exist Post.</message>"
Response.Write "</response>"
Response.End
End If
set rs = Server.CreateObject("ADODB.Recordset")
with rs
.Open trackback_table,접근문자열,adOpenStatic,adLockPessimistic,adCmdTable
.addnew
.fields ("글번호 필드명") = bidx
.fields ("주소 필드명") = strURL
.fields ("제목 필드명") = strTitle
.fields ("내용 필드명") = strExcerpt
.fields ("날짜 필드명") = now
.update
.close
end with
set rs = nothing
'정상적으로 완료되었으면 성공했다는 대답을 보내자.
Response.Write "<?xml version=""1.0"" encoding=""iso-8859-1""?>"
Response.Write "<response>"
Response.Write "<error>0</error>"
Response.Write "<message>TrackBack Success.</message>"
Response.Write "</response>"
%>
첫번째로 트랙백은 규정적으로 4개의 변수값을 전송합니다. 글제목(title),글주소(url),글내용(exerpt),블로그명(blog_name) 입니다. 여기서 필수요소는 url 입니다. 위 소스에서는 블로그명을 포함시키지 않았습니다. 그리고 글번호는 해당 글의 존재유무를 확인하기 위해 트랙백 주소에서 GET 형태로 받아옵니다.
두번째로 인코딩되는 xml 중 <error> 부분이 가장 중요합니다. 즉, error 값으로 트랙백 핑을 보낸쪽에다 대답을 하는 것입니다.0이면 성공이고 1이면 실패입니다. 그리고 <message>부분은 말그대로 추가설명입니다. 그리고 트랙백 핑은 POST 형태로 값을 받습니다. 받아오는 변수들을 Request.Form 형태로 정의해주는것이 더 좋을듯 하네요.
세번째로 위 소스에서는 간단한 xml 이라 굳이 xmlhttp 같은 xml 관련 서버 컴포넌트를 사용하지 않았습니다.
2. 트랙백 핑 보내기
<%
b_tb = "핑을 보낼 블로그 게시물의 트랙백 주소"
if b_tb <> "" then '만약 트랙백 주소가 입력되었다면 ..
' 여기서 부터 트랙백 처리
' 핑을 보낼 준비하자
x_Posturl = Server.URLEncode(나의 글의 고유주소)
x_BlogName = Server.URLEncode(나의 블로그명)
x_Title = Server.URLEncode(나의 글의 제목)
x_Excerpt = Server.URLEncode(나의 글의 내용)
Str_tb="title="&x_Title&"&url="&x_Posturl&"&excerpt="&x_Excerpt&"&blog_name="&x_BlogName
' 트랙백 핑을 보내자
set xml = server.CreateObject("msxml2.xmlhttp")
xml.open "POST", b_tb , false
' 몇가지 헤더처리
xml.setRequestHeader "Accept-Language","ko"
xml.setRequestHeader "Accept-Encoding","gzip, deflate"
xml.setRequestHeader "Content-Type","application/x-www-form-urlencoded"
xml.setRequestHeader "Connection","Keep-Alive"
xml.setRequestHeader "Cache-Control","no-cache"
xml.send (Str_tb)
' 트랙백 핑 성공여부
If InStr(1, xml.responseText, "<error>0</error>") Then
' 성공일경우 처리
Else
' 실패일경우 처리
End If
Set xml = Nothing
end if
%>
일반적으로 글의 저장 또는 편집시 사용하실수 있습니다. 그리고 Str_tb 변수 정의 하면서 POST 로 넘기는 변수명은 변경하시면 안됩니다. 또한 위 소스에서는 xmlhttp 컴포넌트를 이용하여 POST 형태로 핑을 전송합니다. 트랙백 핑의 성공여부는 받아온 xml 을 디코딩 하셔도 되지만 그냥 <error>부분만 체크하기 위해 instr 로 처리하였습니다. 추가적으로 <message> 부분도 체크하여 성공 또는 실패시의 메시지를 받아오실수도 있습니다. 간혹 핑 전송시 한글이 깨어진다는 질문이 있는데, 이 경우 UrlEncoding 을 시키지 않으셨을때가 가장많습니다. 그외에는 위와 같은 방법으로 무난하게 성공하실것 입니다.
출처 : 송준우 ( http://iendev.com http://iendev.nbloger.com )
블로그 XML RSS 리더의 구현
블로그에서 XML RSS 리더 개발에 관련한 간단한 예제입니다. 아주 기본적인 부분만 구현하였습니다. 보다 세부적인 사항은 RSS 버전별 특징을 참조하여 구체화 시키셔야 합니다. 아래 소스에서 처리되는 노드들은 item (개별 포스트) , title (제목) , link (고유링크) ,description (내용) 입니다.
XML RSS 를 보기좋게 보여주는 방법은 서버 차원에서 XML DOM 컴포넌트를 사용하여서도 가능하지만, CSS 나 XSL 로 클라이언트 차원에서도 바인딩 - 물론 웹브라우저 호환성 문제가 발생합니다만 - 이 가능합니다. 여기서는 전자의 방법을 사용하고자 합니다.
XML DOM 컴포넌트에 대한 구체적인 정보는 MSDN 에서 확인하실수 있습니다. 그리고 .NET & C# 으로의 구현은 taeyo.pe.kr 을 참조하여 주십시오.
<html>
<title>XML RSS 리더 예제</title>
<body>
<%
addr = "원하시는 XML RSS 주소"
Set XMLDOM = Server.CreateObject("Msxml2.Domdocument")
XMLDOM.setProperty "ServerHTTPRequest", true
XMLDOM.async = false
XMLDOM.load addr
If XMLDOM.parseError.ErrorCode <> 0 Then ' XML RSS 에 연결할수 없다면..
response.write ("XML RSS 를 읽어올수 없습니다.")
else '연결되었다면 ..
Set item = XMLDOM.selectNodes("//item") ' 포스트별 노드
Set title = XMLDOM.selectNodes("//item/title") ' 포스트 제목
Set description = XMLDOM.selectNodes("//item/description") ' 포스트 내용
Set link = XMLDOM.selectNodes("//item/link") ' 포스트 고유주소
For i = 0 to item.length-1 'item 노드의 개수만큼 반복
%>
제목: <b><%=title.item(i).text%></b><br>
링크: <%=link.item(i).text%><br><br>
<%=description.item(i).text%>
<br><br>
<%
next
end if
%>
</body>
</html>
출처 : 송준우 ( http://iendev.com http://iendev.nbloger.com )
블로그 XML RSS구현
사실 RSS 를 구현할때 사실 단순히 텍스트 파일로 뿌려주고 ContentType 만 xml 로 선언해줘도 가능합니다. 그러나 조금은 다르게 해보고 싶다는 저의 호기심도 있고, 확장성과 향후 유지보수에 조금이라도 더 손쉽게 하기위해서 윈도우즈 2000 에 기본제공되어 있는 XML 관련 컴포넌트를 이용하여 구현해보았습니다. 물론 아래 소스는 지금 제 블로그 RSS 의 원형이 되고 있습니다.
한가지 주의 하실점은 XML 선언전에 어떠한 개행(\n) 이나 문자가 들어가서는 안됩니다. PHP 에서의 쿠키과 마찬가지 입니다.
<?xml version="1.0" encoding="EUC-KR" ?>
<%
Response.ContentType = "text/xml"
Set xmlPars = Server.CreateObject("Msxml2.DOMDocument")
' 여기서 부터 rss 정보를 담는다.
Set rss = xmlPars.CreateElement("rss")
rss.setAttribute "version", "2.0"
rss.setAttribute "xmlns:dc", "http://purl.org/dc/elements/1.1/"
rss.setAttribute "xmlns:sy", "http://purl.org/rss/1.0/modules/syndication/"
rss.setAttribute "xmlns:admin", "http://webns.net/mvcb/"
rss.setAttribute "xmlns:rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlPars.AppendChild(rss)
'<channel> 시작
Set Channel = xmlPars.CreateElement("channel")
rss.AppendChild(Channel)
'<title>정보
Set title = xmlPars.CreateElement("title")
Channel.AppendChild(title)
Channel.childnodes(0).text = "블로그 제목"
'<link>정보
Set channel_link = xmlPars.CreateElement("link")
Channel.AppendChild(channel_link)
Channel.childnodes(1).text = "블로그 주소"
'<description>정보
Set description = xmlPars.CreateElement("description")
Channel.AppendChild(description)
Channel.childnodes(2).text = "블로그 설명"
'<dc:language>정보
Set language = xmlPars.CreateElement("dc:language")
Channel.AppendChild(language)
Channel.childnodes(3).text = "ko"
'<image>정보
Set image = xmlPars.CreateElement("image")
Channel.AppendChild(image)
'이미지 정보에 들어갈 것들
set i_title = xmlPars.CreateElement("title")
set i_url = xmlPars.CreateElement("url")
set i_width = xmlPars.CreateElement("width")
set i_height = xmlPars.CreateElement("height")
image.AppendChild(i_title)
image.AppendChild(i_url)
image.AppendChild(i_width)
image.AppendChild(i_height)
image.childnodes(0).text = "이미지 제목"
image.childnodes(1).text = "이미지 경로"
image.childnodes(2).text = "이미지 가로 사이즈"
image.childnodes(3).text = "이미지 세로 사이즈"
' 여기서 부터는 포스트에 대해서 출력
' 우선 데이터를 읽어오자
SQL = "해당되는 포스트에 대한 쿼리문"
set rs = Server.CreateObject("ADODB.Recordset")
rs.Open SQL,접근문자열,adOpenForwardOnly,adLockPessimistic,adCmdText
' 여기서 부터 루프를 돌리자.
Do until rs.EOF
'<item> 이라는 노드를 추가
Set item = xmlPars.CreateElement("item")
Channel.AppendChild(item)
' 여기서부터 해당 포스트의 세부 정보를 출력
set title = xmlPars.CreateElement("title") '
set link = xmlPars.CreateElement("link")
set description = xmlPars.CreateElement("description")
set dcdate = xmlPars.CreateElement("dc:date")
set dcsubject = xmlPars.CreateElement("dc:subject")
item.AppendChild(title)
item.AppendChild(link)
item.AppendChild(description)
item.AppendChild(dcdate)
item.AppendChild(dcsubject)
item.childnodes(0).text = rs("제목필드")
item.childnodes(1).text = rs("포스트 고유 url 필드")
item.childnodes(2).text = rs("내용 필드")
item.childnodes(3).text = rs("날짜 필드")
item.childnodes(4).text = rs("포스트의 분류 필드")
rs.movenext
loop
' 마지막으로 최종적으로 뿌려주자.
Response.Write xmlPars.xml
'마무리 ^^;
rs.close
set rs = nothing
Set xmlPars = nothing
%>
출처 : 송준우 ( http://iendev.com http://iendev.nbloger.com )
Static SQL
JSP환경에서는 많이 봐왔는데 ASP에서도 쓰는군요.
근데 이것은 Oracle에서만 효과를 보는건지. 함 찾아봐야겠군요.
현재는 MS-SQL에 적용을 해봣는데 아직까지는 아무이상이 없네요. ㅎㅎ
김영준(poo97@nownuri.net)님의 글을 퍼왔습니다.
==============================================
만약 Static SQL을 잘 쓰신다면 일반적으로 잘 알려진 방법
ASP에서 Stored Procedure보다 더 나은 성능을 얻게 되실 수 있으리라 장담합니다.
글구 DB를 오라클로 쓰시는 분들께 정말 권해드리고 싶습니다.
(Oracle과 MTS는 뻑(bug)가 있다나요..)
자 다음과 같은 순서로 강의를 진행하려고 합니다.
1. Static SQL에 대해
2. Static SQL이 왜 빠를까?
3. 실질적인 Static SQL에 대해
4. Static SQL을 마치며..
그럼 1단원을 시작해볼까요...
아 참 전 ASP와 Oracle기준으로 이 강좌를 진행해나가겠습니다.
(이 점 유의하시길.)
1.Static SQL에 대해
*.Static SQL이 무엇일까?
우리는 일반적으로 쿼리를 작성합니다.
만약 아래와 같은 테이블이 있다고 생각을 해보죠.
(예)
CREATE TABLE employee
(
empno varchar2(4) primary key, /* 사원번호 컬럼 */
empname varchar2(20) not null, /* 사원이름 컬럼 */
empaddr varchar2(200) not null, /* 사원주소 컬럼 */
empcphone varchar2(11), /* 사원핸드폰 컬럼 */
empstatus varchar2(1) /* 사원상태 컬럼 */
);
위와 같은 사원테이블이 있을 때 사번이 44번인 사람의 정보를 보고 싶다고 한다면 보통 이런 식으로 쿼리를 만들 것입니다. -_-;;
(ex)SELECT * FROM employee WHERE empno = '44'
만약 사번이 45인 사람의 정보를 보고 싶다면 위의 SQL에서 마지막비교되는 상수값이 44에서 45로 바꿜 것입니다.
(SQL1)SELECT * FROM employee WHERE empno = '44'
(SQL2)SELECT * FROM employee WHERE empno = '45'
그런데 데이터 베이스에서는 불행히도 SQL1과 SQL2를 서로 다른 Query로 보고 이것을 새롭게 파싱하고 DB의 Shared Pool에는 SQL1과 SQL2가 각각 다른 내용으로써 저장됩니다.
(참고: Shared Pool이란 컴퓨터에서 Cache Memory와 유사한 것으로 컴퓨터에서 어떤 프로그램을 실행시킬 때 필요한 데이터를 Memory에 올려서 쓰는데 그 내용중 일부는 cache memory라는 곳에 저장되어 만약 어떤 데이터의 요청이 일어난다면 cache memory를 먼저 찾아보고 내용이 없다면 memory에서 다시 찾아서 cache memory로 올리는 방식과 아주 유사합니다.
Shared Pool은 DB에서 사용자가 실행한 SQL문이 저장되는 영역입니다. 그러므로 만약 사용자가 SQL1을 사용하고 이것을 다시 사용한다면 DBMS는 Shared Pool에서 먼저 동일한
SQL이 존재하는지 찾고 나서 존재한다면 이미 파싱해놓은 내용을 가져오고 그렇지 않다면 다시 파싱을 하게 됩니다. )
SQL1과 SQL2는 거의 동일한 문자열과 빈칸등으로 되어 있지만 empno를 비교하는 상수가 다르므로 각각 다른 SQL이 됩니다.
그렇다면 SQL1과 SQL2를 동일한 SQL로 만들려면 어떻게 하면 될까요??
앗 벌써 눈치를 채신 분들이 계시군요..
그렇습니다.
(SQL3)SELECT * FROM employee WHERE empno = :inputnum
위와 같은 SQL로 대치될 수 있겠죠..
비교되는 상수값의 위치에다가 변수를 넣는거죠..
('무하하하, 난 역쉬 똑똑해!'라고 자만하시는 분들 있으시겠죠..)
(똑똑하십니다. d_(-_-;;) (GOOD) )
근데 위와 같은 SQL은 토드나 SQL*PLUS에서는 사용할 수 있지만 일반적인 ASP나 VB에서는 사용이 불가능하답니다.
그래서 ASP에서 지원하는 방식으로 변수를 선언해야겠죠..
여기서 잠깐...
유식해지기 위해서 고급적인 단어 몇 개를 배워보기로 하죠. (제가 전 직장에서 같이 일한 과장님과 강남에서 술을 먹는데
그 분이 외국계회사에서 일을 하시는지라 공부를 빡시게 하셔서 엄청 고급약어(?) 들을 쓰시는데 뽀대있어 보이더군요..
아직도 그 단어들에 대해서는 정확한 이해가 ~~~~~ 쿨럭.... 윤과장님 죄송해유... -_-;;;)
위의 :inputnum이라고 선언한 것은 parameter binding이라고 합니다.
parameter binding하니까 프로그래밍 언어론 시험칠 때 열씨미 외웠던 기억이... 제가 실력은 미진해도 무늬는 컴공이거든요.. 쿨럭-_-;;)
(참조) 이렇게 파라미터 바인팅 변수를 사용하는 SQL을 대용량데이터베이스책에서는 Static SQL이라고 명명하고 있습니다.
이것의 원리는 SQL1과 SQL2는 상수가 empno를 비교하는 값에 실제 상수가 들어가 있는데 반해 이것은 메모리의 주소값이 들어가 있다나요...(Maybe... ^_^;;)
전 옛날에 배운 C의 Pointer가 생각이 나더군요..
포인터 변수 쓰면 그곳에다 어떤 값들을 넣을 수 있잖아요..
(좀 유사하다고 생각하지 않으세요?--> 아니라고 생각하신다구요.. 그럼 말구..)
3. 실질적인 Static SQL에 대해 Static SQL을 쓰기위해서는 ADODB의 Command객체를 사용해야 합니다.
갑자기 깜찍이님의 Stored Procedure강좌가 생각이 나는군요..
CREATE TABLE employee
(
empno varchar2(4) primary key,
empname varchar2(20) not null,
empaddr varchar2(200) not null,
empcphone varchar2(11),
empstatus varchar2(1)
);
강좌 1에서 사용하던 employee 테이블이죠..
(잊어버리셨을까 해서 다시 보여드립니다.
저 착하죠.. ^.^ )
<% Option Explicit %>
<!-- #include virtual = "/include/adovbs.inc" -->
<%
Dim ConObj, DbCmd, InsSql
'(1)
Set ConObj = Server.CreateObject("ADODB.Connection")
ConObj.Open "test","scott", "tiger"
'(2)
Set DbCmd = Server.CreateObject("ADODB.Command")
Set DbCmd.ActiveConnection = ConObj
'(3)
InsSql = "INSERT INTO employee(empno, empname, empaddr, empcphone, empstatus) " &_
"VALUES(?, ?, ?, ?, ?)"
'(4)
with DbCmd
.CommandText = InsSql
.CommandType = adCmdText
'(5)
.Parameters.Append .CreateParameter("@empno", adVarChar, adParamInput, 4)
.Parameters.Append .CreateParameter("@empname", adVarChar, adParamInput, 20)
.Parameters.Append .CreateParameter("@empaddr", adVarChar, adParamInput, 200)
.Parameters.Append .CreateParameter("@empcphone", adVarChar, adParamInput, 11)
.Parameters.Append .CreateParameter("@empstatus", adVarChar, adParamInput, 1)
'(6)
.Parameters("@empno") = "0001"
.Parameters("@empname") = "김영준"
.Parameters("@empaddr") = "부산시 서구 남부민동"
.Parameters("@empcphone") = "01101011010"
.Parameters("@empstatus") = "1"
'(7)
.Execute
End with
'(8)
Set DbCmd = Nothing
Set ConObj = Nothing
%>
자 위의 예제 소스를 보고는 어떤 느낌이 드시나요..
아니 이 놈이 뭐가 있는 것처럼 뻥만 치더니 알고 보니 아무것도 아니잖아.
뭐 그렇게 생각하셔도 할 수 없습니당. -_-;;;
자 그럼 순서대로 설명을 해볼까요.
아 참 먼저 간단한 팁 하나와 Static SQL을 꼭 해주어야 할 것들을 대해서 설명하겠습니다.
팁: Option Explicit를 꼭 사용하세요.
메모리 관리에도 좋구 변수 사용시 짱입니다요.
Static SQL사용하기 전에 먼저 adovbs.inc파일을 꼭 include해주셔야 합니다.
(왜냐구요, Command객체에서 사용되는 상수들이 adovbs.inc파일안에 모두 들어가 있기 때문에 꼭 필요합니다.)
(1)은 당근 DB에 컨넥션을 맺는것이죠.. (먼저 ODBC를 잊지 말고 세팅해주어야겠죠..)
(2)는 Command객체를 생성해야겠죠.. (왜냐구요.. Static SQL은 Command객체를 사용해서만이 지원이 가능하거든요..)
(3)변수선언해서 여기다가 Static SQL을 변수에다 저장해줍니다.
여기서 중요한 것은 Binding Parameter인데 눈치채셨겠지만 당연히 '?'입니다. 실망하셨다구요. 어쩔 수 없죠. 히 (@_@);;;;
(4)그런 다음 With DbCmd라는 것을 쓰는데 이것은 With DbCmd와 End With내에서는 DbCmd의 property들을 사용하는 거죠..
CommandText는 말 그래도 명령문장인데 여기다가 위에서 변수에다 저장한 SQL을 넣어주죠..
(참고) .CommandText = "INSERT INTO employee(empno, empname, empaddr, empcphone, empstatus) " &_
"VALUES(?, ?, ?, ?, ?)"
위와 같은 방식으로 (3)부분을 생략하고 바로 SQL을 적어줄 수도 있습니다.
CommandType이 있는데요.
깜찍이님 강좌보신분들은 아실텐데요.
이 부분에다가 adCmdStoredProc를 쓰면 스토어드 프로시져 쓸 수 있다는 것 아시죠.
(다들 공부를 열씨미 하시니까 다 아실꺼에요.)
저처럼 adCmdText를 사용하시면 그냥 SQL을 사용하실 수 있습니다.
예를 들자면
with DbCmd
.CommandText = "INSERT INTO employee(empno, empname, empaddr, empcphone, empstatus) " &_
"VALUES('0001', '곰탱이', '서울시 서초구 양재동', '0111010101', '1')"
.CommandType = adCmdText
.Execute
End With
굳이 Static SQL을 쓰지 않으신다면 위와 같이 Command 객체를 사용해서 Query를 실행시키시지 마시길...
(왜냐하면 소스만 쓸데없이 길어지니까요..)
(5)Binding Parameter들의 변수타입과 사이즈를 정해주는 부분입니다.
일반적인 SQL을 실행시키는 것보다는 asp소스가 길어지죠..
그러나 성능향상을 위해서 소스 몇 줄이 길어지는 것은 감수를 해야죠.
눈치가 빠르신 분들은 이미 눈치채셨겠지만요..
@empno라고 해놓은 것을 볼 수 있습니다. DB테이블의 empno컬럼이 위치할 자리에 들어갈 Binding Parameter라는 것을 알리는 것이죠.
이런 걱정을 하시는 분들이 있겠죠.
만약 똑같은 이름의 변수를 써야 하면 어떻게 하냐고
(예) SELECT empname
FROM employee
WHERE empno = ?
AND empno = ?
위와 같은 경우에는 바인딩 파라미터를 어떻게 설정해야 할까요?
저의 입사동기인 창현씨가 정답을 알아냈습니다.(사실 제가 입사일짜는 며칠이 빠릅니당. 무하하)
For i = 0 To 1
.Parameters.Append .CreateParameter("empname"&CStr(i), adVarChar, adParamInput, 20)
Next
위와 같이 골뱅이를 빼버리면 대입해주는 파라미터 순서대로 바인딩 파라미터가 세팅이 됩니다.
앗 3편까지 쓰는데 4시간이 걸리는군요..
(휴 힘들군요.. 시원한 아이스크림이라도 먹었으면)
(6) (5)에서 바인팅 파라미터을 세팅했다면 그에 대한 값들을 넣어주어야겠죠.
(5)번에서 예로 들었던 Static SQL에 대해서 바인딩 파라미터 값넣어주는 방법입니다.
For i = 0 To 1
.Parameters("empname"&CStr(i)) = CStr(emp(i))
Next
(주의)'@'을 사용하지 않고 바인팅 파라미터 세팅을 해줄때는 순서가 무척 중요합니다.
주의하시길...
(7)그런 다음 .Execute로 실행을 해주시면 됩니다.
그런데 만약 우리가 사용하고자 하는 SQL이 Select문이었다면 어떻게 될까요?
그럼 어떻게 해서 값을 가져와야 될까요?
만약 SELECT문을 Static SQL로 쓰는 경우 .Execute문을 밖으로 빼어냅니다.
그런 다음 Set ObjRecSet = DbCmd.Execute라고 설정하면 SELECT문에서 반환된 SQL문의 결과값이 ObjRecSet으로 저장되겠죠..
그런 다음 지지고(?) 볶으면 되겠죠..
(8)아 힘드셨죠.
마지막 Set DbCmd = Nothing입니다.
이 놈의 Command객체가 재사용이 불가능하다는 것을 알았습니다.
Static SQL을 하나 쓰고 나서는 Nothing해주고 나서 다시 (1)에서 (9)까지의 과정을 다시 거치셔야 합니다.
이 과정이 약간 번거로워서 그렇지 DB쪽에 걸리는 부하는 현저히
줄어들게 됩니다.
(큰 사이트일 경우 더욱 더 빛을 발하겠죠..)
[행경]고객 감소원인
12월 04일에 온 행경메일인데 가슴속에 계속 남을꺼 같네요.
고객 감소 원인
어느 마케팅 조사에 따르면 고객 감소 원인 중
사망(1%), 이사 (3%), 단골이 없는 경우(4%), 주위의 권유(5%),
가격(9%), 만성적 불평고객(10%)등이 차지하는 비중은 32%이다.
나머지 68%는 고객에 대한(세일즈맨의) 무관심 때문에
다른 거래처를 찾는다.
- 박형미 화진화장품 부회장 칼럼 중
servlet Eclipse 설정
- TOMCAT\common\lib\servlet-api.jar 을 이클립스 lib폴더 생성후 파일 복사
- 이클립스 프로젝트 생성 (라이브러리 폴더에서 Extenal JARs에서 방금 복사한 파일 연결후 Finish
- package 생성(servlet.test) -> class 생성 (HelloServlet)
package servlet.text;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;public class HelloServlet extends HttpServlet
{
public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException
{
//출력시 사용할 문자셋 지정
res.setContentType("text/html;charset=euc-kr");
//출력시 사용할 객체 생성
PrintWriter pout = res.getWriter();
//문자열 변수 선언
String str1 = "서블렛 수업입니다.";
//태그의 출력
pout.println("<html>");
pout.println("<head>");
pout.println("<title>Hello</title>");
pout.println("</head>");
pout.println("<body>");
pout.println("<table width=400 height=200 bgcolor='99FF66'>");
pout.println("<tr><td align='center' valign='center'>");
pout.println("<font color='blue'><h2>");
pout.println("Hello " + str1);
pout.println("</h2></font>");
pout.println("</td></tr></table>");
pout.println("<br>");
pout.println("<table width=400 height=200 bgcolor='99FF66'>");
pout.println("<tr><td align='center' valign='center'>");
pout.println("<font color='blue'><h2>");
pout.println("JSP 수업 중입니다.");
pout.println("</h2></font>");
pout.println("</td></tr></table>");
pout.println("<br>");
pout.println("<table width=400 height=200 bgcolor='99FF66'>");
pout.println("<tr><td align='center' valign='center'>");
pout.println("<font color='blue'><h2>");
pout.println("왕눈이의 Servlet Test 입니다.");
pout.println("</h2></font>");
pout.println("</td></tr></table>");
pout.println("</body>");
pout.println("</html>");
}
}
- 이클립스에서 저장한 파일은 workspace에 저장이 되어진다. (src, bin 폴더)
- 환경 설정 (tomcat\con\web.xml)
. Line 99 ~ 111 (invoker를 이용하여 모든 서블릿을 호출할 수 있는 서블릿을 지정합니다.)
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
. 톰캣이 설치된 폴더의 conf 폴더에서 web.xml의 350~355번근처 라인을 아래와 같이 수정합니다.
. Servlet을 URL상에서의 접근 경로명을 지정합니다.
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
. Line 211을 아래 처럼 수정한다
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>modificationTestInterval</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>development</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>reloading</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
. workspace 의 bin\servlet 파일을 webapps\WEB-INF\classes 하위로 복사
. 도메인/폴더/servlet/패키지명.파일명(servlet.text.HelloServlet)
JDK + TOMCAT
- JDK 1.5.0_10
. 삭제할경우 1.5이상은 프로그램 추가/삭제에서 삭제
. 1.4버전이하는 프로그램 추가/삭제후 regedit에서 LOCAL_MACHINE -> SOFTWARE -> javasoft 삭제
. 환경설정
- PATH 에 JDK 설치 경로입력 (C:\jdk1.5.0\bin)
- 오라클 9i설치된 경우 오라클에 내장된 jre1.3.1, jre 1.1.8이 인식이 됨으로 이것을 PATH에서 삭제
- CLASSPATH에 .;C:\jdk1.5.0\lib\tools.jar 입력
- cmd창에서 java -version, echo %path%, echo %classpath% 확인
- TOMCAT 5.5.20
. \confg\server.xml Line 77 포트번호 변경 같은 곳에 URIEncoding="KSC5601" 삽입
(get방식으로 넘어오는 값을 사용할수있게)
. Editplus (파일명은 ***.cmd or ***.bat)
SET JAVA_HOME=C:\jdk1.5.0
SET TOMCAT_HOME=D:\java_저녁반\tomcat-5.5
SET CATALINA_HOME=D:\java_저녁반\tomcat-5.5
SET Path = %Path%;D:\java_저녁반\tomcat-5.5\bin
D:
CD D:\java_저녁반\tomcat-5.5\bin
startup.bat
. /conf/tomcat-users.xml 수정
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="admin"/>
<role rolename="manager"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
<user username="knit" password="tomcat" roles="manager,admin"/>
</tomcat-users>
. http://localhost:포트번호 좌측 상단에서 tomcat Manager에서 knit/tomcat으로 접속
tomcat-users.xml은 위처럼 로그인하기위해서 수정
. webapps 에 폴더를 만든다
폴더 구조
jsptest ─┬─ WEB-INF ─┬─ classes (클래서파일, 서블릿, Beans파일)
│ └─ lib (배포파일 라이브러리)
└ JSP 파일, css, common, js 파일등
. WEB-INF 파일 수정시에는 어드민에서 반드시 Reload
. 컴파일된 파일 (***.jsp파일이 처음 실행되는 시점)은 \work\Catalina\서버\작업폴더\에 위치
한번 컴파일된 파일은 수정이 일어나기전까지 캐쉬에 저장되어있음
. 기본 페이지 (test.jsp)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> New Document </title>
<%
String strName = "JSP TEST PAGE";
%>
</head><body>
<%=strName%>
</body>
</html>