반응형

객체란?

객체란 실생활에서 흔히 볼수 있는 개,고양이,자동차,자전거..등등이 모두 객체라 할수 있는데
프로그래밍 세계에선 문법에 의해 형식이 짜여진 컴퓨터에 사용되는 요소들이 객체가 될수가 있다.
객체는 특성(Property)와 메소드(Method)로 나누어진다.

  • 객체정의하기
    자바스크립트에서 객체는 생성자 함수를 이용해서 만들수가 있다.
    생성자 함수는 객체의 특성과 메소드를 정의하기 위해 사용되는 함수이다
    생성자 함수 역시 일반함수나 변수 만드는 방법과 동일하다.

    컴퓨터라는 객체를 만들어보자
    컴퓨터의 특성중에는 CPU(중앙처리장치) ,RAM(메모리) , HDD(하드디스크) 등을 들수가 있는데
    보기를 이용해 생성자 함수를 만들어보면

    function computer(cpu,ram,hdd) {
    this.cpu=cpu;
    this.ram=ram;
    this.hdd=hdd;
    }

    this는 객체자신을 가리킨다.

  • 객체만들기
    생성자 함수를 이용해서 객체를 만드는 방법은 new 라는 연산자를 통해 가능하다.

    mycom = new computer("pentium4",256,20000)

    mycom에는 cpu(pentium4),ram(256),hdd(20000)이라는 특성을 갖게 된다.
    다르게 표현할수도 있다

    mycom.cpu = "pentium4"
    mycom.ram = 256
    mycom.hdd = 20000

    "." 연산자는 객체에 속한 특성이나 메소드를 구분해 주는 것으로
    왼쪽에는 객체가 오고 오른쪽에는 특성이나 메소드가 온다

    예제1 실행화면
    <script language="javascript">
    <!--
    function computer(cpu,ram,hdd) {
    this.cpu=cpu;
    this.ram=ram;
    this.hdd=hdd;
    }
    //끝 -->
    </script>

    <script language="javascript">
    <!--
    mycom = new computer("pentium4",256,20000);
    document.write("CPU : " + mycom.cpu + "<br>");
    document.write("RAM : " + mycom.ram + "<br>");
    document.write("HDD : " + mycom.hdd + "<br>");
    //끝 -->
    </script>

    CPU : pentium4
    RAM : 256
    HDD : 20000

  • 객체 메소드 정의
    메소드는 객체의 동작을 지정하는 함수이다
    출력하는 함수를 메소드로 지정해 보면

    function mirage10() {
    document.write("CPU : " + this.cpu + "<br>");
    document.write("RAM : " + this.ram + "<br>");
    document.write("HDD : " + this.hdd + "<br>");
    }

    this는 특정 객체를 출력 시키는게 아닌 mirage10 함수를 사용하는 객체의 특성을
    출력 하겠다는 의미이다.
    그렇기 때문에 mirage10 함수를 메소드로 등록해서 사용하려면 생성자 함수에
    mirage10을 넣어주어야 한다.

    function computer(cpu,ram,hdd) {
    this.cpu=cpu;
    this.ram=ram;
    this.hdd=hdd;
    this.mirage10=print;
    }

    새로운 생성자 함수로 예를 들어보자

    예제2 실행화면
    <script language="javascript">
    <!--
    function mirage10() {
    document.write("CPU : " + this.cpu + "<br>");
    document.write("RAM : " + this.ram + "<br>");
    document.write("HDD : " + this.hdd + "<br>");
    }
    //끝 -->
    </script>

    <script language="javascript">
    <!--
    function computer(cpu,ram,hdd) {
    this.cpu=cpu;
    this.ram=ram;
    this.hdd=hdd;
    this.mirage10=mirage10;
    }
    //끝 -->
    </script>

    <script language="javascript">
    <!--
    mycom = new computer("pentium4",256,20000);
    mycom.mirage10();
    //끝 -->
    </script>

    CPU : pentium4
    RAM : 256
    HDD : 20000

    더 복잡한것 같지만 여러개를 출력 한다면 효과가 아주크다

  • 객체 특성 정의
    객체가 다른 객체의 특성으로 사용 될 수가 있다
    사람이라는 객체의 특성으로 컴퓨터 객체를 사용해 보겠다
    사람이라는 객체를 사용하기 위해 생성자함수를 만든다

    function person(name , age , computer)
    this.name=name;
    this.age=age;
    this.computer=computer;
    }

    이제는 person이란 객체를 만들다

    Mr=new person("남자" , 21, mycom);
    Miss=new person("여자" , 20 , mycom);

    보기를 이용해서 에를 들어본다

    예제3 실행화면
    <script language="javascript">
    <!--
    function mirage10() {
    document.write("성별: " + this.name + "<br>");
    document.write("나이: " + this.age + "<br>");
    document.write("CPU : " + this.computer.cpu + "<br>");
    document.write("RAM : " + this.computer.ram + "<br>");
    document.write("HDD : " + this.computer.hdd + "<br>");
    }
    //끝 -->
    </script>

    <script language="javascript">
    <!--
    function computer(cpu,ram,hdd) {
    this.cpu=cpu;
    this.ram=ram;
    this.hdd=hdd;
    }
    //-->
    </script>

    <script language="javascript">
    <!--
    function person(name , age , computer) {
    this.name=name;
    this.age=age;
    this.computer=computer;
    this.mirage10=mirage10;
    }
    //-->
    </script>

    <script language="javascript">
    <!--
    mycom = new computer("pentium4",256,20000);
    Mr=new person("남자" , 21, mycom);
    Miss=new person("여자" , 20 , mycom);
    document.write("<b>철수</b><br>")
    Mr.mirage10();
    document.write("<p><b>영희</b><br>")
    Miss.mirage10();
    //-->
    </script>

    철수
    성별: 남자
    나이: 21
    CPU : pentium4
    RAM : 256
    HDD : 20000

    영희
    성별: 여자
    나이: 20
    CPU : pentium4
    RAM : 256
    HDD : 20000

  • 참조배열 사용
    배열과 유사하지만 다른점은 []안에 숫자대신 문자를 사용한다.
    mycom의 특성값을 참조배열을 통해 접근하는 방법이다.

    mycom.cpu = mycom[0] = mycom["cpu"] = "pentium4"
    mycom.ram = mycom[1] = mycom["ram"] = 256
    mycom.hdd = mycom[2] = mycom["hdd"] = 20000

  • for ~ in 제어문
    for ~ in 제어문은 객체에 들어있는 모든 특성들을 반복해서 보여주는 기능이 있다.
    for다음에는 각각의 특성을 가리키는 변수가 오고 in 다음에는 특성을 알고자 하는 객체가 오게 된다.
    위에 있는 mycom으로 예를 들어보자

    for(var pro_ty in mycom) {
    document.write(mycom[pro_ty]);
    }

    모든특성을 한번씩 보여주는 반복 제어문으로 pro_ty에는 첫번째값인 cpu가 들어가게 된다.
    그리고 스크립트 문장을 실행한후 다시 for ~ in 제어문 처음으로 돌아가고 pro_ty는 두번째값인
    ram이 들어간다.
    for ~ in 제어문은 객체 의 특성을 모두 읽을때 까지 반복 실행이 된다.

    예제4 실행화면
    <script language="javascript">
    <!--
    function mirage10(object) {
    for(var pro_ty in object) {
    document.write(pro_ty + "=" + object[pro_ty] + "<br>");
    }
    }

    function computer(cpu,ram,hdd) {
    this.cpu=cpu;
    this.ram=ram;
    this.hdd=hdd;
    }
    //-->
    </script>

    <script language="javascript">
    <!--
    mycom = new computer("pentium4",256,20000);
    document.write("computer<p>")
    mirage10(mycom);
    //-->
    </script>

    computer

    cpu=pentium4
    ram=256
    hdd=20000

  • 배열
    makeArray라는 생성자 함수로 배열을 만들수가 있다.

    function makeArray(n) {
    this.length = n;
    for(var i=1; i<=n;i++)
    this[i] =0 (null값이 안나오게 초기화 해준다)
    return this;
    }

    n에는 배열의 갯수를 지정해 준다.
    생성자 함수로 배열을 선언한다

    array = new makeArray(4);
    4개의 변수 array[1],array[2],array[3],array[4] 을 사용 할 수 있게 된다.

    예제5 실행화면
    <script language="javascript">
    <!--
    function makeArray(n) {
    this.length = n;
    for(var i=1; i<=n;i++)
    this[i] =0 ;
    return this;
    }
    //-->
    </script>

    <script language="javascript">
    <!--
    array = new makeArray(4);
    array[1] ="사과"
    array[2] ="배"
    array[3] ="수박"
    array[4] ="참외"
    document.write("배열테스트<p>");
    for(var i=1;i<=4; i++){
    document.write(i+"번" + " : " + array[i] + "<br>")
    }
    //-->
    </script>

    배열테스트

    1번 : 사과
    2번 : 배
    3번 : 수박
    4번 : 참외

반응형
  1. 함수란?

    프로그램 내에서 특정 작업을 수행하기 위해 작업을 하나의 단위로 만들어 반복적으로 사용 할 수 있게
    한 것이다.

  2. 함수정의

    function 이란는 키워드를 사용하여 함수를 정의 할수 있다.

    function 함수이름(매개변수1,2,3.....) {
    문장
    }

    함수이름은 변수이름과 동일한 방법으로 만들어야 하며,매개변수의 수는 제한이 없고 매개변수 간에는
    콤마(,)로 구분해야 한다

    매개변수가 없는 경우
    설명
    function mirage(){
    window.open("a.html","","")
    }
    mirage 라는 함수명 안에 매개변수를 사용하지 않은 예이다.
    매개변수가 있는 경우
    설명
    function mirage(home1){
    document.write(" " + home1 + " ")
    }
    mirage함수에 home1이라는 매개변수가 들어간 경우이다.
    리턴값이 있는 경우
    설명
    function mirage(str){
    com2 = confirm("hom1")
    return com2
    }
    사용자가 입력한 값을 com2라는 변수에 담아서 mirage함수에 리턴값으로 보내는 경우이다.
    confirm은 다이얼로그 박스를 띄워서 확인 취소를 물어보는 자바 스크립트 내장함수이다.
    hom1은 다이얼로그 박스 안내문 이다.
    확인은 true, 취소는 false가 리턴된다.

  3. 내장함수

    선언해서 만들은게 아니라 이미 만들어져서 자바 스크립트에 내장되어 있는 함수이다.
    가져다가 사용 하기만 하면 된다.

    • alert
      경고창을 띄워 주는 내장함수이다
      확인=true, 취소=false 가 리턴된다.

      alert("mirage728홈 방문을....")

    • confirm
      다이얼로그 박스를 띄워 확인 취소에 따라 결과값을 리턴해 주는 함수이다

      confirm("선택 하시겠습니까")

    • prompt
      사용자 입력창을 띄워 결과값을 리턴해 주는 함수이다

      prompt("입력값","초기값")

      입력값:계산할 수식을 입력해 주세요
      초기값을 지정하면 undefined글자 대신에 지정한 값이 입력된다.
      위그림은 초기값 지정을 안한 상태이다.

    • eval
      문자열로 입력된 수식을 계산 해주는 내장함수이다.
      입력양식을 통해 입력된 값을 계산할때 아주 유용하다.

      예제1 실행화면
      <script language="javascript">
      <!--
      var mirage3
      mirage3 = prompt("계산할 수식을 입력해 주세요")
      document.write("입력한 값 : " + mirage3 + "
      ")
      document.write("실행결과 : " + eval(mirage3) + "
      ")
      //끝 -->
      </script>
      <INPUT onfocus="this.blur()" onclick="coun()" type="button" value="실행하기">

    • parseInt
      문자열을 정수로 변환해주는 자바스크립트 내장함수이다.

      parseInt(string,nbase)

      string에는 변환할 문자열을 입력하고 nbase에는 변환할 정수형태를 지정한다.
      string매개변수 안에 일반문자가 들어가 있다면 문자앞에 있는 숫자 까지만 적용이되고
      되에있는 문자나 숫자는 모두 무시된다.

      예제2 실행화면
      <script>
      var mirage7
      mirage7 = prompt("변환할 숫자를 입력하세요.")
      document.write("입력한 값 : " + mirage7 + "<br>");
      document.write("실행결과 : " + parseInt(mirage7,16) + "<br>");
      </script>
      <INPUT onfocus="this.blur()" onclick="coun3()" type="button" value="실행하기">

      위의 예제는 입력한 값을 16진수 값으로 출력합니다.

    • parseFloat
      문자열을 부동소수점으로 변환해 준다.

      parseFloat(string) F는 꼭 대문자로 써야한다

      farseFloat은 2진수나 8진수가 없기때문에 nbase는 존재하지 않는다.

      예제3 실행화면
      <script language="javascript">
      <!--
      var mirage7
      mirage7 = prompt("부동소수점으로 변환할 숫자를 입력하세요.")
      document.write("입력한 값 : " + mirage7 + "<br>");
      document.write("실행결과 : " + parseFloat(mirage7) + "<br>");
      // end -->
      </script>
      <INPUT onfocus="this.blur()" onclick="coun2()" type="button" value="실행하기">

    • escape
      ISO-Latin-1 문자셋을 ASCII형태로 바꾸어 리턴해 주는 함수이다
      리턴값은 %??형태로 나오게 된다.

      예제4 실행화면
      <script language="javascript">
      <!--
      document.write("& = "+ escape('&')+"<br>");
      document.write("^ = "+ escape('^')+"<br>");
      // end -->
      </script>
      & = %26
      ^ = %5E

    • unescape
      ASCII형태를 ISO-Latin-1 문자셋으로 바꾸어 리턴해주는 함수이다.

      예제5 실행화면
      <script language="javascript">
      <!--
      document.write("%13 = "+ unescape('%13')+"<br>");
      document.write("%c7 = "+ unescape('%c7')+"<br>");
      // end -->
      </script>
      %13 =
      %c7 = Ç

      기타 많은 내장함수가 있다.....!

  4. 함수호출

    함수를 만들어 놓고 호출을 해야 실행이 되는 함수가 있고 브라우저가 문서를 읽어 들일때
    바로 실행이 되는 함수도 있다.

    함수호출: 함수명()

    호출하는 방법은 여러가지가 있다.
    그중에 자주 쓰이는 예)

    예제6 실행화면
    <script>
    function mirage9() {
    alert("함수가 호출됐습니다");
    return;
    }
    </script>
    <a href="javascript:mirage9()">호출하기1</a>
    <a onclick="mirage9()">호출하기2</a>
    <body onload=mirage9()> ← 호출하기3
    호출하기1

    호출하기2

    ↑커서만들려면: style="cursor:hand;"
    넣어주면 된다


    링크안에 함수 호출문이 있어서 클릭하면 곧장 함수가 실행된다.
    브라우저가 문서를 읽어 들일때 실행 하려면 정의된 함수명을 삭제하고
    내장함수만 사용하든가 아니면 <body onload=mirage9()> 형태로 사용 할 수도 있다

    • 재귀적 호출

      함수가 내부에서 자기 자신을 호출하는 것이다.

      예제7 실행화면
      <script language="javascript">
      <!--
      function fac(mirage) {
      if(mirage >1 ) {
      var resu
      resu = mirage*fac(mirage-1)
      return resu
      }
      else {
      return mirage
      }
      }
      // -->
      </script>

      <script language="javascript">
      <!--
      var mirage
      mirage = prompt
      ("수의 계승을 구할 정수을 입력하세요")
      document.write("<h4>" + mirage + "의 계승 = "
      + fac(mirage) + "</h4>")
      // -->
      </script>

      첫번째 스크립트는 계승(factorial)구하는 공식이다.
      계승이란 수의 값을 줄여가며 곱해주는
      계산식 이다. 7! = 7*6*5*4*3*2*1

      먼저 함수 fac를 선언하고 매개변수로 mirage를
      지정해주었다
      if문으로 매개변수(앞으로 입력 받을값)의 범위를 지정하고 있는데 1보다 크면 문장을 실행하고 1이거나 1보다 작으면 입력받은 값을 그대로 리턴값으로 돌리고 있다
      결과값을 저장할 변수를 resu로 만들어 주었다. resu에는 입력값(mirage) 곱하기 (입력값-1)한 값이 들어가는데 입력값-1을 매개변수로 fac함수를 호출하고 있다.
      이유는 조건을 검사하기 위해서 이다
      (1이면 결과값을 리턴하고 if문을 벗어나야 하니까)
      mirage-1값이 1이 될때까지 계속 fac함수를 호출하게 된다.
      밑에 문장(return resu)은 실행 할 수도 없다 계속 함수 호출문에 걸리니까
      1이되면 resu(계산한 값이 들어있다)를 리턴값으로 돌려준후 if문을 끝내게 된다.

      두번째 스크립트는 입력을 받고 출력시키기 위한 스크립트로 계산은 위에 있는 스크립트가 한다
      prompt 내장함수로 값을 입력 받아서 mirage라는 변수에 넣어주고 있다
      mirage라는 변수에는 사용자가 입력한 값이 들어가게 된다
      그 값을 매개변수로 fac함수를 호출해서 출력시키고 있다.
      " "안에 있는 모든 값들은 그대로 출력되고 밖에 있는 문자는 값을 가지고 있는 변수또는 함수라고 생각하면 될 것이다 "" 와 계산값(변수,함수리턴값..등등)은 + 기호로 연결해 주면 된다. 중요한 점은 변수나 함수를 " "안에 넣어주면 문자로 인식하기 때문에 실행이 안되고 그냥 출력되어 버린다

      <INPUT onfocus="this.blur()" onclick="coun4()" type="button" value="실행하기">

      조금더 간단하게 표현 한다면.....!

      예제8 실행화면
      <script>
      function fact(n){
      if(n == 1)
      return(1)
      else
      return(n*fact(n-1))
      }
      </script>
      <script language="javascript">
      <!--
      var mirage
      mirage = prompt("수의 계승을 구할 정수을 입력하세요")
      document.write("<h4>" + mirage + "의 계승 = " + fact(mirage) + "</h4>")
      // -->
      </script>
      <INPUT onfocus="this.blur()" onclick="coun5()" type="button" value="실행하기">

      예제9 실행화면
      재귀적 호출의 완결판 문제!

      3개의 막대와 n개의 서로다른 크기의 접시가 있다.
      접시에는 가운데 구멍이 나서 막대에 꽂을수가 있는데 왼쪽막대에 크기 순으로 작은것은 위에
      큰것은 밑에 차례대로 꽂혀있다.
      이접시를 모두 맨오른쪽 막대에 옮기되 한번에 하나씩 옮겨야 하며 작은 접시를 큰 접시에
      놓을순 있지만 큰 접시를 작은접시 위에 놓을 수 는 없다.
      가운데 막대는 잠시 옮겨놓는 장소로 사용 할 수 있다.

      문제)접시의 갯수를 n이라 할때 n개 접시를 옮기는 프로그램을 작성하시오.

      참고) 접시갯수(n)에 따른 옮기는 횟수는 (2에n승-1)로 증가하기 때문에 너무 큰수는 컴퓨터로 계산해도 시간이 엄청 걸립니다. 결과를 확인할때 15 이하로 입력하세요..^^
      <INPUT onfocus="this.blur()" onclick="coun6()" type="button" value="결과 보기">


반응형
  1. 자료형

    • 정수
      10진수:일반정수
      16진수:0x 로 시작하며 0~15까지의 수를사용, 10~15까지의 숫자는 영문 알파벳 A~F를
      대신 사용한다
      8진수:0 으로 시작하는수로 0 ~ 7 까지의 수를 사용한다

    • 부동소수점:소수가 있는 10진수를 의미하며 지수를 사용하여 표현할수가 있다.

    • Boolean형:1비트인 자료형으로 참과 거짓을 나타낸다.true=참 false=거짓
      함수 리턴값, 관계 연산자의 결과값으로 사용을 한다.

    • null 값: 값이 없다는 것을 의미함

    • 문자열: " "' '안에 들어가는 모든 문자를 의미한다.
      문자열 안에 특수문자를 삽입할수가 있는데 의미는 아래의 표와 같다.

      \n 다음줄로 이동(newline)
      \b 백스페이스(backspace)
      \r 리턴(return)
      \t 탭문자 삽입(tab)
      \\ 역슬래시
      \' 작은따옴표(')
      \" 큰따옴표(")

  2. 변수선언

    • 특정 자료형의 값을 지닌 저장 장소로 변수를 만들때 변수명의 시작은 반드시 알파벳이나
      "_ "로 시작해야 한다.
    • 자바스크립트에서 사용하는 키워드는 사용할수가 없다.
      true, do, if ,for, return ,this,else.......등등
    • 자바스크립트 에서는 변수에 값을 할당 하기만 하면 그 입력값에 해당하는 변수가
      선언이 된 것이다.
      str="중학생"(문자열 변수) , a1 = 1 (정수형변수)
    • Var을 이용해서 선언을 할수도 있다.
      Var intvar , str
    • 자바스크립트 에서는 변수의 자료형을 쉽게 바꿀수가 있다
      Var a1="학생"
      a1은 현재 문자열 변수이다.
      형변환 하려면 자료만 바꿔준다.
      a1 = 20
      a1은 정수형 변수로 형변환 되었다.

  3. 연산자
    연산자에는 수치연산자,비교연산자,조건연산자,대입연산자,비트연산자 등이 사용된다.

    • 수치연산자
      수치계산에 쓰이는 연산자이다
      + (덧셈), - (뺄셈), * (곱셈), / (나눗셈), % (나머지),++ (증가),-- (감소), 단항연산자
      ++,--는 하나씩 증가 하거나 감소 시키는 연산자이다.

          a1 = 1
      ① sum = ++a1 (a1값이 2로 증가한후 sum에 대입된다)==> sum=2 , a1=2
      ② sum = a1++ (a1값 1이 먼저 sum에 대입된후 a1은 2가된다)==> sum=1 , a1=2
      앞뒤 어디에 붙느냐에 따라 값이 변하므로 주의해야 한다.

      단항연산자는 변수값 앞에 부호를 붙인것을 의미한다.
      -a1 = (-1*a1)
      예외) "고등" + "학생" ==> 고등학생 (이때 +는 문자열 연산자로 변한다)

    • 비교연산자
      값을 비교해서 결과를 리턴하는 연산자이다.
      작다,크다,같다,다르다 등을 주로 비교한다

      A < B A가 B보다 작다
      A > B A가 B보다 크다
      A <= B A가 B보다 작거나 같다
      A >= B A가 B보다 크거나 같다
      A == B A가 B와 같다
      A != B A가 B와 다르다

    • 조건연산자
      주어진 조건이 참인지 거짓인지를 판단하여 그 결과를 리턴해준다.
      두가지 조건이 동시에 만족해야 참인 AND(&&)연산자
      두가지 조건중 하나만 만족하면 참인 OR(||)연산자
      주어진 하나의 값이 참인지 거짓인지에 따라 값을 취하는 ?연산자(3진연산자)가 있다.

      A B A && B A || B
      true true true true
      true false false true
      false true false true
      false false false false

      ? 연산자는 조건이 참인 경우 " : " 기호 앞에 있는 값이 선택되고 거짓인 경우 " : "뒤에 있는
      값이 선택된다.

      a = 4;
      b = (a < 3) ? 7 : 10;
      조건이 거짓이라 : 뒤에 있는 10이 선택된다.
      결과: b = 10

    • 대입연산자
      대입 연산자는 오른쪽에 있는 값을 왼쪽에 대입 시키는 연산자이다.
      a1 = 3 (3을 a1에 대입시킨다)
      = 에 수치 연산자를 붙인것을 복합 대입연산자 라고한다.

      수식 같은표현
      a1 = 3
      a1 += 5
      결과: a1 = 8
      a1 = 3
      a1 = a1 + 5
      결과: a1 = 8

      -= , *= , /= , %= 도 사용 할 수 있다.

    • 비트연산자
      주어진 두수의 비트값에 AND , OR , XOR 연산을 하는 기능과
      비트값을 좌우측 으로 수평이동(Shift연산) 시키는 기능도 가지고 있다.
      비트값은 숫자의 2진수 표현이다.
      XOR연산의 진리표이다

      A B A ^ B
      1 1 0
      1 0 1
      0 1 1
      0 0 0

      두 값이 서로 달라야 참이된다.

      시프트(shift)연산자는 비트값이 한자리씩 왼쪽이나(왼쪽 시프트연산)
      오른쪽(오른쪽 시프트연산)으로 이동하는 것을 의미한다.

      A << B (A의 값을 B번 왼쪽으로 시프트)
      A >> B (A의 값을 B번 오른쪽으로 시프트)

      10 << 1 (10을 왼쪽으로 1번 시프트함)
      00001010 << 1 (10을 2진수 표현으로 변환한것,8비트적용)
       0 0 0 0 1 0 1 0
          ↙↙↙↙ (왼쪽으로 한자리씩 이동함)
       0 0 0 1 0 1 0 0 (앞의 비트값은 사라지고 뒤에 들어올 값이 없으면 무조건 0
      들어간다.)
      10100 => 20 ( 십진수로 표현) 한비트 움직일때마다 2를 곱해준 값하고 같다.

      예제1 실행화면
      1.<script language="javascript">
      <!--
      x = 10 << 1;
      document.write(x);
      //-->
      </script>
      20
      2.<script language="javascript">
      <!--
      x = 10 << 2;
      document.write(x);
      //-->
      </script>
      40

      오른쪽 시프트는 한비트 이동할 때마다 2로 나누어준 값하고 같다.
      예제2 실행화면
      1.<script language="javascript">
      <!--
      x = 20 >> 1;
      document.write(x);
      //-->
      </script>
      10
      2.<script language="javascript">
      <!--
      x = 20 >> 2;
      document.write(x);
      //-->
      </script>
      5

      오른쪽 시프트는 부호가 필요없는 정수일때 앞에 0 이 들어가고
      음수 일때는 1 양수일때는 0 이 들어간다.

    • Boolean NOT 연산자( ! )

      Boolean 값을 반전시키는 연산자로 true 일때는 false 로 false일때는 true가 된다.
      a = false;
      a = !a;
      a 의값은= true

      연산자 우선순위
      순위 연산자 설명
      1 . [] () 괄호
      2 ++ -- ! 증감,불린not
      3 * / % 수치연산
      4 + - 수치연산
      5 << >> 시프트연산
      6 < > <= >= 비교연산
      7 == != 비교연산
      8 & 비트연산
      9 ^ 비트연산
      10 | 비트연산
      11 && 조건연산
      12 || 조건연산
      13 ? : 조건연산
      14 = += -= *= /= %= &= ^= |= >>= <<= 대입연산

  4. 제어문

    • if-else
      주어진 조건을 만족 할때만 지정된 동작을 수행한다. 조건1이 참인경우 문장1
      조건2가 참인경우 문장2
      모든조건이 거짓인경우 문장n

      예제3 실행화면
      <script language="javascript">
      <!--
      a = 1, b = 2, c = 3;
      if(a == 2) {
      document.write("a = 2 입니다.")
      }
      else if(b == 4) {
      document.write("b = 4 입니다.")
      }
      else {
      document.write("모든 조건이 틀렸군요.<br>")
      document.write("c값을 출력 하겠습니다.<br>")
      document.write("c = "+c)
      }
      // -->
      </script>
      모든 조건이 틀렸군요.
      c값을 출력 하겠습니다.
      c = 3

      예제4 실행화면
      <script language="javascript">
      <!--
      function food(form) {
      for(var i=0 ; i < form.a1.length;i++) {
      if(form.a1[i].checked == true) {
      alert(form.a1[i].value + "를 좋아 하는군요")
      return document.form1.reset();
      }
      }
      }
      // -->
      </script>
      <어떤음식을 좋아하세요?
      <form name=form1>
      김치찌게 <input name="a1" type=radio value="김치찌게">
      된장찌게 <input name="a1" type=radio value="된장찌게">
      피자 <input name="a1" type=radio value="피자">

      <input type=button value="선택" onclick="food(this.form)" >
      </form>

      어떤음식을 좋아하세요? <FORM name="form1">김치찌게 <INPUT type="radio" value="김치찌게" name="a1">
      된장찌게 <INPUT type="radio" value="된장찌게" name="a1">
            피자 <INPUT type="radio" value="피자" name="a1">

      <INPUT onclick="food(this.form)" type="button" value="선택하기"> </FORM>

    • while
      주어진 조건이 만족되는 동안 반복해서 지정된 기능을 수행한다.
      반복 제어문 이다
      while문은 조건을 먼저 검사한후 참이면 문장을 실행한다.
      처음 조건이 거짓이면 문장을 한번도 실행 시키지 않는다.

      while (조건) {
      문장;
      }

      조건이 거짓(false)이 될때까지 계속 문장을 반복해서 수행한다.
      바꿔 말하자면 참(true)인 동안에는 계속해서 문장을 반복수행 하고 거짓이 될때
      while문을 빠져 나간다.

      예제5 실행화면
      3단출력

      <script language="javascript">
      <!--
      i=1;
      while(i <10) {
      document.write("3 * "+ i + " = " + 3*i + "<br>")
      i++
      }
      // -->
      </script>

      3단출력

      3 * 1 = 3
      3 * 2 = 6
      3 * 3 = 9
      3 * 4 = 12
      3 * 5 = 15
      3 * 6 = 18
      3 * 7 = 21
      3 * 8 = 24
      3 * 9 = 27

      while(i <10)에서 i값이 참(true)이므로 3*i(1)를 실행한다
      i++에 의해 i=2가 되었지만 그래도 조건이 참이므로 3*i(2) 를 실행한다
      계속 반복 하다가 i값이 10이 되면 조건이 거짓(false)이 되므로 while문을 빠져 나간다.

    • do while
      while문과 다른점은 일단 문장을 먼저 실행한후 조건을 검사해서 참이면 계속해서 문장을
      실행 시키고 거짓이 되면 do while문을 빠져 나가게 된다.
      최소한 한번은 문장이 실행된다.

      예제6 실행화면
      4단출력

      <script language="javascript">
      <!--
      i=1;
      do {
      document.write( "4 * "+ i + " = " + 4*i + "<br>")
      i++
      } while(i<10);
      // -->
      </script>

      4단출력

      4 * 1 = 4
      4 * 2 = 8
      4 * 3 = 12
      4 * 4 = 16
      4 * 5 = 20
      4 * 6 = 24
      4 * 7 = 28
      4 * 8 = 32
      4 * 9 = 36

    • for
      while처럼 주어진 조건이 참(true)인 동안만 문장을 반복해서 실행 시키고 거짓(false)이
      되는 순간 for문을 빠져 나간다.

      for(초기값;조건;증감식) {
      문장;
      }

      변수에 초기값을 설정하고 변수가 조건에 참이면 문장을 실행한다
      증감식에 의해 변수값은 1이 증감(증가와감소)하고 다시 조건을 비교해 본후 참이면
      또 문장을 실행시킨다.
      변수값이 증감 하다가 조건에 거짓이 될때 for문을 빠져나간다.

      예제7 실행화면
      5단출력

      <script language="javascript">
      <!--
      for(i=1 ; i<10 ; i++) {
      document.write( "5 * "+ i + " = " + 5*i + "<br>")
      }
      </script>

      5단출력

      5 * 1 = 5
      5 * 2 = 10
      5 * 3 = 15
      5 * 4 = 20
      5 * 5 = 25
      5 * 6 = 30
      5 * 7 = 35
      5 * 8 = 40
      5 * 9 = 45

    • break
      반복 제어문(while,for) 안에서 제어문을 종료하는 역활을 한다.
      break문 뒤에 실행을 중단시킬 위치를 지정 할 수 있다.

      예제8 실행화면
      6.7단출력

      <script language="javascript">
      <!--
      i=6 , j=1;
      mirage1 :
      while(true) {
      mirage2 :
      while(true) {
      if(i == 8) break mirage1;
      if(j == 10) {
      j=1;
      break mirage2;
      }
      document.write(i + " * " + j + " = " + i*j + "<br>")
      j++;
      }
      i++;
      }
      // -->
      </script>

      6.7단출력

      6 * 1 = 6
      6 * 2 = 12
      6 * 3 = 18
      6 * 4 = 24
      6 * 5 = 30
      6 * 6 = 36
      6 * 7 = 42
      6 * 8 = 48
      6 * 9 = 54
      7 * 1 = 7
      7 * 2 = 14
      7 * 3 = 21
      7 * 4 = 28
      7 * 5 = 35
      7 * 6 = 42
      7 * 7 = 49
      7 * 8 = 56
      7 * 9 = 63

    • continue
      break문과는 다르게 제어문의 처음 부분으로 이동 시키는 역활을 한다.
      continue문 뒤에 실행을 시작할 위치를 지정 할 수 있다

    • return
      함수에서 특정값을 리턴값으로 특정 위치에 보낼때 사용한다.
      예제4 에 리턴값 으로 form을 초기화 시켰다.

    • switch
      여러개의 조건마다 실행되는 문장을 서로 다르게 할때 사용한다.

      switch(표현식) {
      case value1 :
      문장1;
      break;
      case value2 :
      문장2;
      break;
      ........
      default :
      문장n;
      }

      예제9 실행화면
      1 ~ 10사이의 정수 영문출력

      <script language="javascript">
      <!--
      i = prompt("1 에서 10 사이의 수를 적으세요.");
      j = eval(i)
      switch(j) {
      case 1 : document.write("One");
      break;
      case 2 :document.write("Two");
      break;
      case 3 : document.write("Three");
      break;
      case 4 : document.write("Four");
      break;
      case 5 : document.write("Five");
      break;
      case 6 : document.write("Six");
      break;
      case 7 : document.write("Seven");
      break;
      case 8 : document.write("Eight");
      break;
      case 9 : document.write("Nine");
      break;
      case 10 : document.write("Ten");
      break;
      default : document.write("숫자오류");
      }
      // -->
      </script>

      1 ~ 10사이의 정수 영문출력

      <INPUT onfocus="this.blur()" onclick="mirage2()" type="button" value="실행하기">



반응형
  1. 자바스크립트란?

    넷츠케이프 에서 사용하는 스크립트 언어 로서 프로그램 코드가 직접 HTML문서 상에 삽입되어, 브라우저 에서 HTML 파일을 읽을때 같이 해석되고 실행된다.
    클라이언트 에서만 실행 되기에 정보를 서버에 보낼필요 없이 즉시 처리 할수가 있다.
    달리 해석 하자면 인터넷 연결 없이도 넷츠케이프2.0, 익스플로러3.0 이상의 브라우저만 있다면 실행하고 확인 할수가 있다.

  2. 자바스크립트 와 자바의 차이점?

    자바스크립트

    • 자바스크립트는 직접 html문서 안에 삽입되어 브라우저 에서 문서가 읽혀지면 같이 해석되고 실행된다.
    • 자바스크립트는 타입 체크를 자바 보다는 철저히 하지 않는다.
    • 그렇기에 누구나 쉽게 배울수있다.
    • 그 댓가로 몇가지 객체지향 요소를 포기 하는데,가령 클래스를 정의할수 없다거나 클래스를 상속 할수 없다.
    • 그대신 객체를 정의하여 사용 할수가 있다.
    • 객체기반 스크립트 언어이다.(이미 언어로 만든 객체들의 집합을 단순히 이용하여 프로그래밍)
    • 변수타입이 선언되지 않아도 된다.
    자바
    • 자바는 서버에서 컴파일 작업시 해석한후 애플릿 형태로 html문서에 삽입된다. 미리 해석되어 있기에 속도면에서 자바 스크립트 보다 빠르다.
    • 타입체크를 철저히 하기 때문에 클래스를 정의 할수 있고 상속 할수 있다.
    • 객체지향 언어이다( 만들고자 하는 클래스를 생성하고, 추가할 수 있으며 특정 작업을 수행하는 일련의 문장이 아닌 다른일을 하는 개개의 부분들의 집합을 프로그래밍)
    • 변수타입이 선언 되어야 한다.

  3. 스크립트 언어란?

    매크로와 같은 어떤 특별한 것들을 사용해서 작은 프로그램 들을 구현해 넣음 으로써 프로그램을
    고칠 수 있다.
    대부분은 미니 프로그램 들이 컴파일 되지 않고 에플리케이션이 실행되는 동안 라인 단위로 해석 되는데
    이러한 미니 프로그램 들을 스크립트라 하며 관련 명령어와 문장들의 집합체를 스크립트 언어라 한다.

  4. 자바스크립트 실행

    자바스크립트는 <script> 로시작해서....(본문)...</script>로 끝나게 된다.
    <script>택은 넷츠케이프 에서 자바스크립트를 위하여 새롭게 만든 택으로 넷츠케이프나 익스플로러를
    제외한 다른 브라우저 에서는 인식을 하지 못하는 경우가 많다.
    그렇기 때문에 자바스크립트를 실행시키기 위해서는 위의 두 브라우저
    중에 하나를 사용해야 합니다.

    (브라우저 다운받는곳:익스플로러, 넷츠케이프)
    다운이 안되면 직접사이트를 방문해서 받으세요..
    인터넷 익스플로러 사이트
    네츠케이프 사이트

    자바스크립트 코드는 보통 <head>---</head>택 사이나
    <body>---</body>택 사이에 들어간다.
    보통은 <head>택 사이에 들어가는데 그이유는 웹 브라우저가 HTML 문서를 읽을때 <head>안에 있는
    정보를 모두 읽은후에 <body>안에 있는 실제 정보를 읽어 화면에 출력하기 때문에 <body> 안에
    넣는다면 화면에 페이지를 출력 하면서 자바스크립트 코드를 읽어 들이고, 미처 해석 하기도 전에
    코드를 실행시킨 다면 오류를 일으키기 때문에 이런 문제를 미연에 방지 하고자 페이지가 화면에
    출력되기 전에 <head>택사이에 넣어 미리 읽어들여 해석하게 하는 것이다.
    ※그렇다고<body>에넣으면 안된다는 말은 아닙니다.~ ~만약을 대비 해서죠

  5. 주석문

    자바 스크립트 주석문은 2가지가 있다.

    /* 과 */ 사이에 들어가는 문장을 주석문으로 취급한다.
    // 는 한줄만 주석문 으로 처리 한다.

    <!-- 와 --> 는 HTML 주석문으로 자바스크립트 코드를 감출때 쓰이는데
    만약 넷츠케이프나 익스플로러 처럼 자바스크립트를 지원하는 웹 브라우저를 제외한 다른 브라우저는 <script> 택이 무시 된다.

    하지만 <script>....</script> 사이에 있는 코드들은 아무런 태그 표시가 없기 때문에
    그대로 화면에 출력된다.
    이것을 해결하기 위해 <!-- 와 --> 택으로 밑(↓)에있는 소스와 같이 모든 코드를 안에 넣어주면 된다.

  6. 간단한 예제.
    <HTML>
    <HEAD>
       <TITLE>자바스크립트</TITLE>
       <SCRIPT LANGUAGE="JavaScript">
       <!--
        document.write("안녕하세요!")
       //스크립트 끝 -->
       </SCRIPT>
     </HEAD>
       <BODY>
       </BODY>
    </HTML>

    ☞ 소스해석
    스크립트 택이 헤더 사이에 위치해 있다.
    스크립트 택에는 LANGUAGE 라는 옵션이 사용 되는데 이는 다른 스크립트 언어에 확장이 가능 하도록 하기 위해서 이다.
    지금은 자바스크립트 이기 때문에 LANGUAGE="JavaScript"가 할당된 것을 볼 수 있다. 자바스크립트가 아닌 VB스크립트 라면 LANGUAGE="vbscript" 라고 할당해 주면 된다
    중간에 document.write 라는 명령이 나오는데 이것은 영문뜻과 같이 문서에 출력하라(써라!) 라는 명령이다.
    저장 할때는 확장자를 이름.html 또는 이름.htm 으로 저장해서 브라우저로 출력해 보면 write안에 있는 "안녕하세요"가 출력 된다.

    실행하기

반응형

onabort
이미지의 다운로드를 중지할  (브라우저의 중지버튼)
onactivate
개체가 활성활   발생
(
태그의 기능이 작용할  발생하는 이벤트로 예를 들어 링크를 누를 경우 링크가 옮겨질때 발생하는 것을 감지하는 이벤트 핸들러)
onafterprint
문서가 출력되거나 혹은 출력하기 위해 출력 미리보기를 한후에 발생
onafterupdate
데이터영역 개체에서 발생하는 이벤트로 데이터 소스 오브젝트내의 데이터가  업데이트 되었을  발생(데이터 개체부분 참조)
onbeforeactivate
개체가 활성화 상태로 되기 바로 직전에 발생 (onactivate 참고)
onbeforecopy
선택 영역이 시스템의 클립보드로 복사되기 바로 직전에 발생
onbeforecut
선택 영역이 지워지기 바로 직전에 발생
onbeforedeactivate
 문서에서 현재 개체에서 다른 개체로 activeElement 바뀔 때 발생 (activeElement 개체를 지칭하는 예약어로도 쓰임)
onbeforeeditfocus
편집가능한 개체 내부에 포함된 개체가 편집활성화  상태가 되거나 혹은 편집가능한 개체가 제어를 위해 선택될때 
onbeforepaste
시스템의 클립보드에서 문서로 붙여넣기 될때 대상 개체에서 발생
onbeforeprint
문서가 출력되거나 혹은 출력하기 위해 출력미리보기 직전에 발생
onbeforeunload
페이지가 언로드되기 직전에 발생
onbeforeupdate
데이터영역 개체에서 발생하는 이벤트로 데이터 소스 오브젝트내의 데이터가  업데이트 되기전에 발생(데이터 개체부분 참조)
onblur
개체가 포커스를 잃었을 
onbounce
마퀴태그에서 alernate상태에서 스크롤이  사이드에서 바운드 될때 발생
oncellchange
데이터제공 개체에서 데이터가 변화할때 발생
onchange
개체 혹은 선택영역의 내용이 바뀔  발생
onclick
개체위에서 마우스의 왼쪽 버튼을 누를때 발생
oncontextmenu 
클라이언트 영역에서 사용자가 마우스 오른쪽 버튼을 눌러 콘텍스트 메뉴를 열 때 발생
oncontrolselect
사용자가 개체의 제어 영역을 만들때 발생
oncopy

시스템의 클립보드에 선택영역 혹은 개체를 복사할  소스 개체로부터 발생
oncut
시스템의 클립보드에 선택영역 혹은 개체를 잘라낼때 소스 개체로부터 발생
ondataavailable
비정기적으로 데이터를 전달하는 데이터 소스 개체로부터 데이터가 도착할  마다 정기적으로 발생
ondatasetchanged
데이터 소스개체의 변화에 의해 데이터가 노출된 상태로 될때 발생
ondatasetcomplete
데이터 소스 개체로부터 모든 데이터가 유용한 상태로 표시될때 발생
ondblclick
사용자가 개체에 더블클릭 할때 발생
ondeactivate
 문서에서 현재 개체에서 다른 개체로 activeElement 변할 때 발생
ondrag
드래그 상태가 지속되는 동안 소스 객체로 부터 발생
ondragend
드래그 상태가 끝날때 소스 객체로 부터 발생
ondragenter
사용자가 개체를 드래그 하여 드롭가능 위치로 지정된 영역으로 이동할때 타겟 개체에서 발생
ondragleave
사용자가 개체를 드래그 하여 드롭가능 위치로 지정된 영역을 떠날때 타겟 개체에서 발생
ondragover
사용자가 개체를 드래그 하여 드롭가능 위치로 지정된 영역내에서 드래그할  계속적으로 타겟 개체에서 발생
ondragstart
선택된 개체 혹은 텍스트 영역에서 사용자가 드래그를 시작할  발생
ondrop
드래그앤드롭 작용에서 상태가 진행되는 동안 개체가 타겟 개체에 드롭되었을  타겟 개체에서 발생
onerror
개체가 로드되는 동안 발생하는 이벤트
onerrorupdate
데이터 소스 개체 내에 데이터가 없데이트 되는 동안 에러가 발생할  데이터 영역 개체에서 발생 
onfilterchange
비주얼 필터의 상태가 바뀌거나 트랜지션이 완료되었을  발생
onfinish
마퀴개체의 loop 완료되었을  발생
onfocus
개체가 포커스를 받았을  발생
onfocusin
개체에 포커스가 셋팅되기 바로 직전 개체에 대해 발생
onfocusout
포커스가 다른 개체로 이동한 후에 포커스를 가고 있는 현재 개체에서 발생
onhelp
브라우저가 활성화 되어 있는 동안 F1키를 눌렀을  
onkeydown
사용자가 키를 눌렀을  
onkeypress
기능키를 제외한 키를 눌렀을  발생
onkeyup
사용자가 키를 놓았을  발생
onlayoutcomplete
소스 문서로 부터 콘텐드를 가지는 객체가 미리보기나 출력을 할때 현재 LayoutRect개체를 모두 채우는 것이 끝났을  발생
onload
브라우저가 개체를 로드한 후에 발생
onlosecapture
개체가 마우스 캡쳐를 잃었을  발생
onmousedown
개체 위에 마우스 버튼을 누를 때 발생(좌우 어느 버튼이든)
onmouseenter
개체 안으로 마우스 포인터가 들어올 때 발생
onmouseleave
개체의 경계 밖으로 마우스 포인터가 이동할  발생
onmousemove
개체 위에서 마우스가 움직일 때 발생
onmouseout
개체 밖으로 마우스 포인터가 빠져나갈  발생
onmouseover
개체위로 마우스 포인터가 들어올 때 발생
onmouseup
마우스가 개체 위에 있는 동안 마우스를 누른상태에서 해제될때 발생
onmousewheel
마우스 휠이 돌아갈 때 발생
onmove
개체가 움직일  발생
onmoveend
개체가 움직임이 끝날  발생
onmovestart
개체가 움직이기 시작할  발생
onpaste
문서에 클립보드로 부터 데이터가 전송될때 타겟 개체에서 발생
onpropertychange
개체의 속성이 바뀔 때 발생
onreadystatechange
개체의 상태가 변화할 때 발생
onreset
폼을 사용자가 리셋할 경우 발생
onresize
개체의 크기가 바뀔 때 발생
onresizeend
제어영역에서 개체의 크기가 사용자에 의해 변화가 끝날 때 발생
onresizestart
제어영역에서 개체의 크기가 사용자에 의해 변화되기 시작할 때 발생
onrowenter
데이터 소스 내에서 현재 열이 변화되거나 개체에 새로운 유용한 데이터가 입력될 때 발생
onrowexit
데이터 소스 콘트르롤이 개체내의 현재 열을  변화시킬  발생 
onrowsdelete
레코드셋에서 열이 삭제될 때 발생
onrowsinserted
현재 레코드셋에 새로운 열이 추가된 후에 발생(데이터 개체에서)
onscroll
사용자가 개체내이 스크롤 바를 스크롤 할 때 발생
onselect
현재 선택된 영역이 바뀔 때 발생
onselectionchange
문서의 선택 영역의 상태가 바뀔 때 발생
onselectstart
개체가 선택되기 시작할 때 발생
onstart
마퀴 개체에서  루프가 시작될 때 발생
onstop
사용자가 stop버튼을 눌렀을 경우 혹은 페이지를 떠날 때 발생
onsubmit
폼이 전송되기 바로 전에 발생
onunload
 

반응형

Tomcat 5.0 JNDI Datasoruce 설정


JNDI Datasoruce 설정 개요

  • Tomcat 5 JNDI DataSource를 통한 DB 커넥션 풀 사용
  • JNDI를 통한 커넥션 풀 사용은 J2EE 표준이고, 현존하는 거의 모든 웹 컨테이너가 지원
  • Jakarta의 DBCP 커넥션 풀과 Tomcat JNDI 설정을 통해 데이터베이스 커넥션 풀을 사용하는 방법 제시
  • 기본적으로 필요한 라이브러리
    • commons-dbcp.jar
    • commons-collections.jar
    • commons-pool.jar
    • DB에 대한 JDBC 라이브러리 (JAR)

JNDI Naming Resource 설정

  1. 위 라이브러리들을 $CATALINA_HOME/common/lib 에 복사한다. 그 이외 디렉토리에 두면 안된다.
  2. Connection 풀을 이용할 경우에는 ResultSet과 Connection 객체를 필히 직접 닫아 줘야만 한다.
  3. $CATALINA_HOME/conf/server.xml 혹은 각 웹 컨텍스트별 XML 파일의 <Context>의 자식 요소로 <Resource>를 추가한다.
  4. 웹 어플리케이션의 web.xml파일에 <resource-ref>를 추가하여 JNDI 리소스를 사용할 수 있도록 한다.
  5. 전역적인 JNDI 리소스를 이용하고자 하는 경우는 <GlobalNamingResources>

Server.xml

server.xml
<Resource name="jdbc/forumDb" auth="Container" type="javax.sql.DataSource"/>
<!-- Resource의 name 속성을 이용해서 각 어플리케이션에서 javax.sql.DataSource 객체를 얻어가게 된다. -->

<!-- 자세한 파라미터 설정은 위의 참조사이트에서 확인 -->
<ResourceParams name="jdbc/forumDb">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>

<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>

<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>

<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>

<!-- DB 사용자명과 비밀번호 설정 -->
<parameter>
<name>username</name>
<value>dbuser</value>
</parameter>
<parameter>
<name>password</name>
<value>dbpasswd</value>
</parameter>

<!-- JDBC 드라이버 클래스 -->
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>

<!-- JDBC 접속 URL -->
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@dbhost:1521:ORA</value>
</parameter>
</ResourceParams>
전역 JNDI 리소스 이용
  • <Resource>와 <ResourceParams> 요소를 server.xml의 <GlobalNamingResources> 의 자식노드로 옮기면 특정 웹 어플리케이션이 아니라, 이 톰캣에 설치된 전체 웹 어플리케이션에서 사용 할 수 있게 된다. 하지만 각 웹 어플리케이션 "<Context>"에 다음과 같은 설정을 해야 한다.
server.xml의 <Context> 부분에 추가
<ResourceLink
name="jdbc/forumDb"
global="jdbc/forumDb"
type="javax.sql.DataSource"
/>
  • 아니면 server.xml에서 <Host> 요소의 자식으로 다음을 추가하면 각 컨텍스트별 설정 필요없이 전체 웹 어플리케이션 컨텍스트에서 GlobalNamingResources로 지정된 JNDI 리소스를 사용할 수 있다.
server.xml의 <Context> 부분에 추가
<DefaultContext>
<ResourceLink
name="jdbc/forumDb"
global="jdbc/forumDb"
type="javax.sql.DataSource"
/>
</DefaultContext>

web.xml

web.xml에 리소스에 대한 reference를 설정
<resource-ref>
<description>Forum DB Connection</description>
<!-- 다음이 바로 리소스의 이름 -->
<res-ref-name>jdbc/forumDb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

Tomcat 5.5 JNDI Datasoruce 설정


DBCP(Database Connection Pool) 설정

  • 라이브러리 설치
    • Jakarta-Commons DBCP
    • Jakarta-Commons Collections
    • Jakarta-Commons Pool
  • DBCP 는 Jakarta-Commons Database Connection Pool을 사용하는데, 위에 있는 세개의 라이브러리는 $CATALINA_HOME/common/lib/naming-factory-dbcp.jar의 한개의 JAR에 포함되어 있다.
  • 이 하나의 라이브러리가 존재하는지 확인한다.

DB connection pool 누수 방지하기

  • DBCP Datasource 설정에 다음 Resource 속성을 설정한다.
  • 디폴트는 false이다.
removeAbandoned="true"
  • 취소된 Connection에 대한 timeout 시간을 설정한다.
  • 디폴트 timeout 시간읜 300초이다.
removeAbandonedTimeout="60"
  • Connection 리소스를 취소하는 코드의 Stack Trace를 로깅하도록 설정한다.
  • 디폴트는 false이다.
logAbandoned="true"

MySQL DBCP 예제

  • MySQL JDBC 드라이버 설치 
    • MySQL 3.23.47, MySQL 3.23.47 using InnoDB,, MySQL 3.23.58, MySQL 4.0.1alpha
    • Connector/J 3.0.11-stable (the official JDBC Driver)
    • mm.mysql 2.0.14 (an old 3rd party JDBC Driver)
    • 이 중에 하나의 드라이버를 결정하여 $CATALINA_HOME/common/lib에 복사한다.
  • Context 설정 (context.xml)
context.xml
<Context path="/DBTest" docBase="DBTest"
        debug="5" reloadable="true" crossContext="true">

    <!-- maxActive: Maximum number of dB connections in pool. Make sure you
         configure your mysqld max_connections large enough to handle
         all of your db connections. Set to -1 for no limit.
         -->

    <!-- maxIdle: Maximum number of idle dB connections to retain in pool.
         Set to -1 for no limit.  See also the DBCP documentation on this
         and the minEvictableIdleTimeMillis configuration parameter.
         -->

    <!-- maxWait: Maximum time to wait for a dB connection to become available
         in ms, in this example 10 seconds. An Exception is thrown if
         this timeout is exceeded.  Set to -1 to wait indefinitely.
         -->

    <!-- username and password: MySQL dB username and password for dB connections  -->

    <!-- driverClassName: Class name for the old mm.mysql JDBC driver is
         org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
         Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
         -->

    <!-- url: The JDBC connection url for connecting to your MySQL dB.
         The autoReconnect=true argument to the url makes sure that the
         mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
         connection.  mysqld by default closes idle connections after 8 hours.
         -->

  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/javatest?autoReconnect=true"/>

</Context>
  • web.xml 설정
    • WebRoot의 WEB-INF/web.xml 파일에 다음 <resource-ref> 부분을 추가한다.
web.xml
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">
  <description>MySQL Test App</description>
  <resource-ref>
      <description>DB Connection</description>
      <res-ref-name>jdbc/TestDB</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

Oracle 8i, 9i & 10g 예제

  •  Oracle의 경우에는 MySQL 예제에서 최소한의 수정을 통해 설정할 수 있다.
  • 오라클9i까지는 oracle.jdbc.driver.OracleDriver 드라이버를 지원하지만 이후에는 oracle.jdbc.OracleDriver 드라이버를 활용해야 한다.
  • 오라클 드라이버를 포함하는 JAR 파일을 $CATALINA_HOME/common/lib에 설치한다.
  • context.xml 설정
<Resource name="jdbc/myoracle" auth="Container"
              type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@127.0.0.1:1521:mysid"
              username="scott" password="tiger" maxActive="20" maxIdle="10"
              maxWait="-1"/>
  • web.xml 설정
<resource-ref>
 <description>Oracle Datasource example</description>
 <res-ref-name>jdbc/myoracle</res-ref-name>
 <res-type>javax.sql.DataSource</res-type>
 <res-auth>Container</res-auth>
</resource-ref>
  • 자바 활용 코드 예제
Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();
//etc.

Tomcat 6.0 JNDI Datasoruce 설정


Tomcat 5.5와 동일한 설정

  • 톰캣 5.5의 설정방법과 동일하게 6.0에서도 설정한다.

참고자료


 
반응형
< 출처 : http://www.idg.co.kr/newscenter/common/newCommonView.do?newsId=57714 >

 현재 미국에서 K 모사 일을 하고 있지만, 우리나라만의 새로운 운영체제를 발표한다는 소식을 듣고 관련 동영상과 문서를 보면서 필자도 모르게 아쉬운 마음을 감출 수 없었다. 특히, 많은이들이 공감하듯이 개발자의 이혼이야기며, 건강이야기를 자랑스럽게 이야기하는 부분에서 흥분하지 않을 수 없었다. 과연 이것은 회사의 경영진의 문제일까? 아니면, 개발자 자신의 문제일까? 필자는 무엇보다도 개발자의 자발적인 자기관리가 중요하다고 생각한다.

개발자가 반드시 관리를 해야 하는 부분을 안과 밖으로 나누어 설명할 수 있는데, 안이라고 하면 정신적인 것과 관련된 이야기이며 밖은 육체적인 것과 관련된 이야기다. 이 둘의 조화가 얼마나 중요한지 짚고 넘어가야 한다. 한번이라도 개발을 해보았던 사람들이라면 누구나 공감을 할 것이다. 아래와 같은 상황을 가정하고, 결과를 한번 상상해보자.

술김에 프로그램을 만들어 본 기억이 있는가?

어느 프로젝트에서 일이 너무도 힘들어서 홧김에 술을 마시고 코딩을 했다면, 그 당시에는 이것이 얼마나 잘못된 일인지 알지 못한다. 멀쩡한 정신에 프로그램을 만들어도 자신이 어디서 실수를 했는지 찾기는 그렇게 만만치 않은데, 하물며 술을 마시고 프로그램을 만들었다면 이건 진짜 대박이라고 하는 표현이 맞을 것이다. 술의 힘을 빌어 프로그램을 만들게 되면 당사자도 놀라울 정도로 척척 코딩이 이루어진다. 하지만 술이 깬 다음 날 자신이 만든 프로그램을 보게 되면 도무지 이해가 되지 않는 부분들을 발견하게 된다. 어디까지 만들고 어디까지 수정을 했는지 알 수가 없게 된다. 그러니 더더욱 혼자서 만드는 소스가 아닐 때에는 오히려 찾아서 원상복귀 시키는 것조차 어렵게 된다. 이런 얘기를 해서는 안 되겠지만 필자 역시도 경험이 있기에 그게 얼마나 위험한 상태인지 알기에 얘기를 하는 것이다.

아픈 상태에서 프로그램을 만들어본 기억이 있는가?

깊이 생각할 일도 아닌 것 같다. 가벼운 감기,몸살만 걸려도 정신이 몽롱하고 집중이 안 되어 도저히 프로그램 개발이 안되는 경우를 경력이 좀 되는 개발자라면 누구나 경험해 보았을 것이다. 일반적인 프로젝트에서는 그런 사람이 옆에 있으면 오히려 기존 프로그램마저 망칠까 봐 일찍 귀가를 시키는 경우를 종종 볼 수가 있다. 몽롱한 상태에서 아무리 개발을 해봐야 그건 그냥 시간 잡아먹기에 불과하며 상황을 오히려 악화시키는 불완전한 요소가 될 뿐이다.

그렇다면, 개발자 중에 개발 때문에 이혼까지 하고 자신이 아픈 줄도 모르고 개발을 한 사람이 있다는 사실은 결코 자랑해서는 안 되는 부분이지 않을까. 이혼까지 갔다면 도중에 맨정신으로 개발이 가능 했을까? 아픈 줄도 모르고 개발을 했다면 제대로 된 코딩이 가능 했을까? 잠도 못자고 개발을 했다면 새로운 영역의 개발인데 정말 제대로 된 프로그램이 만들어 졌을까? 하는 의문만 남게 만들었다. 어떤 의미로 얘기를 했는지는 이해는 되지만 결코 자랑할 부분이 아니라는 생각이 들며 진짜 너무 고생, 고생하며 개발한 개발자들을 한꺼번에 바보로 만들었다는 생각이 들었다.

개발자가 하나의 프로젝트를 끝까지 무사히 끝내고 싶다면 체력은 반드시 갖추고 있어야 한다. 보약을 먹든지 아니면 운동을 하든지 끝나는 그 순간까지 견딜 힘의 원천이 필요한 것이다. 정신적인 것도 역시 마찬가지라고 생각한다. 일주일 내내 오직 일에만 전념한다면 정말 중요한 시점에서 모든 것이 고갈되고 말 것이다. 주말에 휴식하는 것도 다음 일주일을 위한 배려이다. 하루 이틀 바짝 밤샘하며 일을 하는 것과는 다른 얘기이다. 장기 프로젝트 경우 개발자들 중에 보약을 먹으며 체력을 쌓거나, 운동을 하고 정신적인 스트레스를 운동으로 푸는 등, 자기만의 비법으로 장기전에 대비하는 경우를 쉽게 볼 수가 있다. 필자 역시도 체력적, 정신적인 면의 해결을 위해서 이젠 약보다는 운동에 힘쓰고 있다. 운동을 하면 살도 빠지고 맑은 정신을 오래 유지할 수 있도록 해주는 숙면도 제공하기에 적극 추천한다. ‘건강한 신체에 참신한 아이디어가 깃든다’는 상투적인 표현을 굳이 부연 설명할 필요는 없을 것이다. 육체적인 면만 강조하는 우를 범하지 말아야 한다. 모든 것은 조화에서 비롯된다.

그리고 이 말도 해주고 싶다. 하루 이틀 밤샘으로 끝날 일이 아니라면 무작정 자신을 혹사시키며 일한 것이 결코 자랑은 아니라는 것이다. 행복한 개발자가 되고 싶다면 자기관리는 스스로 해야만 한다. 제삼자가 해주는 것이 아니다. 개발자에게 균형있는 자기관리는 현재, 그리고 미래를 위한, 어쩌면 가장 중요한 투자이기 때문이다. cess98@paran.com


임철우님의 컬럼이 또 올라왔길래 읽다가 퍼오게 되었다.
국내 기업중 모기업에서 운영체제 개발 과정에 대한 에피소드 소개시에 나온 이야기를 나도 들었었다.
그 기업에서는 힘든 프로젝트이고 모든 팀원들이 모두 열심히 노력했다는 취지이겠지만
개발자들의 일은 단순히 작업시간에 비례하여 그 성과가 나오는 것은 아니라고 생각하기 때문이다.
위에서 언급한 것과 같이 아프거나 다른데 신경쓸일이 있거나 술에 취하거나 하는 경우는
일의 특성상 좋은 프로그램을 만들어 내는 것이 어려운 것이다.
기계적으로 처리할수 있는 단순공정이 아니기 때문이다.
개발은 근본적인 문제를 해결하는 활동이고 문제를 해결하려면 창의력이 필요하다고 한다.
소프트웨어 문제를 해결하는 활동은 어떤 활동보다도 아주 복잡한 과정임을 인정해야 한다.
관라자 측면에서는 이러한 특성에 대한 이해가 필요하리라 생각한다.
사람은 기계가 아니며 소프트웨어 개발은 기계가 할수 있는 단순 작업공정이 아님을 인지하고
소프트웨어 개발에 대한 특성을 고려하여 이에 대한 환경을 조성하고 관리해야 할것이다.
요즘 읽고 있는 "소프트웨어 크리에이티비티 2.0"  내용을 조금 인용하였다.
반응형
<출처: http://blog.sdnkorea.com/blog/811 >
 JavaOne에서 발표된 가장 중요한 내용 중 하나가 자바 스토어(Java Store)였습니다. 필자 역시 지난 몇 개월간 이 프로젝트에 비밀리에 참여했기 때문에 큰 자부심을 느낍니다. 이번 발표 후 저는 자바 스토어에 대해 그리고 나머지 자바 에코시스템과의 관계에 대해 많은 질문을 받았습니다. 유익한 FAQ의 내용을 보강하는 차원에서 몇 가지 질문에 답변해 드리고자 합니다.

발표 내용을 한 단락으로 요약한다면?

데스크탑 자바 애플리케이션을 검색하고 구입할 수 있는 데스크탑 클라이언트인 자바 스토어의 비공개 베타 버전 그리고 개발자가 배포 목적으로 애플리케이션을 제출할 수 있는 자바 웨어하우스의 공개 베타 버전을 발표했습니다. 여러분도 지금 등록 후 스토어웨어하우스를 테스트할 수 있습니다. 현재는 미국에서만 스토어와 웨어하우스를 이용할 수 있으며, 곧 다른 국가에서도 서비스할 예정입니다.

JavaFX가 아닌 언어로 자바 스토어용 애플리케이션을 개발할 수 있습니까?

예! 자바 및 JavaFX뿐 아니라 모든 JVM 기반 언어가 사용 가능합니다. 최종 사용자는 애플리케이션이 어떤 언어로 작성되었는가에 신경쓰지 않습니다. 멋진 외양과 성능을 갖춘, 유익한 애플리케이션이면 됩니다. 가장 생산적으로 사용하면서 최고의 애플리케이션을 개발할 수 있는 언어를 선택하십시오.

스토어의 애플리케이션에 어떤 제한이 적용됩니까?

자세한 내용은 FAQ를 참조하십시오. 간단하게 말씀드리자면, JVM 애플리케이션이며, 개인 사용자 지향적이어야 합니다. 50MB로제한됩니다(현재). 서명되지 않거나 유효한 인증서로 서명되어야 합니다. 스토어에서 정식 서비스를 시작할 때까지는 모든 애플리케이션이 무료이며, 서비스 개시 후에는 요금을 부과할 수 있습니다. 이 기본적인 내용 외에 추가 정보가 몇 가지 더 있습니다.

언제부터 애플리케이션을 판매할 수 있습니까?

가급적 일찍 시작할 것입니다. 이 스토어는 아직 개장하지 않았습니다. 진열대가 빈 상점은 없으니까요. 이런 이유로 개발자 여러분이 애플리케이션을 준비할 수 있는 시간을 드리고 있습니다. 스토어가 정식 개장하면 개발자는 가격을 정하고 애플리케이션을 판매할 수 있습니다.

고객이 어떻게 애플리케이션을 찾을 수 있습니까?

JavaOne에서 소개한 데스크탑 클라이언트는 1차 버전일 뿐입니다. 고객이 애플리케이션을 검색할 수 있도록 새로운 기능을 스토어에 추가하는 작업이 순조롭게 진행되고 있습니다. 검색, 필터링, 평가, 리뷰와 같은 기능이 제공될 것입니다. 그리고 자바 스토어가 자바 자체와 함께 배포되므로, 10억여 명의 사용자들에게 애플리케이션을 선보일 수 있습니다.

모바일 애플리케이션 및 TV는 어떻게 됩니까?

자바 스토어는 사실상 두 부분으로 구성됩니다. 쇼핑몰은 데스크탑 애플리케이션을 구입할 수 있는 데스크탑 클라이언트 프로그램입니다. 그리고 자바 웨어하우스가 있습니다. 여기서는 개발자들이 판매할 애플리케이션을 보관할 수 있습니다. 향후 TV 및 모바일용 쇼핑몰이 추가로 마련될 예정이며, 아마도 사업자 브랜드로 제공될 것입니다. 개발자가 애플리케이션을 보관하는 자바 웨어하우스가 모든 쇼핑몰을 서비스합니다. 데스크탑은 멋진 첫 단추일 뿐입니다.

현재 자바 스토어에는 어떤 애플리케이션이 있습니까? 어디서 제공한 것입니까?

파트너사들과 함께 새로운 애플리케이션을 개발하고 기존 애플리케이션을 이 스토어에 맞게 수정했습니다. 저는 개인적으로 Astronomy Picture of the Day라는 애플리케이션이 마음에 듭니다. 여기 오리건 주, 유진에 위치한 Concentric Sky라는 멋진 회사에서 개발한 것입니다. NASA의 천체 사진 아카이브로 연결하여 과거의 사진을 살펴보면서 설명을 읽고 Google Translate를 통해 다른 언어로 번역해 볼 수도 있습니다. Concentric Sky의 CEO가 이 회사의 블로그에서 자바 스토어 및 JavaFX에 대해 어떤 얘기를 했는지 읽어보십시오.

다른 국가의 개발자는 왜 등록할 수 없습니까? 언제쯤 다른 국가에서도 애플리케이션을 판매할 수 있습니까?

조만간 다른 국가에서도 자바 스토어를 열 계획입니다. 국제 상거래는 생각보다 훨씬 복잡합니다(엔지니어인 저로서는 놀라울 따름입니다). 나라마다 세금, 개인정보 보호 및 상거래 규정이 다릅니다. 산더미 같은 서류 작업을 거쳐야 합니다. 현재 법률 및 비즈니스 전문가들이 이 일을 담당하고 있습니다. 현재로서는 2010년 초부터 서비스할 계획이지만, 그 시기가 앞당겨진다면 신속하게 알려드리겠습니다.

Java 담당자 중 한명인 Jeet Kaul에게 자세한 설명을 부탁했습니다. (클릭하여 들어보십시오.)

SafariScreenSnapz024.png

자바 스토어에 관하여 다른 궁금한 사항이 있으시면 제게 이메일로 보내주시거나 피드백 페이지로 의견을 보내주십시오.

이 글의 영문 원본은 The Java Store, a Q&A 에서 보실 수 있습니다.


자바 앱스토어가 열리는 군요. 여러 밴더들이 앞다투어 앱스토어에 발을 내딪어서 향후 흐름이
앱스토어로 가는구나 하는 생각을 하였는데 자바 진영도 그 서막을 열었습니다. 내심 기대가 되는..
뭐 이래저래 해도 애플의 앱스토어가 새로운 사업 시장을 개척했다는 생각은 지울수가 없네요.
개인 개발자들에게 새로운 수익을 창출할수 있는 폭이 점점 넓어지는 것 같습니다.
개인적으로 애플의 앱스를 통한 수익 창출에 도전하고 싶어서 여건이 된다면 참여하고자 했는데
자바 앱스가 열린다고 하니 자바로 한번 도전해 봐야겠습니다. 마음은 먼저 굴뚝같습니다. ㅎㅎ;;
반응형
책 소개
순도 100% ‘착한 청년’ 호랭총각이 이번 2권에서는 대한민국 교육계의 현실을 신랄하게 비판한다. 한층 업그레이드 된 개그, 탄탄해진 스토리 라인, 유재석도 울고 갈 능수능란한 언어구사, 좀 더 섬세해진 캐릭터 묘사 등 무엇하나 빠지는 요소가 없다.

남부럽지 않은 명문가에서 태어나 어릴 때부터 신동소리를 들으며 자랐지만 부패한 세상이 싫어 은둔하는 ‘의외로’ 강직한 선비 이상균, 이름 없는 양반집에서 태어나 비굴한 삶을 살아온 선비 최미영, 미영과 손을 잡고 불법 강좌와 청탁으로 한 몫 잡으려는 남부학당의 인기강사 왕선생, 또 다른 남부학당의 강사이지만 양심껏, 성의껏 학생들을 가르치는 ‘cutie Kong' 공선생. 그리고 순수하게 학업에 대한 열정으로 공부를 시작한 호랭총각까지. 조선시대에 살고 있는 이들은 2009년 현재 대한민국의 교육정책을 진지하게 생각해볼 수 있는 계기를 마련해 줄 것이다. 2권부터 봐도 재미 10,000% 보장!!

2009년 교육계의 현실을 제대로 꼬집다.

국제중학교, 자립형 사립 고등학교, 일제고사 재실시……. 지난해부터 끊임없이 사람들 입에 오르내리는 교육 정책들이다. 하루가 멀다 하고 바뀌는 교육정책으로 인해 수많은 학생들과 학부모들이 정신적, 경제적인 고통을 받고 있지만 개선의 여지는 보이지 않는다. 입시학원가는 또 어떤가? 실력을 쌓기보다는 진학을 위해 공부하는 학생들, 유명강사에게 수업을 받기위해서는 고액의 학원비도 아깝게 여기지 않는 학부모들, 기초보다는 요령을 가르칠수록 대접받는 강사들. <호랭총각전 2권>은 이런 일들이 당연하게 여겨지는 대한민국 교육계의 현실을 신랄하게 비판하고 있다.
남부럽지 않은 명문가에서 태어나 어릴 때부터 신동소리를 들으며 자랐지만 부패한 세상이 싫어 은둔하는 ‘의외로’ 강직한 선비 이상균, 이름 없는 양반집에서 태어나 비굴한 삶을 살아온 선비 최미영, 미영과 손을 잡고 불법 강좌와 청탁으로 한 몫 잡으려는 남부학당의 인기강사 왕선생, 또 다른 남부학당의 강사이지만 양심껏, 성의껏 학생들을 가르치는 ‘cutie Kong' 공선생. 그리고 순수하게 학업에 대한 열정으로 공부를 시작한 호랭총각까지. 조선시대에 살고 있는 이들은 2009년 현재 대한민국의 교육정책을 진지하게 생각해볼 수 있는 계기를 마련해 준다.  [예스24 제공]

//2009.07.15
오랫만에 블로그에 글을 남기기 위해 들어왔습니다.
한동안 정신적으로든 육체적으로든 여유가 없었네요. 무엇보다 심적인 여유가 없다고 하는게 맞을듯
급속도로 피폐해지는 정신과 그를 담는 육체조차 서서히 붕괴를 시작하고 있습니다.
어깨위에 앉은 우루사는 떠날지 모르고 쓰러져가는 나의 가치관은 애써 손을 뻗어 보지만 쉽지 않네요.
지금은 정신적으로 무척 혼란스러운 시기인거 같습니다. 그저 답답하고 힘들고 좌절하는 중입니다.
문득 옛날을 떠올려보며 이제 잠시 쓰러져 멈추고 싶기도 하고 쉬고 싶다는 충동이 억제하지 못할정도로..
언제나 고난은 이겨낼수 있는 자에게 찾아온다고 믿고 행동하려고 했습니다.
"피할수 없다면 즐겨라~! 그럼 이제는 피할수 있다면 피하란 말인가? 그냥 피해버릴까?"
새로운 도전은 언제나 나를 두렵게 하지만 그 뒤에 따라오는 것은 새로운 것에 대한 설레임이리라..
내게 다가온 시련은 피하고 싶기도 하고 새로운 변화를 추구 하고 싶기도 합니다.
이렇게 머리는 복잡하고 맘은 심난하고 단지 책이나 읽으면서 좀 휴식을 취하고 싶은 맘만...^^;;
아직 집에 새로 들어와서 그 첫장조차 넘기지 못한 책이 쌓여가지만 또 한권 득했습니다.
요즘은 책 욕심만 늘어가는 것 같습니다. 맘의 여유를 가지고 책을 읽고 싶기도 하구요..
솔직히 책 읽을 시간이야 넘쳐나지만 맘의 여유를 갖지 못한 제 핑계일 뿐이지만 ㅠㅠ


//2009.07.20
마침 읽고 있던 "사용자 스토리"를 다 읽고 이번에 받은 "호랭총각 2"를 펼쳐보았습니다.
표지는 아이들이 좋아할만한 그림체로 언뜻 곰돌이 푸우 얼굴에 티거의 눈을 달아놓은것 같네요.
책을 따악 펼쳐들어보니 컬러풀한 카툰이 가득하네요.  교육현실을 비판하는...
일단 아이 어른 상관없이 모두다 좋아하는 만화이니 지루하지 않게 쭉 볼수 있었습니다.
호랭총각 너무 귀엽게 그려졌네요. 내용도 재미있고 유머러스한 멘트까지.. 재밌었습니다.
만화책이고 책도 두껍지 않고 재미있으니 단번에 쑤욱 보았습니다.
지하철 안에서 펼쳐보니 옆사람이 힐끔힐끔 쳐다보네요. 다큰 어른이 애들 보는 만화라니..
근데 이거 재밌어 보이는데 하는 눈빛이 느껴지더군요. 우리나라 교육현실을 풍자한 만화라
16년동안 우리나라 교육정책을 몸소 느낀 저로서는 은연중 고개가 끄덕여지더군요.
참 안타까운 현실이고 그 외에도 더 많은 문제점이 있는 것이 사실이구요.
여기서 한가지 덧붙여서 약간 모순을 짚어보는 것도 좋지 않을까 하는 생각이 들더군요.
풍자한 것이 우리나라 교육정책인 것인데... 만화의 특성상.. 재미상.. 표현방식은 불가피 하겠지만..
교육이라는 것에는 우리말 즉 언어 자체도 포함이 될것인즉 너무 많은 은어나 인터넷 용어의 남발
저도 가장 재미있게 보았던 것이 유머러스한 조선시대의 현대적 은어 사용이었지만
다루고자 하는 그 본질을 약간은 흐리는 것이 아닌가 하는 생각이 들었습니다.
하지만 바른말 고운말 표준어를 사용하였다면 재미가 반감되기 때문이겠지요.
작가님의 의도를 분명히 파악하지 못한 저의 짧은 소견일수도 있겠습니다. ㅎㅎ
하지만 재미있게 읽었습니다. 청소년 학생들이 가장 좋아하고 재미있어 하지 않을까 싶습니다.
반응형
책 소개
사용자가 필요로 하는 소프트웨어를 개발하기 위해 '사용자의 이야기'를 듣는 것부터 시작하는 것은 당연하다. 사용자 스토리는 실제 사용자들에게 정말 가치 있는 기능을 간단명료하게 기술한 것이다. 이 책의 저자 사용자 스토리를 작성하는 것은 물론이고, 사용자 스토리를 여러분의 개발 프로세스에 접목시킬 수 있도록 하나에서 열까지 충실히 설명한다.

스토리를 잘 작성하기 위한 포인트뿐만 아니라 조심해야 할 사항들까지 배우게 될 것이다. 사용자 스토리를 수집하는 현실적 방법들도 배우게 된다. 실제 사용자를 만나볼 수 없는 상황에 대한 대처 방법도 배울 것이다. 사용자 스토리를 수집한 다음 조직화하고 우선순위를 부여하여 계획, 관리, 테스트 단계에 활용하는 방법을 설명한다.

사용자 역할 모델링 - 사용자들의 공통점과 차이점을 이해
스토리 수집 - 사용자 인터뷰, 설문, 관찰, 워크숍
대리 사용자(proxy)와 작업 - 관리자, 교육담당, 영업 등
인수 테스트 작성
스토리를 이용한 우선순위, 일정계획, 비용추정
각 장 끝에 연습 문제 포함   <출처 : 네이버 책 >


웹서핑중 눈에 들어온 책이 있어서 구입예정도서 목록으로 올려놓게 되었다.

사용자스토리 라는 책 이름을 보고 별 관심이 없었지만 책소개를 읽다가

멀리서 지켜보던 지름신이 강림 한것이다. 하지만 아직 집에 읽지 않은 책이 있기에

지름신의 신탁을 거절하고 훗날을 기약하기로 마음을 먹을수 밖에...

현재 SI업체에서 일을 하고 있기에 현업들 즉 사용자와 접할 기회가 많이있는 편이지만

커뮤니케이션 부분에서 많은 부족함을 느끼고 있기 때문에 구입예정도서로 찜! 만 했다.

책 이름을 보니 얼마전에 읽었던 "아키텍트 이야기"란 책에 나온 문구가 생각난다.

그리고 "아키텍트 이야기" 中
"기술자라면 자신의 기술을 충분히 활용하고 또한 넓히고 싶은 게 당연하다.
사용자의 웃는 얼굴을 보고 싶고 거기에서 보람을 느낄 것이다."

위 문구가 번뜩 떠오르게 되서 이렇게 포스팅을 하고 잊지 않고 나중에 구입하려고 한다.

처음 프로그래밍에 입문때 상상하던 것이 내가 만든 프로그램을 사용하는 사용자의 모습이다.

물론 감탄하고 편하다 이거 잘만들었네! 하는 모습을 상상하면서..

정작 개발자로 일하면서 무엇이 중요한지 자꾸 잊어먹고 일을 하게 되는거 같다.

일정에 치여 정작 사용자의 편의성은 뒤로한채 개발 편의만을 생각하게 되는건 아닌지 하는 생각이...

빠른시일내에 구매하여 읽고 서평을 올리도록 해야겠다.^^

---- 문득 포스트를 올리고 다시 수정하면서 생각이 든것이 있다.
이번 포스트를 올리면서 아니 최근 들어 포스트를 올리면서 내가 쓴 글에 많은 어색함이 느껴진다.
그것은 말투의 어색함이 감돌기 시작한것이다. 이전부터 내 블로그는 나만의 작은 공간이라고 생각했지만
어느 순간부터 인지 내 블로그를 자주 방문해 주시는 분들이 계시기 때문이다.
그래서 인지 아직도 많이 부족하지만 글 하나에도 조금 더 신경이 쓰이게 되어가는 것이다.
그러한 상황에서 오는 포스트의 어색함은 아직 부족한 블로거가 더 발전하는 과도기라 생각한다.
어느샌가 내 블로그에 글들은 다른 사람을 향한 이야기와 같이 변화해 가는거 같다.
블로그를 통해 다른 사람들과 커뮤니케이션을 하고 있는것이다.
이것이 블로그를 하는 이유가 아닐까 생각한다. ^^ 내가 찾은 블로그의 매력!!

//2009.06.23
10년지기 친구인 찐이에게 필살 조르기 어택!! ㅎㅎ 득했습니다. 갑자기 책이 너무 많아졌네요.
참고로 형석 ♡ 진이 커플에게 각각 책 선물 받았습니다. 둘의 첫 만남에 아주 조그만 기여를 했기에..
고맙다.. 친구들아~!! 내가 조르기는 했지만 잘 읽을께..ㅋㅋ 둘이 행복해라..^^

//2009.07.18
책을 선물받고 한번 훑어 보는데 3주 가량의 시간이 걸린거 같다. 흠.. 꽤 걸렸군..
책을 읽는데 얼마간의 시간이 걸렸는지는 중요하지 않을 것이다. 하지만 틈틈히 짬을 내어 읽다보니
머리속에서 그 내용이 쭈욱 연결되지 않는 것 같다.  조금 읽다 몇일 뒤에 이어서 읽고 하다보니.
책의 내용은 내가 생각했던 것과 다른 내용이여서 조금 난감하기도 하였다.
사전지식 없이 그저 책 이름과 대충 추정했으니.. 이책은 개발방법론에 관한 책이다.
애자일 방법론과 부합하는 내용의 방법론의 일종이고 읽으면서도 흠 이렇게 하면 괜찮겠군..하고
생각도 하면서 읽었지만 아직 초급 개발자인 나에게는 조금 맞지 않는 책인듯 하다.
책의 내용을 내가 적용해 볼수도 없는 입장이니 말이다. 그리고 내가 겪은 프로젝트에 대해 적용한다고
생각했을때 한국에서 하는 프로젝트에 적용하기엔 문제가 있을꺼 같다는 생각이 들었다.
작은 소규모의 프로젝트에는 적용해 볼수 있지만 대규모 프로젝트나 거의 대부분의 SI 프로젝트에서는
한국의 특성상 수시로 바뀌는 요구사항의 변경/추가를 커버하기에는 무리 일듯하다.
책의 내용이 잘못됫다거나 부족한것은 절대 아니다. 한국과 서양의 특성이나 관점의 차이일듯 하다.
개발방법론에 관한 책인지 모르고 읽었지만 이슈가 되었던 애자일 이라던가 익스트리밍 이라던가 에 대한
약간의 맛을 보았다는 데에 나름대로 만족하고 있다. 여유가 된다면 소규모 프로젝트에 적용하고픈..
개인적으로 아는 지인들과 함깨 작은 프로젝트를 같이 해보고 싶다. 거기에 여러가지 배운 것들을 적용해서
개발 방법론이라던가  디자인 패턴, 지속적인 통합(Continuous Integration), 등등...

+ Recent posts