레이블이 객체지향이란인 게시물을 표시합니다. 모든 게시물 표시
레이블이 객체지향이란인 게시물을 표시합니다. 모든 게시물 표시

2013년 10월 19일 토요일

오라클 SCN은 최근의 SCN 보다 크고 유일한 값

SCN 이란?
오라클은 특정한 시점의 데이타베이스 상태를 SCN으로 관리하는데 어떤 트랜잭션이 commit 되면, SCN은 최근의 SCN 보다 크고 유일한 값이 할당되며이 값은 그 트랜잭션이 변경시킨 블럭에 반영되고또한 데이타화일의 가장 최근의 SCN은 데이타화일의 헤더에 기록 됩니다.
아래에는 SCN이 이용되는 경우에 대해 몇 가지 적었습니다.
참고 하세요~

1. Oracle Startup 
내부적 과정

$ORACLE_HOME/dbs/init$ORACLE_SID.ora file
를 찾는다
.
$ORACLE_SID.ora file
내의 지정된 config file를 포함하여 parameter 내용을 참조하여 Oracle backgroud process startup 한다.
(nomount )

control_file
이라는 parameter에 지정된 control file를 읽는다.
(mount )

control file
내에 설정되어 있는 Datafile  redolog file를 읽은 후 SCN이 일치하는가를 check한 후에 만약 틀리면 redolog를 이용하여 Recover 한 후 startup한다.


2. Listing Status Information About Data Files

SQL> SELECT name,
2 rfile#,
3 status,
4 checkpoint_change# "CHECKPOINT"
5 FROM v$datafile;

NAME RFILE# STATUS CHECKPOINT
----------------------------------------------------------------
C:\ORACLE\ORADATA\WINK\SYSTEM01.DBF 1 SYSTEM 7041729

C:\ORACLE\ORADATA\WINK\UNDOTBS01.DBF 2 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\CWMLITE01.DBF 3 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\DRSYS01.DBF 4 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\EXAMPLE01.DBF 5 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\INDX01.DBF 6 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\ODM01.DBF 7 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\TOOLS01.DBF 8 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\USERS01.DBF 9 ONLINE 7041729

C:\ORACLE\ORADATA\WINK\XDB01.DBF 10 ONLINE 7041729


10 
개의 행이 선택되었습니다.

RFILE#
은 각 데이타 화일의 화일 숫자로 리스트 하며 데이타베이스를 갖고 create 되었던,
SYSTEM tablespace
에 있는 첫번째 데이타 화일은 항상 화일 1 입니다.

STATUS
은 데이타 화일에 대해 다른 정보로 리스트 합니다만약 데이타 화일이 SYSTEM tablespace의 부분에 있다면상태는 SYSTEM 입니다.
(
만약 recovery를 요구 하지 않는다면)
만약 non-SYSTEM tablespace에 데이타 화일이 online으로 된다면상태는 ONLINE 이구요,
non-SYSTEM tablespace
에 데이타 화일이 offline으로 된다면상태는 OFFLINE이나 RECOVER 중 하나로 될 수 있습니다.
CHECKPOINT
는 데이타 화일의 가장 최근의 checkpoint에 기록된 마지막의 SCN을 리스트 합니다.


3. Oracle
 "fast commit" mechanism을 사용 하므로 사용자가 COMMIT문장을 사용하면 LGWRcommit record를 즉시 redo log buffer에 기록하지만 해당 data buffer의 변경들은 redo log buffer들을datafile들에 write하는 것을 더 효과적으로 할 때까지 지연 되는 것입니다.

User
 transaction commit 할 때, transaction System Change Number(SCN)를 할당 받고 Oracleredo log transaction redo log entry들과 함께 기록 합니다.

Activity
가 빈번하다면, LGWR group commit을 사용하여 online redo log file write할 수도 있습니다.

출처 : 오라클자바커뮤니티(http://www.oraclejavanew.kr)

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





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> 

2013년 8월 2일 금요일

자바 위임을 이용한 Adapter 패턴 예제 (java adapter pattern, java design pattern

안녕하세요~ oraclejavacommunity 입니다. 위임을 이용한 Adapter 패턴 예제 입니다.
 
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의) 



위임이란 어떤 메소드의 처리를 다른 인스턴스의 메소드에 맡긴다는 의미 


Banner.java및 Main.java는 앞 예제와 동일함

//Print.java
public abstract class  Print {
public abstract String printString();
}


//PrintBanner.java
public class PrintBanner extends Print {
private Banner banner;
public PrintBanner (String str) {
this.banner = new Banner(str);
}
public String  printString() {
return "(" + banner.showString() + ")";
}
}
 
  

2013년 8월 1일 목요일

자바의 특성(객체지향적) , ORACLE JAVA OOP 실무강좌

******** 자바의 특성(객체지향적) ************

추상화(Abstraction) : 실제 사물을 명사화/동사화 시켜서 프로그램에 적용할수 있는 형태로 만드는 것
상속성(Inheritance) : 미리 만들어진 소스를 가지고 공유하며 재사용하고, 또한 특별한 부분에 대 해서는 다시 재정의해서 사용하는 것 자바에서 상속은 한 클래스를 확장하여 새로운 클래스를 만드는 것을 말한다. 이렇게 새로 만들어지는 클래스를 하위클래스(subclass)라고 부른다. 그리고 원래의 클래스는 상위클래스(superclass)라고 부른다.
다형성(Polymorphism) : 상속을 받은 것을 그대로 사용하지 않고 입맛에 맞게 바꾸어 줄 수 있도록 하는것이며 이 때문에 다형성 함수는 전달하는 변수의 타입을 고려하지 않게된다.
캡슐화(Encapsulation) : 캡슐화는 사용자로부터 객체 내부의 데이터를 감추는 것이다. 데이터를 변수로 나타내며, 클래스의 함수와 프로시저는 메소드(Method)라고 한다. 클래스가 다른 클래스의 데이터를 다루려면 메소드를 통해야 한다. 이러한 캡슐화는 객체 내부의 처리과정을 알 필요없이 그것을 다루는 메소드에 대해서만 알면 된다는 점에서 편리하다. 변수들(외부에서 임의로 조작되었을때 원하지 않는 결과가 나오는것들 또는 잘못된 결과가 나오는것들) 에대해서 외부로 부터 접근제한을 시키는 것이 바로 encapsulation, 즉 객체내부의 데이터와 메소드 항목을 정의할때 private로 지정하여 클래스 외부에서의 접근을 제한하는것.


다중 쓰레드를 지원한다.
- 프로세스는 실행중인 프로그램을 뜻하는 말입니다. 보통 프로세스가 운영 체제의
여 러 자원을 사용하는 기본 단의 입니다.
- 쓰레드(Thread)란 프로세스 내부에서 실행되는 일련의 명령 흐름을 뜻합니다.
프로세스내의 제어의 단일 순차 흐름을 의미하며, 때때로 수행 문맥
(execution context)또는 가벼운 프로세스(lightweight peocess)라함
- 프로세스가 실행되면서 하나의 흐름만을 갖는 것이 아니라 여러 개의 흐름으로
분기할 수 있으며 하나의 프로세스가 같은 시간에 여러 가지 일을 수행하기
위해서 여러 개의 스레드를 만들게 됩니다.
- 다중 쓰레드란 하나의 프로그램내에서 동시에 수행되며 서로 다른 작업들을
수행하는 복수개의 쓰레드들을 의미한다.


[예제]
class Employee {
String name;
String id;

//생성자
public Employee(String name1, String id1) {
name = name1;
id = id1;
}
public void gotoOffice() {
System.out.println(name+"님 출근하였습니다...");
}
public void gotoHome() {
System.out.println(name+"님 퇴근하였습니다...");
}
}


class Manager extends Employee {
String chargeDept;
public Manager(String newName,String newID,String newDept) {
//super는 상위클래스의 생성자를 의미
super(newName, newID);
this.chargeDept = newDept;
}

public void startJob() {
System.out.println(this.chargeDept +” “+ super.name + "님이 직원관리를 시작합니다...");
}
}


class Example {
public static void main(String args[]) {
Manager m = new Manager("이종철","12345","솔루션개발부");
m.gotoOffice();
m.startJob();
m.gotoHome();
Manager m1 = new Manager("홍길동","12346","고객관리부");
m1.gotoOffice();
m1.startJob();
m1.gotoHome();
}
}