달력

12025  이전 다음

  • 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

KSUG/자바지기 공동 주체 세미나를 진행했을 때 다음과 같은 질문을 받은 기억이 있다.

"지금 발표하고 있는 내용이 N사와 같은 곳에서만 가능하지 않을까요. SI 프로젝트에서는 힘들다고 생각하는데요. 어떻게 생각하시는지요?".

이와 같은 질문을 받고 나 또한 확신에 찬 답변을 하지 못했다.

"지금 세미나를 하는 것처럼 조금씩 변화시켜 나간다면 언젠가는 할 수 있지 않을까요? 작은 변화이지만 지금부터 만들어 나갔으면 좋겠습니다. 여러분 개개인이 변화하려는 노력을 보여주시면 좋을 것 같습니다."

정 확하게 기억이 나지 않지만 이와 같이 답변을 했던 것으로 기억한다. 나 또한 SI 프로젝트에서 애자일 프로세스를 적용하고 지속적 통합툴(CI)을 사용해본 경험이 없었기 때문이다. 현재 내가 일하고 있는 곳은 계약 관계에 의해서 프로젝트를 진행하는 것이 아니라 프로젝트에 참여하는 모든 구성원들이 같은 회사 사람이기 때문에 개발 프로세스를 선택하거나 개발 환경을 세팅하는 부분에 있어서는 자유로운 부분이 있다. 물론 그렇다고 완전히 자유로운 것도 아니다. 조직이 대규모화되면서 점차 정해진 프로세스에 따라 진행해야하는 부분도 많다. 하지만 계약 관계에 있는 SI 프로젝트보다는 새로운 시도를 해볼 수 있는 환경이 아직까지는 남아 있는 것이 사실이다.(개인적인 생각으로 몇년 이내에 이러한 자유조차 없어질 가능성도 있다.)

세미나가 끝나고 한 동안 다른 업무에 치이면서 잊고 지냈다. 그러던 중 "린 소프트웨어 개발:애자일 실천 도구 22가지 - 애자일 시리즈 003" 책을 다시 읽으면서 위 질문에 대한 해답을 어렴풋하게나마 찾을 수 있었다. 내가 직접 경험한 내용은 아니지만 이 책을 쓴 필자들을 신뢰하고 있기 때문에 충분히 소개할만하다고 생각한다.

SI 성으로 진행하는 국내 대부분의 프로젝트와 포털, 솔루션 개발 업체의 가장 큰 차이점은 계약 관계를 맺고 있느냐 그렇지 않느냐의 차이에 달려 있다. 포털이나 솔루션 개발 업체는 계약관계없이 프로젝트를 진행하는 경우가 대부분이기 때문에 프로젝트에 가장 적합하다고 판단되는 개발 프로세스와 개발 환경을 만들어 프로젝트를 진행할 수 있다. 특히 애자일 프로세스가 가능한 이유는 우선순위에 따라 개발을 진행하는 것이 가능하며, 우선 순위가 낮은 경우에는 다음 버전으로 미룰 수 있는 타협점이 있다는 것이다.

물 론 SI 프로젝트 또한 이 같은 타협점을 찾는 것이 가능하지만 계약관계에 있기 때문에 힘든 것이 사실이다. 특히 국내 소프트웨어 개발 환경에서는 갑의 한마디로 인해 무수히 많은 부분이 한순간에 뒤바뀌어 버릴 수 있다는 것이다. 불합리한 부분이 있음에도 불구하고 주종관계에 있기 때문에 을,병 입장에서는 거절하기 힘든 것이 사실이다. 국내에서 진행하는 많은 SI 프로젝트들이 성공이라는 이름으로 포장을 하고 있지만 뚜껑을 열어보면 80~90% 이상이 실패한 프로젝트일 것이라 생각한다. 물론 근거 자료를 제시하라고 한다면 제시할 근거는 없다. 어디에도 실패했다고 이야기하는 프로젝트를 본적이 없기 때문이다. 그러나 내가 참여했던 많은 프로젝트들이 성공했다고 포장은 했지만 실상은 실패했다고 생각하기 때문이다. 갑과 을이 서로간의 책임을 지지 않기 위하여 성공이라는 이름으로 포장하기 때문에 어쩔 수 없이 발생할 수 밖에 없는 상황이라고 생각한다.

어차피 성공이라는 이름으로 포장을 하지만 프로젝트 오픈후에 무수히 많은 밤을 지세우면서 고생하는 개발자들을 생각하면 마음이 아프다. 또한 1차로 끝나지 않고 2차, 3차, 4차로 이어지는 Never Ending 프로젝트들 또한 발생하고 있는 것이 사실이다.

계약 직 개발자로서 지내던 시간이 생각나 잠시 삼천포로 빠졌다. 다시 본론으로 들어가서 SI 프로젝트에서 애자일 프로세스를 적용하기 위하여 필요한 부분은 현재의 계약 방식을 바꿔야 한다는 것이다. 지금은 프로젝트의 요구사항도 분석하지 않은 상태에서 계약이 이루어지는 경우가 대부분이다. 그러나 이런 상태에서 어떻게 제안을 하고 계약을 맺을 수 있겠는가? 이와 같이 계약이 이루어질 경우 갑은 정해진 기간과 금액 내에서 최대한 많은 기능을 요구할 것이 뻔하며, 을은 갑의 요구사항에 최대한 방어하면서 더 빠른 기간내에 프로젝트를 완료해야 자신의 이익을 증가시킬 수 있는 것은 명백한 사실이다. 이와 같은 상황이기 때문에 프로젝트 PM 능력이 변경 가능성을 최대한 방어하고 고객의 요구사항을 최대한 잘라버릴 수 있는 능력으로 판단되는 경우가 대부분이다. 물론 개발자들을 얼마나 늦게까지 퇴근시키지 않고 최대한 빨아 먹을 수 있을때까지 최대한 빨아 먹을 수 있는 것을 능력으로 생각하는 몰지각한 PM들도 많이 있다. 그런 PM들에게는 엿이나 먹고 떨어지라고 한마디 하고 싶다.

린 소프트웨어 개발 책의 242~264페이지까지 이 책의 마지막 실천 도구인 22번째 계약에 관련한 내용이 나온다. 이 책에서는 계약의 종류를 고정 가격 계약(현재 국내에서 가장 많이 이루어지는 계약 형태), 시간 자재 계약, 단계적 계약, 목표 비용 계약, 목표 일정 계약, 이익 공유 계약으로 분류하고 있다. 이 책을 두번째 읽고 있지만 이렇게 많은 계약의 종류가 있는지 처음 알았다. 사실 첫번째 책을 읽을 때는 계약이 나와 관계 없는 일이라 생각하고 무시하고 넘어갔던 것 같다. 하지만 두번째 읽으면서 세미나 때의 질문에 대한 해답이라는 생각이 들면서 더 관심을 가지면서 읽을 수 있었다.(질문을 주신분께 개인적으로 감사의 말을..)

이 책에서는 애자일 프로세스에서 사용할 수 있는 계약 형태를 다음과 같이 보고 있다.

  • 시간 자재 계약은 동시 개발 방법을 쓰며, 가장 우선 순위가 높은 기능을 먼저 개발하고 동작하는 통합 코드를 각 반복 주기에서 전달하여 고객이 범위를 제한함으로써 비용을 쉽게 조정할 수 있게 하는 방법이다.
  • 단계적 계약은 주계약을 이용하여 각 반복주기에서 릴리스하게 한다. 동시 개발에서 중점을 두는 것처럼 각 단계에서 높은 우선순위 기능을 먼저 개발하고 동작하는 통합 코드를 각 반복 주기에서 전달하는 방법이다.
  • 목표 비용 계약은 양측의 일선 작업자에게 목표 비용을 맞추는 선에서 문제에 대한 해결책을 찾는 데 서로 협력할 수 있는 권한을 부여하고, 비용 안에서 목표를 달성하기 위해 범위를 제한할 자유를 부여하는 것이 기본 메커니즘인 방법이다.
  • 이익 공유 계약은 시간이 지남에 따라 상호 이익을 위해서 양측이 하는 일을 수정할 수 있다는 가정 하에 이루어진다.
린 소프트웨어 263페이지에서..


위 네가지 방법 중에서는 이익 공유 계약이 갑과 을 모두의 이익을 보장할 수 있으며, 프로젝트를 성공으로 이끌 수 있는 것으로 소개하고 있다. 물론 프로젝트의 성격에 따라 달라질 수도 있겠지만서도..위 네가지 계약 형태의 공통점은 모두 범위를 상세하게 결정하지 않은 상태로 계약을 맺는다는 것이다. 이는 돈에 대한 결정을 최대한 늦추는 형태를 가지는 것이다.

국내에서 위와 같은 형태의 계약 방식이 가능할까? 물론 선도적인 기업들은 위와 같은 형태의 계약을 통해서 높은 가치를 발휘하는 소프트웨어를 만들어낼 것이다. 그러나 단기적인 이익에만 집착하는 국내의 대다수 회사들은 꿈도 꾸지 못할 계약 방식일 것이다. 이미 이와 유사한 계약 형태를 한 경험이 있거나 하고 있다면 이 글의 트랙백을 통하여 자랑스럽게 소개하기 바란다. 아마도 국내의 좋은 개발자들이 해당 프로젝트에 지원하지 않을까 생각한다. 현재의 하청 구조의 프로젝트 진행 방식에서는 더더욱 힘든 계약 형태이며, 을에 해당하는 대형 SI(S사, L사, C사 등등) 업체들은 이런 형태의 계약을 하고 싶은 욕심 또한 없는 듯 싶다. 대형 SI 업체들이 그런 변화를 원했다면 국내 개발자들에게도 많은 혜택이 있었을 것으로 생각하나 온라인 상의 어느 곳을 찾아봐도 위와 유사한 계약 사례를 찾아볼 수 없다는 것이 안타깝다.

갑 또한 변화할 필요가 있다. 지금까지의 계약 형태인 고정 가격 계약으로 진행한 프로젝트들에 만족하는가? 아마 대부분 만족하지 못할 것이다. 만족하지 못하는 것은 문제가 있는 형태로 계약이 맺어졌기 때문이다. 자신들이 진정 원하는 소프트웨어를 만들고 싶다면 갑이 나서서 다른 형태의 계약을 하는 것도 좋은 선택이 될 것이다. 그런 변화의 자세없이 기존의 관행을 반복한다면 영원히 만족하는 소프트웨어를 볼 수 없을지도 모른다. 현재 자리를 좀 더 오래 지키고 싶다면 기존의 계약 형태를 바꾸기 위하여 노력해보라. 좋은 소프트웨어 개발을 통한 회사의 효율성 증대는 회사내에서 자신의 생명을 연장시켜 줄 것이다. 지금까지의 관행을 실천하기는 쉬울 것이다. 그러나 회사내에서 그저 그런 사원이 될 것이며, 그저 그런 회사로 남을 수 밖에 없을 것이다. 개떡 같은 소프트웨어를 만들고 싶지 않다면 갑 너 자신부터 변화하는 모습을 보여라.(오해할지 모르지만 현재 나 또한 갑이다. 물론 계약관계를 맺는 경우는 거의 없지만..)

개발 자들이 생각할 부분은 고정 가격 계약으로 맺어진 프로젝트에 섣부르게 애자일 프로세스를 적용하지 마라. 괜시리 적용했다가 모든 책임을 혼자 뒤집어 쓸수도 있다. 개발 환경을 자동화하는 부분에 있어서는 적극적으로 찬성하지만 애자일 프로세스의 적용에서는 다소 소극적인 입장을 취하고 싶다. 개발자들이 피해보는 상황은 만들고 싶지 않기 때문이다. 애자일 프로세스를 적용하고 싶지만 적용하지 못하는 것을 자신의 능력 부족 탓으로 돌리지는 말았으면 좋겠다. 개떡 같은 갑과 개떡 같은 을..그리고 개떡 같은 시대에 태어났기 때문에 겪는 문제이거니 생각하면 좋을거 같다. 하지만 그런 속에서도 지속적으로 변화를 만들어가고자 한다면 조금씩 변화의 모습은 나타나지 않을까? 개발자들이 언젠가는 관리자가 될 것이며, PM이 될 것이며, 갑이 될 수도 있기 때문이다.

개 떡 같은 환경을 탓하는 것도 좋지만 문제에 봉착했을 때 해결하려고 하지 않은 개떡 같은 우리들의 자세 또한 비판해 보기 바란다. 다른 사람들이 변화를 만들어주기 바라기 전에 자기 자신이 변화를 만들어가는 사람들이 많아졌으면 하는 바람이다. 그럼 나는 뭐하고 있냐고? 나 또한 개떡같은 내 자신을 비판하면서 좀 더 적극적으로 변화를 만들어 가려고 노력하고 있다.

PS. 언제나 갑이 될 수는 없을진데, 언제인가는 병이 될 수도 있을진데..오늘 갑과 을을 너무 씹었다. 아무래도 내가 갑의 자리에서 물러날 때는 이 글을 살포시 삭제해야 될까?  이런 글 하나 때문에 나와 같이 일하지 않는다면 나 또한 같이 일하고 싶지 않다. 분명 그네들은 개떡 같은게 아니라 개똥같이 쪼잔한 성격의 소유자들일 것이 분명하기 때문에..

'java' 카테고리의 다른 글

Java POI 예제소스  (0) 2008.08.26
jdbc 1.0 ~ 3.0  (0) 2008.08.05
HTTPClient 3.0  (0) 2008.07.25
URLConnection 와 HTTPClient  (0) 2008.07.25
javac 옵션  (0) 2008.07.09
Posted by marryjane
|

http://www.ibm.com/developerworks/kr/library/os-eclipse-ganymede/

가니메데에 포함된 프로젝트

이클립스 생태계는 크고 때론 위압감이 느껴지는 곳이다. 이클립스에는 90개 이상의 프로젝트가 진행 중이고, 가니메데 배포판은 단지 특정 시점에서 그 프로젝트들을 모아 놓은 것일 뿐이다. 가니메데 배포판은 이클립스 기술을 소개하기 위한 것이고, 또, 이클립스를 활용하는 사람들이 이클립스 기술을 자신들의 제품에 통합하는 데 도움을 준다. 가니메데 프로젝트에 대해 더 알고자 하면 다음 링크들을 살펴보기 바란다. 아니라면 다음 절로 넘어가서 가니메데에 포함된 주요 프로젝트에 대해 살펴보자.


표 1. 가니메데 배포판에 포함된 프로젝트들
프로젝트 개요 웹 사이트
Business Intelligence and Reporting Tools (BIRT) 리포트 생성 도구 http://www.eclipse.org/birt
Buckminster 개발 과정 단순화 도구 http://www.eclipse.org/buckminster
C/C++ Development Tools (CDT) C/C++ 코딩 도구 http://www.eclipse.org/cdt
Dynamic Languages Toolkit (DLTK) 펄(Perl), 루비(Ruby) 코딩 도구 http://www.eclipse.org/dltk
Device Software Development Platform — Device Debugging (DSDP-DD) 임베디드 장치 디버깅 관련 프로젝트 http://www.eclipse.org/dsdp/dd
Device Software Development Platform — Native Application Builder (DSDP-NAB) 장치 GUI 개발 프레임워크 http://www.eclipse.org/dsdp/nab
Device Software Development Platform — Target Management (DSDP-TM) 원격 시스템 관리용 프레임워크(SSH) http://www.eclipse.org/dsdp/tm
Eclipse Data Tools Platform (DTP) 데이터 중심 시스템 관리 http://www.eclipse.org/datatools/
Eclipse Communications Framework (ECF) 이클립트 내에서 채팅할 수 있도록 하기 위한 프레임워크 http://www.eclipse.org/ecf
Eclipse Project 플랫폼, JDT, PDE, 이쿼녹스(Equinox)를 포함한 이클립스를 구성하는 도구들 http://www.eclipse.org/eclipse
Eclipse Modeling Framework (EMF) 모델 개발 프레임워크 http://www.eclipse.org/emf
Eclipse Modeling Framework Technologies (EMFT) 모델 개발에 도움이 되는 유틸리티들 http://www.eclipse.org/emft
Eclipse Packaging Project (EPP) 이클립스 인스톨러 개발 http://www.eclipse.org/epp
Graphical Editing Framework (GEF) 그래픽 편집기 개발용 프레임워크 http://www.eclipse.org/gef
Graphical Modeling Framework (GMF) EMF, GEF 기반 그래픽 편집기 개발용 프레임워크 http://www.eclipse.org/gmf
Model Development Tools (MDT) 모델 개발에 도움되는 유틸리티들 http://www.eclipse.org/mdt
M2M 모델 대 모델 변환 언어를 위한 프레임워크 http://www.eclipse.org/m2m/
Model To Text (M2T) 모델 개발에 도움되는 유틸리티들 http://www.eclipse.org/m2t
Mylyn 작업(task) 기반으로 개발에 집중하도록 도와주는 도구 http://www.eclipse.org/mylyn
Rich Ajax Platform (RAP) 이클립스 기반 웹 2.0 애플리케이션 개발 도구 http://www.eclipse.org/rap
SOA Tools Platform (STP) SOA를 위한 도구 http://www.eclipse.org/stp
Subversive 서브버전(Subversion) 지원 http://www.eclipse.org/subversive
Test and Performance Tools Platform (TPTP) 프로파일러(Profiler) http://www.eclipse.org/tptp
Web Tools Platform (WTP) 웹 기반 애플리케이션 개발 도구 http://www.eclipse.org/webtools


'eclipse' 카테고리의 다른 글

Eclipse Tip  (0) 2008.09.08
JUnit 관련 사이트  (0) 2008.09.02
Eclipse 관련 IBM developerworks  (0) 2008.09.02
Eclipse PlugIn  (0) 2008.08.29
Eclipse에서 Subversion을 사용하는 방법 (한글) - IBM developerworks  (0) 2008.05.15
Posted by marryjane
|

HTTPClient 3.0

java 2008. 7. 25. 18:02

3.0 혹은 3.1 사용 시. 4.0 은 포함되지 않는다.
원본 : http://programmers.tistory.com/entry/HTTPclient의-사용-1

#### 1. 설명 및 설치
1-1. HttpClient 소개
HttpClient은 HTTP상에서 커뮤니케이션을 하는 자바 기반의 어플리케이션 개발을 쉽게 할수 있도록 제공한다.
우리가 웹 브라우저 또는 그에 준하는 어플리케이션을 개발한다면 HttpClient은 우리에게 클라이언트 코드 개발에 도움을 줄수있다.
이름에서 의미하는것과 같이 HttpClient는 오직 HTTP 클라이언트 코드을 위한 컴포넌트이지 HTTP 요청을 처리하는 서버측 프로세스을 지원하지는 않는다.

1-2. 설치
현재 아파치 HttpClient 는 3.0.1 안정버전을 지원한다.
Jakarta Commons HttpClient 페이지에서 다운로드 받으면 된다.
(다운로드 페이지: http://jakarta.apache.org/commons/httpclient/downloads.html)
(최신버전 다운로드:
  - http://jakarta.apache.org/site/downloads/downloads_commons-httpclient.cgi
  - http://mirror.apache-kr.org/jakarta/commons/httpclient/binary/commons-httpclient-3.0.1.zip
)

commons-httpclient-3.0.1.zip 를 받아서 압축을 풀고,
commons-httpclient-3.0.1.jar 를 CLASSPATH 에 추가하면 된다.

1-3. 추가 설정(Dependencies)
http://jakarta.apache.org/commons/httpclient/dependencies.html

Artifact ID  Type  Version  Scope  URL  Comment 
commons-codec jar 1.2  http://jakarta.apache.org/commons/codec/
                       http://jakarta.apache.org/site/downloads/downloads_commons-codec.cgi
commons-logging jar 1.0.4  http://jakarta.apache.org/commons/logging/  
junit jar 3.8.1 test  http://www.junit.org/ 


#### 2. getMethod 사용 예제
=========================== GetSample.java =================================
package test.httpclient;

import java.io.FileOutputStream;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;

// Get Method를 사용한 예제
public class GetSample {

 // 가져올 페이지 주소, 네이버 뉴스 속보
 private static String url =
  "http://news.naver.com/news/list.php";
 
 
 // 파일에 byte[] 저장
 public static void saveBytes(String filepath, byte[] byteData) throws Exception
 {
  FileOutputStream foStream = null;
  try {
   foStream = new FileOutputStream(filepath);
   foStream.write(byteData);
  } finally {
   try { foStream.close(); foStream = null; } catch (Exception e) {}
  }
 }
 
 
 /**
  * @param args
  */
 public static void main(String[] args) {

  // HttpClient 생성
  HttpClient client = new HttpClient();


  // 요청 Method 지정
  HttpMethod method = new GetMethod(url);


  try {
   
   // QueryString 지정, 1.문자열
   url = url + "?mode=LSD&section_id=001&menu_id=001&view=1";
   // QueryString 지정, 2.NameValuePair 사용
//   NameValuePair nvp1= new NameValuePair("mode","LSD");
//   NameValuePair nvp2= new NameValuePair("section_id","001");
//   NameValuePair nvp3= new NameValuePair("menu_id","001");
//   NameValuePair nvp4= new NameValuePair("view","1");
//   method.setQueryString(new NameValuePair[]{nvp1,nvp2, nvp3, nvp4});

   System.out.println("QueryString>>> "+method.getQueryString());

   // HTTP 요청 및 요청 결과
   int statusCode = client.executeMethod(method);

   // 요청 결과..
   if (statusCode == HttpStatus.SC_OK) {
    System.out.println("요청 성공");
    System.out.println("응답 HTML:\n" + method.getResponseBodyAsString());
   
    // 결과 저장
    GetSample.saveBytes("naver_news.html", method.getResponseBody());
   } else if ((statusCode == HttpStatus.SC_MOVED_TEMPORARILY) ||
                 (statusCode == HttpStatus.SC_MOVED_PERMANENTLY) ||
                 (statusCode == HttpStatus.SC_SEE_OTHER) ||
                 (statusCode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
    System.out.println("Redirecte !!!");
    System.out.println("Redirect target: " + method.getResponseHeader("location").getValue());
         }
   
  } catch (Exception e) {
   e.printStackTrace();
   
   // Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
   // commons-logging.jar, commons-logging-api.jar 를 CLASSPATH에 추가한다.
   
   // Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/codec/DecoderException
   // commons-codec-1.3.jar 를 CLASSPATH에 추가한다.
  }

 }

}

=========================== GetSample.java =================================


#### 3. postMethod 사용
GetMethod 나 PostMethod 나 사용방법은 비슷합니다.


PostMethod method = new PostMethod("http://xx.com/ex_login_ok.php");
NameValuePair userid = new NameValuePair("nick", "aaaaa");
NameValuePair userpw = new NameValuePair("password", "bbbb");

method.setRequestBody( new NameValuePair[] {userid, userpw});

client.executeMethod(method);


 

#### 4. Header 사용
헤더를 사용하기 위해서는 setRequestHeader() 를 이용하여 원하는 헤더를 정의해 주시면 됩니다.


String charset = null; // 기존 charset 사용
//String charset = "euc_kr"; // charset 지정

// 요청 헤더 설정
if (charset == null) {
    method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");
} else {
    method.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=" + charset);
}


#### 5. Cookie 사용
아직 정리가 않되서.. 분량이 좀 많네요.^^;
찬찬히 정리하겠습니다.


#### Reference
1) 자카르타 프로젝트 HttpClient와 FileUpload 사용하기
  - http://blog.empas.com/inter999/read.html?a=3271313&l=1&v=trackback

'java' 카테고리의 다른 글

jdbc 1.0 ~ 3.0  (0) 2008.08.05
SI 프로젝트에서도 애자일 프로세스는 가능한가?  (0) 2008.07.28
URLConnection 와 HTTPClient  (0) 2008.07.25
javac 옵션  (0) 2008.07.09
IBM HOST CICS Transaction 연동 (NT) - 자바서비스넷  (0) 2008.07.03
Posted by marryjane
|

URLConnection 와 HTTPClient

java 2008. 7. 25. 17:50

* URLConnection
http://www.jabook.org/jabook/jabook07/10000_10000_50000__10000_10000_50000.html

* HTTPClient
http://programmers.tistory.com/entry/HTTPclient의-사용-1

* URLConnection 과 HTTPClient 비교
http://www.mimul.com/pebble/default/2007/06/09/1181399220000.html
 - 출처
 
URLConnection과 HTTPClient의 기능들을 비교하여 불필요한 라이브러리의 오용을 막을 수 있는 비교 자료를 제 피씨 백업하다가 찾았습니다. 죽어있던 지식이 블로그를 통해서 빛을 봤으면 합니다. ^^

 

URLConnection

HTTPClient

Methods

Only HEAD, GET, POST, PUT, DELETE, TRACE and OPTIONS.

Has HEAD, GET, POST, PUT, DELETE, TRACE and OPTIONS, plus any arbitrary method, such as those from WEBDav and IPP.

Response Codes

The response code, headers, and body can only be read if the response code was less than 400 - for any 4xx or 5xx response code, you only get IOException's when trying to get any response info.

The response code, all headers, and the body can always be read normally.

Proxies and SOCKS

Full support (SOCKS: Version 4 only)

Full support (SOCKS: both version 4 and 5)

Authorization

Support for Basic and an early version of Digest in JDK 1.2 or later, only. The current version of Digest authentication (which is the one supported by most servers) is not supported, and due to a bug of theirs they won't even recognize the digest info returned by Apache.

Support for Basic and Digest Authentication; other schemes can be added.

Cookies

No.

Yes.

True request output streams

No - all data is fully buffered before it is sent.

Yes - HttpOutputStream will stream directly to the socket.

True response input streams

Under JDK 1.2, yes; under JDK 1.3 only if the response is not sent using the chunked encoding (this excludes most server-push responses).

Yes.

Persistent Connections

HTTP/1.0 Keep-Alive's in JDK 1.1 and JDK 1.2; JDK 1.3 has HTTP/1.1 persistence.

Supports HTTP/1.0 Keep-Alive's and HTTP/1.1 persistence.

Pipelining of Requests

No.

Yes.

Can set Timeouts

No.

Yes.

Can handle protocols other than HTTP

Yes (e.g. ftp, gopher, mailto, and file are provided)

No.

Can do HTTP over SSL (https)

Appropriate SSL package (such as JSSE) which provides an appropriate client must be installed.

Patches are available for various free and commercial SSL packages

Source code available

No.

Yes.


'java' 카테고리의 다른 글

SI 프로젝트에서도 애자일 프로세스는 가능한가?  (0) 2008.07.28
HTTPClient 3.0  (0) 2008.07.25
javac 옵션  (0) 2008.07.09
IBM HOST CICS Transaction 연동 (NT) - 자바서비스넷  (0) 2008.07.03
jad 옵션  (0) 2008.06.05
Posted by marryjane
|

http://blog.naver.com/civan?Redirect=Log&logNo=150012783664

DB2 -tvf 파일명

1. DB2 Connect to 데이타베이스명 user 사용자명 using 비밀번호

2. test.sql을 만들어 insert/update/select 등 sql 구문을 작성합니다
    단 이때 DB2 콘솔창에서는 하나의 sql을 마칠때 ;를 쓰면 에러가 발생하지만 파일로 만들경우에는 ;가 없으면 에러가 생기더군여
    ex) insert into emp(employee_num,emp_name) values ('1','TEST');
    또 하나 AutoCommit을 지정하지 않으셨다면 마지막에 Commit; 을 추가하세요

3. DB2 -tvf test.sql 을 하시면 쭈~욱 test.sql에서 실행한 스크립트가 실행되는것을 확인하실수 있습니다.

Posted by marryjane
|

Oracle RAC - CTF & TAF

2008. 7. 24. 15:53

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

sed - 스트림 에디터

OS 2008. 7. 16. 16:19

http://www.ibm.com/developerworks/kr/linux/library/l-sed1.html

sed
파일 편집 과정을 자동화하여 파일 편집을 일괄로 처리하거나, 기존 파일을 변경할 수 있는 고급 기능을 가진 스크립트를 작성할 수 있다면 참 좋을 것 같다. 다행히도 우리에게 "sed"가 있다.

sed는 리눅스 및 거의 모든 유닉스 제품군에 포함된 경량의 스트림 에디터이다. sed는 좋은 기능들이 많이 갖추었다. 우선, 매우 가볍다. 기존 스크립팅 언어보다 훨씬 작다. 둘째, sed는 스트림(stream) 에디터이기 때문에 stdin에서 받은 데이터를 편집할 수 있다. 따라서 편집할 데이터를 디스크 상의 파일에 저장할 필요가 없다. 데이터는 sed로 쉽게 연결(pipe)될 수 있기 때문에 강력한 쉘 스크립트의 길고 복잡한 파이프라인의 일부로서 sed를 쉽게 사용할 수 있다. 한번 시도해보라.

sed 예제
sed는 인풋 데이터에 대해 사용자가 지정한 편집 연산("commands")을 수행하여 작동한다. sed는 라인 기반(line-based)이기 때문에 명령어는 순서대로 각 라인에서 수행된다. sed는 결과를 표준 아웃풋(stdout)에 작성한다. 어떤 인풋 파일들도 수정하지 않는다.

예제를 보도록 하자. sed가 중요한 태스크를 어떻게 수행하는가 보다는 sed가 어떻게 작동하는지를 설명할 것이기 때문에 먼저 제공되는 코드들은 약간 이상하다. 하지만 sed가 처음이라면 이것을 이해하는 것도 중요하다.

$ sed -e 'd' /etc/services

이 명령어를 입력하면 아웃풋이 없다. 왜 그럴까? 이 예제에서 편집 명령어인 'd'와 함께 sed를 호출했다. sed는 /etc/services 파일을 열고, 패턴 버퍼로 라인을 읽어 들이고, 편집 명령어("delete line")를 수행한 다음, 패턴 버퍼를 프린트했다.(비어있다.) 그리고 나서 후속 라인들에 대해서도 이 같은 단계들을 반복했다. 이것은 어떤 아웃풋도 만들지 않았다. 'd' 명령어는 패턴 버퍼에서 모든 라인을 영구히 삭제하기 때문이다.

이 예제의 포인트는 두 가지이다. 우선, /etc/services는 절대 변경되지 않았다. 이것은 sed는 이것을 인풋으로서 사용하여 명령행 라인에서 여러분이 지정한 파일에서 읽기만 한다. 파일을 수정하지 않는다. 두 번째로 알아야 할 것은 sed는 라인(line) 지향이란 점이다. 'd' 명령어는 sed에게 모든 인커밍 데이터들을 삭제하라고 명령하지 않는다. 대신 sed는 /etc/services의 각 라인을 하나씩 내부 버퍼(패턴 버퍼)로 읽어 들인다. 일단 라인이 패턴 버퍼에서 읽혀지면 'd' 명령어가 작동하고 패턴 버퍼의 내용을 프린트한다. (이 예제에서는 아무것도 없었다.) 나중에 명령어가 적용될 라인을 정하는 주소 범위에 대해 설명하겠다. 주소가 없다면 명령어는 모든 라인에 적용된다.

마지막으로, 'd' 명령어에 싱글 쿼트를 사용한다는 것이다. sed 명령어에는 싱글 쿼트를 사용하는 습관을 들이는 것이 좋다.

기타 sed 예제
다음은 sed를 사용하여 아웃풋 스트림에서 /etc/services 파일의 첫 번째 줄을 제거하는 방법을 보여주는 예제이다.

$ sed -e '1d' /etc/services | more

여러분도 보다시피 이 명령어는 첫 번째 'd' 명령어와 매우 비슷하다. 앞에 숫자 '1'이 붙은 것만 다르다. '1' 이 라인 번호를 의미한다고 생각했다면 여러분이 맞다. 첫 번째 예제에서는 'd'만 사용했다. 이번에는 앞에 숫자(주소)가 붙은 'd' 명령어를 사용한다. 이 주소를 사용하면 sed에게 특정 라인 또는 라인들에서만 편집을 수행하도록 명령할 수 있다.

주소 범위
이제 주소 범위를 설정하는 방법을 설명하겠다. 이 예제에서 sed는 아웃풋의 1번부터 10번 라인을 삭제한다.

$ sed -e '1,10d' /etc/services | more

두 개의 주소를 콤마로 구별하면 sed는 첫 번째 주소부터 두 번째 주소까지 명령어를 적용한다. 이 예제에서 'd' 명령어는 1에서 10까지의 라인에 적용되었다. 다른 라인들은 무시된다.

정규식이 있는 주소
이제 보다 유용한 예제를 생각해보자. /etc/services 파일의 내용을 보고싶지만, 여기에 삽입된 주석에는 별 관심이 없다면? 알다시피 /etc/services 파일에서 주석을 표시할 때, '#'문자를 가진 라인에 붙인다. 주석을 보지 않으려면 sed에게 '#'으로 시작하는 라인을 삭제하도록 한다.

$ sed -e '/^#/d' /etc/services | more

어떤 일이 일어나는가? sed가 거뜬히 원하는 작업을 수행한다. 어떻게 이것이 가능한지 분석해보자.

'/^#/d' 명령어를 이해하려면 하나씩 분리해서 생각해보자. 우선 'd'를 제거해보자. 떼어내고 보니 ''/^#/'가 남아있다. 이것은 새로운 유형의 정규식 주소이다. 정규식 주소에는 언제나 슬래시가 사용된다. 이들은 패턴(pattern)을 지정하고, 정규식 주소를 바로 뒤따르는 명령어가 이 특정 패턴과 매치될 경우 라인에 적용된다.

따라서, ''/^#/'는 정규식이다. 하지만 이것이 무슨 일을 하는가? 정규식에 대해 좀 더 알아보자.

주소
지금까지 라인 주소, 라인 범위 주소, regexp 주소를 살펴보았다. 하지만 더 많은 가능성이 있다. 두 개의 정규식을 콤마로 분리하여 지정할 수 있다. sed는 첫 번째 정규식을 찾는 첫 번째 라인부터 시작하여, 두 번째 정규식을 찾는 라인을 포함할 때까지 모든 라인들을 찾을 것이다. 예를 들어, 아래 명령어는 "BEGIN"을 포함하고 있는 라인으로 시작해서, "END"를 포함하는 라인으로 끝나는 텍스트 블록을 프린트 할 것이다.

$ sed -n -e '/BEGIN/,/END/p' /my/test/file | more

"BEGIN"을 찾지 못하면 어떤 데이터도 프린트되지 않는다. 그리고 "BEGIN"은 찾았지만, "END"를 찾지 못했다면 모든 라인들은 프린트되지 않는다. 이것은 sed가 스트림 지향 에디터이기 때문이다.

C 소스 예제
C 소스 파일에서 main() 함수만 프린트하려면 다음을 입력한다.

$ sed -n -e '/main[[:space:]]*(/,/^}/p' sourcefile.c | more

이 명령어는 두 개의 정규식, '/main[[:space:]]*(/' and '/^}/', 한 개의 명령어 'p'를 갖고 있다. 첫 번째 정규식은 "main" 과 그 뒤를 따르는 공간과 탭 그리고 열린 괄호를 찾는다. 이것은 ANSI C main() 선언의 시작을 찾는다.

이 정규식에서 '[[:space:]]' 문자 클래스를 주목하라. 이것은 sed에게 탭 또는 공간을 찾도록 명령하는 특별한 키워드이다. 원한다면, '[[:space:]]' 를 타이핑하는 대신에 '['를 타이핑하고, 그런 다음 빈 공간, Control-V, 탭, ']'순서로 타이핑한다.

Control-V 는 명령어 확장을 수행하기 보다 실제 탭을 삽입해야 한다는 것을 의미한다. 좋다. 이제 두 번째 regexp로 넘어가 보자. '/^}'는 '}' 문자를 찾는다. 이것은 새로운 라인의 시작에 나타난다. 코드가 잘 포맷되었다면 main() 함수의 닫기 괄호를 찾을 것이다.

'p' 명령어는 언제나 같은 일을 수행한다. sed에게 라인을 프린트할 것을 명령한다. 우리가 '-n' 모드에 있기 때문이다. C 소스 파일에서 명령어를 실행하라. 이것은 전체 main() { } 블록을 아웃풋할 것이다. 여기에는 초기 "main()"과 닫기 '}'가 포함된다.

정규식
우리는 정규식을 사용하여 텍스트의 패턴을 표시한다. 쉘 명령행에서 '*' 문자를 사용했다면 같은 것은 아니지만, 정규식과 비슷한 것을 사용했던 것이다. 다음은 정규식에 사용할 수 있는 특수 문자이다.

문자 설명
^ 라인의 시작을 찾는다.
$ 라인의 끝을 찾는다.
. 한 개의 문자를 찾는다.
* 이전 문자의 0 또는 그 이상 발생한 선행 문자를 찾는다.
[ ] [ ]안에 있는 모든 문자들을 찾는다.

정규식을 이해하려면 예제만큼 좋은 것이 없다. 이 모든 예제들은 sed에서 허용된다. 명령어 왼쪽에 유효 주소가 나타나도록 한다.

정규식
표현식
설명
/./ 최소한 한 개 이상의 문자를 포함하고 있는 라인을 찾는다.
/../ 최소한 두 개 이상의 문자를 포함하고 있는 라인을 찾는다.
/^#/ '#'으로 시작하는 라인을 찾는다.
/^$/ 모든 공백 라인을 찾는다.
/}^/ '}' (공간 없음)로 끝나는 라인을 찾는다.
/} *^/ 0 또는 그 이상 공간이 뒤에 붙는 '}' 로 끝나는 라인을 찾는다.
/[abc]/ 소문자 'a', 'b', 'c'를 포함하고 있는 라인을 찾는다.
/^[abc]/ 'a', 'b', 'c'로 시작하는 라인을 찾는다.

이 예제를 시도해 보기 바란다. 시간을 들여 정규식을 익히기 바란다. 그리고 정규식을 직접 만들어보라. regexp를 다음과 같이 사용할 수 있다.

$ sed -e '/regexp/d' /path/to/my/test/file | more
여기에서 sed는 매치된 라인을 삭제하게 될 것이다. sed에게 regexp 매치들을 프린트(print)하고, 매치하지 않는 것을 삭제하라고 명령하여 정규식에 익숙해 지는 것이 다른 어떤 방법들 보다 쉽다.

$ sed -n -e '/regexp/p' /path/to/my/test/file | more
새로운 '-n' 옵션을 주목하라. 명확한 명령이 없는 한 패턴을 프린트하지 말 것을 sed에게 명령한다. 'd' 명령어를 'p' 명령어로 대체했다는 것을 알게 될 것이다. 이것은 명확하게 sed에게 패턴 공간을 프린트할 것을 명령하고 있다. 당연히 매치들만 프린트된다.

'OS' 카테고리의 다른 글

nm - lib 안의 함수목록  (0) 2008.08.08
HOW-TO Glance  (0) 2008.08.06
ulimit 명령어  (0) 2008.07.14
netstat 의 status 별 설명  (0) 2008.07.14
특정 유저 process 찾아 한라인으로 죽이기  (0) 2008.07.14
Posted by 알 수 없는 사용자
|