2009년 5월 31일 일요일

Java JDBC Performance Tip(2)-Insert, Delete Speed up!

from : http://www.javapattern.info/viewArticle.do?articleId=1050369182597

이전 아티클에서는 database select speedup에 대하여 알아보았다. 이번 편에서는 update를 제외한
insert, delete tranaction의 속도를 최대로 끌어올릴 수 있는 방안을 살펴보자.

▶ Insert, Delete Query speed up!

JDBC 2.0에서는 기본적으로 scrollable한 메소드등의 유연성있는 메소드들과  batch processing에 관련된 
메소드가 추가되었다. 

그게 바로 어떤 것이냐하면 Statement, PreparedStatement 인터페이스의 addBatch(String sql),
addBatch()메소드이다. Pro*C같은 경우 기본적으로 array processing을 이용하여 데이터베이스에
작업을 하므로 상당한 퍼포먼스를 낼 수 있는데 이를 자바측으로 변환한것이 바로 addBatch메소드인
것이다.

첨보았는가? 아니면 아래의 BMT아티클에서도 보았는가? 
Other--> Development를 보게 되면 Java vs Pro*C의 비교자료가 있다. 한번읽어보기 바라며 그 내용의
상세부분을 간략한 코딩으로서 당신에게 보여주고자 한다.

기본적으로 java에서도 그러한 배치기능을 사용하고자 한다고 하고, 당신이 만약 드라이버 개발자라고 하면
어떻게 데이터베이스에 작업을 할것인가? 

그나마 setAutoCommit(false)를 connection에 때려넣어놓으면 commit에 대한 그만큼의 비용이 떨어질것이라는
걸 알고 있다면 다행이겠다. 자. 그러면 데이터를 소위 "밀어넣는다"라고 이야기했을 때 가장 최선책은?
건당 하는 건 무리일테고, 음~ 자바니까 Collection을 이용해보면 딱이겠다. 

그리고 Collection을 이용한다면 들어오는 데이터는 중복을 허용하고 순서도 있어야 할테니까
List 계열을 사용하는 것을 좋겠고.. 놀새의 결론은 List중에서도 제일 퍼포먼스가 좋은 ArrayList를
사용하는게 딱일것이라고 생각했다. 하지만 실제 Driver는 어떠한 자바버젼에서도 맞아야 하기 때문에
1.2부터 사용되는 ArrayList는 좀 고려해볼만도 하다. 

그러면 뭐가 들어오는 sql문장에 대한 저장소로 적당할 것인가? 답은 Vector!! 왜 Vector인지는 설명하지
않겠다. 이정도 글읽는 당신정도라면 API는 어느정도 숙지하고 있을 거라는 놀새의 생각때문이다.

우선 그러면 실제 Oracle을 예로 driver내부나 한번 보도록 할까?

JDBC API Statement 인터페이스의 구현체인 OracleStatement코드의 addBatch메소드를 잠깐보자

    public synchronized void addBatch(String s)
        throws SQLException
    {
        addBatchItem(s);
    }

    private void addBatchItem(String s)
    {
        m_batchItems.addElement(s);
    }
어라? addElement를 사용하는 걸 보니 놀새가 생각했던 것처럼 Vector를 사용하고 있다. 즉 batch를 위한 저장소로서 Vector class를 사용중인 것이다. 그러면 Statement클래스의 실제 batch execute 명령어인 executeBatch()메소드를 보도록 하자.
    public int[] executeBatch()
        throws SQLException
    {
        synchronized(connection)
        {
            synchronized(this)
            {
                int i = 0;
                int j = getBatchSize();
                if(j <= 0)
                {
                    int ai[] = new int[0];
                    return ai;
                }
                int ai2[] = new int[j];
                Object obj = null;
                Object obj1 = null;
                Object obj2 = null;
                boolean flag = false;
                ensureOpen();
                prepare_for_new_result(true);
                try
                {
                    connection.needLine();
                    for(i = 0; i < j; i++)
                    {
                        String s = getBatchItem(i);
                        String s1 = expandSqlEscapes(s);
                        byte abyte0[] = strToDbaccessBytes(s1);
                        byte byte0 = getSqlKind(s1);
                        if(byte0 == 0)
                            DBError.throwBatchUpdateException(80, "invalid SELECT batch command " + i, i, ai2);
                        ai2[i] = parseExecuteFetchWithTimeout(dbstmt, byte0, abyte0, null, 1, null, 1);
                        if(ai2[i] < 0)
                            DBError.throwBatchUpdateException(81, "command return value " + ai2[i], i, ai2);
                    }

                }
                catch(IOException ioexception)
                {
                    DBError.throwBatchUpdateException(81, ioexception.getMessage(), i, ai2);
                }
                catch(SQLException sqlexception)
                {
                    if(sqlexception instanceof BatchUpdateException)
                        throw sqlexception;
                    DBError.throwBatchUpdateException(81, sqlexception.getMessage(), i, ai2);
                }
                finally
                {
                    clearBatchItems();
                }
                int ai1[] = ai2;
                return ai1;
            }
        }
    }

위에서 보면 당연히 connection은 동기화되어져야 하므로 synch걸어놓고 작업할게 뻔하며, parseExecuteFetchWithTimeout메소드가 실제 update작업을 이루게끔 하는데 저놈은 timeout이 걸려있으면 타이머 작동시키고 statement에 update때리는 작업을 하며, timeout이 0이면 바로 update이다. 복잡한가? PreparedStatement(이하 PS)의 addBatch()메소드는 조금 더 복잡하므로 간략하게 어떻게 작동되는지만 설명하겠다. PS의 경우는 쿼리가 이미 database의 내부 procedure로 변환되어져 있기 때문에 Stream을 이용하여 데이터를 세팅시키는 일을 한다는 것이 Statement Batch와 틀린 점이다. 그렇다면 Statement와 PreparedStatement의 속도차이는 얼마나 될까? 놀새는 이미 전부 다 해봤기 때문에 이건 당신의 숙제로 남겨두겠다. 위의 내용복잡하면 몰라도 됨을 강력히 주장한다. 당신이 JDBC Driver개발자가 아니지 않은가~!! ^^ 자 그럼 이제 코더의 신분으로 돌아왔다고 가정을 하고, API를 이용하여 코딩이나 한번 해보자. 단순히 API를 사용하는 것이므로 거창하게 설명하고 자시고 할 필요도 없이 바로 들어간다. 알아서 보라~
public class BatchTest {
    private Connection getConnection(){
        // 알아서 연결들 하라~! ^^
    }
    
    private void close() {
        // 알아서 연결을 닫아라
    }

    public void insertABT231Batch(){
        System.out.println(Utility.getTime() 
        + " Insert ABT231 Batch Start .. Transaction size is " + m_abt231InsertList.size());
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            StringBuffer query = new StringBuffer();
            query.append("INSERT INTO ABT231 ");
            query.append("(customer_no, item_cd, occur_amt, reason_cd, register_ymd, register_no) ");
            query.append(" VALUES (?, ?, ?, '9', ?, ?) ");

            conn = getConnection();
            conn.setAutoCommit(false);

            pstmt = conn.prepareStatement(query.toString());
            Iterator iter = m_abt231InsertList.iterator();
            int count = 0;

            while( iter.hasNext() ) {
                m_abt231 = (Abt231) iter.next();
                pstmt.setInt(1, m_abt231.getCustomerNo());
                pstmt.setString(2, m_abt231.getItemCd());
                pstmt.setLong(3, m_abt231.getOccurAmt());
                pstmt.setString(4, s_magamCurrentTime);
                pstmt.setInt(5, Integer.parseInt(s_workCd));
                pstmt.addBatch();
                count++;
                if( (count % 10000) == 0){
                    System.out.println(count + "건 처리중");
                    pstmt.executeBatch();
                }
            }

            pstmt.executeBatch();
            conn.commit();
            System.out.println(Utility.getTime() + "] " + count + "건 입력완료");
        } catch ( Exception e) {
            e.printStackTrace();
            try{
                conn.rollback();
            }catch(Exception e2) {e2.printStackTrace();}
        } finally {
            close(pstmt);
            close(conn);
        }
    }
}

2009년 5월 29일 금요일

MS SQL Server Express(2005)에서 사용자 추가 & 데이터베이스 생성

 

출처 :  http://blog.naver.com/withj12/150011203133

SQL Server Management Studio를 실행하자.


그러면 서버에 연결 대화상자가 나타난다. 일단 인증 항목에서 Windows 인증과 SQL Server 인증이 있는데 SQL Server 인증을 사용하기위해 (만약 SQL Server 인증 사용이 설정되어 있지 않다면...) 설정하는 것 부터 시작하자. Windows 인증에 연결 버튼을 클릭하자.


서버 항목에 (1번 항목) 마우스 오른쪽 버튼을 누르고 메뉴 항목에서 2번 항목에서 속성을 클릭한다. 그러면 서버 속성 대화상자가 나타난다.


여기서 서버 인증 항목에서 SQL Server 및 Windows 인증 모드를 선택하고 확인을 누르자. 그러면 다음과 같이 대화상자가 나타난다.


확인을 클릭하자. 일단 서버를 다시 시작하기전에 SQL Server 인증으로 로그인 할 수 있도록 sa 로그인을 가능하도록 하자.


게체 탐색기에서 보안->로그인->sa 항목을 마우스 오른쪽 클릭하여 메뉴에서 속성을 클릭하자. 그러면 로그인 속성 - sa 대화상자가 나타난다.


만약 암호를 다시 설정하고 싶으면 1번 항목을 선택하고 2번 항목에서 암호를 다시 입력하자. 다음에 SQL Server 인증으로 로그인이 되도록 설정하자.


항목에서 1번 상태 항목을 선택하고 2번, 3번을 선택한다. 그리고 확인을 누르자.


1번 데이터베이스 항목을 마우스 오른쪽 버튼 클릭하여 메뉴에서 2번 항목 다시 시작을 선택하자.


그리고 나타난 대화상자에서 예를 선택하자. 그렇면 데이터메이스가 다시 시작된다. 자 그렇면 새로운 데이터베이스 QuadraThreeDMap을 생성해보자.


개체 탐색기에서 데이터베이스를 마우스 오른쪽 버튼을 눌러 메뉴에서 항목에서 새 데이터베이스를 선택하자. 그렇면 새 데이터베이스 대화상자가 나타난다.


일단 1번 일반 항목에서 2번 데이터베이스 이름에 QuadraThreeDMap을 입력하여 확인 버튼을 누르자. 그러면 다음과 같이 데이터베이스가 추가된다.


자 인제 Quadra 사용자를 추가하자.


보안 항목에서 로그인 항목에 마우스 오른쪽 클릭해서 메뉴에서 새 로그인 항목을 선택한다. 그러면 로그인 - 신규 대화상자가 나타난다.


대 화상자에서 일반 항목을 선택한후, 로그인 이름을 Quadra라고 입력하고, 3번 처럼 SQL Server 인증을 선택한 후 암호을 입력하고 편의를 위해 암호 만료 강제 적용 체크를 없애자. 또, 4번 항목에서 기본 데이터베이스와 기본 언어를 각각 QuadraThreeDMap과 Korean으로 하자.



다음에 사용자 매핑 항목을 선택하고, 2번 항목처럼 db_owner를 선택하고 3번 처럼 체크를 하고 확인을 누른다. 자 사용자 추가와 데이터베이스 추가를 마쳤다. 마지막으로 사용자에게 권한을 주어야 한다.




데이터베이스 속성에서 사용 권한을 위와 같이 주면 된다. 인제 모두 마쳤으므로, 확인을 위해 다시 데이터베이스 연결을 해보자.


파일 메뉴에서 개체 탐색기 연결...을 선택하자.


서버에 연결 대화상자에서 인증, 로그인, 암호를 입력하고 연결 버튼을 누르자.

msu 파일 설치 에러 해결하기

  제노트북에 비스타 영문을 새로 설치하면서 RSAT(원격서버관리도구)를 설치하면서 잘되지않아서 고생했더랬습니다.    바로 전 포스팅에 올렸듯이 비스타 SP1에서 RSAT를 사용하려면   윈도우 비스타 업데이트 독립실행형파일인 Windows6.0-KB941314-x86.msu를 먼저  설치해야 합니다. 근데 이 msu파일이 설치가 잘 되지않고 에러를 자꾸 내는 바람에 애를 먹게 되었습니다.  어쨋든 몇시간을 헤매던 끝에 겨우 방법을 찾았답니다.

  먼저 발생한 에러창은 아래와 같습니다. "Installer encountered an error: 0x800401f0  CoInitialize has not been called"라는 에러가 나더군여..  

사용자 삽입 이미지

▶ 해결방법은 다음과 같습니다.
   1) 지역및 언어옵션에서 Keyboards and Languages탭으로 이동합니다.
   2) Change Keyboards 버튼을 클릭하면 Text Services and Input Languages창이 뜹니다.
사용자 삽입 이미지
   3) 하단의 Add버튼을 눌러서 Microsoft IME (Microsoft 한글입력기)를  추가해줍니다.
사용자 삽입 이미지
   4) 중단의 Default input language를 새로 추가한 Korean -Microsoft IME로 지정해줍니다.
사용자 삽입 이미지
이젠 설치가 잘 될 것입니다.
msu파일이 설치가 다 되었으면  IME default 설정을 원래대로 돌려놓으셔도 됩니다.  ^^

2009년 5월 27일 수요일

청소년 톨스토이의 6가지 자기경영 원칙

(1) 부여받은 일은 무슨 일이 있어도 반드시 해낼 것.
(2) 할 때는 아주 잘할 것.
(3) 무엇을 잊었다 하더라도 결코 책을 뒤적이지 말고 스스로 생각해내도록 노력할 것.
(4) 가능한 전력을 기울여 너의 정신이 살아있도록 노력할 것.
(5) 항상 소리 내어 읽고 생각할 것.
(6) 너를 방해하는 사람들에게 방해가 된다고 말하기를 주저하지 말 것. 처음에는 스스로 깨닫게 하고 만일 알아듣지 못한다면 용서를 구하고 분명히 말해 줄 것. (123p)
 
빅토르 쉬클롭스키 지음, 이강은 옮김 '레프 톨스토이 1 - 한국학술진흥재단 학술명저번역총서 서양편 258' 중에서 (나남출판)
'원칙'을 세우는 것이 중요합니다. 원칙이 있어야 흔들리지 않고 자기가 세운 목표를 향해 갈 수 있으니까요.
 
10대 후반의 카잔대학 시절, 레프 톨스토이가 세우고 실천했던 여섯가지 규칙. 세계적인 문호이자 사상가가 청소년시절 스스로 정했던 자기경영 원칙들인 셈입니다.
이 중 네번째인 '가능한 전력을 기울여 너의 정신이 살아있도록 노력할 것'이 인상적입니다.
 
당시 톨스토이는 마치 선생이 학생을 대하듯이 스스로에게 과제를 부여하고 항상 그것을 검사하면서 점수를 매겼다고 합니다. 그는 책은 어떻게 읽을 것인가 등 진지한 주제들은 물론이고, 사교계 응접실에 들어설 때는 어떻게 하고, 카드는 어떻게 치며, 여성들에게는 어떻게 대할 것인가에 대해서도 자신의 규칙을 세웠습니다. 심지어 잘못된 일들에서조차 잘못을 하는 규칙을 세우려 시도했습니다.
 
안온한 귀족자제의 생활에서 탈피해 스스로를 가혹하게 몰아붙였던 톨스토이. 그는 이런 매일 매일의 믿기 어려울 정도의 노력에 의해서 세계적인 문호이자 사상가로 성장했던 겁니다.
 
10대 후반의 대학생 톨스토이처럼, 오늘 나 자신을 제대로 빚어내줄 자기경영의 원칙을 5개 정도 세워보는 것은 어떨까요.

2009년 5월 22일 금요일

Spring 프레임워크를 설치

우선 Spring 프레임워크를 설치해서 구동하는것부터 해보자. 그 유명한 Hello World 찍는것부터~~^^

우선 내 스타일대로 개발환경 세팅

1. 이클립스는 3.3 버젼 J2EE용으로 받고(eclipse-jee-europa)

2. 필요한 이클립스 플러그인 설치

  • SpringIDE 플러그인 - http://springide.org/updatesite

    설치시 주의할점은 이클립스 업데이트를 통해 플러그인 설치시 feature선택할때 springide내 Dependancies항목은

    제외한다. Mylyn이나 AJDT등은 당장 사용하진 않더라도 나중을 위해 함께 선택해 설치한다.

  • Tomcat 플러그인  - http://www.eclipsetotale.com/tomcatPlugin.html

    톰캣플러그인은 이클립스를 통한 업데이트가 되지 않는다.

    다운받아서 plugin디렉토리에 그냥 풀어놓으면 된다.

    이클립스3.3버젼에 호환되는 버전 그리고 최신인 tomcatPuginV321.zip 다운로드

  • Colorer 플러그인 -  http://colorer.sf.net/eclipsecolorer

    이클립스 초기부터 사용해오던 플러그인.. 이제 이거 없으면 제대로 소스 못본다.  중독...-.-

    이클립스 속성에서 File Association 프로퍼티에서 xml, jsp, html등의 파일들을 모두 이걸 통해 보는걸로 수정해둔다.

3. 실행환경으로 사용할 Tomcat을 하나 설치해둔다. Tomcat5.5.9 설치했음

4. Dynamic Web Project를 하나 생성해서 HelloWorld라는 프로젝트를 만든다

    TargetRuntime 부분은 설치해둔 Tomcat 으로 지정한다.

5. Spring 프레임워크(최신인 2.5.2)를 다운받아 우선 몽땅 다 들어있는 spring.jar를 lib폴더에 넣는다.

=> 중요한 부분 하나. Spring 2.5 버젼의 spring.jar에는 SpringMVC에 필요한

org.springframework.web.servlet.mvc.Controller, org.springframework.web.servlet.ModelAndView등이 포함되어 있지 않다.

대부분의 매뉴얼들이 2.0정도의 버젼으로 작성되어있어서 spring.jar만 클래스패스에 잡으라고 되있기때문에 이것땜에 한참 헤멨다.

암튼 제대로 돌리려면 spring-framework-2.5.2-with-dependencies.zip파일을 다운로드받아서 dist안에 있는 spring.jar뿐만 아니라

modules안에 있는 spring-webmvc.jar도 함께 가져온다.

또 /lib/jakarta-commons/commons-logging.jar 도 가져온다

마지막으로 태그라이브러리 사용을 위한 jstl 라이브러리. 기존에 JSTL을 사용안하고 있기 때문에 이 부분없이 해보고 싶었으나 대부분의 예제들이

그냥 이렇게 진행되있는 이유로 우선은 그대로 진행.

다운받은 스프링프레임워크 내부의 lib에도 있으나 http://jakarta.apache.org/site/downloads/downloads_taglibs-standard.cgi 에서

최신 라이브러리로 다운받는다. JSTL이 1.0과 1.1 버젼이 사용법이 다르므로 최신으로 받는다.

jstl.jar, standard.jar 를 /WEB-INF/lib폴더에 포함시킨다

      이제 개발 환경은 설정완료


HelloWorld 애플리케이션을 Spring기반에 만들어보기

간단히 Sping프레임워크 동작 구조 공부 more..

펼쳐두기..

1.web.xml 파일 수정

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="HelloWorld" version="2.4" 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">
 <display-name>HelloWorld</display-name>
 
 <servlet>
  <servlet-name>helloworld</servlet-name>
  <servlet-class>
  org.springframework.web.servlet.DispatcherServlet  
  </servlet-class>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>helloworld</servlet-name>
  <url-pattern>*.htm</url-pattern>
 </servlet-mapping>  
   
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
</web-app>

우선 중요한 부분은 Spring 프레임워크내의 DispatcherServlet을 매핑하게 되는데 이부분은 Spring에서 제어행위를 처리하는 서블릿이다. 그리고 이에 대한 설정파일은 서블릿명-servlet.xml이 된다.

2. 규칙대로 /WEB-INF/helloworld-servlet.xml 을 만든다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
 <bean id="springController" class="web.SpringController" />
 <bean id="urlMapping"  
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <props>
    <prop key="/hello.htm">springController</prop>  
   </props>
  </property>
 </bean>
 <bean id="viewResolver"  
  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass">
   <value>org.springframework.web.servlet.view.JstlView</value>
  </property>
  <property name="prefix">
   <value>/JSP/</value>
  </property>
  <property name="suffix">
   <value>.jsp</value>
  </property>
 </bean>
</beans>

총 3개의 Bean을 정의하고 있는데 첫번째는 처리제어를 위한 컨트롤러를 정의하고 있는데 springController라는 이름으로 web.SpringController라는 클래스를 매핑해주고 있습니다.

그리고 두번째는 hello.htm으로 들어오는 요청에 대해 springController로 넘기게 되어있고

세번째는 View의 역할을 할 JSP에 대한 설정이다

3. 다음에는 SpringController를 만듭니다

web패키지 아래에 SpringController를 만들되 org.springframework.web.servlet.mvc.Controller를 상속받아 구현합니다.

package web;

import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class SpringController implements Controller {
 protected final Log logger = LogFactory.getLog(getClass());
 
 public ModelAndView handleRequest(HttpServletRequest arg0,
   HttpServletResponse arg1) throws Exception {
        String now = (new Date()).toString();  
        logger.info("returning hello view with " + now);      
        return new ModelAndView("hello", "now", now);
 }
}

소스내용을 보면 단순하게 요청에 대해 현재 시간을 담은 변수를 now라는 이름으로 hello라는 페이지로 전달하게 되어있다

이 hello는 helloworld-servlet.xml내에 viewResolver 빈에 정의한 설정에 따라 /JSP/hello.jsp가 될것이다.

4. 이제 /JSP/hello.jsp를 작성한다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Hello World :: Spring Application</title>
</head>
<body>
<h1>Hello World! - Spring Application</h1>
<p>Greetings, it is now<c:out value="${now}" /></p>
</body>
</html>

컨트롤러를 통해 ModelAndView에 담겨진 now객체를 받아 뿌려주게 되어있다

여기서 문제점 하나! 태그라이브러리 선언 부분이 jstl라이브러리 버젼에 따라 달라진다. (이부분도 많이 헤멤-.-)

jstl 라이브러리 버전 1.0은 uri="http://java.sun.com/jstl/core"
1.1 버전은 uri="http://java.sun.com/jsp/jstl/core" 로 선언. 내 경우 spring다운받은 내부의 jar를 이용했는데 1.0인가보다.

5. 이제 Tomcat을 기동하고 http://localhost:8080/HelloWorld/hello.htm 으로 접근하면.. 드뎌 나온다 Hello World...ㅎㅎㅎ

효과적인 마인드컨트롤 7가지 방법

효과적인 마인드컨트롤 7가지 방법
 
2005.03.15 10:28
인간은 운명의 포로가 아니라 자신의 정신에 딸린 포로이다. -프랭클린 루즈벨트

원래 마인드컨트롤 (mind-control)이란 심리학적인 용어로 정신통제, 최면이나 자기 암시 등을 의미하는 뜻으로 쓰였다. 여기서 말하는 '마인드컨트롤'이란 좀더 정확하게 이야기하자면, 감정통제(Emotion-Control)에 가깝다. 최근에는 스포츠에서도 '마인드컨트롤'이라는 용어가 널리 쓰이기 시작했다. 프로팀에서는 스포츠 심리학자까지 고용하면서 마인드컨트롤에 열을 올리고 있다. 특히 우리나라 선수들이 골프나 양궁에서 마인드컨트롤을 응용하여 좋은 성과를 내고 있다. 88올림픽 당시 우리나라 양궁 대표 선수들이 좋은 성적을 얻는데 기여한 것이 마인드컨트롤 훈련이라는 사실이 보도되면서 일반 대중에게도 널리 알려졌다. 골프선수 박세리의 경우도 선두 경쟁이 뜨거워질수록 경기를 즐기자고 마인드컨트롤을 했고 그것이 바로 좋은 결과를 내는 원동력이 되었다고 고백한다.

많은 스포츠선수들이 마인드컨트롤 훈련 덕에 집중력이 크게 좋아진 것이다. 마인드컨트롤 훈련은 긴장과 이완을 적절히 조절하면서 침착하고 편한 상태에서 시합을 치룰 수 있도록 도와준다. 마찬가지로 직장인들 사이에게도 긴장과 이완을 통해서 평정심을 찾도록 도와주는 마인드컨트롤이 부각되고 있다. 얼마나 마인드컨트롤을 잘 하느냐가 승패에 큰 영향을 미친다는 얘기이다. 마인드 컨트롤은 성과를 내는데 있어서 가장 비중이 높은 핵심역량 가운데 하나이다. 성공한 사람과 실패한 사람의 차이는 얼마나 열심히 하는가와 마인드컨트롤에 달렸다고 해도 과언이 아니다.

"내가 혹시 실수이라도 하면 어떡하지"라는 생각보다는 "내가 멋있게 해서 박수를 받아야지"라는 긍정적인 마인드컨트롤이 중요하다. 마음이 삐뚤어지면 자신도 모르게 구부정하게 웅크려 앉는 자세가 되고, 마음이 긍정적이면 자신도 모르게 등받이에서 약간 앞으로 나와 앉는다고 한다. 어떤 마음자세를 갖느냐가 행동에 변화를 유도하는 것이다. 조급함보다는 기다림의 여유를 가져야 한다. 일정한 흐름을 유지하면서 또박또박 말하려면 호흡을 가다듬는 것이 좋다. 무엇보다 명심할 것은 낚싯대를 던져놓고 기다리는 사람만이 고기를 잡을 수 있다는 진리이다. 양궁에서 과녁 정중앙을 맞추는 ‘퍼펙트골드’나 골프에서 쏙 들어가는 ‘퍼펙트샷’은 아무나 하는 것이 아니라 마인드컨트롤을 할 수 있는 사람만이 할 수 있는 것이다. 결정적인 승부처는 바로 마인드컨트롤에 있다.

마인드컨트롤 중에서 제일 중요한 것은 분노를 다스리는 능력이다. 인간의 감정을 동의보감에서는 기쁨, 분노, 슬픔, 생각, 걱정, 놀람, 공포 등의 7가지로 분류하는데, 그 중에서 제일 문제가 되는 것이 바로 분노이다. 분노가 건강을 해치기 때문에 분노를 다스리는 마인드컨트롤이 꼭 필요한 것이다. 물론 분노뿐만 아니라 7가지 감정을 적절히 다스리는 마인드컨트롤이 필요하다. 감정이 극에 달하면 일을 그르칠 수 있기 때문에 주의해야 한다. 그래서 자신에 대한 분노가 생활 자체를 망치게 하는 경우가 많다.

직장인이든, 학생이든, 주부든 각자에 맞는 마인드컨트롤이 필요하다. 자신의 실력을 제대로 발휘하기 위해서는 평정심이 중요하다. 어려운 처지일수록 자신의 환경을 객관화해 바라보는 감정통제가 필요하다. 이런 힘든 상황의 원인을 '남의 탓'으로 돌리고 주변에 화풀이하는 행동은 문제를 더욱더 악화하는 지름길이다. 슬럼프일수록 마인드컨트롤을 통해서 자기혁신을 추구해야 한다. 구체적인 변화가 없더라도 자기 스스로 자신의 마음만 조절하면 변화가 가능하다. 효과적인 마인드컨트롤 7가지 방법을 정리하면 다음과 같다.

1. 우선 자신의 마음 상태를 파악하라.

자신이 긴장을 많이 하는 성격이라면 자신의 마음 상태가 어떤 상태인지 정확하게 파악하는 것이 중요하다.

2. 지나치게 집착해 냉정함을 잃지 마라.

실수를 했다면 화가 날 것이다. 실수는 빨리 잊고 새롭게 시작해야 한다. 실수를 만회하려다가 아예 실패하는 경우가 많다.

3. 무조건 휴식을 취하라.

최악의 사태에서는 벗어나려는 노력조차 하지 말고 그냥 잠을 자거나 휴식을 취하는 것이 좋다. 마음의 동요를 하지 말고 그냥 휴식을 취한다.

4. 실수를 철저히 분석해서 실패를 하지 마라.

인생은 경험의 연속이다. 경험을 통해서 배우는 마음가짐을 가져야 한다. 실수를 재빨리 잊는 것이 최선의 방법이다. 실수했을 때 그 실수를 철저히 분석해서 똑 같은 실수를 반복해서는 안된다.

5. 상대방과 비교하여 상대방 페이스에 휘말리지 마라.

남을 쫓아다니면 마음만 바쁘게 된다. 남들과 비교하거나 남의 페이스에 말려들지 말아야 한다. 자신의 감정을 억제하면서 상대방도 객관적으로 살펴보아야 한다.

6. 자신의 장점과 단점을 분석하라.

하기 싫은 일을 하는 것은 고통이다. 자신이 과거에 경험했던 장점과 단점을 적어보시고 그것을 분석해보면 자신을 객관화하는데 도움이 된다.

7. 전적으로 자신을 믿어라.

무슨 일을 하든 자신에 대한 신뢰가 중요하다. 자포자기 보다는 자신감을 가지고 차근차근 시작하는 것이 더 중요하다. 끝까지 자신을 믿는 사람만이 실패를 보지 못한다.

2009년 5월 16일 토요일

실수나 실패에 주눅들지말고, 만회할 생산적인 뭔가를 해라

"이것이 바로 여러분이 실수를 저지른 뒤에 해야 할 행동이다. 여러분은 자신의 실수에 대해 생각할 필요가 없다. 그 실수를 만회할 생산적인 뭔가를 해라."
 
콜리는 이렇게 회상한다.
"그게 빌 윌시 감독님이었어요. 그는 그날 실패를 바라보는 내 시각을 변화시켰죠." (69p)
마이클 에브라소프 지음, 김정미 옮김 '용감한 항해 - 조직 용병술의 교본이 된 벤폴드 호의' 중에서 (흐름출판)
누구든 실수나 실패를 하게됩니다. 중요한 것은 그 이후의 모습과 행동이지요.
실수나 실패를 떠올리고 여기에 압도되어 있어서는 안됩니다. 대신 더 이상 실수를 생각하지 않고 그 실수를 만회할 생산적인 무언가를 하는 것이 중요합니다.
 
저자는 빌 윌시 감독의 예를 듭니다. 한 시합에서 공격수 브루스 콜리가 홀딩 페널티(공을 갖고 있지 않은 선수를 붙들었을 때 받는 벌칙)를 받아 상대 팀에 점수를 내주었습니다.
경기가 끝난 후 월요일에 열린 경기 평가회의. 윌시 감독은 경기를 촬영한 필름을 돌리다가 콜리의 반칙 장면이 끝나자 영사기를 중시시켰습니다. 콜리는 긴장했지요.
 
그때 윌시 감독은 이렇게 말했습니다.
"우리 모두 브루스 콜리가 이때 어떻게 행동을 했는지 알고 있다. 하지만 난 여러분이 그 다음에 그가 어떻게 했는지를 눈여겨보길 바란다."
 
다음 장면은 이랬습니다. 실수를 저지른데 대해 화가 난 콜리는 방어선에 있는 선수에게 돌진해 그를 눌러버렸습니다.
 
윌시 감독의 말처럼, 우리는 자신이 저지른 실수나 실패에 압도되어 주눅들어있어서는 안됩니다. 그 실수를 만회할 생산적인 무언가를 찾아 '행동'하는 것이 중요합니다.

꼭 하고 싶다면... 그냥 현장에 나타나라

꼭 다니고 싶은 직장이 있는데 그곳에서 당신을 받아들여주지 않는다면 그냥 그 직장에 모습을 드러내라.
가서 온갖 잔심부름을 도맡아 하며 그곳에서 쓸모 있는 사람이 되라. 그리고 사람들에게 당신에 대해서 알려라.
그러면 언젠가 그들은 당신을 받아들여 줄 것이다. 왜냐하면 당신은 이미 그 그룹의 일원이 되어있기 때문이다. (132p)
 
폴 아덴 지음, 김지현 옮김 '생각을 뒤집어라 - 나와 세상을 뒤집는 역발상의 기술' 중에서 (김앤김북스)
누구에게나 '꼭 하고 싶은 일'이 한번쯤은 생깁니다. 그리고 소수의 사람들만이 그 일을 하며 삽니다.
 
꿈이나 목표가 생겨도 많은 이들은 생각에서 그칩니다. 어떤 이들은 '완벽한 준비'를 한뒤 시작하겠다고 하면서 끝내 시작을 하지 못하기도 합니다.
 
"그냥 현장에 나타나라."
성공의 비결이 무엇이냐고 우디 알렌에게 묻자, 그가 대답한 말입니다.
 
상상도 좋고 준비도 좋지만, 가장 중요한 것은 현장에 나타나 부딪치는 것입니다. 꼭 하고 싶은 일이 있다면 그 일을 하는 장소에 가서 무엇이든 하는 겁니다.
'완벽하게 준비된 사람'으로 홀연 나타나 "왜 이제야 나타났느냐"고 환영을 받는다면야 그보다 좋을 수는 없겠지만, 이런 경우는 정말 드물지요. 그러니 현장에 나타나는 것이야말로 대부분의 경우에서 성공의 비결이 됩니다.
 
제 친한 중고교 동창인 영화배우 박중훈. 당연히 그 친구도 처음부터 주연 영화배우는 아니었습니다. 영화배우가 되고 싶은 한 청년이었지요. 1985년 중앙대 영연과에 입학한 그는 꼭 영화배우가 되고 싶었습니다.
 
대학 1학년생일 때, 마침 합동영화사가 '깜보'라는 영화의 배우를 뽑는다는 얘기를 들었습니다. 무작정 달려가 지원을 하고 기다렸지만 아무런 연락이 없었습니다. 떨어진 것이었지요.
그 친구는 이후 영화사로 출근했습니다. 매일 아침에 사무실에 가서 청소를 하고 그냥 앉아있다가 오가는 사람들에게 인사도 하고 커피 심부름도 했습니다. 그렇게 4개월이 지났고, 결국 그 친구는 꼭 하고싶었던 충무로 영화의 주인공이 됐습니다. 1986년 김혜수와 함께 찍은 깜보가 개봉됐고, 그는 백상예술대상에서 신인상을 수상했습니다.
 
대학교 1학년생일 때 꿈을 쫒아 영화사 사무실이라는 '현장'에 나타났던 그 선택으로, 그 친구는 이후 '칠수와 만수', '우묵배미의 사랑', '인정사정 볼것 없다', '라디오 스타' 같은 좋은 영화들에 계속 출연하며 자신의 세계를 만들어갈 수 있게 된 것입니다.
 
꼭 하고 싶은 일이 생기면, 이런 저런 이유를 만들며 미루고 주저하지 않으면 좋겠습니다. 그냥 '현장'에 나타나는 것. 이것이 좋은 방법이 될 수 있다는 것을 기억해야겠습니다.
 

Nas - Surviving the times

이거슨 진리............

Nas - Surviving The Times/Eye For An Eye/Made You Look

첨에 나오는 넘 캐부럽...

made you look 간지작렬

 

윈도우 환경에서 Subversion 설치

CVS와 같은 버전 관리 툴이 필요해서 이전에 잠시 사용해본 Subversion(SVN)을 설치하기로 했습니다.

설치와 관련된 파일은 아래 주소에서 다운로드 하세요.



서버로 사용할 컴퓨터에 서버 프로그램을, 클라이언트에 클라이언트 프로그램을 적당한 곳에 설치합니다.

서버 프로그램을 설치후 저장소(repository)로 사용될 폴더를 생성, 설정하기 위해 콘솔을 실행시켜 설치 디렉토리 아래 Bin 폴더로 이동후 아래와 같이 입력합니다.

svnadmin create --fs-type bdb h:svn mcp2



h:svn mcp2 라는 폴더가 생기고 서브 파일 및 폴더가 생성된 것을 볼 수 있습니다. 인증 단계를 위해서 rmcp2confsvnserve.conf 파일을 열어

[general]
anon-access = none
auth-access = write
password-db = passwd


으로 설정하여 인증받지 않은 접근을 차단합니다. 또한 사용자별 패스워드를 설정하기 위해 passwd 파일을 열어


[users]
harry = harryssecret

와 같이 ID=PW 형식으로 설정합니다.

중요한 기밀 문서(소스)를 다루고 회사 외부에서 접근을 한다면 반드시 SSH를 이용하여 암호화해야합니다.

서버 구동에는 아파치 웹서버와 연동하는 방법과 자체 서버를 구동하는 두가지 방식으로 나뉘는데 여기서는 간단하게 자체 서버를 이용하여 구동시키도록 하겠습니다. 아래 명령을 입력하여 서버를 구동합니다.

svnserver -d -r h:svn


위 과정으로 기본적인 서버 환경은 구축되었습니다.

추후 실행에 편의를 위해서는 svnserver.exe 파일에 바로가기를 생성한 후 속성에서 아래 그림과 같이 설정하면 쉽게 실행할 수 있습니다.(서비스로 등록할 수 있는 방법이 있는지는 모르겠네요)


클라이언트 프로그램을 설치하고 윈도우 탐색기를 실행하여 마우스 오른쪽 버튼을 클릭하면 SVN클라이언트 프로그램의 명령을 볼 수 있습니다.

먼 저 저장소에 VC6 프로젝트를 올려 보겠습니다. 저장소에 들어갈 파일중 각 사용자별로 로컬에서만 사용되고 임시로 수정되는 파일은 삭제해주는 것이 좋습니다. 삭제하지 않으면 업데이트할 때마다 의미없는 충돌 현상이 발생할 수 있기때문입니다. 일단, 확장자가 ncb, opt, plg 그리고 Debug, Release 폴더 아래 모든 파일은 삭제합니다(VC관련 마이크로소프트 문서). 추후 문제가 있다면 저장소에 추가/삭제후 업데이트, 커밋 하여 해결할 수 있습니다.



불필요한 파일 삭제후 소스의 최상위 폴더에서 임포트명령을 실행하여 서버의 주소, 저장소, ID/PW를 설정해주면 저장소에 저장이 됩니다.




이제 체크아웃통해 파일을 저장소에서 가져옵니다. 특정 작업 폴더에서 체크아웃을 실행하면 주소 및 패스워드 입력후 저장소에서 파일을 가져오는 것을 확인할 수 있습니다.


체 크아웃후 기본적인 사용법은 작업 시작전 업데이트해서 저장소에서 수정된 파일을 가져옵니다. 작업을 완료후 저장소에 커밋하기전에 반드시 업데이트를 수행하여 작업중 다른 사람이 수정했는지 여부를 체크하여 충돌이 발생했는지 여부를 체크합니다. 만약 다른 파일이 수정되었다면 다시 빌드를 해야 하며 같은 부분을 수정하여 충돌이 발생했다면 그 담당자와 상의, 수정후 저장소로 커밋하여야 합니다.



2009년 5월 15일 금요일

Subversion 설치 및 Eclipse와의 연동

 

Summary : 현재 버전 관리 시스템으로는 CVS를 가장 많이 사용하고 있다. Subversion은 CVS가 가지고 있는 기능 외에 더 많은 기능들을 제공하고 있다. 속도 또한 CVS보다 더 좋은 상태로 현재 많은 오픈 소스 진영에서 CVS 대신 Subversion을 사용하고 있다. 이번 강좌는 Subversion의 설치에서부터 Eclipse와 연동하는 과정까지 다룬다.

Apache, Subversion설치하기

  • 1. http://httpd.apache.org/download.cgi에서 2.x 버전의 apache를 다운 받는다.
  • 2. http://subversion.tigris.org/project_packages.html에서 가장 최신의 subversion을 다운 받는다.
  • 3. 먼저 apache를 설치한다.
  • 4. 그리고 subversion을 설치한다. subversion설치중에 다음과 같은 화면이 나오는데 3번째 Apache modules부분에 체크가 되어 있는지 확인한다. 디폴트로는 체크가 되어 있을것이다.

  • 5. apache설치 디렉토리\conf\httpd.conf파일을 열어보면 중간쯤에
LoadModule dav_module modules/mod_dav.so 
LoadModule dav_svn_module modules/mod_dav_svn.so 

두줄이 주석이 없는
것이 보일것이다. Subversion이 설치중에 관련 모듈을 설치하면서 주석을 삭제하기 때문이다. 자동으로
된다. 따로 할필요가 없다.

  • 6. svnadmin create 명령어로 저장소를 생성한다.

필자는 다음과 같이 수행했다.
E:\svn\repository에 저장소를 생성한다는것이다.

파일 시스템 타입으로 생성한것이다.
버클리 DB타입은 ?fs-type bdb라고 하면된다.

svnadmin --fs-type
fsfs create e:/svn/repository

  • 7. 다음처럼 유저 파일을 생성한다. 물론 이때 path가 안걸려 있을때는 아파치 설치디렉토리밑에
    bin디렉토리를 path에 걸어주고 다시 실행한다.

htpasswd -cm
e:/svn/svn-auth-file 유저명

-> 여기서 c옵션은 새로운 파일 생성, m옵션은
md5타입으로 암호화하는것을 의미한다.

필자는 htpasswd -cm
e:/svn/svn-auth-file fromm0 으로 명령을 수행했다.

htpasswd -m
e:/svn/svn-auth-file 유저명

-> 따라서 이건 해당 유저의 패스워드만
바꾸는것이다.

  • 8. httpd.conf파일에 저장소 관련 셋팅 추가하기.

파일 검색해서 Location이
위치한 부분 마지막에 다음과 같이 추가해준다.

<Location /repos> 
  DAV svn
  SVNPath e:/svn/repository

  Require valid-user

  # how to authenticate a user
  AuthType Basic
  AuthName "Subversion repository"
  AuthUserFile e:/svn/svn-auth-file
</Location>

이 셋팅엔 여러가지 방법이 있다. 자세한 내용은 매뉴얼을 참조하기 바란다.

<Location>
태그내의 /repos는 나중에 http로 접근할 때 http://서버주소/repos형식으로 붙는다.

SVNPath : 저장소 위치를 적어준다. 여러 개의 저장소를 생성할때는 SVNParentPath라고 적어주면
된다.

Require : valid-user라는 값은 승인된 유저만 접근이 가능하다는 것을 의미한다.

AuthType : 인증 타입으로는 필자는 Basic인 기본타입을 사용한다.

AuthUserFile에는 위에서 셋팅한것처럼 사용자 정보가 들어가는 파일의 위치를 지정한다.

  • 9. 보통 아파치 설치후 subversion을 설치하면 아파치 관련 서비스가 사라진다. 이때는 명령창에서
    apache -k install 라고 해주면 다시 서비스가 설치된다.
  • 10. 아파치를 다시 시작 시키고 나서 웹브라우저로 http://localhost/repos 해주면
    Revision 0: / 라는 메시지를 보여준다. 물론 위처럼 설정을 했다면 인증절차를 거치게
    된다.

Eclipse와 Subversion을 연동해서 사용하기.

필자는 eclipse3.1.M4버전을 사용했다.

  • 1. 일단 eclipse용 subversion플러그인은 현재 두가지가 나와있다.

http://subclipse.tigris.org

http://ar.geocities.com/itcrespo/eclipse/

두가지 중에 필자는 위의 것을 사용한다.

  • 2. 홈페이지에서 보면 알겠지만 subclipse는 eclipse내의 software updates를
    사용한다.

Help -> software updates -> find and install를
누른다.

  • 3. search for new features to install를 체크하고 next한다.
  • 4. 다음처럼 new remote site를 추가해 준다. 그럼 sites to include in
    search에 추가가 되고, subclipse에 체크를 한 다음에 다음으로 넘어가자.

  • 5. 다음처럼. 선택한다. 그리고 몇번의 페이지 이동을 한다.

  • 6. 그럼 다음과 같은 화면이 나온다.

  • 7. 설치하고 나면 eclipse를 다시 시작할지 물어본다. 그냥 다시 시작한다.

window->preferences에 team부분을 보면 다음처럼 svn관련이 추가된걸 볼수있다.

  • 8. 메뉴에 window -> show view -> other -> svn하위의 svn
    repositories를 선택한다.

그럼 다음과 같은데 마우스 오른쪽을 클릭해서 new ->
repository location으로 새 저장소를 생성한다.

  • 9. 다음처럼 셋팅해주고 finish를 해준다.

  • 10. 그럼 svn repositories에 등록이 된다. 그리고 다음과 같이 보여준다.

필자의
경우 기존에 등록된 프로젝트가 있어서. 조금 다르게 나온다.

  • 11. 프로젝트를 생성하고 svn에 연결을 시도한다.

  • 12. 다음처럼 cvs와 svn을 선택하는 화면이 나온다.

  • 13. 셋팅이 되어 있는 svn repository를 선택하면 된다.

  • 14. 그럼 svn연결이 되면서 다음과 같은 화면이 나온다. cvs와는 조금 다르게 연결이 되었는데, ?
    표시가 보인다.

Subversion은 연결후 다시 subversion version
control등록을 해야 한다.

  • 15. 다음처럼 version control제어에 추가하고 다시 commit를 하면 연결작업이 사실상 끝난다.

강좌에 대하여

작성자 : [이동국]
작성일 : 2005년 2월 20일

문서이력 :

  • 2005년 2월 20일 이동국 문서 최초 생성

참고 자료

[출처:http://www.javajigi.net/pages/viewpage.action?pageId=175]