캠핑과 개발

설치법은 현재 테마에 설치가 되어 있기 때문에 간략 하게만 설명을 한다.  
아래 파일을 다운 받은후 스킨 style, scripts 폴더에 있는 파일들을  
관리자 페이지의 스킨 -> HTML/CSS 편집 메뉴로 이동 후 파일 업로드를 이용해 모두 업로드 한다.
업로드가 완료 되면 skin.html에 다음과 같은 코드를 추가해준다.
 






















사용법은 간단하다.

... 내용

관련된 사이트 : http://code.google.com/p/syntaxhighlighter/

'잡동사니' 카테고리의 다른 글

[ScahFoler]디렉터리 리스트를 뽑아보자.  (1) 2010.05.31
브라우저 아이콘 모음  (0) 2010.04.27
특수문자표  (0) 2010.01.24
Hex editor  (0) 2009.12.11
Monaco 폰트  (0) 2009.10.24

리눅스상에서도 대부분 rpm버전을 깔 수 있지만 특수한 경우 mysql을 컴파일해야만 할 때가 있다.
다음과 같은 절차로 컴파일하면 된다.

1. mysql홈페이지에서 mysql 소스 다운(tar.gz파일)

2. 압축을 해제하고 그 디렉토리에서 ./configure 실행
./configure --prefix=/usr/local/mysql --localstatedir=/usr/local/mysql/data --sysconfdir=/etc --without-debug --with-charset=utf8 --with-extra-charsets=all --with-plugins=innobase
   --prefix : 설치될 경로
   --localstatedir : 디비파일이 설치될 경로
   --sysconfdir : 환경설정파일이 저장될 경로
   --without-debug : 디버그옵션 off 로 성능 향상
   --with-plugins=innobase : 트랜잭션사용을 위해 innobase 선택

3. make

4. make install

5. 기본 테이블을 만들어주는 스크립트 실행
/usr/local/mysql/bin/mysql_install_db

6. 데몬 실행
/usr/local/mysql/bin/mysqld_safe &
 - 이때 다음과 같은 에러가 발생하고 데몬이 뜨지 않으면 chown -R mysql.mysql /usr/local/mysql 명령을 실행후 다시 데몬을 시작한다.
14:46:27 mysqld_safe Logging to '/usr/local/mysql/var/localhost.localdomain.err'.
090520 14:46:27 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/var
090520 14:46:27 mysqld_safe mysqld from pid file /usr/local/mysql/var/localhost.localdomain.pid ended

7. innodb형식으로 테이블 생성
트랜잭션을 사용하기 위해 테이블생성시 다음과 같이 INNODB옵션을 준다.
CREATE TABLE Temp( col1 varchar(10) not null,
                                        col2 varchar(10)) TYPE=INNODB;


이클립스 신규로 받으면 추가적으로 사용해야 하는 유용한 플러그인들이 있다.

SVN : http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/
SVN : http://subclipse.tigris.org/update_1.4.x
Spring IDE
http://springide.org/updatesite
Eclibatis : http://eclibatis.sourceforge.net/updatesite/
log4e : http://log4e.jayefem.de/update
Call Hierarchy :
http://eclipse-tools.sourceforge.net/updates/
maven :
http://m2eclipse.sonatype.org/update/
pmd : http://pmd.sf.net/eclipse 
ibator : http://ibatis.apache.org/tools/ibator
AJDT : http://download.eclipse.org/tools/ajdt/35/update
QuantumDB : http://quantum.sourceforge.net/update-site
                  http://sourceforge.net/projects/quantum/files/quantum-plugin/
jrebel : http://www.zeroturnaround.com/update-site/
* -noverify -javaagent:D:\DEV\jrebel\jrebel.jar -Drebel.spring_plugin=true

PropertiesEditor : http://propedit.sourceforge.jp/eclipse/updates

Flex plug-in
FlexUnit - http://www.codesquared.com/eclipse

이전 내용--
1. Subversion : http://subclipse.tigris.org/update_1.2.x
2. Maven2 : http://m2eclipse.codehaus.org/update-dev/
3. Log4E : http://log4e.jayefem.de/update
4. Spring IDE : http://springide.org/updatesite/
5. DBViewer(DB쿼리툴) : http://www.ne.jp/asahi/zigen/home/plugin/dbviewer/
6. EclEmma(코드 커버리지 툴) : http://update.eclemma.org/
7. Implementor : http://eclipse-tools.sourceforge.net/updates/ 



#tip
weblogig plug-in 
  http://download.oracle.com/otn_software/oepe/europa
  
http://download.oracle.com/otn_software/oepe/ganymede
  http://download.oracle.com/otn_software/oepe/galileo

'DEVELOPMENT > IDE' 카테고리의 다른 글

eclipse copy & Paste 느린 현상  (0) 2015.04.02
eclipse.ini 설정  (0) 2014.04.22
eclipse workspace 바로가기 링크 만들기  (0) 2010.11.17
[eclipse] 자주쓰는 이클립스 단축키  (0) 2008.12.24
Eclipse plug-in  (0) 2008.12.06

[메인]
 
[유이]
[가인]
[승연]
[현아]

'낙서장' 카테고리의 다른 글

신종플루 가장 기본적인 예방법은?  (0) 2009.11.03
네이트온 사기 피해  (4) 2009.10.28
주말 저녁  (0) 2009.09.18
무한도전 춘향전 캐릭터  (0) 2009.05.17
윈도우7 작업표시줄 빠른실행 아이콘 되살리기  (0) 2009.05.12

최범균의 ajax를 공부를 하면서 필요한 부분을 기술하였으며 해당 부분은 ajax.js로 만들어서 사용을 할수가 있습니다.

var ajax = {};
ajax.xhr = {};
ajax.Event = {};

/*
 * Ajax(Asynchronous Javascript and XML) 개념 익히기
 *
 * XMLHttpRequest 사용하기
 *
 * XMLHttpRequest 객체를 사용해서 요청 전송할때 필요한 함수
 *
 * open() : 요청의 초기화. GET/POST선택. 접속할 URL 입력
 * send() : 웹 서버에 요청 전송
 * onreadystatechange = callbackFunction
 *
 * open() 인자 설명
 *
 * 1번째 인자 : HTTP 메소드 지정 (form 메소드)
 * 2번째 인자 : 접속할 URL
 * 3번째 인자 : 동기/비동기 방식 지정
 *
 * ex)
 *
 * GET 방식일 경우
 *
 * httpRequest = getXMLHttpRequest();
 * httpRequest.open("GET", "/test.jsp", true);
 * httpRequest.send(null);
 *
 * POST 방식일 경우
 *  
 * httpRequest = getXMLHttpRequest();
 * httpRequest.open("GET", "/test.jsp", true);
 * httpRequest.send("id=admin&pw=1234");
 */


/*
 * onreadystatechange 프로퍼티 설명
 *
 * XMLHttpRequest 객체에 onreadystatechange 프로퍼티에 콜백 함수를 지정하면 웹 서버로부터
 * 응답이 도착했을 때 콜백 함수가 호출된다. 이 때 실제로 onreadystatechange에서 명시한 콜백 함수
 * 는 readyState라는 프로퍼티의 값이 변경될 때마다 호출된다.
 *
 *
 * readyState 프로퍼티 설명
 *
 *  0 : UNINITIALIZED - 객체만 생성되고 아직 초기화되지 않은 상태(open 메서드가 호출되지 않음)
 *  1 : LOADING - open 메서드가 호출되고 아직 send 메서드가 불려지지 않은 상태
 *  2 : LOADED - send 메서드가 불려졌지만 status와 헤더는 도착하지 않은 상태
 *  3 : INTERACTIVE - 데이터의 일부만 받은 상태
 *  4 : COMPLETED - 데이터를 전부 받은 상태. 완전한 데이터의 이용 가능
 * 
 *  ex)
 *  function callbackFunction(){
 *   if(httpRequest.readyState == 1){
 *     
 *   }else if(...){
 *   
 *   }else if(httpRequest.readyState == 4){
 *    //서버로부터 응답이 도착
 *          //완료후 작업할 내용을 작성한다.
 *   }
 *  }
 *   
 */

/*
 * 서버로부터의 응답 상태 : status / statusText
 *
 * 웹 서버로부터 응답이 도착하면 웹 서버에서 처리가 올바르게 수행되었는지 확인해야 한다.
 * 웹 서버는 작업을 올바르게 실행했는지, 처리 도중에 에러가 발생했는지등의 상태 코드를 통해서 알려주는데,
 * XMLHttpRequest 객체는 웹 서버가 전달한 상태 코드를 status 프로퍼티에 저장한다. status 프로퍼티에
 * 저장되는 주요 상태 코드는 다음과 같다.
 *
 *  HTTP 주요 상태 코드
 * 
 *  200 : OK - 요청설명
 *  403 : Forbidden - 접근 거부
 *  404 : Not Found - 페이지 없음
 *  500 : Internal Server Error - 서버 오류 발생
 * 
 *  ex)
 * 
 *  function callbackFunction(){
 *   if(httpRequest.readyState == 4){
 *    if(httpRequest.status == 200){
 *     //정상적인 수행
 *        //완료후 작업할 내용 작성
 *       }else{
 *        alert('에러 발생' + httpRequest.status);
 *       }
 *      }
 *  }
 */


/*
 * 응답 데이터 사용하기 : responseText, responseXML
 *
 * XMLHttpRequest에서 정상적인 요청이 이루어질 경우 요청한 페이지에서 넘겨준 값을 알맞게 처리할때
 * 사용한다. 텍스트 형식과, XML형식이 있다.
 *
 * function callbackFunction(){
 * if(httpRequest.readyState == 4){
 *   if(httpRequest.status == 200){
 *    var txt = httpRequest.responseText; //text일 경우
 *     var xml = httpRequest.responseXML; //XML 형식인 경우
 *  
 *     alert(txt);
 *   }
 *  }
 * }   
 */

/*
 * 동기 방식과 비동기 방식의 실행 차이
 *
 * XMLHttpRequest의 open() 함수는 인자를 세 개를 받는데, 그 중 마지막 인자는 동기/비동기 여부를
 * 표시한다. 아래 코드처럼 open() 함수에 세 번째 인자 값을 true로 지정하기 되면 비동기 방식으로 호출된다.
 *
 *  1. httpRequest = getXMLHttpRequest();
 *  2. httpRequest.onreadystatechange = callbackFunction;
 *  3. httpRequest.open('GET', '/test.jsp', true) <-- 마지막 인자
 *  4. httpRequest.send(null);
 *  5. //비동기 방식
 *  6. callSomeFunction();
 * 
 * 
 *  비동기 방식 - send()함수가 호출된 뒤 곧바로 6.줄의 callSomeFunction 함수가 실행된다.
 *  동   기 방식 - send()함수가 호출되면, 서버와의 통신이 완전히 완료된 이후에 send() 함수 이후의
 *          코드 6.줄의 callSomeFunctiong함수가 실행된다.
 */


/*
 * 파라미터의 한글 처리 방법 : "name=" + encodeURIComponent('한글');
 */

 

/*
 * ajax 실행
 *
 * 사용법
 * new ajax.xhr.Request('targetPage.jsp', 'num=1&id=test', targetFunction, 'POST');
 * @param url 요청 URL
 * @param params 인자값
 * @param callback 콜백함수
 * @param method POST,GET
 */
ajax.xhr.Request = function(url, params, callback, method){
 this.url = url;
 this.params = params;
 this.callback = callback;
 this.method = method;
 this.send();
}

ajax.xhr.Request.prototype = {
 /**
  * Ajax HttpRequest 객체를 구한다.
  * @return
  */
 getXMLHttpRequest: function(){
  if(window.ActiveXObject){ //IE에서 XMLHttpRequest 구하기
   try{
    return new ActiveXObject("Msxml2.XMLHTTP"); //IE중에서도 Microsoft.XMLHTTP 보다 이전 버전 이므로 먼저 구한다.
   }catch(e){
    try{
     return new ActiveXObject("Microsoft.XMLHTTP");
    }catch(e1){
     return null;
    }
   }
  }else if(window.XMLHttpRequest){ //IE 이외의 파폭,오페라 같은 브라우저에서 XMLHttpRequest 구하기
   return new XMLHttpRequest;
  }else{
   return null;
  }
 },
 /**
  * Ajax 통신을 한다.
  * @return
  */
 send: function(){
  this.req = this.getXMLHttpRequest();
  
  var httpMethod = this.method ? this.method : 'GET';
  if(httpMethod != 'GET' && httpMethod != 'POST'){
   httpMehtod = 'GET';
  }
  
  var httpParams = (this.params == null || this.params == '') ? null : this.params;
  var httpUrl = this.url;
  
  if(httpMethod == 'GET' && httpParams != null){
   httpUrl = httpUrl + "?" + httpParams;
  }
  
  this.req.open(httpMethod, httpUrl, true);
  this.req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  
  var request = this;
  this.req.onreadystatechange = function(){
   request.onStateChange.call(request);
  }
  this.req.send(httpMethod == 'POST' ? httpParams : null);
 },
 /**
  * 콜백함수 호출
  * @return
  */
 onStateChange: function(){
  this.callback(this.req);
 }  
}
/**
 * 이벤트 리스너 등록
 */
ajax.Event.addListener = function(element, name, observer, useCapture){
 useCapture = useCapture || false;
 
 if(element.addEventListener){ //기타 브라우저
  element.addEventListener(name, observer, useCapture);
 }else if(element.attachEvent){  //IE 브라우저
  element.attachEvent('on' + name, observer);
 }
}
/**
 * 등록된 이벤트 리스너 삭제
 */
ajax.Event.removeListener = function(element, name, observer, useCapture){
 useCapture = useCapture || false;
 
 if(element.removeEventListener){ //기타 브라우저  
  element.removeEventListener(name, observer, useCapture);
 }else if(element.detachEvent){  //IE 브라우저
  element.detachEvent('on' + name, observer);
 }
}

/**
 * 이벤트 대상 반환
 */
ajax.Event.getTarget = function(event){
 if(event == null) return null;
 if(event.target) return event.target; //W3C 표준 이벤트 타켓
 else if(event.srcElement) return event.srcElement; //구버전의 IE 타겟
 return null;
}

/*
 * 마우스 이벤트 종류
 *
 * click : 마우스 버튼 클릭시 발생
 * dbclick : 마우스 버튼 더블 클릭 발생시 발생(비표준)
 * mousedown : 마우스 버튼이 눌렸을 때
 * mouseup : 마우스 버튼을 뗐을 때
 * mouseover : 마우스가 영역 안으로 들어왔을 때
 * mousemove : 마우스가 영역 안에서 이동할 때
 * mouseout : 마우스가 영역 밖으로 나갈 때
 *
 */


/*
 * 마우스 클릭 버튼 판별하기
 *
 * button 프로퍼티를 사용(event.button)
 * 또는 which 프로퍼티 사용(파이어폭스, 사파리, 모질라 지원)
 *
 * button 프로퍼티 (파이어 폭스/모질라)
 * 0 : 일반버튼(보통 왼쪽 버튼)
 * 1 : 추가 버튼(보통 가운데, 또는 휠 관련)
 * 2 : 콘텍스트 버튼(보통 오른쪽 버튼)
 *
 * button 프로퍼티 IE 
 * 1 : 왼쪽 마우스 버튼 (단 click 이벤트일 경우는 0 을 반환)
 * 2 : 오른쪽 마우스 버튼
 * 3 : 휠(가운데)
 *
 * which 프로퍼티 사용 (IE 경우 undefind 값이 없음)
 * 1 : 왼쪽
 * 3 : 오른쪽
 * 2 : 휠(가운데)
 *
 */

/*
 * 마우스 발생 위치 정보
 *
 * clientX : 웹 브라우저에서 출력되는 영역에서 X 좌표값을 반환 --> X
 * clientY : 웹 브라우저에서 출력되는 영역에서 Y 좌표값을 반환 
 * screenX : 전체 화면에서 X 좌표값을 반환한다. --> X
 * screenY : 전체 화면에서 Y 좌표값을 반환한다.
 *
 */

/*
 * 브라우저 안에 스크롤 된 마우스의 마우스의 좌표 구하기
 *
 * scrollLeft, scrollTop를 이용
 *
 * clientX, clientY의 마우스 좌표를 구한 영역에 위에 코드를 사용하여 스크롤 된
 * 영역만큼 더해준다.
 */


/*
 * 마우스 이벤트로 작업을 할 경우는 오른쪽 마우스 클릭은 가급적 사용하지 않느것이 좋다
 * 이유는 클릭 이벤트 자체를 지원하지 않는 브라우저가 있기 때문이다.
 */


/**
 * 마우스 좌표값을 반환한다.
 */
ajax.Event.getMouseXY = function(event){
 var mouseX = event.clientX;
 var mouseY = event.clientY;
 
 var dd = document.documentElement; //W3C 표준 (최신 브라우저에서는 지원)
 var db = document.body; //구버전의 경우 (document.documentElement 미지원 경우)
 
 if(dd){
  mouseX += dd.scrollHeight;
  mouseY += dd.scrollTop;
 }else if(db){
  mouseX += db.scrollHeight;
  mouseY += db.scrollTop;
 }
 
 return {x: mouseX, y: mouseY};
}

/**
 * 마우스 왼쪽 버튼 클릭 여부를 boolean 형식으로 반환한다.
 */
ajax.Event.isLeftButton = function(event){
 return (event.which) ? //which 프로퍼티 여부가 존재하는지 여부
   evnet.which == 1 && event.button == 0 : //파이어폭스/모질라
    (event.type == 'click') ? event == 0 : event.button == 1; //IE경우
}

/**
 * 마우스 오른쪽 버튼 클릭 여부를 boolean 형식을 반환한다.
 */
ajax.Event.isRightButton = function(event){
 return event.button == 2; //오른쪽 버튼의 경우는 IE, 파이어폭스/모질라가 모두 동일
}

/*
 * 키보드 이벤트
 *
 * keydown : 키보드를 누를 때 발생한다.
 * keyup : 키보드에서 뗄 때 발생한다.
 * keypress : 키보드를 누를 때 발생한다.(비표준)
 */

/*
 * 키보드 이벤트 프로퍼티
 *
 * keyCode : 키 코드값
 * ctrlKey : Ctrl 키를 누른 경우 true
 * shiftKey : Shift 키를 누른 경우 true
 * altKey : Alt 키를 누른 경우 true 
 */



ibatis 작업중 로그를 보여줍니다.


사용법 
1. ibatis-2.3.0.677.jar 파일을 WEB-INF/lib 폴더 아래로 복사합니다.
2. log4j.properties 파일에 다음 줄을 추가해줍니다.

log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG

간혹 안나오는 경우는 log4j.jar 파일이 WEB-INF/lib 폴더에 존재하는지 확인하기 바란다.

Spring2.5 annotation 설정

없으면 에러 낼거야
이건 2.5이전부터 있던건데 그냥 한번 짚고 넘어 갑니다.
@Required 가 붙은 setter 메소드는 반드시 XML 설정에 의존성 삽입이 정의 되어 있어야 합니다.
(@Autowired도 안됩니다.)
XML 설정에 명시적인 의존성 삽입이 없다면 런타임 예외가 던져 집니다.
이 애노테이션을 처리하기 위한 후처리기는 다음과 같습니다.
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>


자동으로 묶어 줄게
@Autowried 는 타입에 일치하는 bean을 의존성 삽입 해줍니다.
필드에 사용 할 경우 setter가 존재하지 않아도 됩니다.
@Autowried
private Foo foo;

여러개의 인자를 가진 메소드에 사용 할 수 있습니다.
@Autowried
public void setUp(Foo foo, Bar bar) {
    this.foo = foo;
    this.bar = bar;
}

@Autowired의 속성인 required의 기본값이 true이기 때문에 발견되는 bean이 없다면 예외가 던져 집니다.
발견 되는 bean이 없더라도 예외가 던져지지 않기를 원하면 required 속성을 fasle로 설정하면 됩니다.
@Autowried(required=false)
private Foo foo;

일치하는 타입을 찾기 때문에 발견되는 bean이 여러개인 경우 예외가 던져 집니다.
이를 방지 하기 위해 <bean /> 요소의 추가된 속성인 primary를 설정 합니다.
발견되는 bean이 여러개 일지라도 primary가 설정된 bean이 참조 됩니다.
<bean id="foo" class="example.Foo" primary="true" />
<bean id="foo2" class="example.Foo"/>

이 애노테이션을 처리하기 위한 후처리기는 다음과 같습니다.
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>


정확한 이름을 알려줄게
@Autowired을 사용 할 때 타입으로 bean을 찾기 때문에 여러개의 bean이 발견되면 primary로 해결 했습니다.  하지만 @Qualifier를 이용해 찾으려는 bean의 id를 넘길 수 있습니다.
@Autowried
@Qualifier("foo")
private Foo foo;

필드에만 사용 가능 하기 때문에 메소드에 적용시 다음과 같이 설정 합니다.
@Autowried
public void setUp(@Qualifier("foo") Foo foo, @Qualifier("foo2") Foo foo2) {
    this.foo = foo;
    this.foo2 = foo2;
}

이 애노테이션을 처리하기 위한 후처리기는 @Autowried의 후처리기와 동일 합니다.


JSR-250 애노테이션 지원
-@Resource
-@PostConstruct
-@PreDestroy
위 세가지 애노테이션을 사용하기 위해서는 후처리기를 등록 해야 합니다.
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>

@Resource
JNDI의 리소스 및 Spring 컨테이너의 bean을 찾아 autowring 합니다.
name 속성을 생략 할 경우 해당 필드명으로 찾고 해당 bean이 발견되지 않는다면 타입으로 찾습니다.

필드에 사용 할 경우 setter가 존재하지 않아도 됩니다.
@Resource(name="dataSource")
private DataSource dataSource;

한개의 인자를 가진 setter 메소드만 적용 할 수 있습니다.
@Resource(name="dataSource")
public void setDataSource(DataSource dataSource) {
    this.dataSource = dataSource;
}

타입으로 찾지 않길 원한다면 다음과 같은 설정을 합니다.
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
    <property name="fallbackToDefaultTypeMatch" value="false"></property>
</bean>

JNDI 리소스만 참조 하려면 다음과 같은 설정을 합니다.
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor">
    <property name="alwaysUseJndiLookup" value="true"/>
</bean>

@PostConstruct 와 @PreDestroy
기존에는 생명 주기를 다루는 방법이 2가지가 있었습니다.
1.InitializingBean, DisposableBean을 구현하는 방법
2.XML 설정파일에서 <bean /> 요소의 init-method, destroy-method 속성 설정

2.5에서 추가된 두 애노테이션은 기존의 방식과 동일한 결과를 가져 옵니다.
@PostConstruct
public void init() {
    ...
}
   
@PreDestroy
public void preDestroy() {
    ...
}

만약 3가지 방식 모두 사용할 경우
우선순위는 애노테이션->XML설정->인터페이스 구현 입니다.


이거 하나면 OK
위에서 나온 애노테이션을 사용하기 위해서는 3가지의 BeanPostProcessor를 등록해야 했습니다.
하지만 이거  하나면 3개가 모두 등록 됩니다.
<context:annotation-config />


알아서 찾아줄게
위에서 나온 애노테이션으로 XML설정을 줄이더라도 bean 선언은 반드시 해야 했습니다.
하지만 component-scan 을 이용하면 bean선언 조차 생략 할 수 있습니다.
component-scan의 대상이 되기 위해서는 스테레오타입 애노테이션을 사용해야 합니다.

4개의 스테레오타입 애노테이션
@Component
- 스테레오타입 애노테이션의 조상 입니다.
@Controller
-Spring MVC에서 컨트롤러로 인식 합니다.
@Service
-역할부여 없이 스캔 대상이 되는데 비즈니스 클래스에 사용하면 될 것 같습니다.
@Repository
-DAO에 사용되며 DB Exception을 DataAccessException으로 변환해 줍니다.

간단한 예제 입니다.
테스트에 사용될 2개의 클래스
@Component("bar")
public class Bar {
}

@Component("foo")
public class Foo  {
    @Autowired
    private Bar bar;
   
    public Bar getBar() {
        return bar;
    }
}

지정된 패키지의 하위패키지까지 재귀적으로 스테레오타입이 있는 클래스를 찾습니다.
필터를 이용해 제외 검색 대상에서 제외 시킬 수 있으며
<context:annotation-config /> 까지 자동으로 등록됩니다.
<context:component-scan base-package="example" />

테스트는 통과 합니다.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"Beans.xml"})
public class ScanTest {
    @Autowired
    private Foo foo;
   
    @Test
    public void fooTest() {
        assertNotNull(foo.getBar());
    }
}

@Scope를 함께 사용 하여 Scope를 설정 할 수 있습니다.
@Scope("request")
@Component("bar")
public class Bar {
}
singleton인 foo에서 request scope인 bar를 사용 하면 어떻게 될 까요?
역시 scope문제가 발생 합니다.

이 문제를 해결하기 위해 <context:component-scan /> 요소의 scoped-proxy 속성이 존재 합니다.
scoped-proxy 속성은 <aop:scoped-poxy/> 요소처럼 WebApplicationContext 에서만 유효하며
"session", "globalSession", "request" 이외의 scope는 무시 됩니다.

아래 3가지 값을 지정 할 수 있습니다.
no - 디폴트값, proxy를 생성하지 않습니다.
interfaces - JDK Dynamic Proxy를 이용한 Proxy 생성
targetClass - CGLIB를 이용한 Proxy 생성

Bar는 인터페이스 기반이 아니기 때문에 CGLIB를 이용 했습니다.
<context:component-scan base-package="example" scoped-proxy="targetClass"/>

만약 스캔된 bean들 중 @Scope의 값이 "session", "request" 일 때
scoped-proxy 속성 값이 "targetClass", "interfaces" 가 아닐경우 예외가 던져지고 초기화에 실패 합니다.

component-scan을 이용하면 method-lookup도 불가능 하므로 참조되는 bean이 web-scope가 아니고
prototype일 경우의 문제는 해결 할수 없을것 같습니다.

출처 : http://blog.daum.net/calmknight/15785980


(select * from Table limit 0,5) order by rand()


출처 : http://web.lge.cn:8000/system/mysql/2059/page/2

'DEVELOPMENT > Database' 카테고리의 다른 글

[Mysql] SQLyog GUI Tool  (0) 2009.10.28
리눅스에서 Mysql 5.1 컴파일하는 방법  (0) 2009.10.24
mysql 최근 자료 가져오기  (0) 2009.10.06
[oracle] 자주 쓰는 숫자 함수  (0) 2009.09.27
Multi Table Insert  (0) 2009.07.14

최근 5일 자료를 가져오기 위한 쿼리

ex))
mysql> SELECT col1, col2, col3 FROM table
WHERE TO_DAYS(NOW()) - TO_DAYS(date_column) <= 5;