RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'Application_developing'에 해당되는 글 48
proc : 프로시저
  • oracle
BEGIND 프로시저명(:name, :name2, :name3); END;
  • mssql
자동으로 prepare 적용 
  • mysqli (since mysql 5.0)
call proc_php_test(?, @out); 

select @out;
  • cubrid
select 1 into a from db_root;  -- output 변수 설정 

call proc_php_test(?, ?, ?, a);

select a from db_root; -- output 변수 출력

[편집] select : 조회

  • oracle
select * from 테이블;
  • mssql
select * from 테이블;
  • mysql
select * from 테이블;
set @age := 10;

select @name1 := name1, @name2 := name2 from 테이블 where age = @age;
  • mysqli
select * from 테이블;
  • postgres
select * from 테이블; 
  • cubrid
select * from 테이블;

[편집] insert : 입력

insert 구문을 DB에 따라 다르게 생성한다.

  • oracle
insert into 테이블 values (:name1, :name2, :name3);
  • mssql (자체 구현) - sp_executesql 을 사용하여 구현
insert into 테이블 values (@name1, @name2, @name3);
declare @sql nvarchar(1000)
declare @param nvarchar(1000)

set @sql = N'insert into 테이블 values (@name1, @name2, @name3) '
set @param = N'@name1 varchar(30), @name2 varchar(30), @name3 varchar(30)'

exec sp_executesql @sql, @param, @name1 = '안녕', @name2 = '하세요', @name3 = '호박'
declare @name1 varchar(30) 
declare @name2 varchar(30)
declare @name3 varchar(30)

set @name1 = '안녕'
set @name2 = '하세요'
set @name3 = '호박'

insert into 테이블 values (@name1, @name2, @name3);
  • mysql (자체 구현)
set @name1 := '안녕';
set @name2 := '하세요';
set @name3 := '호박';

insert into 테이블 values (@name1, @name2, @name3);
  • mysqli (mysql은 지원하지 않음)
insert into 테이블 values (?, ?, ?);
  • postgres
insert into 테이블 values ($1, $2);
  • cubrid
insert into 테이블 values (?, ?);

[편집] delete

  • oracle
delete from 테이블 where name = :value or name = :value2;
  • mssql (자체 구현) - sp_executesql 을 사용해서 구현
delete from 테이블 where name = @name1 or name = @name2;
declare @sql nvarchar(1000)
declare @param nvarchar(1000)

set @sql = N'delete from 테이블 where name = @name1 or name = @name2; '
set @param = N'@name1 varchar(30), @name2 varchar(30)'

exec sp_executesql @sql, @param, @name1 = '안녕', @name2 = '하세요'
  • mysql (자체 구현)
set @name1 := '안녕';
set @name2 := '하세요';

delete from 테이블 where name = @name1 or name = @name2;
  • mysqli (mysql은 지원하지 않음)
delete from 테이블 where name = ? or name = ?;
  • postgres
delete from 테이블 where name = $1 or name = $2;
  • cubrid
delete from 테이블 where name = ? or name = ?;

[편집] update

  • oracle
update 테이블 set name = :value where name2 = :value2 or name2 = :value3;
  • mssql (자체 구현) - sp_executesql 을 사용하여 구현
update 테이블 set name = @name1 where name2 = @name2 or name2 = @name3;
declare @sql nvarchar(1000)
declare @param nvarchar(1000)

set @sql = N'update 테이블 set name = @name1 where name2 = @name2 or name2 = @name3;'
set @param = N'@name1 varchar(30), @name2 varchar(30), @name3 varchar(30)'

exec sp_executesql @sql, @param, @name1 = '안녕', @name2 = '하세요', @name3 = '메롱'


  • mysql (자체 구현)
set @name1 := '안녕';
set @name2 := '하세요';
set @name3 := '메롱';

update 테이블 set name = @name1 where name2 = @name2 or name2 = @name3;
  • mysqli (mysql 지원하지 않음)
update 테이블 set name = ? where name2 = ? or name2 = ?;
  • postgres
update 테이블 set name = $1 where name2 = $2 or name2 = $3;
  • cubrid
update 테이블 set name = ? where name2 = ? or name2 = ?;
2010/02/22 23:49 2010/02/22 23:49
이 글에는 트랙백을 보낼 수 없습니다
Visual Basic, ASP, VB.NET에서 ADO, ADO.NET을 이용한 Database 프로그램을 개발하는 경우 프로그램내에 SQL 구문을 문자열로 연결한 후 실행하도록 구성한 코드를 많이 보게 된다.

이러한 코드 구성을 일반적으로 '동적 쿼리', '하드 코딩된 쿼리'라 부른다.

예를 들어 비주얼 베이직의 경우

Dim strSQL As String

strSQL="select orderid, orderdate, employeeid from orders"
strSQL=strSQL+" where orderid=" & txtOrderID

cnn.Execute strSQL

하지만 이같은 동적 쿼리는 가능한 사용하지 않는 것이 좋다. 대신 SQL Server의 저장 프로시저를 이용해 처리 용량과 응답 속도의 향상 및 유지 보수 등 저장 프로시저의 특징을 활용하는 것이 좋다.

하지만 설계상의 문제나 또는 고객의 다양한 요구 구현 방법상의 이질적 문제로 인해 동적 쿼리를 써야하는 상황이 자주 발생한다. Q/A의 질문 유형 중에도 이같은 동적 쿼리 작성법에 관한 내용이 상당수를 차지하고 있다.

저 장 프로시저를 통해 코드를 구성하더라도 저장 프로시저 내에서 다시 동적 쿼리를 사용하게 되는 경우가 발생한다. 온라인 설명서에는 이를 '런타임 시 명령문 작성'이라는 주제로 설명했다. 이 경우 SQL Server에서는 sp_executesql, exec()의 두가지 명령을 사용할 수 있다.

클라이언트나 서버 사이드에서 동적 쿼리를 사용해야 하는 상황이 되었을 때, 다시말해 저장 프로시저를 직접 사용할 수 없는 상황에서는 또 다른 해결 방법을 이용할 수 있다.
아래 두 가지 상황에서의 해결 방법이다.

클라인트 사이드에서 동적 쿼리가 필요한 경우

ADO, ADO.NET에서는 파라미터를 가진 동적 쿼리를 지정할 수 있으며 일반적으로 아래와 코드 구성을 가진다.

1. ADO, ODBC, Command 오브젝트 연동
Dim strSQL As String

strSQL="select orderid, orderdate, employeeid from orders"
strSQL=strSQL+" where orderid = ?"

2. ADO.NET, SqlClient 네임스페이스, SqlCommand 오브젝트와 연동
Dim strSQL As String

strSQL="select orderid, orderdate, employeeid from orders"
strSQL=strSQL+" where orderid = @orderid"

위 에 코드를 실행하면 실제 SQL Server에서는 sp_executesql 시스템 프로시저를 통해서 실행이 된다. 특히 ADO.NET의 경우는 디자인 타임에 'SqlDataAdapter Configuration Wizard'를 사용하면 위와 같은 코드를 작성해 준다.

SQL Server, 저장 프로시저에서 동적 쿼리가 필요한 경우
exec() 아니라 sp_executesql 시스템 프로시저를 이용한다.

결 국 클라이언트 사이드건 서버 사이드건 sp_executesql이 사용된 것을 알 수 있다. exec()를 쓴 경우와 sp_executesql를 사용한 경우의 성능과 SQL Server의 Cache 매니저의 상황 비교에 대한 내용을 마지막에 추가해 두었다.

일반적으로 sp_executesql은 exec()비해 몇 가지 장점을 제공한다.

1. 쿼리문안에 매개변수(입력/출력)를 정의할 수 있다.
2. 매개변수 사용으로 인해 쿼리 최적화 프로그램이 컴파일된 실행 플랜을 재 사용할 확률이 높아진다.

실제로 exec()와 sp_executesql은 Cache 매니저의 처리 방법 및 활동 상태가 다르다는 것을 마지막에 추가한 성능 모니터링을 통해서 알 수가 있을 것이다.

이번 기회의 sp_executesql 시스템 프로시저 다양한 사용법과 관련 지식을 얻는데 미력하나마 도움이 됐으면 한다. 그럼, 구문부터 살펴보자.

sp_executesql [@stmt =] stmt
[
{, [@params =] N'@parameter_name data_type [,...n]' }
{, [@param1 =] 'value1' [,...n] }
]

인수설명
@stmt: T-SQL문 또는 배치 명령. ntext 형으로 변환될 수 있는 변수 또는 유니코드 상수 문자열. 내부에 @name 형식의 파라미터를 포함할 수 있다.
@params: @stmt에 포함된 모든 파라미터의 이름과 데이터 타입을 정의한다.
@param1: @params 파라미터에서 첫번째 파라미터에 할당할 값
n : 각 파라미터에 대한 값을 할당한다.

참고
UNICODE 문자열 상수를 지정할 때는 N'...'형식을 사용한다.sp_executesql 프로시저에 선언됐던 파라미터가 ntext형이기 때문에 문자열을 직접 지정할 때는 위와 같은 형태를 사용하면 된다.

sp_executesql은 sql로 구성된 시스템 프로시저가 아니라 확장 프로시저이다.

기본 예제
1. TOP 절의 값을 동적으로 지정하고자 하는 경우(아래 구문은 set rowcount n 세션 옵션으로 대치할 수도 있다)

declare @cnt as nvarchar(5)
declare @stmt as nvarchar(100)
set @cnt = '5'
set @stmt = 'select top ' + @cnt + ' * from northwind.dbo.orders'

exec sp_executesql @stmt

아래 예제는 단순히 SQL을 동적으로 작성하고자 하는 경우로 @db의 값이 실행 시마다
다른 데이터베이스명이 올 수 있다고 가정한다. 테이블명은 동일한다.

declare @db as nvarchar(20)
declare @stmt as nvarchar(100)
set @db = 'northwind'
set @stmt = 'select * from '+ @db +'.dbo.orders'

exec sp_executesql @stmt

2. 하나 이상의 명령을 배치로 실행

declare @stmt as nvarchar(500)
set @stmt = 'use northwind; '
set @stmt = @stmt + 'select top 5 * from dbo.orders where
orderid=10248; '
set @stmt = @stmt + 'select top 5 * from dbo.[order details] where
orderid=10248'

exec sp_executesql @stmt

입력 파라미터를 적용한 예제

1. @orderid 입력 파라미터를 이용해 해당 주문 번호를 가진 [order details] 테이블의 주문 제품 정보를 출력

use northwind

declare @stmt as nvarchar(100)
declare @params as nvarchar(100)
set @stmt = 'select productid, quantity, unitprice from '
set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
set @params = '@orderid int'

exec sp_executesql @stmt, @params, @orderid=10248

2. 위 예제를 저장 프로시저 안에서 연동한 경우

use northwind

create proc upOrderDetailsSel
@porderid int
as
declare @stmt as nvarchar(100)
declare @params as nvarchar(100)
set @stmt = 'select productid, quantity, unitprice from '
set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
set @params = '@orderid int'

exec sp_executesql @stmt, @params, @orderid=@porderid
go
exec upOrderDetailsSel @porderid = 10248

input 파라미터를 적용한 예제

1. @table을 입력 파라미터를 이용해서 실제 입력할 대상 테이블을 결정 입력될 컬럼값들 또한 입력 파라미터로 처리한 예제

-- 아래 테스트용 테이블을 우선 작성할 것.
create table northwind.dbo.table1 (a int, b int, c int)

use northwind

declare @table as nvarchar(20)
declare @stmt as nvarchar(100)
declare @params as nvarchar(100)

set @table = 'dbo.table1'
set @stmt = 'insert into ' + @table + ' '
set @stmt = @stmt + 'values (@a, @b, @c)'
set @params = '@a int, @b int, @c int'

exec sp_executesql @stmt, @params, @a=1, @b=2, @c=3

확인

select * from table1

2 .output 파라미터를 적용한 예제

동적 SQL문 내에도 출력(OUTPUT) 파라미터를 선언하고 결과 값을 리턴 받을 수 있다. 저장 프로시저에서 출력 파라미터를 사용하는 것과 동일하게, 선언부와 호출부에 반드시 OUTPUT 키워드를 지정한다.

use northwind

declare @stmt as nvarchar(100)
declare @params as nvarchar(100)
declare @orderret as int

set @stmt = 'select @ordercnt = count(*) from dbo.orders'
set @params = '@ordercnt as int OUTPUT' -- OUTPUT 키워드에 주의

여기도 OUTPUT 키워드를 지정한다.

exec sp_executesql @stmt, @params, @ordercnt = @orderret OUTPUT

확인

select @orderret

지원이 안되는 것들은 다음과 같다

*. sp_executesql은 배치, 저장 프로시저, 트리거처럼 한 배치로 실행된다.

1.동적 SQL문에서는 RETURN 문을 사용할 수 없다

2.로컬 변수를 액세스 할 수 없다

declare @chr char(3)
set @chr = 'abc'

sp_executesql N'PRINT @CharVariable'
GO

3. 현재 데이터베이스가 변경되지 않는다
use pubs
go
sp_executesql N'use northwind'
select * from shippers -- shippers 테이블은 northwind에 있다.
go

전문 개발자및 관리자를 위한 추가 정보

성능 비교
만일, 여러분이 Windows NT/2000의 성능 모니터의 사용법을 알고 있다면 아래 3가지 사용 예에 대한 모니터를 수행하고 각각 Cache Manager상의 활동이 어떻게 다른지를 비교 해 보면 많은 도움이 될 것이다.

아래에 성능 모니터에 모니터링할 관련 오브젝트 및 카운트을 적어 뒀다.

성능 개체
SQL Server:Cache Manager
- 모든 카운터
- 다음 목록에서 인스턴스 선택
_Total
Adhoc Sql Plans
Execution Context
Procedure Plans
기타... (관심이 있다면)

참고
3개의 방법을 개별적으로 테스트할 때, Procedure Cache상에 동일한 플랜이 재 사용되는 것을 방지하기 위해

DBCC FREEPROCCACHE

명 령을 사용할 수 있다. 이 명령은 프로시저 캐시에서 모든 요소를 제거한다. 이 작업을 수행해야 Cache Object Counter가 늘어나는 것을 볼 수 있다. 그리고 현재 Cache된 Object에 대한 정보를 보고자 하는 경우 아래의 쿼리를 이용하면 된다.

select * from master..syscacheobjects
where dbid = db_id('northwind')

1. 저장 프로시저 테스트용
DROP PROC dbo.upOrderDetailsQuery
CREATE PROC dbo.upOrderDetailsQuery
@orderid int
AS
select productid, quantity, unitprice from dbo.[order details]
where orderid = @orderid
go
EXEC dbo.upOrderDetailsQuery @orderid = 10248

2. sp_executesql

USE Northwind

declare @stmt as nvarchar(100)
declare @params as nvarchar(100)
set @stmt = 'select productid, quantity, unitprice from '
set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
set @params = '@orderid int'

exec sp_executesql @stmt, @params, @orderid=10248
go

3. EXEC() 사용

USE Northwind

declare @stmt as nvarchar(100)
declare @orderid varchar(10)
set @orderid = '10248'
set @stmt = 'select productid, quantity, unitprice from '
set @stmt = @stmt + 'dbo.[order details] where orderid = '+ @orderid

EXEC (@stmt)
2010/02/22 23:12 2010/02/22 23:12
이 글에는 트랙백을 보낼 수 없습니다

매번 까먹고 까먹는 주석 -_-
프로젝트가 끝나는 시점에 주석과의 싸움은 언제나 있는데 ..
항상 까먹는다 -_-;;


Window -> Preferences -> Java -> Code Style -> Code Templates -> Comments 에서


파일정보 주석 (소스 가장 위 상단을 선택)

Types -> Edit

/**
 * @FileName  : ${file_name}
 * @Project     : ${project_name}
 * @Date         : ${date}
 * @작성자      : ${user}

 * @변경이력 :
 * @프로그램 설명 :
 */



메소드정보 주석 (원하는 함수를 선택)

Methods -> Edit

/**
 * @Method Name  : ${enclosing_method}
 * @작성일   : ${date}
 * @작성자   : ${user}
 * @변경이력  :
 * @Method 설명 :
 * ${tags}
 */



${} 내용설명

data : Current date (현재 날짜)

dollar : The dollar symbol (달러문양)

enclosing_type :The type enclosing the method (선택된 메소드의 타입)

file_name : Name of the enclosing compilation (선택된 편집파일 이름)

package_name : Name of the enclosing package (선택된 패키지 이름)

project_name : Name of the enclosing project (선택된 프로젝트 이름)

tags : Generated Javadoc tags (@param, @return...) (Javedoc 태그 생성)

time : Current time (현재 시간)

todo : Todo task tag ('해야할일'태그 생성)

type_name : Name of the current type (현재 타입의 이름)

user : User name (사용자 이름)

year : Current year (현재 연도)



3.2 기준으로 주석입력 단축키는 ALT + SHIFT + J

2010/02/11 15:58 2010/02/11 15:58
이 글에는 트랙백을 보낼 수 없습니다


< 원인 >

형상관리 이력정보가 꼬이는 경우가 있음.


< 해결 >

1-1. 해당 프로젝트를 선택하고 우클릭 > team > cleanup 실행

1-2. cleanup 성공 후 다시 업데이트


클린업 도중 에러가 발생하거나 위 방법으로 해결이 안되면 다음과 같이 처리

2-1. 탐색기에서 콘솔로그에 출력된 폴더 내에 있는 .svn 폴더로 이동


2-2. 폴더 내에 locked 파일이 있으면 삭제

2-3. 이클립스에서 다시 업데이트

2010/02/01 16:02 2010/02/01 16:02
이 글에는 트랙백을 보낼 수 없습니다

JSP & PHP with EASE

by Ahmad Baitalmal
published on: 07/05/2006


Inter-mingling JSP and PHP code inside EASE is extremely simple. You can use JSP/PHP code inside your EASE script to leverage any existing code you might already have or extent the platform with third party libraries and capabilities.

The Etelos Application Server platform allows you to drop in and out of PHP/JSP code seamlessly. Below is an example of how you can access any EAS binder variable.

< #[SYSTEM.DATE_TIME]#> <
br>
<?php
print eas_get_value( "system.date_time" ) ."<br>";
?>

<?jsp

<%= eas_get_value("system.date_time") "<br/>"%>

?>



The three lines in the code above will produce identical output. You have full un-crippled access to PHP & JSP. You can interact with EAS data in real-time and see your changes on the fly. The following code creates a new binder tag in PHP  and prints it out in EASE.

<?php
print eas_set_value( "my.data", "right here" );
?>

My data is <b></b><br>

As expected, the output is:

My data is right here

Or in JSP:
<?jsp
<% eas_set_value( "my.data", "right here" )%>
?>

My data is <b>< #[MY.DATA]#></b><br>

EASE skips much of the grunt work usually required in web development. With the PHP/JSP interfaces, you can still do all the fine-grained coding that you may need. For example, you may need to update a few binder instances real quick without user interaction. While eas_set_value and eas_get_value give you access to the EAS tag data in real-time, after the page execution is done, your changes aren't saved to the database. Here is how you modify the actual data in contacts and instances in PHP:

<?php
eas_set_instance_value( "products.6", "color", "Tomato");
eas_set_contact_value( eas_get_value("contact.id"), "age", "33");
?>

< # apply instance products.6 and reference as "product". # >
The product color is < #[product.color]# >
<br>

The instance's color variable is changed in the database to "Tomato" and the < # [contact.id] # >'s age variable is changed to "33". In the opposite direction, you can load an instance or contact from the database like this:

<?php
print_r( eas_get_instance( "products.6" ) );
print_r( eas_get_contact( eas_get_value("contact.id") ) );
?>


This code will print two arrays. The first array is an associative array of variable=>value for instance id 6 from the products binder. The next array is also an associative array of variable=>value for the < # [contact.id] # >.

The following code goes a little bit further. eas_query enables you to write your own SQL queries to the database.
<?php
$result = eas_query( "select * from binder_12 where lower( color ) != 'red';" );
if( $result->ok )
{
    print "<u>". $result->count ."</u> products were found\n";    
    print "<u>". $result->updated ."</u> products were updated\n";    
    while( $product = pg_fetch_assoc($result->recordset) )
    {
        print "<b>". $product['instance_id'] . " - " . $product['name'] . "</b>\n";
        print $product['color'] ."\n";
        print $product['description'] ."\n\n";
    }
}
?>


In this example, a query is issued to return all products (binder_12) where the color is not red. The result object that is returned provides a few useful properties.

$result->ok is true when the query is executed successfully, otherwise it's false. $result->count has the number of rows returned, and $result->updated has the number of rows that were updated if the query was an UPDATE.



Here is the same code in JSP:
<?jsp

<%
   try
   {
       ResultSet rs = eas_query( "select * from binder_12;" );
       Statement st = rs.getStatement();
             rs.last();
       int count = rs.getRow();
       rs.beforeFirst();
             int updateCount = st.getUpdateCount();
%>
       <%="<u>" count "</u> products were found<br/>"%>
       <%="<u>" updateCount "</u> products were updated<br/>"%>
<%
       while( rs.next() )
       {
%>
           <%="<b>" rs.getString( "instance_id" ) "-" rs.getString( "name" )
               "</b><br/>"%>
           <%=rs.getString( "color" ) "<br/>"%>
           <%=rs.getString( "description" ) "<br/><br/>"%>
<%
       }          st.close();
   }
   catch( Exception e ) {}
%>

?>


You can easily imagine doing some more advanced queries that would be hard or inefficient to do in the standard list engine like unions or intersects. Having the full power and flexibility of PHP and JSP is also a big plus, you have the speed of rapid web application development with EASE and the flexibility and extensibility of PHP and JSP all in a single page.




//  This following example is not featured int he magazine because of space in the printed edition.  Here is an extra example of setting contact values in JSP.

<?jsp
<%@ page import="java.util.*" %>

<%=eas_set_contact_value( "2330c69b9fab0cfe170fad0a95e8f7f8", "last_name", "Changed!" )%>

<%
   Map m = eas_get_contact( "2330c69b9fab0cfe170fad0a95e8f7f8" );
   Iterator i = m.keySet().iterator();
   String result = "";
   while( i.hasNext() )
   {
       Object key = i.next();
       Object val  = m.get( key );
             result = key.toString() ":" val.toString() "<br/>";
   }
%>

<%="<br/><br/>result:<br/>" result%>

?>


Relevent Tags: EASE tips   PHP Dev   JSP Dev   

2009/11/10 11:51 2009/11/10 11:51
이 글에는 트랙백을 보낼 수 없습니다

ESftp 라는게 Eclipse와 연동되는 FTP plug in으로 유용한 기능을 지니고 있었으나

Eclipse 3.2로 업그레이드 되면서 실행이 되지 않았습니다.

그러나 드디어 200711월 말 패치로 3.2버전에서도 실행이 가능하군요.


먼저 첨부한 jar 파일을 Eclipse 폴더의 plugin 폴더에 복사해서 넣으시면 메뉴가
생깁니다.


연결하고자 하는 프로젝트를 선택하여 우 클릭하여
 Properties를 선택하면 ESftp라는 메뉴가 생겼습니다.


선택하시면
간단한 메뉴가 나옵니다.


Protocol
FTP로 설정 Test settings을 하면 Eclipse가 뻗어버리는


현상이 생기므로 ProtocalSFTP 바꿔주시는게 좋습니다.


그리고 프로젝트 하위와 FTP root가 일치한다면 Site Root 옵션에 ‘/’하나 써주시면 되겠습니다.


그리고 Test settings를 클릭하면
이렇게 성공했다는 메시지가 나타나면 성공입니다.


.java
파일의 경우 컴파일된 클래스를 우클릭하면 위와 같은 메뉴를 통해 서버에 전송할 수 있고


보시는 바와 같이 단축키는 Ctrl+Alt+P 입니다.


전송을 실행하면


Eclipse Console
에 메시지가 뜨면 전송이 잘된 것 입니다.


확인해 보세요.


이제 Eclipse로 클래스파일 작업 후 타 FTP 프로그램이나 Application을 사용하는


불편함이 줄어들겠죠.


그럼 도움이 되시길 바랍니다.

 

2009/03/13 14:49 2009/03/13 14:49
이 글에는 트랙백을 보낼 수 없습니다
이클립스를 위주로 개발을 하지만 아직도 가끔 에딧플러스를 이용하는데요.
 
제경우 가장큰 이유중 하나가 이클립스에서 자동 줄바꿈이 되지않아서 입니다.
 
html같은 부분을 편집할때보면 가로로 줄이 긴경우 무척이나 불편하더군요
 
오늘 작정하고 구글검색을 해서 찾아봤습니다.
이곳인데요.
영어가 짧아서 정확히 무슨소리인지는 알수없지만 아직 버그가 좀 있다고 하는말
같아요 -_-;;
 
설치 방법은 나와 있는 방법그대로 하시면 됩니다.
 

How to install?

  1. Open Eclipse
  2. Help > Software Updates > Find and Install
  3. Search for New Features to Install
  4. New Remote Site
  5. Enter the url - http://ahtik.com/eclipse-update/
  6. Install and Enjoy
위순서대로 하신후에 이클립스를 재시작합니다
그리고 문서를 하나 열어봅니다
 
 
 
 
위소스는 네이버 메인화면 소스입니다. 보시는 바와 같이 가로 스크롤이 길게 생겨있네요.
문서에 대고 오른쪽 클릭을 하면 virtual Word Wrap 이란메뉴가 있습니다.
이메뉴를 클릭해주시면 됩니다
 
 
 
보시는 바와 같이 가로 스크롤이 없어졌네요^^
같은 한줄로 되어있던부분은 같은 백그라운드 칼라로 하이라이트 되어있습니다.~
 
오늘 오후에 설치를 해보았기 때문에 현재까진 특별한 버그는 발견하지 못했습니다.
그리고 문제시 삭제하는 방법은
 
 
Help > Software Updates > Manage Configuration 선택
WordWrap Feature 를 disable시킨담에 uninstall하시면 됩니다~


BR />
Flex Builder3 에서도 됩니다 ㅎㅎ
2009/03/13 14:40 2009/03/13 14:40
이 글에는 트랙백을 보낼 수 없습니다

명령행 인수

Eclipse 런타임의 다양한 부분에서 처리하는 명령행 인수가 아래에 나열됩니다. -D VM 인수를 사용하는 명령행에서 시스템 특성을 사용하거나 config.ini 파일에서 값을 지정하여 이러한 값 대부분을 지정할 수도 있습니다. 후자의 방법을 사용하면 명령행 인수를 사용하지 않고 Eclipse를 사용자 정의할 수 있습니다.

목록의 각 인수에서 해당 시스템 특성 키를 {}로 묶어 지정합니다. 또한 ()로 묶인 명령행 인수를 처리할 Eclipse 런타임 계층도 지정됩니다. 이 방법은 런타임 부분을 특수한 요구에 맞게 바꾸는 사용자에게 유용합니다.

-application <id> (Runtime)
eclipse.application을 <id>로 설정하는 것과 동등함
-arch <architecture> (OSGi)
osgi.arch를 <architecture>로 설정하는 것과 동등함
-clean (OSGi) NEW
osgi.clean을 "true"로 설정하는 것과 동등함
-configuration <location> (Main)
osgi.configuration.area를 <location>으로 설정하는 것과 동등함
-console [port] (OSGi) NEW
osgi.console을 [port] 또는 기본 포트를 사용할 경우(즉, 포트가 지정되지 않은 경우) 빈 문자열로 설정하는 것과 동등함
-consoleLog (Runtime)
eclispe.consoleLog를 "true"로 설정하는 것과 동등함
-data <location> (OSGi)
osgi.instance.area를 <location>으로 설정하는 것과 동등함
-debug [options file] (OSGi)
osgi.debug를 [options file] 또는 예를 들어 옵션 파일 위치를 지정하지 않은 경우 간단히 디버그를 사용할 수 있도록 빈 문자열로 설정하는 것과 동등함
-dev [entries] (OSGi)
osgi.dev를 [entries] 또는 예를 들어 항목을 지정하지 않은 경우 간단히 dev 모드를 사용할 수 있도록 빈 문자열로 설정하는 것과 동등함
-endSplash <command> (Main)
스플래시 화면을 아래로 내릴 때 사용할 명령을 지정합니다. 보통 Eclipse 실행 파일에서 제공합니다.
-feature <feature id> (Runtime)
eclipse.product를 <feature id>로 설정하는 것과 동등함
-framework <location> (Main) NEW
osgi.framework를 <location>으로 설정하는 것과 동등함
-initialize (Main)
실행 중인 구성을 초기화합니다. 모든 런타임 관련 데이터 구조 및 캐시를 새로 고칩니다. 모든 사용자/플러그인의 정의된 구성 데이터가 제거되지 않습니다. 모든 응용프로그램이 실행되지 않고 모든 제품 스펙이 무시되며 UI가 표시되지 않습니다. 예를 들어 스플래시 화면이 그려지지 않습니다.
-install <location> (Main)
osgi.install.area를 <location>으로 설정하는 것과 동등함
-keyring <location> (Runtime)
디스크에서 권한 데이터베이스의 위치입니다. 이 인수는 -password 인수와 함께 사용해야 합니다.
-nl <locale> (OSGi)
osgi.nl을 <locale>로 설정하는 것과 동등함
-noLazyRegistryCacheLoading (Runtime)
eclipse.noLazyRegistryCacheLoading을 "true"로 설정하는 것과 동등함
-noRegistryCache (Runtime)
eclipse.noRegistryCache를 "true"로 설정하는 것과 동등함
-noSplash (Executable, Main)
스플래시 화면의 표시 여부를 제어합니다.
-os <operating system> (OSGi)
osgi.os를 <operating system>으로 설정하는 것과 동등함
-password <password> (Runtime)
권한 데이터베이스의 암호
-pluginCustomization <location> (Runtime)
eclipse.pluginCustomization을 <location>으로 설정하는 것과 동등함
-product <id> (OSGi) NEW
eclipse.product를 <id>로 설정하는 것과 동등함
-showSplash <command> (Main)
스플래시 화면을 표시할 때 사용할 명령을 지정합니다. 보통 Eclipse 실행 파일에서 제공합니다.
-user <location> (OSGi) NEW
osgi.user.area를 <location>으로 설정하는 것과 동등함
-vm <path to java executable> (Executable, Main) NEW
Eclipse 실행 파일에 전달하는 경우 이 옵션은 Eclipse 실행에 사용할 Java VM 위치를 찾는 데 사용됩니다. 이 때 찾는 위치는 해당 Java 실행 파일의 전체 파일 시스템 경로여야 합니다. 경로를 지정하지 않으면 Eclipse 실행 파일은 검색 알고리즘을 사용하여 적절한 VM을 찾습니다. 모든 경우 실행 파일은 -vm 인수를 사용하여 Java 기본에 사용된 실제 VM의 경로를 전달합니다. 그 다음 Java 기본은 이 값을 eclipse.vm에 저장합니다.
-vmargs [vmargs*] (Executable, Main) NEW
Eclipse에 전달하는 경우 이 옵션은 Eclipse 실행에 사용할 Java VM 조작 위치를 찾는 데 사용됩니다. 위치를 지정하는 경우 이 옵션은 명령행의 끝에 와야 합니다. 위치를 실행 파일 명령행에 지정하지 않는 경우에도 실행 파일은 -vmargs 인수를 사용하는 Java로 전달된 명령행에 실행 중인 클래스를 포함한 관련 인수를 자동으로 추가합니다. 그 다음 Java 기본은 이 값을 eclipse.vmargs에 저장합니다.
-ws <window system> (OSGi)
osgi.ws를 <window system>으로 설정하는 것과 동등함

더 이상 사용하지 않는 명령행 인수

다음 명령행 인수는 더 이상 관련이 없거나 대체된 상태이고 역방향 호환성을 유지보수하도록 런타임에서 이용되며 실행 중인 응용프로그램에 전달되지 않습니다.

-boot
-configuration 참조
-classLoaderProperties
더 이상 관련 없음
-firstUse
더 이상 관련 없음
-newUpdates
더 이상 관련 없음
-noPackagePrefixes
더 이상 관련 없음
-noUpdate
더 이상 관련 없음
-plugins
더 이상 관련 없음
-update
더 이상 관련 없음

기타

다음 명령행 인수는 다양한 Eclipse 플러그인에서 정의되며 정의하는 플러그인이 설치, 해석 및 활성화된 경우에만 지원됩니다.

-noVersionCheck (workbench)
<description>
-perspective (workbench)
<description>
-refresh (org.eclipse.core.resources)
<description>
-showLocation (org.eclipse.ui.ide.workbench)
<description>
-allowDeadlock
<description>

시스템 특성

다음 시스템 특성은 Eclipse 런타임에서 사용됩니다. "osgi"로 시작하는 이러한 시스템 특성은 OSGi 프레임워크 구현에 특정하지만 "eclipse"로 시작하는 일부 시스템 특성은 OSGi 프레임워크의 맨 위에 계층화된 Eclipse 런타임에 특정함에 유의하십시오.

이러한 특성 대부분은 명령행과 동등합니다({} 중괄호의 값 및 명령행 인수 섹션 참조). 사용자는 명령행 또는 특성 설정을 사용하여 값을 지정할 수 있습니다. 특성은 다음과 같은 방법으로 설정될 수 있습니다.

  • -DpropName=propValue를 Java VM의 VM 인수로 사용
  • 해당 구성 영역에서 config.ini 파일에 필요한 특성 설정
eclipse.application {-application}
실행할 응용프로그램 ID입니다. 여기에 지정된 값은 실행 중인 제품(eclipse.product 참조)에서 정의한 응용프로그램을 대체합니다.
eclipse.commands
sdf
eclipse.consoleLog
"true"인 경우 로그 출력도 Java의 System.out에 송신됩니다. 보통 명령 쉘에 다시 송신됩니다. -debug와 함께 결합하면 유용합니다.
eclipse.debug.startupTime
이 세션에서 Java VM이 시작된 시간(밀리 초)
eclipse.exitcode
<description>
eclipse.exitdata
<description>
eclipse.manifestConverter
레거시 plugin.xml 파일을 manifest.mf 파일로 변환할 때 사용할 manifest 변환기의 클래스 이름
eclipse.noExtensionMunging
"true"인 경우 레거시 레지스트리 확장은 그대로 남아 있습니다. 기본적으로 이러한 확장은 갱신하여 Eclipse 3.0에 있는 새 확장점 ID를 사용합니다.
eclipse.noLazyRegistryCacheLoading {-noLazyRegistryCacheLoading}
"true"인 경우 플랫폼의 플러그인 레지스트리 캐시 로드 최적화가 비활성화됩니다. 기본적으로 구성 요소는 레지스트리 캐시가 사용 가능한 경우 요청할 때에만 해당 레지스트리 캐시에서 로드되어 메모리 예정 범위를 줄입니다. 이 옵션은 시작할 때 레지스트리 캐시를 전체적으로 로드하도록 강제 실행합니다.
eclipse.noRegistryCache {-noRegistryCache}
"true"인 경우 내부 확장 레지스트리 캐시의 읽기 및 쓰기가 불가능합니다.
eclipse.pluginCustomization {-pluginCustomization}
플러그인 환경 설정의 기본 설정이 들어 있는 특성 파일의 파일 시스템 위치입니다. 이 기본 설정은 1차 기능에 지정된 기본 설정을 대체합니다. 상대 경로는 Eclipse 자체의 현재 작업 디렉토리에 따라 해석됩니다.
eclipse.product {-product}
실행 중인 제품 ID입니다. 이 ID를 통해 다양한 브랜딩 정보 및 사용되는 응용프로그램을 제어합니다.
eclipse.vm {-vm}
Eclipse 실행에 사용한 Java 실행 파일의 경로입니다. 이 정보는 재실행 명령행을 구성하는 데 사용됩니다.
eclipse.vmargs {-vmargs}
Eclipse 실행에 사용한 VM 인수를 나열합니다. 이 정보는 재실행 명령행을 구성하는 데 사용됩니다.
osgi.adaptor
사용할 OSGi 프레임워크 어댑터의 클래스 이름
osgi.arch {-arch}
-arch 참조
osgi.baseConfiguration.area
asf
osgi.bundles
시스템을 가동하여 실행하면 자동으로 설치되어 선택적으로 시작되는 쉼표로 구분된 번들 목록입니다. 다음은 각 항목 양식입니다.
    <URL | simple bundle location>[@ [<start-level>] [":start"]]
시 작 레벨(>0인 정수)이 누락되면 프레임워크에서는 번들의 기본 시작 레벨을 사용합니다. "start" 태그를 추가하면 번들은 설치 후 시작됨으로 표시됩니다. 단순 번들 위치는 프레임워크의 상위 디렉토리에 상대적으로 해석됩니다. 시작 레벨은 번들을 실행해야 하는 경우에 OSGi 시작 레벨을 표시합니다. 이 값이 설정되지 않으면 시스템에서 적절한 기본값을 계산합니다.
osgi.clean
"true"로 설정하면 OSGi 프레임워크 및 Eclipse 런타임에 사용되는 캐시된 데이터가 정리됩니다. 그러면 번들 종속성 분석 및 eclipse 확장 레지스트리 데이터를 저장하기 위해 사용되는 캐시가 정리됩니다. 이 옵션을 사용하면 eclipse는 이 캐시들을 다시 초기화하게 됩니다.
osgi.configuration.cascaded
"true"로 설정하면 이 구성은 상위 구성에 계단식으로 설정됩니다. 자세한 내용은 위치 섹션을 참조하십시오.
osgi.configuration.area {-configuration}
이러한 플랫폼을 실행하는 데 사용할 구성 위치입니다. 구성에서는 실행한 플러그인 및 다양한 기타 시스템 설정을 판별합니다. 자세한 내용은 위치 섹션을 참조하십시오.
osgi.configuration.area.default
이러한 플랫폼을 실행하는 데 사용할 기본 구성 위치입니다. 구성에서는 실행한 플러그인 및 다양한 기타 시스템 설정을 판별합니다. 이 값, 즉 기본 설정은 osgi.configuration.area에 설정된 값이 없는 경우에만 사용됩니다. 자세한 내용은 위치 섹션을 참조하십시오.
osgi.console {-console}
널이 아닌 값으로 설정하면 OSGi 콘솔을 설치한 경우 해당 콘솔이 사용 가능합니다. 값이 적절한 정수인 경우 이 값은 콘솔이 청취하는 포트로 해석되어 지정된 포트로 해당 출력을 지정합니다. 시스템 상태를 조사할 때 유용합니다.
osgi.console.class
요청할 경우 실행할 콘솔의 클래스 이름
osgi.debug {-debug}
널이 아닌 값으로 설정하면 플랫폼은 디버그 모드가 됩니다. 값이 문자열인 경우 이 값은 .options 파일 위치로 해석됩니다. 이 파일은 플러그인에서 사용 가능한 디버그 확장점 및 이러한 확장점의 사용 가능 여부를 표시합니다. 위치를 지정되지 않은 경우 플랫폼에서는 설치 디렉토리 아래의 .options 파일을 검색합니다.
osgi.dev {-dev}
빈 문자열로 설정하면 dev 모드가 간단히 켜집니다. 또한 이 특성은 플러그인 세트의 사용자 정의 클래스 경로 추가가 들어 있는 Java 특성 파일의 URL 또는 각 플러그인의 클래스 경로에 추가되는 쉼표로 구분된 클래스 항목에 설정됩니다. 사용자 정의된 dev 시간 클래스 경로를 요구하는 각 플러그인의 경우 해당 파일에 다음 양식의 항목이 들어 있습니다.
    <plug-in id>=<추가할 쉼표로 구분된 클래스 경로 항목>
여기서 plug-in id "*"는 별도의 언급이 없는 한 모든 플러그인과 일치합니다.
osgi.framework
OSGi 프레임워크 URL 위치입니다. Eclipse 설치를 해체할 경우 유용합니다. 자세한 내용은 위치 섹션을 참조하십시오.
osgi.frameworkClassPath
OSGi 프레임워크 구현에 사용할 쉼표로 구분된 클래스 경로 항목 목록입니다. 상대 위치는 프레임워크 위치에 따라 해석됩니다(osgi.framework 참조).
osgi.install.area {-install}
플랫폼의 설치 위치입니다. 이 설정은 기본 Eclipse 플러그인의 위치를 표시하며 Eclipse 설치를 해체할 경우 유용합니다. 자세한 내용은 위치 섹션을 참조하십시오.
osgi.instance.area {-data}
이 세션에서의 인스턴스 데이터 위치입니다. 플러그인에서는 이 위치를 사용하여 데이터를 저장합니다. 예를 들어 자원 플러그인에서는 이 위치를 프로젝트(작업공간이라고도 함)의 기본 위치로 사용합니다. 자세한 내용은 위치 섹션을 참조하십시오.
osgi.instance.area.default
이 세션에서의 기본 인스턴스 데이터 위치입니다. 플러그인에서는 이 위치를 사용하여 데이터를 저장합니다. 예를 들어 자원 플러그인에서는 이 위치를 프로젝트(작업공간이라고도 함)의 기본 위치로 사용합니다. 이 값, 즉 기본 설정은 osgi.instance.area에 설정된 값이 없는 경우에만 사용됩니다. 자세한 내용은 위치 섹션을 참조하십시오.
osgi.manifest.cache
생성된 Manifest가 발견 및 생성된 위치입니다. 기본값은 구성 영역이지만 Manifest 캐시를 별도로 저장할 수 있습니다.
osgi.nl {-nl}
Eclipse 플랫폼을 실행할 로케일 이름입니다. NL 값은 표준 Java 로케일 이름 지정 규칙을 따라야 합니다.
osgi.os {-os}
운영 체제 값입니다. 이 값은 Eclipse에 알려진 Eclipse 프로세서 아키텍처 이름 중 하나여야 합니다(예: x86, sparc, ...).
osgi.splashLocation
Eclipse를 시작할 때 표시할 스플래시 화면(.bmp 파일)의 절대 URL 위치입니다. 이 특성은 osgi.splashPath에 설정된 값을 대체합니다.
osgi.splashPath
splash.bmp 파일을 검색하는 쉼표로 구분된 URL 목록입니다. 이 특성은 osgi.splashLocation에 설정된 값으로 대체됩니다.
osgi.user.area {-user}
사용자 영역의 위치입니다. 사용자 영역은 OS 사용자에게 특정한 데이터(예: 환경 설정)를 포함하고 Eclipse 설치, 구성 또는 인스턴스와는 독립되어 있습니다. 자세한 내용은 위치 섹션을 참조하십시오.
osgi.user.area.default
사용자 영역의 기본 위치입니다. 사용자 영역은 OS 사용자에게 특정한 데이터(예: 환경 설정)를 포함하고 Eclipse 설치, 구성 또는 인스턴스와는 독립되어 있습니다. 이 값, 즉 기본 설정은 osgi.user.area에 설정된 값이 없는 경우에만 사용됩니다. 자세한 내용은 위치 섹션을 참조하십시오.
osgi.ws {-ws}
창 시스템 값입니다. 이 값은 Eclipse에 알려진 Eclipse 창 시스템 이름 중 하나여야 합니다(예: win32, motif, ...).
osgi.syspath
<xxx가 계속 사용됩니다. 이름을 고정합니다.>

위치

Eclipse 런타임에서는 플러그인 개발자에게 데이터를 읽거나 저장하는 컨텍스트를, Eclipse 사용자에게 데이터 공유 및 가시성의 범위에 대한 제어를 제공하는 위치 수를 정의합니다. Eclipse는 다음과 같이 위치 개념을 정의합니다.

User (-user) {osgi.user.area} [@none, @noDefault, @user.home, @user.dir, filepath, url]
사용자 위치는 사용자에게 특정된 위치입니다. 보통 사용자 위치는 Java user.home 시스템 특성의 값에 기초하지만 해당 위치를 대체할 수 있습니다. 사용자 범위의 환경 설정과 같은 정보 및 로그인 정보는 사용자 위치에서 찾을 수 있습니다.
Install (-install) {osgi.install.area} [@user.home, @user.dir, filepath, url]
설치 위치는 Eclipse 자체가 설치된 위치입니다. 실제로 이 위치는 실행 중인 startup.jar 또는 eclipse.exe의 상위 디렉토리(보통 "eclipse")입니다. 여러 사용자가 설치를 공유할 수 있으므로 이 위치는 일반 사용자에게 읽기 전용으로 간주됩니다. 설치 위치를 설정하고 나머지 Eclipse에서 startup.jar를 분리할 수 있습니다.
Configuration (-configuration) {osgi.configuration.area} [@none, @noDefault, @user.home, @user.dir, filepath, url]
구성 위치에는 실행할 설치 세트(또는 서브세트)를 식별 및 관리하는 파일이 들어 있습니다. 이와 같이 한 설치에 여러 구성이 있을 수 있습니다. 설치는 기본 구성 영역과 함께 제공될 수 있지만 일반 시작 시나리오는 쓰기 가능한 구성 위치를 더 찾으려는 런타임과 연관되어 있습니다.
Instance (-data) {osgi.instance.area} [@none, @noDefault, @user.home, @user.dir, filepath, url]
인스턴스 위치에는 사용자 정의 데이터 아티팩트가 들어 있습니다. 예를 들어 자원 플러그인에서는 인스턴스 영역을 작업공간 위치로 사용하므로 프로젝트의 기본 홈을 사용합니다. 기타 플러그인에서는 이 위치에서 필요한 모든 파일을 쓸 수 있습니다.

사용자는 이러한 모든 위치를 설정할 수 있지만 Eclipse에서는 값이 지정되지 않으면 올바른 기본값을 계산합니다. 위치를 설정하는 가장 일반적인 사용 케이스는 인스턴스 영역 또는 IDE 컨텍스트의 경우 작업공간입니다. 다음을 지정하여 특정 데이터 세트에서 기본 Eclipse 구성을 실행할 수 있습니다.

    eclipse -data c:\mydata

세부사항

위치는 URL입니다. 위치를 단순하게 표시하도록 파일 경로도 허용되고 자동으로 file: URL 형식으로 변환됩니다. 효율적인 제어 및 편의를 제공하는 사용 가능한 여러 사전 정의된 기호 위치도 있습니다. 위치 유형 및 기호 값을 조합한 모든 경우가 올바르지는 않음에 유의하십시오. 아래의 테이블에서는 가능한 조합을 자세히 표시합니다. 기본 케이스가 모든 위치에서 올바르고 쓰기 가능한 조합으로 설정되었으므로 일부 플러그인은 가능한 경우로 나열되었어도 다른 설정에서 실패할 수 있습니다. 예를 들어 인스턴스 영역을 정의하지 않으면 사용자 데이터에 초점을 맞춘 플러그인(예: Eclipse 자원 플러그인)에서 많은 작업을 수행할 수는 없습니다. 플러그인 개발자가 필요한 경우 지원한 설정을 선택하고 해당 기능을 설계해야 합니다.

@none
해당 위치를 명시적으로 설정하거나 기본값으로 설정할 수 없음을 표시합니다. 예를 들어 사용자 데이터가 없는 RCP 스타일 응용프로그램에서는 osgi.instance.area=@none을 사용하여 외부 파일이 디스크에 작성되지 않도록 할 수 있습니다. @none 뒤에 추가 경로 세그먼트가 올 수 없습니다.
@noDefault
정의되지 않거나 명시적으로 정의된 위치를 강제 실행합니다. 즉, Eclipse에서는 기본값을 자동으로 계산하지 않습니다. 이 방법은 해당 위치에 있는 데이터는 허용하려고 할 때 Eclipse 기본값이 적절하지 않은 경우 유용합니다. @noDefault 뒤에 추가 경로 세그먼트가 올 수 없습니다.
@user.home
Eclipse를 사용자 홈 디렉토리와 관련된 위치 값을 계산하도록 지정합니다. @user.home 뒤에 추가 경로 세그먼트가 올 수 없습니다. 모든 경우 "@user.home" 문자열이 Java "user.home" 시스템 특성 값으로 간단히 바뀝니다. 예를 들어 다음과 같이 설정합니다.
osgi.instance.area=@user.home/myWorkspace
다음은 이 때의 결과 값입니다.
file:/users/bob/myWorkspace
@user.dir
Eclipse를 현재 작업 디렉토리와 관련된 위치 값을 계산하도록 지정합니다. @user.dir 뒤에 추가 경로 세그먼트가 올 수 없습니다. 모든 경우 "@user.dir" 문자열이 Java "user.dir" 시스템 특성 값으로 간단히 바뀝니다. 예를 들어 다음과 같이 설정합니다.
osgi.instance.area=@user.dir/myWorkspace
다음은 이 때의 결과 값입니다.
file:/usr/share/eclipse/myWorkspace
위치/값
기본값 지원
파일/URL
@none
@noDefault
@user.home
@user.dir
인스턴스
예(기본값)
구성
예*
예*
설치
아니오
아니오
아니오
사용자

*는 이 설정이 기술적으로는 가능하지만 실용적으로는 관리에 어려움이 있음을 표시합니다. 특히 구성 위치가 없는 경우 Eclipse 런타임은 OSGi 프레임워크를 시작하는 경우에만 가져올 수 있습니다.

2009/02/24 12:21 2009/02/24 12:21
이 글에는 트랙백을 보낼 수 없습니다

작업을 하다 자바소스를 잃어버려 이전에 컴파일 해놓은 .class 파일을 역컴파일 해서 소스를

보고 싶을때가 있을것이다. 그리고 배포된 API 들을 열어 좋은 예가 되는 소스를 보고 공부해

볼수도 있다. 이럴때 eclipse 에서 볼수있는 방법이다.

환경은 Eclipse SDK 3.3 이며 jad 실행파일과 jadclipse 이클립스 플러그인이 필요하다.

Jad 다운로드 : http://www.kpdus.com/jad.html  jadnt158.zip

각종 OS 환경에 맞는 프로그램이 있는데 windows 용을 받는다.


Jadclipse다운로드: http://sourceforge.net/projects/jadclipse 에서

JadClipse (net.sf.jadclipse_3.3.0.jar) 를 다운 받는다. 다운받는 사이트에 보시면 eclipse 버전에 맞는 플러그인 버전이 표시 되어있으므로 맞는걸 다운받으면 된다.


먼저 jad.exe 를 사용해서 독립적으로 사용하는 방법과 eclipse 와 연동해서 사용하는 방법 두가지를

기술하도록 하겠다.

몇 개안되는 클래스파일들은 jad.exe 만으로 컴파일 하게 되면 더 편할수도 있는데 위에서 받은

jadnt158.zip 압축을 풀게 되면 jad.exe 가 나오게 되는데 이것을 java path 환경설정이 잡혀있는

bin 폴더에 넣는다. 도스창에서 실행을 바로 할수 있도록 하기 위함 이다.

제대로 깔렸는지 실행해본다.


아래 보는 바와 같이 programDlg.class 를 디컴파일 하게 되는데

명령어는 jad s .java [컴파일된파일명]로 넣어서 실행하면되는데 output[파일명].java가 될것이다.

하나의 컴파일된 클래스 파일이 아닌 폴더에 있는 모든 클래스 파일을 디컴파일하고 싶을 때

명령어는 다음과 같다. Jad -o -r -s .java **/*.class

다음은 이클립스에서 실행하기 위한 환경설정과 방법이다.

위에서 다운받은 jadclipse -> net.sf.jadclipse_3.3.0.jar eclipse plugin 폴더에 넣는다.

Windows > Preferences > java > Jadclipse 라는 메뉴가 생겼을 것이다.

기본셋팅은 아래와 같을텐데 그대로 둔다

다음 해야될것이 .class 파일클릭시 기본적으로 jadclipse 가 실행되도록 설정해줘야한다.

Windows> Preferences > General > Editors > File Associations 클릭하게 되면

모든 확장가가 기본적으로 취하게 되는 프로그램명들을 설정할수 있게 되어있는데 .class 파일을

클릭해서 아래에 jadclipse file view를 기본으로 사용하겠다고 오른쪽 default 클릭해서 셋팅한다

이제 디컴파일이 되는지 확인하기 위해서 jar 파일을 열고 클래스 파일을 클릭하게 되면

디컴파일된 소스가 화면에 나타나게 된다.

기타 환경설정을 해야되는부분이다. 한글이 깨지는 문제는 Convert Unicode String into ANSI Strings

체크하면 된다.

프로젝트 폴더에 넣었다고해서 디컴파일을 jadclipse 가 다 실행시켜주는 것은 아니다.

몇 개의 원하는 class 파일을 이클립스에서 디컴파일 할려고 할 때 Project build path Libraries

등록 되어있어야 한다. 그림에서 와 같이 Add class folder 클릭하여 원하는 폴더를 체크하면 되는데

없을경우 만들어서 넣고 그 만든폴더에 class 파일이 들어가면되는 것이다

2009/02/19 16:51 2009/02/19 16:51
이 글에는 트랙백을 보낼 수 없습니다

java.lang.OutOfMemoryError 

                     2005-05-31     송학렬    ㈜아이티플러스 기술지원부

이 문서는 기술지원 또는 개발 시 java.lang.OutOfMemoryError 를 만났을 때 원인 파악 및 해결방안 입니다.

java.lang.OutOfMemoryError 에는 크게 2가지 패턴이 있다고 볼 수 있습니다.(전적으로 개인적인 생각이지만..^^)

Java heap 메모리가 정말로 Full 되서 나는 종류가 있고 그렇지 않은데도 나는 종류가 있습니다.

그 둘 중에 어는 것 인지부터 가려내는 것이 가장 먼저 선행되어야 합니다.

Java 가상머신에는 메모리 구조가 여러단계로 나뉘어 져 있으므로 어느 영역에 의해 java.lang.OutOfMemoryError 가 나는지 알기 위해 JAVA OPTION으로 싸이트가 안정화 되기 전까진 verbosegc 또는 -XX:+PrintGCDetails  옵션을 추가해 놓는 것이 java.lang.OutOfMemoryError 났을 때를 대비해 좋은 습관이라 할 수 있습니다.

-verbosegc 또는  -XX:+PrintGCDetails  옵션으로 로그에 남는 heap 메모리 정보를 본 후 java.lang.OutOfMemoryError 가 날 때 heap이 꽉 차서 나는 것인지 아닌지 부터 판단합니다.

1.     Heap Memory Full 차지 않았을 때 1)     Perm 영역이 full 되는 경우

Permanent generation is full…

increase MaxPermSize (current capacity is set to: 134217728 bytes)

[Full GC[Unloading class sun.reflect.GeneratedSerializationConstructorAccessor31282]

 810207K->802132K(1013632K), 8.3480617 secs]

<GC: 2 4  2465625.831280 10348 0 31 113802808 105534632 286326784 0 0 35782656 715849728 715848840 715849728 134217720 134023296 134217728 8.348677 8.348677 >

Passwd Check =============

<2005. 5. 19. 오전 9 32 23 KST> <Error> <HTTP> <BEA-101017> <[ServletContext(id=2536415,name=/,context-path=)] Root cause of ServletException.

java.lang.OutOfMemoryError

위와 같은 case 인 경우네는 Java 가상머신중에 Perm 영역이 full 차는 경우 입니다. 

Perm 영역에는 class object 및 관련된 meta data가 로드되는 곳인데 싸이트가 매우 많은 수의 class를 사용하는 경우 늘려줘야 하는 case도 있습니다.

얼마가 적정한 사이즈란 정답이 없는 것 같고 max가 계속 늘어나지 않고 일정한 사이즈를 유지 하면 됩니다.

             위 에러가 났을때는 -XX:MaxPermSize=256m  옵션으로 사이즈를 적당하게 늘려주는게 방

             법이며 늘려주었는데도 불구하고 Full 차는 시간만 늘어날 뿐 계속 사이즈가 늘어난다면 이 영역은 일반 비즈니스 프로그램으로 핸들링 할 수 없는 영역이므로 WAS 제품의 버그 및 jdk 버그로 보는 것이 일반적입니다.

       

2)     MAXDSIZ 사이즈 관련

  - Exception in thread “CompileThread0″ java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate

Possible causes:

         - not enough swap space left, or

         - kernel parameter MAXDSIZ is very small.

-          java.lang.OutOfMemoryError: unable to create new native thread

 

위 두 에러가 나는 이유는 Data 사이즈가 Full 차서 더 이상 메모리 할당을 할 수 없다는 java.lang.OutOfMemoryError 입니다.

Jdk도 내부적으로 c 라이브러리를 쓰고 jni를 통해서 c프로그램을 호출할 수 도 있는 환경에서 Data 영역이상으로 메모리 사용 시 위 에러를 만날 수 있습니다.

Heap 영역에는 java heap C heap이 있는데 C heap Data 메모리 영역에 영향을 미치는 것으로 보이며 보통 C의 전역 변수들이 잡히는 영역입니다.

위 현상을 만났을 때는 hp os MAXDSIZ가 너무 작게 잡혀있지 않은지 확인 후 적당한 크기로 늘려 줘야 합니다.

Glance 에서 shift+m 을 누른 후 jvm pid를 누르면 java가 사용하는 Data 사이즈를 모니터링 할 수 있습니다.

모니터링을 통해 적정한 사이즈로 MAXDSIZ를 늘려주어야 하며 만일 늘려 준게 에러 발생의 시간만 지연 시킬 뿐 계속 사용량이 늘어난다면 이는 사용하는 c라이브러리 쪽에 메모리 릭 버그가 있는 것이므로 c라이브러리를 체크 하셔야 합니다.

java.lang.OutOfMemoryError: unable to create new native thread

이 경우는 프로그램에서 Thread pool 프로그램 실수로 필요이상으로 쓰레드가 생성되는 경우도 과도하게 메모리를 사용할 수 있으므로 jvm 쓰레드 덤프를 통해 과도한 쓰레드가 생성되지 않았는지도 확인해 보셔야 합니다.

2.     Heap Full 찾을 때

이 경우는 java가 사용하는 heap 영역이 Full 되서 java.lang.OutOfMemoryError 가 나는 경우 인데 두 가지 패턴이 있습니다.

순간적으로 대량의 데이터를 메모리에 올리는 프로그램이 실행되어 문제를 야기 할수 있으며 다른 한 가지는 조금씩 메모리 릭이 발생하여 점차적으로 메모리가 쌓여 가는 경우 입니다.

두 가지 중에  어느 것인지 구별하는 것이 중요하며 이를 위해서도 마찬가지로 -verbosegc 또는  -XX:+PrintGCDetails  로그를 통해 순간적으로 메모리가 차는 것인지 조금씩 메모리가 차는 것인지를 확인하셔야 합니다.

1) 특정 프로그램의 특정시점의 과도한 메모리 사용에 의한 경우

                특정 프로그램이 과도하게 heap 메모리 이상 메모리를 사용하면서

java.lang.OutOfMemoryError가 발생하는 경우는 이 에러가 발생하는 시점의 쓰레드 덤프를 통해 어느 프로그램인지 쉽게 찾을 수 있습니다.

쓰레드 덤프에 메모리를 쓸만한 프로그램은 어느 정도의 자바프로그램 경험이 있으면 찾을 수 있습니다.

Ex)

“ExecuteThread: ‘36′ for queue: ‘default’” daemon prio=10 tid=0×0048e7b0 nid=48 lwp_id=4139729 runnable [0x23f32000..0x23f30500]

          at java.net.SocketInputStream.socketRead(Native Method)

          at java.net.SocketInputStream.read(Unknown Source)

          at oracle.net.ns.Packet.receive(Unknown Source)

          at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)

          at oracle.net.ns.NetInputStream.read(Unknown Source)

          at oracle.net.ns.NetInputStream.read(Unknown Source)

          at oracle.net.ns.NetInputStream.read(Unknown Source)

          at oracle.jdbc.ttc7.MAREngine.unmarshalUB1(MAREngine.java:71 8)

          at oracle.jdbc.ttc7.MAREngine.unmarshalSB1(MAREngine.java:690)

          at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:373)

          at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1405)

          at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:889)

          - locked <0×35e8e3b0> (a oracle.jdbc.ttc7.TTC7Protocol)

          at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:242)

          - locked <0×36f66c98> (a oracle.jdbc.driver.OracleResultSetImpl)

          at weblogic.jdbc.pool.ResultSet.next(ResultSet.java:180)

          at Dcard.AAA.ejb.monitor.member.wbbb.WACBean.getInfoList(WACBean.java:5789)

java.lang.OutOfMemoryError 가 날 상황에 쓰레드 덤프를 두 세번 떠서 같은 쓰레드 번호로 위 같은 로직이 오래 결려있다면 이는 프로그램에서 while(rs.next()) 를 오랜 기간 돌면서 메모리에 DB로부터 읽어서 올리고 있다는 것을 의미 합니다 대량 데이터 조회가 일어나는 경우인 것 입니다.

이런 식으로 특정 프로그램의 특정 시점에 과도한 메모리 사용으로 인한 java.lang.OutOfMemoryError 에러는 쓰레드 덤프를 통해 찾을 수 있습니다.

물론 2번에서 설명 할 heap dump를 통해서도 찾을 수 있습니다.

2) 메모리 릭에 의해 조금씩 메모리가 쌓인 경우

JVM위 에서 실행중인 프로그램중에 어떤 것이 GC 대상에서 제외되는 영역에 data를 조금씩 쌓고 있다는 얘기입니다.

GC 대상에서 제외되는 영역은 다음과 같은 곳이 있습니다.

- Http Session에 넣는 데이터..(세션 타임아웃 또는 invilidate 씨 까지 제외됨)

- Static 변수

- 서블릿 또는 jsp의 멤버변수 ( WAS 기동 후 최초 호출 시 인스턴스 화 되어 WAS가 내려 갈 때 까지 사라지지 않음 )

- EJB의 멤버변수( pool안에서 객체가 존재하는 한 GC대상에서 제외)

          위 같은 영역에 프로그램에서 data add 하는 구조를 메모리 릭 이라고 할 수 있습니다.

           IBM 또는 SUN JDK 인 경우에는 heapdump를 통해서 분석하여 어느 데이터가 메모리를 많이 잡고 있는지를 알 수 있습니다.

           Heapdump 사용법 및 분석 법은 다음을 참조 하시면 됩니다.

 http://www.alphaworks.ibm.com/aw.nsf/FAQs/heaproots

http://www-1.ibm.com/support/docview.wss?uid=swg21190476

http://www-1.ibm.com/support/docview.wss?rs=180&context=SSEQTP&q1=heapdump+solaris&uid=swg21190608&loc=en_US&cs=utf-8&lang=en

http://www.skywayradio.com/tech/WAS51/IBMHeapDump/

출처 : http://www.javaservice.net/~java/bbs/read.cgi?m=etc&b=jdk&c=r_p&n=1117521098&p=1&s=t#1117521098

var viewer_image_url = “http://blogimgs.naver.com/blog20/blog/layout_photo/viewer/”; var photo = new PhotoLayer(parent.parent.parent); photo.Initialized(); window.onunload = function() { photo.oPhotoFrame.doFrameMainClose(); }.bind(this);

2008/07/31 17:57 2008/07/31 17:57
이 글에는 트랙백을 보낼 수 없습니다
웅쓰:웅자의 상상플러스
웅자의 상상플러스
전체 (379)
게임 (5)
영화 (2)
기타 (23)
맛집 (5)
영어 (2)
대수학 (3)
형태소 (5)
Hacking (9)
Linux (112)
HTML (48)
Application_developing (48)
Web_developing (102)
Window (11)
«   2024/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
  1. 2016/01 (1)
  2. 2015/12 (3)
  3. 2015/10 (3)
  4. 2015/03 (2)
  5. 2015/01 (4)