레이블이 JAR FILE인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JAR FILE인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 8일 목요일

(오라클자바커뮤니티jquery 강좌)jQuery를 통한 키보드 이벤트, keydown, keyup, keypress , ORACLEJAVA CONNUNITY

jQuery를 통한 키보드 이벤트


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  



keydown : 키 눌러질때,   keypress:글자가입력될때
keyup : 키보드가 떨어질 때

<script type="text/javascript">
$(document).ready(function() {
//keydown 이벤트가발생한순간에는글자가입력되어있지않음
//입력한글자수를표시해야하므로keyup 이벤트사용
$("textarea").keyup(function () {
//남은 글자수 구합니다.
var inputLength = $(this).val().length;
var remain = 50 ? inputLength;
//남은 글자수 display
$("h1").html(remain);
//문서객체 색상 변경
if (remain >= 0) {
$("h1").css("color","Blue");
} else {
$("h1").css("color","red")
}
});
});
</script>
<body><div>
<p>지금 내 생각을</p>
<h1>50</h1>
<textarea cols="40" rows="5"></textarea>
</div>
</body>

[오라클자바커뮤니티자바교육강좌, ORACLEJAVA.KR]jQuery를 통한 무한 스크롤 구현

jQuery를 통한 무한 스크롤 구현


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


window객체에 scroll 이벤트 연결원리 

사용자가 마우스  스크롤 움직이면 scroll 이벤트 발생
무한 스크롤 만들려면 화면 끝까지 스크롤이 도달 했다는 사실 인식 필요
   document 객체의 height 속성은 문서 전체의 높이의미
   스크롤이 끝까지 내려가면  window객체 scrollTop +height=document 객체높이
<script type="text/javascript">
$(document).ready(function() {
//스크롤 이벤트 발생 시
$(window).scroll(function() {
var scrollHeight = $(window).scrollTop()+$(window).height();
var documentHeight = $(document).height();
if (scrollHeight = documentHeight) {
for(var i=0; i <10; i++) {
$("<h1>무한 스크롤 </h1>").appendTo("body");
}
}
});
});
$(document).ready(function() {
for(var i=0; i<20; i++) {
$("<h1>무한 스크롤</h1>").appendTo("body");
}
});
</script><body></body>

 

[오라클자바커뮤니티]에서 파라미터 넘기는 법

보통 <global-forwards>에서는 다음과 같은 방법을 매핑될 페이지를
입력합니다.

<forward name="insert_success"        path="BoardList.do" />

여기서 파라미터를 다음과 같이 입력해서 코딩하면 xml 파싱에러가 납니다.
파라미터가 하나는 들어가는데 두개이상이 안들어 가게 됩니다.

<forward name="order"        path="BoardList.do?code=00001" />
  => 에러 안남

<forward name="order"        path="BoardList.do?code=00001&page=1" />
  => 에러 발생

이 경우에는 다음과 같은 방법으로 코딩하면 다수의
파라미터값을 넘길 수 있습니다.

<forward name="board_insert_success"      path="/BoardList.do?run=BoardList & a m p ; current_page=1"/>

윗 부분의 & a m p ; <=요 부분의 띄어쓰기된 부분을 붙여주면 됩니다.
유용하게 쓰일때가 꼭 있을 거라는 생각이 들어서 올려봤습니다. ^^

[오라클자바커뮤니티강좌,자바교육]Struts에서의 예외처리-2

Struts에서의 예외처리(2)



오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  




스트럿츠가 제공 하는 예외 처리

스트럿츠 1.1. 이후에는 작지만 효율적인 예외처리 프레임워크를 추가 했습니다. 또한 org.apache.struts.util.AppException 클래스는 ActionError를 포함하며 java.lang.Exception을 확장한 클래스 입니다.

아래와 같이 스트럿츠에서 사용하면 되는데

throw new AppException(“error.password.invalid”);

생성자의 “error.password.invalid”는 리소스 번들의 key 이며 프레임웍에서는 자동적으로 예외의 ActionError 객체를 생성하고 적절한 scope에 저장 합니다. 물론 애플리케이션에서 AppException에 대해 확장이 가능 합니다.

----------------------------------------------------
선언적 예외 처리와 프로그램적 예외처리
----------------------------------------------------

선언적 예외처리는 struts-config.xml등에 예외에 대해서 정의 하는 것 입니다. 이에 반해 프로그램적 예외 처리는 선언적 예외 처리와 정반대되는 개념으로 애플리케이션에서 정의한 내부 코드를 통해 예외를 처리하는 전통적인 방법 입니다.

아래는 login Action에서 발생하는 세가지 예외를 정의한 것 입니다.

<action-mappings>
                <action
                        path="/login"
                        type="com.oreilly.struts.storefront.security.LoginAction"
                        name="loginForm"
                        scope="request"
                        input="/login.jsp">
               
                <!--The following exceptions can be thrown during the login action -->
                <exception
                        key="security.error.changepassword"
                        path="/changePassword.jsp"
        type="com.oreilly.struts.framework.exceptions.ExpiredPasswordException"/>

                <exception
                        key=" security.error.loginfailed"
                type="com.oreilly.struts.framework.exceptions.InvalidLoginException"
                        path="/login.jsp"/>

                <exception
                        key="security.error.accountlocked"
        type="com.oreilly.struts.framework.exceptions.AccountLockedException"
                        path="/accountLocked.jsp"/>
        </action>
</action-mappings>


위에서 exception 요소는 정의한 예외가 발생 할 경우 포워드할 경로를 액션 매핑이나 전역 예외에 정의 합니다. Login Action이 실행하는 동안 ExpiredPasswordException이 발생 한다면 컨트롤러의 제어를 changePassword.jsp로 포워드 됩니다.

예외를 Action 클래스에 프로그램 코드를 통해 코딩을 하지 않았다면 RequestProcessor는 정의한 예외 타입을 설정한 exception 요소가 있는지 확인 하며 만약 exception 요소가 있다면 컨트롤러는 exception 요소의 path 속성에 지정된 자원으로 포워드 합니다.

아래는 RequestProcessor 클래스의 processException() 메소드 입니다. 메소드의 시작 시점에 findException() 메소드가 ExceptionConfig 객체를 반환 하는데 ExceptionConfig 객체는 설정 파일에 기술된 exception 요소가 메모리에 있는 것으로 생각하면 됩니다.

만약 findException() 메소드가 발생한 예외와 대응하는 exception 요소를 찾지 못하면 스트럿츠 프레임워크에서의 예외 처리 없이 클라이언트에 반환 됩니다. 발생한 예외가 IOException이나 IOException 클래스의 서브 클래스가 아니면 ServletException 인스턴스로 감싸서 다시 던집니다.

만약 특정한 예외를 정의한 Action Mapping이 있다면 findException() 메소드를 통해 ExceptionConfig 객체를 반환 합니다.

getHandler() 메소드는 ExceptionConfig 객체를 추출하고 추출한 핸들러를 예외를 처리하는데 사용 합니다.

--------------------------------------------------------
protected ActionForward processException(HttpServletRequest        request,
                                        HttpServletResponse response,
                                        Exception exception,
                                        ActionForm form,
                                        ActionMapping mapping)
                                        throws IOException, ServletException {
        // Is there a defined handler for this exception?
        ExceptionConfig config =mapping.findException(exception.getClass( ));

        if (config == null){
                if (log.isDebugEnabled( )){
                        log.debug(getInternal().getMessage("unhandledException",exception.getClass( )));
                }

        if (exception instanceof IOException){
                throw (IOException) exception;
        }
        else if (exception instanceof ServletException){
                throw (ServletException) exception;
        }
        else{
                throw new ServletException(exception);
        }


        // Use the configured exception handling
        try {
                Class handlerClass = Class.forName(config.getHandler( ));
                ExceptionHandler handler =(ExceptionHandler)handlerClass.newInstance( );
                return (handler.execute(exception, config, mapping,        form,request, response));
        }
        catch (Exception e){
                throw new ServletException(e);
        }
}


---------------------------------------------------------

스트럿츠 프레임워크에서는 예외 처리에 관한 환경 설정이 되어 있지 않은 경우 사용 가능한 기본 예외 처리 클래스를 포함 하고 있는데. org.apache.struts.action.ExceptionHandler가 기본 핸들러 입니다.

기본 핸들러의 execute() 메소드는 ActionError를 생성하고 적절한 scope에 저장한 다음 exception 요소의 path 속성에 할당 되어 있는 ActionForward 객체를 반환 합니다. 결국 Actionforward의 경로로 제어를 넘기게 됩니다.

예외가 발생 했을 때 다른 처리를 원한다면 exception 요소는 핸들러 클래스에 대한 오버라이드를 허용 합니다. 즉 struts-config.xml 파일에 exception 요소 안에서 handler 속성에 org.apache.struts.action.ExceptionHandler 클래스를 상속하는 클래스를 명시 함으로서 가능 합니다. Handler 클래스의 execute() 메소드를 오버라이드 함으로서 각각의 애플리케이션들은 기본 예외에서 확장된 예외 처리를 할 수 있습니다.



------------------------------------------------------------

import java.util.List;
import java.util.ArrayList;
import java.io.PrintStream;
import java.io.PrintWriter;
/**
* 이 클래스는 애플리케이션 예외의 공통 슈퍼 클래스 입니다.
* 이 클래스와 이 클래스의 서브 클래스는 chained exception 기능을 제공
* chained exception 기능은 원래 문제를 이 클래스나 이 클래스의 서브 클래스로
* 감싸서 다시 실행 할 수 있습니다.
* 이 클래스는 exception을 List로 관리 함으로서 다중 예외 처리가 가능 합니다.
*/
public class BaseException extends Exception{
        protected Throwable rootCause = null;
       
        //예외를 여러 개 관리하고 나중에 ActionError를 만들 때도 반영
        private List exceptions = new ArrayList( );

        private String messageKey = null;
        private Object[] messageArgs = null;

        public BaseException( ){
                super( );
        }
       
        //생성자
        public BaseException( Throwable rootCause ) {
                this.rootCause = rootCause;
        }

        public List getExceptions( ) {
                return exceptions;
        }

        public void addException( BaseException ex ){
                exceptions.add( ex );
        }

        public void setMessageKey( String key ){
                this.messageKey = key;
        }

        public String getMessageKey( ){
                return messageKey;
        }
       
        //어떤 메시지는 아규먼트가 여러 개 일 수 있습니다.
        // 예를들면 나이는 0 ~ 99 사이의 수가 들어와야 합니다.
        public void setMessageArgs( Object[] args ){
                this.messageArgs = args;
        }

        public Object[] getMessageArgs( ){
                return messageArgs;
        }

        public void setRootCause(Throwable anException) {
                rootCause = anException;
        }

        public Throwable getRootCause( ) {
                return rootCause;
        }

        public void printStackTrace( ) {
                printStackTrace(System.err);
        }

        public void printStackTrace(PrintStream outStream) {
                printStackTrace(new PrintWriter(outStream));
        }

        public void printStackTrace(PrintWriter writer) {
                super.printStackTrace(writer);
                if ( getRootCause( ) != null ) {
                        getRootCause( ).printStackTrace(writer);
                }
                writer.flush( );
        }
}



-------------------------------------------------------------

아래에서 messageKey는 ActionError 클래스의 생성자에 전달되고 스트럿츠 프레임웍에서는 키와 리소스 번들의 메시지를 대응 시킵니다. 또한 클래스는 생성된 예외들을 추가 할 수 있는 객체 배열을 포함합니다.

객체 배열에 있는 예외 객체들은 MessageFormat을 기반으로 파라미터에 따라 리소스 번들의 메시지를 교환 할 수 있습니다. 번들 안에 있는 메시지는 다음과 같습니다.

global.error.invalid.price=The price must be between {0} and {1}.

아래는 기본 예외 핸들러 클래스를 확장 하고 ActionError 생성자 내부의 인자를 동적으로 생성하는 기능을 제공 합니다.

-----------------------------------------------------------------

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ExceptionHandler;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionError;
import org.apache.struts.util.AppException;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.config.ExceptionConfig;
import com.oreilly.struts.framework.exceptions.BaseException;

public class SpecialExceptionHandler extends ExceptionHandler
{
        protected ActionForward execute(Exception ex,
                        ExceptionConfig config,
                        ActionMapping mapping,
                        ActionForm formInstance,
                        HttpServletRequest request,
                        HttpServletResponse response)
                                        throws ServletException {
                ActionForward forward = null;
                ActionError error = null;
                String property = null;

                /* input 속성이나 exception 요소에서 포워드할 path를 가져옴 */
                String path = null;
                if (config.getPath( ) != null) {
                        path = config.getPath( );
                }
                else{
                        path = mapping.getInput( );
                }

                // Construct the forward object
                forward = new ActionForward(path);

                /* Figure out what type of exception has been thrown.The Struts
                * AppException is not being used in this example.
                */
                if( ex instanceof BaseException) {
                        // ********* 특화된 처리 부분
                        BaseException baseException = (BaseException)ex;
                        String messageKey = baseException.getMessageKey( );
                        Object[] exArgs = baseException.getMessageArgs( );
                        if ( exArgs != null && exArgs.length > 0 ){
                        // If there were args provided, use them in the       
ActionError
                                error = new ActionError( messageKey, exArgs );
                        }
                        else{
                                // Create an ActionError without any arguments
                                error = new ActionError( messageKey );
                        }
                }
                else{
                        error = new ActionError(config.getKey( ));
                        property = error.getKey( );
                }

                // Store the ActionError into the proper scope
                // The storeException method is defined in the parent        class
                storeException(request, property, error, forward,
                config.getScope( ));
                return forward;
        }
}


스트럿츠의 예외 처리에 대해 정리해보면 Action에서 execute() 메소드를 실행 시 예외처리를 위해 try-catch로 쌉니다. 예외가 발생 했다면 RequestProcessor 클래스의 findException이 호출되어 ExceptioConfig 객체를 반환 합니다. 다음으로 getHandler() 메소드가 호출 되어 핸들러를 얻습니다. 다음으로 기본 핸들러만 정의되어 있다고 보면 핸들러 클래스의 execute() 메소드가 호출되고 여기에서 ActionError를 생성 후 적절한 scope에 저장 후 path 속성에 정의된 리소스로 제어를 넘깁니다.

 


-------------------------------
프로그램에서 오류 처리하기
-------------------------------

Action 클래스에서 예외가 발생 했을 때 만약 발생한 예외가 애플리케이션 예외 인 경우 로그를 남기고 ActionError를 생성하여 해당 스코프에 저장한 후 ActionForward를 통해 제어를 넘기는 식으로 처리 합니다.

예외의 효과적인 관리를 위해 최상위 래퍼 클래스(BaseException)를 하나 만들고 애플리케이션 예외를 모두 그 안에 두는 것 입니다. 이렇게 하면 catch 문에서 BaseException만 받아내면 될 것 입니다. (BaseException이 아니면 시스템 예외라고 가정 할 수 있으며 이렇게 처리 해야 합니다.)

시스템 예외 처리 방법은 예외를 로그로 남기고 시스템 에러 페이지를 만들어 그곳으로 포워드 시키면 됩니다.

아래는 Action안에서의 처리 입니다.

try{
        // Peform some work that may cause an application or system        exception
}
catch( BaseException ex ){
        // Log the exception
        // Create and store the action error
        ActionErrors errors = new ActionErrors( );
        ActionError newError = new ActionError( ex.getErrorCode(),ex.getArgs( ) );
        errors.add( ActionErrors.GLOBAL_ERROR, newError );
        saveErrors( request, errors );

        // Return an ActionForward for the Failure resource
        return mapping.findForward( "Failure" )
}
catch( Throwable ex ){
        // Log the exception
        // Create and store the action error
        ActionError newError = new        ActionError( "error.systemfailure" );
        ActionErrors errors = new ActionErrors( );
        errors.add( ActionErrors.GLOBAL_ERROR, newError );
        saveErrors( request, errors );
        // Return an ActionForward for the system error resource
        return mapping.findForward( IConstants.SYSTEM_FAILURE_PAGE );
}

Action마다 이렇게 한다는 것은 중복되는 코드가 발생 할 수 있는데 앞에서 설명 드린 선언적 접근 방법을 이용한다면 해결 할 수 있지만 Action의 최상위인 BaseAction을 하나 만들어 이를 해결 할 수 있습니다.

모든 action에 공통적으로 들어가야 할 기능이 있다면 (로그인 체크,접속/비 접속 체크,쇼핑 카트 등) 그것을 구현해 놓고(추상 클래스로), 다른 action들이 struts의 action을 상속받지 않고, 이 공통 action을 상속받게 합니다. 이것은 필수요소가 아니라 선택사항입니다. 공통사항이 없다면 하지 않아도 상관 없습니다.

아래에 최상위 Action에 관련된 예문이 있으니 참고 바랍니다.
 
//execute( ) method of the BaseAction(Action의 최상위 클래스로서 추상클래스 입니다.)
//아래의 경우 예외 발생시 execute 메소드의 catch에 의해 잡힙니다.
public ActionForward execute(ActionMapping mapping,ActionForm form,HttpServletRequest request,HttpServletResponse response) throws Exception {
ActionForward forwardPage = null;
        try{
                UserContainer userContainer = getUserContainer( request );
                // 이부분에 필요하다면 모든 액션들이 공통으로 확인해야 되는 사항이
                //있다면 처리 합니다.(로그인 여부, 장바구니 확인 등)

        // 별도로 선언된 executeAction을 실행 시킵니다.
        // executeAction은 서브 액션의 입맛에 맞게 적절히 구현해서 사용 합니다.
        //예를들면 게시판 기능이라면 게시물을 읽는 기능, 쓰는 기능, 삭제 기능, 수정 기능 등이  될 수 있습니다.
                forwardPage = executeAction(mapping, form, request,        response, userContainer);
        }
        //아래의 catch문이 모든 Action에 있어야 하는 겁니다.
        catch (BaseException ex){
                // Log the application exception using your logging        framework
                // Call the generic exception handler routine
                forwardPage = processExceptions( request, mapping,        ex );
        }catch (Throwable ex){
                // Log the system exception using your logging framework
                // Make the exception available to the system error page
                request.setAttribute( Action.EXCEPTION_KEY, ex );

                // Treat all other exceptions as system errors
                forwardPage =mapping.findForward( IConstants.SYSTEM_FAILURE_KEY );
        }
        return forwardPage;
}

//추상메소드로 선언하고 이 최상위 액션을 상속 받는 하위 액션들의 입맛에 맞게 구현토록 합니다.
abstract public ActionForward executeAction( ActionMapping mapping,
                                                                                        ActionForm form,
                                                                                        HttpServletRequest request,
                                                                                        HttpServletResponse response,
                                                                                        UserContainer userContainer )
throws BaseException;


다음은 execute() 메소드에서 예외가 발생 되었을 때 이것을 처리하기 위한 BaseAction의processException() 메소드를 보도록 합니다.

-----------------------------------------------------------

Action안에 정의 되어 있습니다. 이 메소드는 여러 개일지 모르는 예외를 찾아 예외의 수 만큼 processBaseException 이라는 메소드를 다시 불러 그곳에서 ActionError등에 저장 하는 기능 등을 수행하도록 합니다.

protected ActionForward processExceptions( HttpServletRequest request,
                                        ActionMapping mapping,
                                        BaseException ex )
{
        ActionErrors errors = new ActionErrors( );
        ActionForward forward = null;

        // 사용자의 지역 설정을 가지고 옵니다.
        Locale locale = getUserContainer( request ).getLocale( );
        if (locale == null){
                        // 지역이 설정되지 않았다면 기본 지역을 사용
                        environment locale = Locale.getDefault( );
        }

        processBaseException(errors, (FieldException) ex, locale);

        // 입력된 리소스와 failure 포워드를 반환 합니다.
        String inputStr = mapping.getInput( );
        String failureForward = mapping.findForward(IConstants.FAILURE_KEY);

        if ( inputStr != null) {
                forward = new ActionForward( inputStr );
        }
        else if (failureForward != null){
                forward = failureForward;
        }

        // 예외가 하위 예외를 포함하고 있는지 확인
        List exceptions = ex.getExceptions( );

        if (exceptions != null && !exceptions.isEmpty( ) ){
                int size = exceptions.size( );
                Iterator iter = exceptions.iterator( );

                while( iter.hasNext( ) ){
                        // 모든 하위예외들은 BaseException이어야 합니다.
                        BaseException subException =(BaseException)iter.next( );
                        processBaseException(errors, subException, locale);
                }
        }

        // Tell the Struts framework to save the errors into the request
        saveErrors( request, errors );

        // Return the ActionForward
        return forward;
}


------------------------------------------------------------

processException 메소드의 수행 과정은 다음과 같습니다.

1.        사용자의 지역 확인
2.        Top레벨 예외의 processBaseException() 메소드를 수행
3.        다른 서브 예외가 있다면 각각의 예외를 수행
4.        생성한 모든 ActionError를 저장
5.        제어를 input 속성에 있는 리소스나 액션에 설정된 “Failure” Actionforward에 넘김


아래는 BaseAction의 processBaseException 메소드 입니다.


protected void processBaseException( ActionErrors errors,
                                                                        BaseException ex,
                                                                        Locale locale)
{

        // 추가될 ActionError의 레퍼런스 저장
        ActionError newActionError = null;

        // 에러 코드는 리소스 번들의 키값
        String errorCode = ex.getMessageKey( );

        /*MessageFormat 객체가 사용하는 추가적인 인자가 있다면
        * args에 예외를 추가
        */
        Object[] args = ex.getMessageArgs( );

       
        // ACtionError 클래스의 인스턴스 생성자
        if ( args != null && args.length > 0 ){
                // Use the arguments that were provided in the exception
                newActionError = new ActionError( errorCode, args );
        }
        else{
                newActionError = new ActionError( errorCode );
        }

        errors.add( ActionErrors.GLOBAL_ERROR, newActionError );

[오라클자바닷넷강좌]JAVA AWT Component 클래스

이번 강좌에서는 중요한 Component 클래스에 대해 알아 보겠습니다. 자바 클래스의 최상위 클래스가 Object인 것처럼, AWT의 GUI콤포넌트의 최상위 클래스는java.awt.Component입니다. Component의 하위클래스에는 다시 Button, Canvas, Checkbox, Choic, Label, List, Scrollbar, TextComponent 과 Container가 존재합니다. 그리고, 그중에서, Container콤포넌트는 Button, Canvas..와 같은 일반 콤포넌트와 달리, 다른 Component와 Container를 포함할수 있습니다.


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  




Component Class(Abstract)
- 자바의 모든 Component가 상속을 받는 클래스 -
- 이 클래스를 상속 받는 클래스가 적절히 Method 들을 Overriding 해줘야 함
- Component로서의 기본적인 기능들을 정의및 선언, 하위 클래스에 대한 공통적인 요소(Attribute)아 행동(Behavior, method)을 정의
- 이들 Component는 다른 Component를 자신안에 둘수 있는 컨테이너 콤 포넌트이고, 다른 하나는 컨테이너 역할을 할수 없는 단순한 Component
- 기존 OS 기반 위에서 만들어 지므로 OS가 가지고 있는 Component만을 지원
- Java.awt Package안에 포함되어 있습니다.

배치/위치와 관련된 Method
doLayout() : 이 컴포넌트를 배치하도록 배치 관리 프로그램에 프롬프트 합니다.
validate() : 컨테이너와 모든 부속 컴포넌트가 Valid Layout을 가짐을 확인 합니다. 컨테이너와 하부 컴포넌트를 다시 배치 합니다.
invalidate() : 컨테이너와 모든 부속 컴포넌트가 다시 그려져야 한다고 표시
setVisible(boolean?b) : b 가 true인 경우 Component를 보이게 설정, false인 경우 안보이게 설정
getLocation() : Component의 위치를 x,y형태의 Point 유형의 객체로 Return 합니다.
getLocation(Point ?rv) : Component의 위치를 x,y형태의 Point 유형의 객체로 Return 한다.
getLocationOnScreen() : 화면의 좌표 공간에 컴포넌트의 왼쪽 상단을 지정하여, 점 형식으로 이 컴포넌트의 위치를 가져 옵니다.
setLocation(int?x, int?y) : Component의 위치를 x ,y에 대응시킵니다.
setLocation(Point?p) : Component의 위치를 점 p에 대응시킵니다.
getBounds() : 객체의 위치와 크기를 Rectangle 유형의 객체로 Return 합니다.
getBounds(Rectangle ?rv) : 객체의 위치와 크기를 Rectangle rv로 Return 합니다.
setBounds(int?x, int?y, int?width, int?height) : Component 객체의 위치를 x,y에 위치시키고 그 크기는 width, height 로 합니다.
setBounds(Rectangle ?r) : Component 객체의 위치및 크기를 Rectabgle r로 합니다.
getX(), getY()


크기와 관련된 Method
getSize() : Component의 크기를 Dimension 객체(width, height)로 Return 합니다.
getSize(Dimension ?rv):Component크기를 Dimension객체 rv로 Return 합니다.
setSize(int?width, int?height) : component의 크기를 width와 height로 설정합니다.
setSize(Dimension ?d) : Component의 크기를 Dimention 객체의 width와 height로 설정 합니다.
getPreferredSize() : 이 컴포넌트의 선호 크기를 가져옵니다.
getWidth() : getHeight() :
getMaximumSize() : 이 컴포넌트의 최대 크기를 가져 옵니다.
getMinimumSize() : 이 컴포넌트의 최소 크기를 가져 옵니다.

Graphic과 관련된 메소드
getForeground() : 현재 전경색을 읽어 Color유형의 객체로 Return 합니다.
setForeground(Color c) : 현재 전경색을 Color유형의 객체 c 로 설정 합니다.
getBackground() : 현재 배경색을 읽어 Color 유형의 객체로 Return 합니다.
setBackground(Color c) : 현재 배경색을 Color 유형의 객체c로 설정 합니다.
getFont() : Component 객체의 글꼴을 Font 객체 형태로 Return 합니다.
setFont(Font f) : Component 객체의 글꼴을 설정한다.
getFontMetrics(Font font) : 지정된 글꼴의 글꼴 행렬을 가져 옵니다.
setCursor(Cursor cursor) : 커서 이미지를 사전 정의된 커서로 설정 합니다.
getCursor() : 커서가 이 컴포넌트상에 설정되도록 합니다.
paint(Graphics g) : 이 컴포넌트의 색상을 표시 합니다.
paintAll(Graphics g) : 이 컴포넌트와 모든 서브컴포넌트의 색상을 표시 합니다.
repaint() : 이 컴포넌트의 색상을 표시 합니다.
repaint(long tm) : 이 컴포넌트의 색을 다시 표시 합니다.
repaint(int x, int y, int width, int height) : 이 컴포넌트의 지정된 사각형 색상을 표시 합니다.
repaint(long tm, int x, int y, int width, int height) : tm 밀리쎄컨드 내에 이 컴포넌트의 지정된 사각형 색상을 표시 합니다.
print(Graphics g) : 이 컴포넌트의 색상을 표시 합니다.
printAll(Graphics g) : 이 컴포넌트와 모든 서브컴포넌트의 색상을 표시 합니다.
update(Graphics g) : 이 컴포넌트를 갱신 합니다.

Event와 관련된 메소드
processEvent(AWTEvent e) : 이 컴포넌트에서 발생하는 이벤트를 처리 합니다.
processComponentEvent(ComponentEvent e) : 등록된 ComponentListener 객체로 보내어, 이 컴포넌트에서 발생하는 컴포넌트 이벤트들을 처리 합니다.
processFocusEvent(FocusEvent e):등록된FocusListener객체로 보내어, 컴포넌트에서 발생하는 초점이벤트들을 처리
processKeyEvent(KeyEvent?e) : 등록된 KEYLISTENER객체로 보내어, 이 컴포넌트에서 발생하는 키 이벤트들을 처리.
processMouseEvent(MouseEvent e):등록된 MouseListener 객체로 보내어, 이 컴포넌트에서 발생하는 마우스이벤 처리
processMouseMotionEvent(MouseEvent e) : 등록된 MouseMotionListener 객체로 보내어, 이 컴포넌트에서 발생하는 마우스 모션 이벤트들을 처리 합니다.
processInputMethodEvent(InputMethodEvent e) : 등록된 InputMethodListener 객체로 보내어, 이 컴포넌트에서 발생하는 InputMethod 이벤트들을 처리 합니다.
addComponentListener(ComponentListener?l) : 이 컴포넌트로부터 컴포넌트 이벤트를 받기 위해 지정된 컴포넌트 수신기(listener)를 추가합니다.
removeComponentListener(ComponentListener l) :
addFocusListener(FocusListener l) :이 컴포넌트로부터 초점 이벤트를 받기 위해 지정된 초점 수신기를 추가 합니다.
removeFocusListener(FocusListener l)
addKeyListener(KeyListener l) : 이 컴포넌트로부터 키 이벤트를 받기 위해 지정된 키 수신기를 추가.
removeKeyListener(KeyListener l) :
addMouseListener(MouseListener l) : 이 컴포넌트로부터 마우스 이벤트를 받기 위해 지정된 마우스 수신기를 추가 합니다.
removeMouseListener(MouseListener l)
addMouseMotionListener(MouseMotionListener l) : 이 컴포넌트로부터 마우스 모션 이벤트를 받기 위해 지정된 마우스 모션 수신기를 추가 합니다.
removeMouseMotionListener(MouseMotionListener l) addInputMethodListener(InputMethodListener l) : 이 컴포넌트로부터 Input Method 이벤트를 받기 위해 지정된 Input Method 수신기를 추가 합니다.
removeInputMethodListener(InputMethodListener l)

addPropertyChangeListener(PropertyChangeListener listener) : 이 컴포넌트로부터 Property Change 이벤트를 받기 위해 지정된 Input Method 수신기를 추가 합니다.
removePropertyChangeListener(PropertyChangeListener listener)

getListeners(Class listenerType) : addXXXListener()로 추가된 리스너 들을 리스너 배열로 Return 합니다.
기타 메소드
addNotify() : 이 컴포넌트가 컨테이너에 추가되었고, 피어(peer)가 필요하면 작성해야 한다는 것을 이 컴포넌트에 알립니다.
removeNotify() : 이 컴포넌트가 컨테이너에서 제거되었고, 피어(peer)가 있으면 피어가 제거된다는 것을 이 컴포넌트에 알립니다.
add(PopupMenu popup) : 지정된 팝업 메뉴를 컴포넌트에 추가 합니다.
contains(Point p) : 이 컴포넌트에 지정된 점이 "포함"되어 있는지 점검합니다. 이 점의 x 및 y 좌표는 이 컴포넌트의 좌표 체계에 비례하여 정의 됩니다.
contains(int x, int y) : 이 컴포넌트에 지정된 점이 "포함"되어 있는지 점검합니다. 여기서 x와 y는 이 컴포넌트의 좌표 체계에 비례하여 정의 됩니다.
isEnabled() : 이 컴포넌트가 작동 가능한지 판별 합니다.
setEnabled(boolean b) : 매개변수 b 값에 따라 이 컴포넌트를 작동시키거나 작동 불가능하게 합니다.
getComponentAt(int x, int y) : 이 컴포넌트 또는 바로 아래 부속 컴포넌트 중 하나에 (x,?y) 위치가 있는지 판별 합니다. 있으면 포함된 컴포넌트를 리턴 합니다. .
getComponentAt(Point p) : 지정된 지점이 속해 있는 서브컴포넌트 또는 컴포넌트를 리턴 합니다.
getName() : 컴포넌트의 이름을 가져옵니다.
setName(String name) : 지정된 문자열로 컴포넌트 이름을 설정 합니다.
getParent() : 이 컴포넌트의 상위 컴포넌트를 가져 옵니다.
getToolkit() : 이 컴포넌트의 도구 킷을 가져 옵니다.
hasFocus() : 컴포넌트가 KeyBoard Focus를 가지고 있는지 boolean형 Return
isVisible() : 이 컴포넌트가 가시적인지 판별 합니다.
list() : 표준 시스템 출력 스트림 System.out으로 이 컴포넌트의 목록을 인쇄 합니다.
list(PrintStream out) : 지정된 출력 스트림으로 이 컴포넌트의 목록을 인쇄 합니다.
list(PrintStream out, int indent) : 지정된 들여쓰기 위치에서 시작하여 지정된 인쇄 스트림으로 목록을 인쇄 출력 합니다.
list(PrintWriter out) : 지정된 인쇄 작성자로 목록을 인쇄합니다.
list(PrintWriter out, int indent) : 지정된 들여쓰기 위치에서 시작하여 지정된 인쇄 작성자로 목록을 인쇄 합니다.
isShowing() : 이 컴포넌트가 화면에 표시되고 있는지 판별합니다. isValid() : 이 컴포넌트가 유효한지 판별 합니다.
isDisplayable() : 이 컴포넌트가 displayable 인지 판별
isLightweight() : native Peer Component를 가지지 않는 Component인지 판별 true if this component has a lightweight peer; false if it has a native peer or no peer. Component나 Container의 하위클래스중 Button이나 Scollbar 같은 것이외의 것들은 lightweight Component, 스윙 컴포넌트는 lightWeight Component 컴포넌트가 displayabke 이 아니면 false

아래의 예제를 참고 하세요~

import java.awt.*;
public class AwtTest extends Frame {
Button btn; Label lbl ; TextArea ta; TextField tf; Checkbox cb1, cb2;
Choice choice; List list;
AwtTest () {
btn = new Button("버튼");
lbl = new Label("라벨");
ta = new TextArea("TextArea", 5, 20); // 5행, 20열
tf = new TextField("TextField", 20); // 20칸
cb1 = new Checkbox("체크박스1");
cb2 = new Checkbox("체크박스2");
choice = new Choice();
list = new List(3,true); // 보여지는것은 2개이고 다중선택은 true로 지정
}
void display() {
setLayout(new FlowLayout()); // 컴포넌트 배치 설정
add(btn);
add(lbl);
add(ta);
add(tf);
add(cb1);
add(cb2);

choice.add("초록"); // 콤보박스에 항목 추가
choice.add("빨강");
choice.add("파랑");
add(choice);
list.add("봄"); // 리스트박스에 항목 추가
list.add("여름");
list.add("가을");
list.add("겨울");
add(list);
pack();
setVisible(true);
}
public static void main(String args[]) {
AwtTest myFrame = new AwtTest();
myFrame.display();
}
}








2013년 8월 6일 화요일

[ORACLE SGA Tuning, 오라클자바커뮤니티]X$KSMLRU

X$KSMLRU 에 대해 알아봅니다.


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


 X$KSMLRU는 Shared Pool 영역에서 다른 오브젝트를 age out 시키고 연속된 공간을 할당 받은 Object에 대한 정보를 담고 있어 많은 양의 메모리를 사용하는 Object에 대한 Flush 상태를 확인 할 수 있습니다. SYS 사용자만 질의 가능 합니다.

 많은 Object를 Flush 시키고 할당이 되는 객체들이 자주 변한다면 Response Time이 나빠지며 Flush 되었던 객체가 다시 로드 됨으로서 Library Cache Latch Contention을 일으킬 수 있습니다.

 그러므로 많은 Object들을 Flush 시키며 로드되는 Object들이 자주 사용 된다면 Memory에 KEEP 시키도록 하는 것이 유리 합니다. 이 Fixed Table(X$KSMLRU)에서 한번 조회된 ROW는 테이블에서 없어 집니다.

아래는 Object의 할당으로 인해 Flush 된 Object 수가 0보다 큰 것을 조회하는 겁니다. 즉 여기에 나타나는 것이 큰 Object이죠… 이놈을 Shared Pool에 올리려니 크기가 크니까 다른 Object를 쫓아 보리는 겁니다. 물론 그러한 새션의 아이디도 확인 할 수 있습니다.

SQL> select * from x$ksmlru where ksmlrnum > 0;

ADDR          INDX    INST_ID  KSMLRIDX  KSMLRDUR KSMLRCOM
-------- ---------- ---------- ---------- ---------- --------------------
  KSMLRSIZ  KSMLRNUM KSMLRHON                          KSMLROHV KSMLRSES
---------- ---------- -------------------------------- ---------- --------
02EE6B54          0          1          1          0 work area tabl
      4216          8                                          0 799FC2D8

02EE6B00          1          1          1          0 BAMIMA: Bam Buffer
      4132          8 BEGIN dbms_shared_pool.sizes...  335996982 799FC2D8


SQL> select * from x$ksmlru where ksmlrsiz > 5000;

선택된 레코드가 없습니다.

SQL> select * from x$ksmlru where ksmlrnum > 0;

선택된 레코드가 없습니다.   위에서 조회 했으므로 데이터가 사라 졌다.

Columns Desc

KSMLRSIZ : allocate된 연속된 memory size, 이 크기가 5K 넘으면 문제의 소지가 있으며 10K가 넘으면 심각, 20K가 넘으면 심각한 문제를 야기 시킬 가능성이 있습니다.

KSMLRNUM : 이 Object의 할당으로 인해 Flush 된 Object 수
KSMLRHON : Load되고 있는 Object의 이름(PL/SQL or Cursor)
KSMLROHV : Load되고 있는 Object의 Hash Value
KSMLRSES : 이 Object를 Load한 Session의 SADDR 값 

2013년 8월 5일 월요일

JAVA Struts Model

Struts의 Model 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 
 www.onjprogramming.co.kr 


스트럿츠에서 모델은 Business Logic을 처리하는 부분과 처리된 결과를 저장 하기 위한 부분으로 나누어 볼 수 있는데 처리된 결과를 저장 하는 빈은 Value Object 또는 DTO라고 부르고 있습니다.

Value Object로 볼 수 있는 DTO(Data Transfer Object)는 대부분 비즈니스 객체를 원격지 뷰에 제공 하는데 사용 합니다.

DTO는 원격 객체의 비즈니스 로직을 표현하지만 비즈니스 로직 안에 있을 필요는 없습니다. 앞의 로그인 예제에서 UserInfoVO.java가 DTO의 역할을 한다고 할 수 있습니다.

DTO를 이용하는 것은 분산 환경에선 거의 필수 이며 네트웍 부하를 줄일 수 있으며 스트럿츠에서 DTO를 사용하는 것은 비즈니스 객체와 프리젠테이션을 분리하며 유지 보수를 용이 하게 합니다.

이전의 로그인 예제를 다시 돌아가 보면 LoginAction에서는 실제 로그인을 처리하는 과정은 포함되어 있지 않습니다. Action 클래스는 Controller의 일부라고 이전에 이야기 했습니다.

Action 클래스에서는 인증 처리를 LoginDAO.java에 위임을 했는데 이렇게 분리 하는 경우 인증 모듈에 변경이 가해 지더라도 Action 클래스에는 영향을 끼치지 않는 것 입니다.

아래 소스 코드를 보도록 하죠…( LoginAction.java)

package login2;

import org.apache.struts.action.Action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;

import login2.LoginForm;
import login2.Constants;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionServlet;

/**
 * @author 이종철
 */
public class LoginAction extends Action {
               
        public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {
                String id = ((LoginForm)form).getId();
                String pwd = ((LoginForm)form).getPwd();
               
                //Model을 이용하기 이용하여 인증부분의 처리를 합니다.
                LoginDAO loginDAO = new LoginDAO();
                UserInfoVO userinfo = loginDAO.authUser(id, pwd);
               
                //에러 내용을 담을 ActionErrors 객체를 생성
                ActionErrors errors = new ActionErrors();
               
                if (userinfo==null) {
                        //인증 실패                       
                        errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.login.invalid"));                       
                }
                else {
                        //사용자 아이디와 비밀번호가 틀릴경우 비밀번호가 틀리다는 에러 메세지 출력
                        if ( !id.equals(userinfo.getPwd()) ) {
                              errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("error.login.invalid"));
                        }
                }
               
                //로그인 과정에서 에러가 있을 경우 Action클래스의 saveErrors 메소드를 이용해  에러를 저장하고
                //이전의 로그인 페이지로 돌려 보내면 login.jsp의 <html:errors/> 태그에 의해 오류가 출력 돔
                //mapping의 getInputForward()에서 반환하게 되는 정보는 struts-config.xml의 action태그의
                //input 속성에  정의된 페이지로 이동하게 됩니다.
                if (!errors.isEmpty()) {
                    saveErrors(request, errors);
                  return (mapping.getInputForward());
                }       
                               
                //인증 성공한 경우 세션에 LoginInfoVO(로그인한 사용자 정보를 담은 객체)저장
                HttpSession session = request.getSession();
                session.setAttribute(Constants.USER_KEY, userinfo);
               
                //로그를 남기자.
                StringBuffer buf = new StringBuffer("LoginAction : User --> ");
                buf.append(id + "logged in session");
                servlet.log(buf.toString());
                               
                return (mapping.findForward(Constants.SUCCESS));                       
               
        }

       
}

LoginDAO loginDAO = new LoginDAO();
UserInfoVO userinfo = loginDAO.authUser(id, pwd);
이 부분을 보면 LoginDAO의 authUser라는 메소드가 인증을 수행 함을 알 수 있는데…
실행 후 결과를 리턴 하는 부분을 보면 USerInfoVO라는 DTO(Data Transfer Object)를 리턴함을 알 수 있습니다.

LoginDAO는 비즈니스 로직을 수행하는데(인증처리), 이 처리가 정상적으로 된 경우 사용자 정보(UserInfoVO)를 어디엔가 저장 해 두고 (ID와 PWD이외의 정보가 DB에서 읽혀져서 포함 될 수 있습니다.) 나중에 VIEW에서도 꺼내 볼 수 있는데 이때 UserInfoVO 빈이 DTO or Value Object가 됨을 알 수 있습니다.

이 USerInfoVO는 LoginAction에서 인증 결과가 성공 이었음을 확인 후 session에 setAttribute로 저장 됩니다.

//인증이 성공한 경우 세션에 UserInfoVO(로그인한 사용자 정보를 담은 객체)저장
HttpSession session = request.getSession();
session.setAttribute(Constants.USER_KEY, userinfo);



아래는 LoginDAO.java 파일의 내용 입니다.

package login2;

public class LoginDAO {
       
        public UserInfoVO authUser(String id, String pwd) {
                /**
                * 이부분은 실제 DB에서 ID와 PASWORD로 인증을 해야 하는 부분 입니다.
                * 예제를 간략히 하기 위해 이부분의 처리는 생략 했으며 ID가 "jclee", Password가 "jclee" 인 경우엔
                * 인증을 허용 합니다.
                */
               
                if ( id.equals("jclee")&& pwd.equals("jclee")) {
                        //ID:jclee, PASSWORD:jclee인 경우 인증이 성공, 사용자의 정보(아이디, 패스워드)를 저장 합니다.
                        return new UserInfoVO(id, pwd);
                } else {
                        return null;
                }               
        }
}


아래는 DTO인 UserInfoVO.java 입니다.

package login2;
/**
 * 로그인이 정상적으로 이루어진 경우 사용자의 정보 등을 저장 하는 빈
 * 본 예제에서는 ID와 PASSWORD를 저장 합니다.
 */
public class UserInfoVO {
        private String id = null;
        private String pwd = null;
       
        //LoginDAO에서 인증이 성공인 경우 아래의 생성자를 불러 값을 setting 합니다.
        public UserInfoVO(String id, String pwd){
                this.id = id;
                this.pwd = pwd;
        }
       
        public  String getId() {
                return id;
        }

        public  String getPwd() {
                return pwd;
        }
}


다음은 VIEW쪽에서 세션에 저장 되어 있는 UserInfoVO 빈을 이용하는 예 입니다.
<body>               
            <h3>반갑습니다.<bean:write name="user" property="id"/>님!</h3>       
                <ul>                       
                        <li>                           
                                <html:link forward="logoff">로그아웃</html:link>
                        </li>                       
                </ul>
        <body> 

[ORACLE SGA Tuning]DBMS_SHARED_POOL, Object KEEP

[ORACLE SGA Tuning]DBMS_SHARED_POOL, Object KEEP

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 
 www.onjprogramming.co.kr 




DBMS_SHARED_POOL을 이용한 KEEP

 Shared Poll에 크기가 큰 프로그램을 KEEP하기 위해서는 아래에 있는 것처럼 DBMS_SHARED_POOL Package를 이용 할 수 있습니다.

SQL> @C:\oracle\ora92\rdbms\admin\dbmspool.sql

패키지가 생성되었습니다.


권한이 부여되었습니다.


뷰가 생성되었습니다.


패키지 본문이 생성되었습니다.

SQL> @C:\oracle\ora92\rdbms\admin\prvtpool.plb

뷰가 생성되었습니다.


패키지 본문이 생성되었습니다.

SQL> grant execute on dbms_shared_pool to scott;

권한이 부여되었습니다.

Object를 KEEP하는 방법은 다음과 같습니다.

Procedure,Function,Package : exec dbms_shared_pool.keep(‘pname’,’p’)
Trigger : exec dbms_shared_pool.keep(‘tr_emp’,’r’)
Sequence : exec dbms_shared_pool.keep(‘seq_empno,’q’)
SQL문은 아래와 같은 방법으로 KEEP 합니다.

예를들어 select empno, ename, sal from emp where deptno = ‘20’ 라는 SQL문장을 Library Cache안의 Shared Cursor 부분에 KEEP하기 위해서는 아래처럼 하면 됩니다…

SQL> conn scott/tiger
연결되었습니다.

SQL> select empno, ename, sal from emp where deptno = 20;

    EMPNO ENAME            SAL
---------- ---------- ----------
      7369 SMITH            800
      7566 JONES            2975
      7788 SCOTT            3000
      7876 ADAMS            1100
      7902 FORD            3000

SQL> conn / as sysdba
연결되었습니다.

SQL> select address, hash_value from v$sqlarea
  2  where sql_text = 'select empno, ename, sal from emp where deptno = 20';

ADDRESS  HASH_VALUE
-------- ----------
7856AC4C 1137127237  <- 원하는 SQL문장에 대한 주소와 해시 값

아래 명령으로  KEEP 합니다.

SQL> exec dbms_shared_pool.keep('7856AC4C, 1137127237','c');

PL/SQL 처리가 정상적으로 완료되었습니다.

Object의 KEEP 상태는 다음으로 체크 가능 합니다.

SQL> select distinct name, sharable_mem, loads
  2  from v$db_object_cache
  3  where name like '%emp%'
  4  and kept = 'YES';

NAME                                      SHARABLE_MEM      LOADS
------------ ----------------------------------------------
select empno, ename, sal from emp where deptno = 20  1469          1

또는 exec dbms_shared_pool.sizes(0)로 확인 가능 합니다. 이 sizes라는 procedure는 제한된 사이크 이상의 keep된 Object를 나타내 줍니다.

SQL> set serveroutput on size 2000
SQL> exec dbms_shared_pool.sizes(0)  -> buffer overflow가 나더라도 pin시킬(KEEP할) SQL문장을 찾을 수는 있습니다.

각 Object를 Shared Pool에 유지하던 것을 해제 할 때는 아래의 unkeep 프로시저를 이용 합니다.

SQL> exec dbms_shared_pool.unkeep('7856AC4C, 1137127237','c');

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> select distinct name, sharable_mem, loads
  2  from v$db_object_cache
  3  where name like '%emp%'
4  and kept = 'YES';

결과가 없겠죠…


아래는 DBMS_SHARED_POOL.keep procedure 명셉니다… 메타링크 자료니 참고 하세요…

PROCEDURE:DBMS_SHARED_POOL.KEEP
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Version/s:  7.1+, 8.0, 8.1
See Also:  [NOTE:67537.1] The Purpose of DB Package Reference Articles
            [NOTE:67569.1] DBMS_SHARED_POOL Package Description
 
Specification:
  procedure keep(name varchar2, flag char DEFAULT 'P');
 
Description:
  Keep an object in the shared pool.  Once an object has been keeped in
    the shared pool, it is not subject to aging out of the pool.  This
    may be useful for certain semi-frequently used large objects since
    when large objects are brought into the shared pool, a larger
    number of other objects (much more than the size of the object 
    being brought in, may need to be aged out in order to create a
    contiguous area large enough.
    WARNING:  This procedure may not be supported in the future when
    and if automatic mechanisms are implemented to make this 
    unnecessary.
 
  Input arguments:
    name
      The name of the object to keep.  There are two kinds of objects:
      PL/SQL objects, triggers, sequences which are specified by name,
          and SQL cursor objects which are specified by a two-part number
      (indicating a location in the shared pool).  For example:
        dbms_shared_pool.keep('scott.hispackage')
      will keep package HISPACKAGE, owned by SCOTT.  The names for
      PL/SQL objects follows SQL rules for naming objects (i.e., 
      delimited identifiers, multi-byte names, etc. are allowed).
      A cursor can be keeped by
        dbms_shared_pool.keep('0034CDFF, 20348871')
      The complete hexadecimal address must be in the first 8 characters.
      The value for this identifier is the concatonation of the
      'address' and 'hash_value' columns from the v$sqlarea view.  This
      is displayed by the 'sizes' call above.
      Currently 'TABLE' and 'VIEW' objects may not be keeped.
    flag
      This is an optional parameter.  If the parameter is not specified,
        the package assumes that the first parameter is the name of a
        package/procedure/function and will resolve the name.  It can also
        be set to 'P' or 'p' to fully specify that the input is the name
        of a package/procedure/function.
       
        Other FLAG options are:
          'T' or 't'        to specify that the input is the name of a type.
          'R' or 'r'        to specify that the input is the name of a trigger 
          'Q' or 'q'        to specify that the input is the name of a sequence.
          other        In case the first argument is a cursor address and 
                        hash-value, the parameter should be set to any 
                        character except 'P','p','Q','q','R','r','T' or 't'.
 
  Exceptions:
    An exception will raised if the named object cannot be found.

2013년 8월 3일 토요일

실습과 예제를 통해 Spring Framework3.2를 배우는 과정, (개발과정)Ajax,jQuery,MyBatis&Spring3.X개발자과정(평일야간)

실습과 예제를 통해 Spring Framework3.2를 배우는 과정, (개발과정)Ajax,jQuery,MyBatis&Spring3.X개발자과정(평일야간)


강좌명 (개발과정)Ajax,jQuery,MyBatis&Spring3.X개발자과정(평일야간)
교재 자체교재 or PDF 무료 제공
강좌 일정 08월09일(금) ~ 09월04일(수)((평일야간) 19:00~22:00, 14일) 총 42시간
강의 장소 [B강의장]구로디지털단지역2번 출구-> 미니스톱끼고 우회전 -> 100m 직진 후 골목길 끝에서 이마트방향 우회전 -> 50m 직진 후 우체국 옆골목으로 길건너서 직진 -> 150미터 직진 후 JnK 타워에서 우회전 -> 50미터 직진 후 우측에 코오롱빌란트2차 803호 (구로구 구로3동 222-8 코오롱디지털타워 빌란트2차 803호)
[약도보기]
수강절차 - 강좌내용 확인
- 전화 또는 홈페이지(www.onjprogramming.co.kr)를 통한 수강지원 및 수강료 결제(무통장입금, 온라인 카드결제)
- 고용보험 가입자(재직자)인 경우 고용보험환급 관련 서류 제출
- 수강전 : 커리큘럼 및 장소에 대해 다시 한번 공지
- 교육 전 설문 작성(간단한 개발 경력, 수강 목적, 강좌진행방식 등)
- 강좌 수강
- 수강후 : 교육 후 설문 작성
수강료 - 680,000원
[고용주환급]대기업:20만원 전후,중소기업:270,000원
[개인수강지원(개인환급)]정규직 504,000 ,비정규직:전액환급
대기업(상시근로자 300인 이상 대기업)은 개인환급 불가합니다.

재직자 내일배움카드 : 정부지원금 80% 자기부담금 20%
(구 능력개발카드 명칭이 내일배움카드로 변경 / 연간 총한도 200만원)
수강료
입금안내
- 온/오프라인 카드결제, 계좌이체(수강안내->입금안내 참조)
문의사항 02-851-4790 번으로 연락 부탁 드립니다.
교육개요 (스프링 개발자 과정은 오엔제이프로그래밍 교육 센터 입니다!)

본 과정은 수료 후 자바기반 환경에서 스프링 웹개발이 가능하도록 하는 속성 스프링 개발자 과정 입니다. Ajax, jQuery를 기본으로, 스프링 개발을 위한 최소 구성요소(IoC, AOP, JDBC, MVC)를 학습하고 MyBatis, Hibernate를 학습 후 활용성이 높은 게시판 예제, XPlatform&Spring을 단계별로 학습하면서 이전에 배운 요소기술들을 하나씩 주입시켜 개발해 나가는 개발자 실습 과정 입니다. 게시판 버전을 1차, 2차로 나누어서 1차에서는 Spring DI를 중심으로 Spring JDBC, MVC요소를 결합시켜 작성하며 2차에서는 로그인 기능을 추가하고 Spring 로깅 AOP기능, MyBatis와의 결합을 구현해 나감으로써 스프링 기능 및 부가기능에 대한 응용 학습을 하게 되며, 마지막으로 최근 UI 개발의 필수 구성요소인 XPlatform과 Spring의 연동에 대해서도 학습을 하게 되어 어떠한 환경에서도 개발가능한 자바 웹 개발자를 만들어 드립니다.

본 과정을 이수 후 현장에서 즉시 개발가능한 스프링 개발자가 되는데 손색이 없도록 진행 예정입니다. (단 수강생 스스로도 열심히 학습해 주셔야 합니다)

[특징]
- 실습에 근거한 이론 취득
- 이론/실습 과제로 인한 개발력 UP
교육목표 - Ajax, jQuery 활용 능력
- Spring IoC, AOP에 대한 이해
- Spring JDBC, MVC에 대한 이해
- 스프링 웹 개발에 대한 이해
- 스프링 개발력 UP
교육대상 - Spring을 경험하지 못한 자바 개발자
- Spring을 배우고 싶은 자바 개발자
선수학습 - JAVA, JSP
 

Ajax Programming - Ajax란, 장점
- Ajax 사용예제 분석
- XMLHttpRequest 객체, 메소드, 속성
- Cross-Browsing
- innerHTML, CSV
- JavaFramework & Ajax
- Ajax 동적 XML 로딩
- Form 입력값 검증
- Auto refresh
DOM - DOM 개요
- JAVA for DOM
- Dynamic DOM 다루기
jQuery Programming - jQuery 개요, 다운로드, 설치
- $(document).ready() 메소드
- Selector
$(“*"), $("#ID"), $("DIV"),$(".classname"), $("p > a"),
$(“elementname.classname")
속성 선택자, 속성(attr)
입력양식 필터 선택자
위치와 관련된 필터 선택자
- jQuery 배열(Array) 관리
- jQuery 객체 확장
기본 필터링 메소드
특정 위치 문서 객체 선택
문서 객체에서 특정 태그를 선택하는 방법
innerHTML 속성과 관련된 jQuery 메서드
문서객체 생성 , 제거
- jQuery Event
이벤트 관련 메소드(발생, 제거)
이벤트 자동 발생
마우스/키보드/윈도우/입력양식 이벤트
- jQuery 기본효과, 사용자지정효과
- jQuery, Ajax
관련 메소드
XML 문서 다루기
입력양식 전송
Spring & ORM Basic - Spring의 도입배경 및 아키텍처에 대해 이해한다.
(자바빈의 태동부터 EJB, 그리고 현재까지)
- Eclipse, Maven, STS 플러그인에 대한 이해
(개발환경 설정의 이해)
- Spring IoC(DI, DL)
- Spring AOP
- AspectJ Annotation
- Spring Web MVC, JDBC
- Spring Controller에 대한 이해
- ORM에 대한 이해
Hibernate에 대한 이해
MyBatis에 대한 이해
Spring Project 스프링 게시판 작성하기(Step by Step으로 이해가 쏙쏙)

- 1차버전 : 기본 게시판 기능(리스트보기, 답글, 커멘트, 게시물 입력, 수정) + 게시물 내용 미리보기(Ajax연동)
기술요소 : Ajax, Spring MVC, Spring JDBC, Spring DI

[절차]
게시물 보기 화면부터 구현 후 전체 기능 추가
Controller 구현
Model 영역 구현
DAO 구현
Service 구현
Ajax Manager 구현
View 구현
web.xml, 스프링 설정 파일 작성
TEST, 시연


- 2차버전 : 기본 게시판 기능(리스트보기, 답글, 커멘트, 게시물 입력, 수정) + 로그인 기능(인증한 경우에만 글읽기, 입력,수정,삭제 가능) + 파일 업로드 + DB쪽 Spring AOP를 이용한 로깅 + SQL문을 MyBatis를 이용하여 별도 XML로 관리

기술요소 : Ajax, Spring MVC, Spring JDBC, Spring DI, Spring AOP, MyBatis 결합

[절차]
스프링 설정 파일 수정
Controller 수정
Model 영역 수정
DAO 수정
Service 수정
View 수정
TEST, 시연
 

2013년 8월 1일 목요일

Java.lang.Object 클래스

자바의 모든 클래스는 Object 클래스의 하위 클래스이므로 Object 클래스의 모든 메소드를 사용할 수 있다. Object 클래스의 메소드는 클래스의 객체를 조작하기 위한 가장 기본적인 메소드만을 제공하는데 그 중 주요 메소드만을 소개하면 다음과 같다. 

public java.lang.Class getClass() 
  현재 객체의 원형 클래스에 대한 정보를 자바의 Class 타입으로 반환하는 메소드이다. 두개의 객체가 동일 클래스의 객체인지 비교할 때 유용하다. 

public boolean equals(Object obj)
  현재 객체가 다른 객체(obj)와 내용이 동일한지를 비교하는 메소드이다. 이 메소드는 객체의 내부 필드와 메소드의 구조가 완전히 동일하고 또 필드에 설정되어 있는 값도 동일한지를 비교한다. 

protected java.lang.Object clone() 
  객체를 완전히 복사할 때 사용하는 메소드이다. =의 경우는 참조하는 위치만 전달하지만 clone의 경우는 새로운 객체를 만들어 값까지 동일하게 복사한다. 

public java.lang.String toString() 
  객체를 문자열의 형태로 변환하는 데 사용하는 메소드이다. 보통 객체를 대표할 수 있는 값을 문자열로 반환한다. 
 
protected void finalize()
객체가 더이상 사용되지 않을 때 쓰레기 수집기에 의해 수행되는 메소드이다. 이 메소드는 객체가 사용한 파일이나 데이터베이스를 닫을 때 주로 사용된다. 

2013년 7월 28일 일요일

(오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터)JAVA Jar 사용법

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의)




Jar c|t|u|x[f][m][M][0][v] [jar파일의이름] [menifest] [-C directory] [files]
  Jar –I[jar]
  - 처음 Option의 첫번째 문자(기본적인 연산을 지정)
  c : 새로운 Jar Archive를 생성, 마지막인자로 입력파일등을 표시, 새롭게 생성된 JAR File 
      은 첫번째 엔트리로 META-INF/MENIFEST.MF 파일을 가지며 이파일은 JAR File의 
      내용을 나열하며 각각의 파일에 대한 메시지 요약을 포함한다.
  t : Jar Archive의 내용을 나열한다. 
  u : Jar Archive 파일의 내용을 갱신, 커맨드라인에 나열된 파일은 이 아카이브에 추가된다. 
      m 옵션과 같이 사용된 경우에는 지정된 메니페스트 정보를 Jar File 에 추가한다.
 x : JAR Archive의 내용을 추출한다.
 - 한정자 옵션(4개의 명령지정문 뒤에서 연산에 관한 자세한 정보를 제공)
 f: jar가  Command Line의 지정된 이름의 JAR File에 대해 수행되는 것임을 나타낸다. 
    지정되지 않으면 표준입력으로 JAR File을 읽고 표준출력으로 JAR File을 쓴다.
m : 메니페스트 템플릿이 코맨드라인에 지정되었음을 JAR 명령에게 알린다.,(c,u Option과
    함께사용)


M : jar가 기본 메니페스트 파일을 생성하지 않도록 함(c, u와 함께 사용)
v : 여러 가지 출력을 내보내도록 함
0 : jar가 압축 없이 파일을 JAR 아카이브에 저장 하도록 함 

첫번째 옵션이 f를 포함한다면 jar파일의 이름을 기술하며, m을 포함한다면 menifest파일이름을 기술한다. 만약 첫번째 Option이 f,m을 모두 포함한다면 이와 동일한 순서로 나열해야 한다. Files에는 JAR Archive에 포함시킬 파일을 나열한다.

** 추가옵션
-C Directory : Jar가 다음파일및 디렉토리를 처리하는중에 지정된 dir을 바꾸도록 한다. –C Option은 몇개라도 사용이 가능하며, 다음 –C Option이 올때까지 유효하다.
-I jarfile : c,t,u,x 대신 사용, Jar File의 파일구조등의 인덱스를 산출하도록, META-INF/INDEX.LIST 파일에 저장
 추후 자바인터프리터나 애플릿뷰어등이 알고리즘의 최적화하고 불필요한 Jar File을 다운로드 하지 않기 위해서 이 인덱스 정보를 이용활수 있다.



jar cvf hello.jar HelloWorld*.class
jar cf hello.jar HelloWorld*.class -> 위의 것과 동일하나 화면에 출력이 나타나지 않는다.
jar cmf myMenifest test.jar HelloWorld.class -> test.jar File을 만들면서 myMenifest 라는 파일의 내용을 MENIFEST.MF File에 첨가한다.
Jar ufm test.jar myMenifest -> 이미 만들어져 있는 test.jar File의 MENIFEST.MF File을 myMenifest 를 참조하여 갱신한다.
Jar umf myMenifest test.jar

D:\자바프로그래밍\예제>jar tvf hello.jar
    0 Fri Jun 28 19:07:24 KST 2002 META-INF/
    95 Wed Jul 03 00:08:38 KST 2002 META-INF/MANIFEST.MF
  430 Fri Jun 28 18:30:38 KST 2002 HelloWorld.class
D:\자바프로그래밍\예제>jar tf test.jar
META-INF/
META-INF/MANIFEST.MF
HelloWorld.class


D:\자바프로그래밍\예제>jar uf test.jar HelloWorld1.class

D:\자바프로그래밍\예제>jar uf test.jar HelloWorld2.class

D:\자바프로그래밍>jar cvf sample.jar -C 예제/  .  sample.jar file은 예제 dir에 생김

D:\자바프로그래밍\예제>jar tvf test.jar
    0 Fri Jun 28 19:07:24 KST 2002 META-INF/
    95 Wed Jul 03 00:08:38 KST 2002 META-INF/MANIFEST.MF
  430 Fri Jun 28 18:30:38 KST 2002 HelloWorld.class
  391 Fri Jun 28 17:35:00 KST 2002 HelloWorld1.class
  354 Fri Jun 28 17:35:00 KST 2002 HelloWorld2.class