JAVA & Open Framework2013. 10. 5. 13:59

1. log4j-xxx.jar 라이브러리를 프로젝트에 추가한다.


2. 아래와 같이 사용(log4j.xml파일 - class 생성되는 폴더에 위치) : 아래 첨부파일참조   



log4j.xml




<?xml version="1.0" encoding="UTF-8" ?> 

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> 

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">


<!-- 콘솔 로그  -->

<appender name="stdout" class="org.apache.log4j.ConsoleAppender"> 

<!-- 콘솔 패턴 레이아웃 설정 -->

<layout class="org.apache.log4j.PatternLayout"> 

    <param name="ConversionPattern" value="%t> [%d{yyyy-MM-dd HH:mm:ss}] [%c{1}] [%L line] [%p] %m %n" /> 

</layout>

</appender>



<!-- 날짜별 로그 -->

<appender name="dailyout" class="org.apache.log4j.DailyRollingFileAppender">

<!-- 이것은 날짜별로 로그를 남김. 파일명.확장자.DatePattern으로 정의함. -->

<param name="file"   value="D:/log4j_xml_daily.log" /> 

    <param name="Append" value="true" />    

    <param name="DatePattern" value="'.'yyyy-MM-dd" />    

    <layout class="org.apache.log4j.PatternLayout"> 

    <param name="ConversionPattern" value="%t> [%d{yyyy-MM-dd HH:mm:ss}] [%c{1}] [%L line] [%p] %m %n"/> 

    </layout> 

</appender>

<!-- pattern layout

%p : debug, info 등의 로그타입

%d : 로그 발생 시간 SimpleDateFormat을 따름( ex) %d{yyyy-MM-dd HH:mm:ss} )

%t : 로그 쓰레드 이름

%F : 로그 발생 프로그램 파일명( ex) HolloWorld.java 등으로 표시됨)

%c : 로그 발생 클래스명(만약 패키지가 너무 길다면 %c{숫자}로 조절 가능)

( ex) action.test1.test2.LoginAction.class => %c{1} : LoginAction /  %c{2} : test2.LoginAction 

 %c{3} : test1.test2.LoginAction / %c{4} : action.test1.test2.LoginAction .....  )  

%M : 로그 발생 메서드명

%L : 호출 코드 라인

%r : 프로그램 시작 후 로그 발생까지 시간

%m : 로그로 전달된 메시지(즉, 발생하도록 세팅한 메시지)

%n : 개행 

 -->



<!-- 특정 크기마다 백업하며 로그 -->

<appender name="rolling" class="org.apache.log4j.RollingFileAppender">

<param name="file" value="D:/log4j_xml_rolling.log"/>

<param name="Append" value="true"/>

<param name="MaxFileSize" value="5KB"/>

<param name="MaxBackupIndex" value="3"/>

<layout class="org.apache.log4j.PatternLayout">

  <param name="ConversionPattern" value="%t> [%d{yyyy-MM-dd HH:mm:ss}] [%c{1}] [%L line] [%p] %m %n"/>

</layout>

</appender>



<!-- xml 로그 -->


<!-- xml 형식으로 로그를 남김 -->

<appender name="xmlout" class="org.apache.log4j.FileAppender">

<param name="file" value="D:/log4j_xml_xmlout.xml"/>

<param name="Append" value="true"/>

<layout class="org.apache.log4j.xml.XMLLayout" />

</appender>

<root> 

      <level value="WARN"/>

      <!-- 또는 <priority value="WARN"/> -->

      <appender-ref ref="stdout"/>

      <appender-ref ref="dailyout"/>

      <appender-ref ref="rolling"/>

      <appender-ref ref="xmlout"/>      

 </root> 

 

</log4j:configuration>




3. Pattern Layout

#%p : debug, info 등의 로그타입
#%d : 로그 발생 시간 SimpleDateFormat을 따름( ex) %d{yyyy-MM-dd HH:mm:ss} )
#%t : 로그 쓰레드 이름
#%F : 로그 발생 프로그램 파일명( ex) HolloWorld.java 등으로 표시됨)
#%c : 로그 발생 클래스명(만약 패키지가 너무 길다면 %c{숫자}로 조절 가능)
#( ex) action.test1.test2.LoginAction.class => %c{1} : LoginAction /  %c{2} : test2.LoginAction 
#  %c{3} : test1.test2.LoginAction / %c{4} : action.test1.test2.LoginAction .....  )  
#%M : 로그 발생 메서드명
#%L : 호출 코드 라인
#%r : 프로그램 시작 후 로그 발생까지 시간
#%m : 로그로 전달된 메시지(즉, 발생하도록 세팅한 메시지)
#%n : 개행



출처 및 참조 : http://pupustory.tistory.com/153

Posted by 아로나
JAVA & Open Framework2013. 10. 5. 13:58

1. log4j-xxx.jar 라이브러리를 프로젝트에 추가한다.


2. 아래와 같이 사용(log4j.properties 파일 - class 생성되는 폴더에 위치) : 아래 첨부파일참조



log4j.properties




#Log4J Settings for log4j 1.2.x (via jakarta-commons-logging)

#

# The five logging levels used by Log are (in order):

#

# 1. DEBUG (the least serious)

# 2. INFO

# 3. WARN

# 4. ERROR

# 5. FATAL (the most serious)


# Set root logger level to WARN and append to stdout

#로그설정(로그레벨 DEBUG(최저 심각도), INFO, WARN, ERROR, FATAL(최고) / OFF일 경우 로그사용 안함), 사용 로그 이름

log4j.rootLogger=DEBUG, stdout, rolling 


#stdout 로그 레벨 설정

log4j.appender.stdout.Threshold=WARN

#stdout 콘솔 어펜더로 사용

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

#stdout 패턴 레이아웃 사용

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.

# stdout 레이아웃 패턴 정의

#%p : debug, info 등의 로그타입

#%d : 로그 발생 시간 SimpleDateFormat을 따름( ex) %d{yyyy-MM-dd HH:mm:ss} )

#%t : 로그 쓰레드 이름

#%F : 로그 발생 프로그램 파일명( ex) HolloWorld.java 등으로 표시됨)

#%c : 로그 발생 클래스명(만약 패키지가 너무 길다면 %c{숫자}로 조절 가능)

#( ex) action.test1.test2.LoginAction.class => %c{1} : LoginAction /  %c{2} : test2.LoginAction 

#  %c{3} : test1.test2.LoginAction / %c{4} : action.test1.test2.LoginAction .....  )  

#%M : 로그 발생 메서드명

#%L : 호출 코드 라인

#%r : 프로그램 시작 후 로그 발생까지 시간

#%m : 로그로 전달된 메시지(즉, 발생하도록 세팅한 메시지)

#%n : 개행

log4j.appender.stdout.layout.ConversionPattern=%t> [%d{yyyy-MM-dd HH:mm:ss}] [%c{1}] [%L line] [%p] %m %n



#롤링파일 어펜더 사용

log4j.appender.rolling=org.apache.log4j.RollingFileAppender

#롤링파일 로그에 대한 경로 및 파일명

log4j.appender.rolling.File=D:/output.log

#롤링파일 로그 최대 크기

log4j.appender.rolling.MaxFileSize=3KB

#롤링파일 로그 크기가 MaxFileSize를 초과한 경우 백업 파일의 수( ex)output.log.1 , output.log.2 ...)

log4j.appender.rolling.MaxBackupIndex=2

#롤링파일 패턴 레이아웃 사용 설정

log4j.appender.rolling.layout=org.apache.log4j.PatternLayout

#롤링파일 패턴 레이아웃 정의

log4j.appender.rolling.layout.ConversionPattern=%t> [%d{yyyy-MM-dd HH:mm:ss}] [%c{1}] [%L line] [%p] %m %n




3. Pattern Layout

#%p : debug, info 등의 로그타입
#%d : 로그 발생 시간 SimpleDateFormat을 따름( ex) %d{yyyy-MM-dd HH:mm:ss} )
#%t : 로그 쓰레드 이름
#%F : 로그 발생 프로그램 파일명( ex) HolloWorld.java 등으로 표시됨)
#%c : 로그 발생 클래스명(만약 패키지가 너무 길다면 %c{숫자}로 조절 가능)
#( ex) action.test1.test2.LoginAction.class => %c{1} : LoginAction /  %c{2} : test2.LoginAction 
#  %c{3} : test1.test2.LoginAction / %c{4} : action.test1.test2.LoginAction .....  )  
#%M : 로그 발생 메서드명
#%L : 호출 코드 라인
#%r : 프로그램 시작 후 로그 발생까지 시간
#%m : 로그로 전달된 메시지(즉, 발생하도록 세팅한 메시지)
#%n : 개행







출처 및 참고 : http://pupustory.tistory.com/152

Posted by 아로나
JAVA & Open Framework2013. 10. 5. 13:57

1. log4j-xxx.jar 라이브러리를 프로젝트에 추가한다.


2. 아래와 같이 사용


package action.test1.test2;


import com.opensymphony.xwork2.Action;

import org.apache.log4j.ConsoleAppender;

import org.apache.log4j.Logger;

import org.apache.log4j.PatternLayout;



public class LoginAction implements Action {

static Logger logger = Logger.getLogger(LoginAction.class);

private String message;

//setter

public void setMessage(String message) {

this.message = message;

}

//getter

public String getMessage() {

return message;

}

@Override

public String execute() throws Exception{

if (message == null)

message = "";

else

message = message;

message += userId + "로 로그인하셨습니다.";

//System.out.println("test log : " + message);

PatternLayout pattern = new PatternLayout("%t> [%d{yyyy-MM-dd HH:mm:ss}] [1 %c{1}] [2 %c{2}] [3 %c{3}] [4 %c{4}] [5 %c{5}] [6 %c{6}] [%F] [%L line] [%p] %m %n");

logger.addAppender(new ConsoleAppender(pattern));

logger.debug("로그를 출력합니다.");

logger.debug("콘솔 Appender를 이용했으므로 콘솔로 출력 됩니다.");

logger.debug("파일, 혹은 db로도 저장 가능하구요!");

logger.warn("warn 로그를 출력합니다.");

logger.warn("warn 콘솔 Appender를 이용했으므로 콘솔로 출력 됩니다.");

logger.warn("warn 파일, 혹은 db로도 저장 가능하구요!");

return SUCCESS;

}


}


3. Pattern Layout

#%p : debug, info 등의 로그타입
#%d : 로그 발생 시간 SimpleDateFormat을 따름( ex) %d{yyyy-MM-dd HH:mm:ss} )
#%t : 로그 쓰레드 이름
#%F : 로그 발생 프로그램 파일명( ex) HolloWorld.java 등으로 표시됨)
#%c : 로그 발생 클래스명(만약 패키지가 너무 길다면 %c{숫자}로 조절 가능)
#( ex) action.test1.test2.LoginAction.class => %c{1} : LoginAction /  %c{2} : test2.LoginAction 
#  %c{3} : test1.test2.LoginAction / %c{4} : action.test1.test2.LoginAction .....  )  
#%M : 로그 발생 메서드명
#%L : 호출 코드 라인
#%r : 프로그램 시작 후 로그 발생까지 시간
#%m : 로그로 전달된 메시지(즉, 발생하도록 세팅한 메시지)
#%n : 개행



출처 및 참고 : http://pupustory.tistory.com/151

Posted by 아로나
JAVA & Open Framework2013. 10. 2. 14:58

1. SVN 서버 설치 하기


http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=11151&expandFolder=11151&folderID=91 

에 접속하여 Subversion을 다운로드 한다.


작성일(13.10.02) 기준으로 최신 Version인 1.6.6 다운로드 받음.






SVN 서버 설치 완료됨. 별다른 어려움이 설치가 가능하다.




2. SVN repository 지정 및 SVN 서버 설정



SVN용 repository로 사용할 디렉토리 선정. 본 글에서는 E:\svn_repo 를 repository로 사용하기로 결정.



윈도우 - 시작 - cmd 를 통해 명령어프롬포트 실행하여 repository로 사용할 폴더 이동하여 아래 명령어들 수행


E:


CD svn_repo


svnadmin create --fs-type fsfs svn


svn checkout file:///E:/svn_repo/svn


("체크아웃된 리비전 0." 이라는 메시지가 나와야 정상 체크아웃 된 것.)

--> 여기까지하면 SVN repository 설정 완료



repository 설정 후 해당 실제 폴더에 가보면 위에서 설정한 이름으로 폴더(E:\svn_repo\svn) 가 생성되어 있는 것을 알 수 

있다.  새로 생성된 하위 폴더 중에서 conf 폴더에 있는 설정파일들을 수정한다. (svnserve.conf , passwd, authz)


svnserve.conf 설정


기본적으로는 # 으로 주석처리가 되어 있으며, 아래 부분들을 상황에 맞게 주석해제 및 수정해주면 된다.

# anon-access = read  ( 인증 필수 여부 설정 - read : 미인증사용자 읽기가능, none : 미인증시읽기 및 쓰기 불가 )

# auth-access = write ( 인증사용자의 쓰기권한 설정 )

# password-db = passwd ( id/pw 가 등록되어 있는 파일명)

# authz-db = authz ( 그룹별 계정권한 설정 파일명 )

# realm = My First Repository ( 저장소 인증 시 나오는 타이틀 설정 )




svnserve.conf 파일을 설정한 모습.

# anon-access = read  =>  anon-access = none  (필수적으로 인증 필요함)

# auth-access = write => auth-access = write (인증된 사용자 쓰기 가능)

# password-db = passwd => password-db = passwd (passwd파일에서 id/pw 관리)

# authz-db = authz => 그대로 주석 처리 ( 그룹관련 설정 안함 - 유의사항 참조 : http://kldp.org/node/96377 )

# realm = My First Repository => realm = wintness Repository ( 저장소 인증 시 "wintness Repository"가 나오도록 설정 )

단, 주의해야 할 점은 주석해제 후 수정시 앞에 공백이 있으면 안된다!!!

ex) # anon-access = read  =>  anon-access = none 으로 수정 시 anon 앞에 공백이 있으면 인식이 안되므로 주의할 것.



* passwd 설정


화면처럼 [users] 아래에 유저명 = 유저패스워드 로 로그인가능 한 ID / password 를 설정한다.

이 또한 앞에 공백이 있으면 안되니 조심 할 것.


* authz 설정

그룹별 권한을 설정하는 파일로 여기에서는 사용하지 않기로 한다.

참조 : http://kldp.org/node/96377

===> SVN 서버 설정 완료



3. SVN 서버 START


* 방법 1) cmd 창에서 서버 실행


cmd 창에서 아래와 같은 명령어 수행(E:\svn_repo 를 svn용 repository root directory에 해당)

svnserve -d -r E:\svn_repo

단, cmd 창에서 서버를 수행한 경우 cmd창을 끄게 되면 서버수행이 중지된다.



* 방법 2) 윈도우 서비스에 등록하여 서버 수행


cmd 창에서 위와 같이 sc 를 이용하여 서비스에 등록


sc create svn_2 binpath= "C:\Program Files (x86)\Subversion\bin\svnserve.exe --service -r E:\svn_repo" displayname= "Subversion Server_2" depend= Tcpip start= auto


기본적으로 자동시작으로 옵션을 설정했으므로 윈도우 구동시 자동으로 시작된다.


-> 등록한 서비스를 제거하는 경우 아래 명령어를 이용하여 제거.(단, 등록 후 바로 제거하는 경우 제대로 안되는 경우가 

있으므로 이러한 경우 재부팅 후 제거 명령을 수행해야 제대로 제거됨.)

sc delete svn_2 displayname= "Subversion Server_2"



정상적으로 등록된 경우 제어판 - 관리도구 - 서비스에서 위와 같이 "Subversion Server_2"가 생긴 것을 알 수 있다.

윈도우 재구동 시 자동시작이 되며 여기에서 직접  SVN서버 수행 및 정지가 가능하다.




4. SVN 서버와 이클립스 연동


* 사전준비사항

1) SVN서버 구동

2) 이클립스에 SVN 플러그인 사전 설치 ( 참조 : http://tiger5net.egloos.com/5570003 )



이클립스 - SVN Repositories탭 - New - Repository Location.. 클릭




설정했던 URL 정보 ( svn://localhost/svn ) 와 passwd 파일에 설정한 user명과 user패스워드를 입력하고

Finish버튼 클릭



Finish버튼을 눌렀을 경우 아무런 메시지가 나오지 않고 위와 같이 SVN Repositories 탭에 "svn://localhost/svn"가 

추가되었으면 정상적으로 이클립스와 SVN 서버가 연결된 것.

(단, Finish버튼 클릭 시 SVN 인증 실패 및 기타 메시지가 나오는 경우에는 설정 시 잘못된 것이므로 재설정 후

SVN 서버 재구동 하고 다시 추가를 해본다.)








Posted by 아로나
JAVA & Open Framework2013. 10. 1. 14:37

소스코드 관리 프로그램중 Tortoisesvn를 대해 기본적인 사용법이다.

서버 PC가 없는 관계(???)로 ,

내 PC에 있는 별도의 디스크를 Local 저장소로 사용할 예정이다.

 

Tortoisesvn를 아래 사이트로 접속 후

http://tortoisesvn.net/downloads.html

 

32bit or 64bit중 선택해서 클릭 후, 아래 창이 뜨면 저장을 클릭후 적당한 디렉토리에 다운을 받고,

 

다시 전 화면으로 와서 밑으로 스크롤해서 언어팩중 한국어를 다운받는다.

 

 

설치를 위해

다운받은 TortoiseSVN-1.7.3.22386-win32-svn-1.7.2.msi를 실행을 한다.

"실행"클릭… 화면 뜨는데로 진행을 해준다à go

 

 

Next 클릭

 

 

Agree후 next 클릭

 

 

Next 클릭

 

 

Install 클릭

 

 

설치중…..

 

 

Finish 클릭

 

 

탐색기 실행후 좌측 아무 디렉토리 선택 후 오른쪽마우스 버튼 클릭시,

아래 적색부분의 SVN Checkout 과 TortoiseSVN 메뉴가 나오면 정상적으로 설치가 된것이다.

 

메뉴를 한글로 보이기 위해 다운받은 한글팩을 설치해준다.(설치안 해도 무방)

LanguagePack_1.7.3.22386-win32-ko.msi 를 실행한다.

실행 클릭

 

 

Next 클릭

 

 

설치중……………………..

 

 

Finish 클릭

 

 

탐새기 임의의 디렉토리 선택후 오른쪽 마우스 버튼 클릭하면 아래와 같이 한글 메뉴들이 보인다.

 

 

이제부터 저장소(repository)를 만들고 , 이곳에 소스나 data들을 저장 및 관리를 한다.

  1. 저장소는 나의 경우 F:/repository/project1만들고
  2. 생성된 디렉토리 안으로 들어가 우측 선택 후 오른쪽 마우스 클릭-> TortoiseSVN 커스 위치->" 현재위치에 저장소 생성(Y)" 클릭

     

     

    "폴더 구조 생성" 클릭 ---> "확인" 클릭

    (폴더구조 생성 클릭을 하면 project1안에 3개의 폴더 trunk,branch,tags가 생기지만,

    보이지는 않는다. Trunk에 최초로 import후 check-out,commint를 주로 사용 하게 된다.)

     

     

  3. 아래와 같은 디렉토리들이 project1안에 생성이 된다.

     

     

  4. Repository/project1/ trunk로 improt할 project를 import를 시켜준다.

Import 할때는 탐색기를 통해 해당 project 경로로 이동후

 

디렉토리 선택 후 TortiseSVn -> "임포트" 클릭

 

  1. 저장소 URL를 위에서 생성한 저장소 경로가 안 나오면 아래 화면에서 우측 상단의 버튼으로

저장소 경로 file://F:/repository/project1/trunk " 를 선택 해주고 -> "확인" 클릭

 

 

아래와 같이 저장소로 파일들이 import가 되고, 완료가 되면 좌측 하단에 import건수 표시가 되고 "확인" 클릭

 

 

그다음에는 임포트를 받은 원래 project 작업공간 check-out를 해 준다.

 

저장소 디렉토리인 repoitory 오른쪽 마우스 클릭 -> SVN 체크아웃(K)클릭

 

 

체크아웃받을 디렉토리 익스포트(D)에 지정 후 "확인" 클릭

 

 

목적지 경로로 파일들이 추가가 되며,

완료가 되면 -> "확인" 클릭

 

 

정상적으로 check-out이 되었으면 녹색 체크 표시로 나타난다.

    

 

 

Project1에서 수정작업 후 project1 디렉터리 내부를 보면

 

위와 같이 수정된 파일은 적색의 느낌표로 표시되며,

 

Commit를 해 보자…

 

      

    

SVN 커밋(C)를 클릭 하면 아래 화면과 같이 수정된 파일들이 뜨고 -> 확인 클릭(최근 메시지 박스에 내용도 필요한 내용이 있으면 적어준다.)

 

 

commit이 정상적으로 되었으면 아래 창이 뜨고 -> "확인" 클릭


출처 : http://hotcoffee.tistory.com/entry/Tortoise-SVN-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B8%B0%EB%B3%B8%EC%82%AC%EC%9A%A9%EB%B2%95

Posted by 아로나
JAVA & Open Framework2013. 9. 14. 17:33

안녕하세요 자바를 시작한지 벌써 1년이 다되가지만 부끄러운 질문하나 드립니다. 아무리 책을 찾아보고 인터넷을 찾아보아도 머리속엔 제대로
정리가 되지않아 답답합니다.
1
Collection list = new ArrayList();
Arraylist list = new ArrayList();

2
HashMap map = new HashMap();
Map map = new HashMap();

이렇게 인터페이스 형태를 선언하고 쓰는걸 잘 모르겠습니다.
정확히 말하면 차이점을 모른다는 겁니다.


**

1번에 list. 으로 접근하면 Collection 메서드만 사용할 수 있죠?

앞에 레퍼런스 변수 타입을 Collection말고 ArrayList로 선언 후

(ArrayList

list. 으로 접근하면 Collection을 상속하고있는 ArrayList에 많은

멤버(메서드)를 사용할 수 있을텐데 왜 Collection으로 선언하나요?

어떤 이점이 있고 왜 이렇게 사용하는지 궁금합니다.

**


다형성에 대한 예제도 찾아보았으나  Api기준으로 설명되어있는게없어
이렇게 질문 드립니다. 자세한 답변 부탁드립니다.


==> reply


  • nimal 을 인터페이스로 든 예제. 
    Parent 를 예로 든 예제 많이 봤습니다. 정중히 사양합니다
  • 9562123 
  • 2010-03-31 20:08:27
  • x
  • Collection으로 선언하면 인터페이스에 있는 메소드 밖에 못쓰지만 

    대신에 나중에 ArrayList가 아닌 Vector나 기타 자료형으로 쉽게 교체가 가능하죠 

    같은것을 상속 받았기 때문에 마치 렉서스, 벤츠가 자동차라고 불리우지만 

    자동차가 렉서스, 벤츠는 꼭 아니잖아요 ...여기도 같은 원리라고 보시면 편하 실거 

    같네요.. ArrayList Vector 둘다 Collection 일종이지만 

    Collection은 꼭 ArrayList가 될수 없는거 처럼.... 

    뭐 어리석은 소견이였습니다.... 

  • 5418공적이 
  • 2010-03-31 21:15:37
  • x
  • 아 interface에 사전적인 의미로 접점이라는 의미가 있으니까 서로 연결해줄수 

    있는 통로 ...라고 생각하시면 더 편하실듯...(어려워지는건가요 ㅠㅠ);
  • 5418공적이 
  • 2010-03-31 21:17:26
  • x
  • ---------------------------------------- 
    대신에 나중에 ArrayList가 아닌 Vector나 기타 자료형으로 쉽게 교체가 가능하죠 
    ---------------------------------------- 
    이 말슴은 혹시 Collection 을 Implements하고 있는 클래스들간에는 
    Casting이 자유롭기 때문이라는 말슴인가요? (Vector,AbstractSet,AbstractCollection 등등등.;..) 


  • 9562123 
  • 2010-03-31 21:21:30
  • x
  • 아 혹시.. 
    Collection으로 선언해논 객체 list에는 
    나중에 
    list = new ArrayList(); 
    list = new Vector(); 
    list = new AbstractSet(); 
    등등등으로 자유롭게 변경할 수 있다는 장점이라는 말슴이신지요?
  • 9562123 
  • 2010-03-31 21:26:41
  • x
  • 네 그러한 장점이 있죠... 

    그래서 spring framework에서 인터페이스를 주로 사용하는 이유가 그이유죠.. 

    조합을 할수 있다는 장점과 쉽게 언제든지 교체된다 .. 

    라는 장점 ... 

    저는 아직 프로그래머도 아니라서 많이 어설퍼요^^;;
  • 5418공적이 
  • 2010-03-31 22:41:58
  • x
  • 보통 인터페이스를 설계할 때는 메소드 시그네쳐만 봐도 개발자의 의도가 드러나야 한다고 이야기합니다. 즉, 네이밍, 리턴 타입, 파라메터, 예외 선언 등만 봐도 무슨 의도로 그 메소드를 설계했는지 명확해야한다는 건데요... 

    예를들어 List<Product> getProducts();라는 메소드가 있다면 이름과 반환값만 봐도Product, 즉 제품에 해당하는 객체의 묶음을 반환한다는 뜻임을 알 수 있습니다. 

    이 때, List를 통해 추가로 알 수 있는 건 반환하는 형은 순서가 있는 컬렉션이고 아마도 개발자는 제품을 이름순으로 정렬한다던지 해서 반환하도록 구현하겠죠... 

    그럼 만약 해당 메소드가 ArrayList<Product> getProducts()라면 어떻게 되나요? 

    ArrayList는 배열을 백엔드로한 List의 한 구현체에 불과합니다. 꼭 그 구현을 쓰는 것이 해당 인터페이스 개발자의 의도라고 볼 수 있을까요? 비즈니스적으로 반드시 제품목록을 가져오는데 배열을 백엔드로 하는 구현체에 담아야한다는 요구조건이 있을 가능성은 적습니다. 

    또한 반환형을 ArrayList 같은 구현체 대신에 List라는 인터페이스로 정의하면 의도가 명확하게 한정되는 것 이외에 위의 몇몇 분들께서 말씀하신 것처럼 구현 차원에서 좀 더 자유도를 확보할 수 있습니다. 

    좀 구체적으로 예를 들어보면 처음엔 내부적으로 ArrayList로 구현했다가 속도가 마음에 들지 않아 commons collections에 있는 FastArrayList로 바꿀 수도 있는 것이죠. 또 하이버네이트 같은 ORM으로 백엔드 구현을 바꾸어서 getProducts().get(1).getCategory() 이런 걸 레이지 로드로 가져올 수도 있고 (이런 게 가능하려면 하이버에니트에선 List의 프록시를 씁니다) 그런 변화들을 인터페이스의 클라이언트 쪽에 영향을 주지 않고 변경할 수 있는 장점이 있습니다.
  • 5322fender 
  • 2010-04-01 01:07:59
  • x
  • 누군가가 만들어놓은걸 사용하는 입장으로 생각하면 편합니다. 
    외부 API 를 사용해야 하는데 
    void myMethod(List list) 
    이런 타입이라면 
    일단 그작자가 왜 저렇게 만들었는지는 모르겠더라도 
    '당신이 뭐를 던지던 List 를 상속받은거라면 명시한 기능을 수행해 주겠음' 
    이라는 뜻이니 사용하는 입장에서는 자유도가 높아지죠.
  • 8064지나가다... 
  • 2010-04-01 04:16:21
  • x
  • 부모의 모든걸 자식이 물려받아요 ㅋㅋ 
    이것만 알면 끝임
  • 4224크르릉 
  • 2010-04-01 10:53:33
  • x
  • 단순한 루틴에서는 

    HashMap map = new HashMap(); 

    이와 같이 써도 똑같습니다. 단순히 쓰는 루틴에선 똑같아요. 
    꼭 Map map 으로 할 필요 없습니다. 

    그런데, 좀 복잡한 루틴이 되면 

    Map map; 

    과 같이 선언해 두어야 할 경우가 생깁니다. 
    가령 이같은 경우에는 map을 구현하되 HashMap 으로 구현할지 HashTable로 쓸 것인가 모를 경우에 저렇게 쓰고요. 즉, Map map 이하의 구문에서 조건에 따라 그게 달라질 경우 저렇게 선언해 놓습니다. 그냥 여기에서의 예일뿐인데 경우에 따라 Thread Safe가 필요하면 HashTable로 선언을, Thread Safe가 필요없다면 성능이 좋은 HashMap 으로 선언하게 되는거죠. 이런식으로 하기 위해 상위 Interface로 선언하는 경우가 있는겁니다. 

    웹프로그래밍에선 WAS 컨테이너에서 많은 부분을 자동으로 처리해 주기 때문에 이런 객체지향 적인 구분이 거의 쓰이지 않지만 Java Swing 에서는 이런게 아주 자주 쓰여요. 

    가령 Input 이라는 클래스를 구현하는 Radio 박스와, Check 박스가 있다고 할때 
    일단 Input 이라고 선언해 두고, 이후 문제 문항에 따라 Radio 로 생성하기도 하고 Check 로 생성하기도 하는거죠. 값을 입력 받아 저장하는건 똑같지만, 도구를 다르게 가져가는 겁니다. 
  • 7895ㅁㅁㅁㅁ 
  • 2010-04-06 10:48:23
  • x

  • 1. 인터페이스 List 대신에 구현 클래스 ArrayList의 형타입을 알 수 있다면 더 편리하게 사용할 수 있습니다. (낮게 나는 새가 더 자세히 본다) 

    2. 구현 클래스 ArrayList 대신에 인터페이스 List를 사용하면 더 많은 형타입을 받아 들일 수 있습니다. (높게 나는 새가 더 멀리 본다.) 

    예를들어, 목록의 모든 원소를 출력하는 메서드 public void printAll(List items)는 
    public void printAll(ArrayList items) 보다 더 많은 종류의 형타입을 받아 들일 수 있습니다. (Vector, Set, etc) 

    3. 구현 클래스 ArrayList 대신에 인터페이스 Iterable을 받아 들인다면, 클라이언트는 
    인수로 받는 객체의 크기가 변하지 않을것이라는 보증을 할 수 있습니다. (Iterable 객체는 객체를 더 넣을 수 없습니다. 

    4. 인터페이스 Map을 만족하는 객체라면 굳이 HashMap이 아니여도 Map을 구현하는 클래스를 만들어 사용할 수 있습니다. 
    예를들어 서블릿에서 Cookie를 조작하기 위하여 HttpRequest와 HttpResponse클래스에 의존적인 작업을 해야 합니다만, 이들 클래스를 캡슐화 시키는 일반 클래스 CookieMap클래스를 만들 수 있습니다. 

    public class CookieMap implements Map<String, String> { 
    private HttpServletRequest req; 
    private HttpServletResponse res; 

    ... 

    public String get(String key) { 
    for(Cookie cookie : req.getCookies()) { 
    if(cookie.getName().equals(key)) { 
    return cookie; 




    public void put(String key, String value) { 
    response.addCookie(new Cookie(key, value)); 



    만약 위와 같은 구체화 클래스 CookieMap를 작성하였다고 할 경우에, 이 클래스의 인스턴스를 일반적인 Map객체와 같은 취급을 하는것이 가능합니다. 따라서 다른 클라이언트가 일반적인 Map의 조작을 하고 있다고 하더라도, 실제 클래스에서는 쿠키를 조작하게 되어 실제 구현을 숨기는, 즉 은닉성을 가지게 됩니다.
  • 1639... 
  • 2010-04-11 12:28:44
  • x


출처 : http://www.okjsp.net/seq/149819

Posted by 아로나
JAVA & Open Framework2013. 9. 14. 16:04

org.apache.struts2.views.jsp 


Class IteratorStatus

java.lang.Object
  extended by org.apache.struts2.views.jsp.IteratorStatus

The iterator tag can export an IteratorStatus object so that one can get information about the status of the iteration, such as:


  • index: current iteration index, starts on 0 and increments in one on every iteration
  • count: iterations so far, starts on 1. count is always index + 1
  • first: true if index == 0
  • even: true if (index + 1) % 2 == 0
  • last: true if current iteration is the last iteration
  • odd: true if (index + 1) % 2 == 1


Example

   <s:iterator status="status" value='%{0, 1}'>
      Index: <s:property value="%{#status.index}" /> <br />
      Count: <s:property value="%{#status.count}" /> <br />  
   </s:iterator>
 

will print

      Index: 0
      Count: 1
      Index: 1
      Count: 2


출처 : http://struts.apache.org/release/2.1.x/struts2-core/apidocs/org/apache/struts2/views/jsp/IteratorStatus.html

Posted by 아로나
JAVA & Open Framework2013. 8. 21. 21:41
Posted by 아로나
JAVA & Open Framework2013. 7. 9. 16:08

컴파일시 class 파일의 크기가 이상하게 작은 경우

이런 경우 필시 java파일에 오류가 없는 이클립스에서 살펴보고

혹은 import에 명시된 라이이브러리가 프로젝트에 포함안되어 있는 경우가 다반사이다.

확인해보고 다시 컴파일해보면 정상적으로 class가 만들어 진다.

Posted by 아로나
JAVA & Open Framework2013. 7. 8. 09:44

IT 분야에 계신분들의 가장 큰 고심중에 하나가...
왜이렇게 약어가 많어??? 일것입니다.
참 헷갈리는 용어도 많고, 업무 협의간 약어나 약어에 대한 풀네임에 대한 썰도 좀 풀어줘야 있어보이고 ㅜ.ㅜ



아무튼 그런 약어/용어 중에서 공통적으로 많이 쓰이면서, 개념이 좀 모호하다고 할 수 있는..



POC, Pilot, BMT 이 세가지에 대한 IT업계에서 통용되는 의미에 대해 정리를 해 봤습니다.



물론, 약간의 이견과 분야별로 다르게 해석될 수 있으나, 최대한 공통적인, 일반화된 의미로 해석해봤습니다.

 

 



1. POC (Proof Of Concept)
기존에 시장에서 사용돼지 않던, 신기술을 프로젝트에 도입하기에 앞서, 검증하기 위한 목적으로 사용.
사업과 관계가 약간은 동떨어진 기술 검토를 위한 프로젝트고객사에서 하고, 업무는 아주 간단한 것을 수반. 신기술 여부는 중요치 않음

 

2. Pilot
이미 검증된 기술을 가지고, 대규모 프로젝트 진행에 앞서 소규모로 진행해보는 시험 프로젝트를 말함.
본사업(프로젝트) 진행을 위한 수행안 검증 프로젝트로 가령 기술셋을 확정했으면 그 기술셋으로 실제 업무에 적용해보고 문제점이나 개선안을 마련해서 본 프로젝트에 피드백 주는 것
(계획, 기술문제, 관리요소, 위험요소, 비용 이런 것을 피드백하는 용도, 당초 기대한 효과에 비해 결과가 너무 미미하거나 비용이 많이 들면 취소)

 

3. BMT(Bench Marking Test)
말그대로 성능테스트입니다.
예를 들면 00발주처에서 테라바이트 라우터를 도입한다고 할때, 입찰에 응한 업체들의 제품에 대해서 성능비교를 하는 겁니다.
필요에 의해 이것 저것 골라다가 테스트해보고 비교하는 것. 장비 뿐만이 아니라 소프트웨어(솔루션)도 포함되구요.
(대부분은 수평적으로 기술셋 비교에 대한 내용이 많지만 업무적 특성을 포괄하는 솔루션인가? 이러한 요건이면 업무도 물론 수반)


 

출처 : http://comshin.tistory.com/14

Posted by 아로나