캠핑과 개발

Spring2.5 annotation 설정

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


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

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

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

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

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


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

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

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


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

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

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

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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

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



/*
MOD 
나머지를 구한다.

표현식 : MOD(m, n)
설명 : m을 n으로 나누었을 때 나머지를 반환한다.
*/
SELECT MOD (10, 3) "Modulus"
  FROM DUAL 

--> 1 


/*
Round
반올림한 결과를 반환한다.

표현식 : Round(m, n)
설명 : m을 소숫점 n+! 자리에서 반올림한 결과를 반환한다.
       m이 양수이면 소숫점이 우측으로, 음수이면 좌측으로 이동한다.
 */
SELECT ROUND (18.364, 2) "Round"
  FROM DUAL
 
--> 18.36


SELECT ROUND (16.354, -1) "Round"
  FROM DUAL
 
--> 20


/*
WIDTH_BUCKET

표현식 : WIDTH_BUCKET(expr, min_value, max_value, num_buckets)
설명 : 어떤값의 최소에서부터 최대값을 설정하고 bucket을 지정하여 임의의
      값이 지정된 범위 내에서 어느 위치에 있는지를 반환한다.
*/
SELECT WIDTH_BUCKET (80, 0, 150, 10) "Score"
  FROM DUAL
 
--> 6

/*
CEIL

표현식 : CEIL(n)
설명 : 소숫점일 경우 반올림에 상관없이 올림 후 정수를 반환
*/
SELECT CEIL (12.1)
  FROM DUAL

--> 13


/*
FLOOR

표현식 : FLOOR(n)
설명 : 소숫점일 경우 반올림에 상관없이 내림 후 정수 반환
*/
SELECT FLOOR (12.9)
  FROM DUAL

--> 12

/*
ABS

표현식 : ABS(n)
설명 : 절대값을 반환한다.
*/
SELECT ABS (-12.9)
  FROM DUAL

--> 12.9

/*
ABS

표현식 : ABS(n)
설명 : 절대값을 반환한다.
*/
SELECT TRUNC (1.235, 2)
  FROM DUAL

--> 1.23

특정 요소를 투명하게 처리할때 IE와 기타 브라우저가 표현하는 방식이 다르기 때문에 다음과 같이 해준다.
 
var view = document.getElementById('view');
if(view.filters){
    view.style.filter = 'alpha(opacity=65)'; //IE
}else{
    view.style.opacity = 0.65; //기타브라우져
}

특정 사이트를 즐겨찾기에 추가하는 방법임다..
굳이 설명이 필요 없으리라..

<html>
<head>
 <title>즐겨찾기 추가</title>
 <script language="javascript">
 /**
 * 해당 사이트를 즐겨찾기에 추가한다.
 * 이 스크립트를 사용하기 위해서는 각 브라우저마다 기능 여부를 체크후에 사용
 *
 **/
 function addBookMark(){
     var url = "http://hmjkor.tistory.com";
     var title = "맹돌이의 블로그입니다.";
     window.external.AddFavorite(url, title);
 }
 </script>
</head>
<body>
    <a href="javascript:addBookMark();">즐겨찾기 추가</script>
</body>
</html>


브라우저의 주소창이나 탭, 즐겨찾기에 사이트만의 특정 로고나 이미지를 삽입하는 방법이다.



1. favicon.ico 제작

먼저 사용될 favicon 아이콘을 제작한다.
사이즈는 16*16, 32*32, 48*48로 제작
jpg,gif,png 등의 파일을 사이즈에 맞게 제작을 하여 파일명은 favicon, 확장자는 ico 확장자로 변경한다. 직접 제작을 해도 되나 그러지 못한 경우는 검색해보면 많이 나오니 찾아서 제작
하나 추천 : http://www.html-kit.com/favicon

2. html 페이지 코드 삽입
 
만들어진 favicon.ico를 WebRoot 하위에 업로드 함
index 페이지에 다음 코드를 삽입

방법 1

<html>
<head>
    <title>favicon</title>
     <link rel="shortcut icon" href="/favicon.ico" />
</head>
<body>
</body>
</html>

방법 2
<html>
<head>
    <title>favicon</title>
    <link rel="icon" href="/favicon.ico" type="image/x-icon" />
   <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
</head>
<body>
</body>
</html>


이미지가에 문제가 있는경우는 나타나지 않을 수도 있다.


특정한 페이지를 브라우저 시작페이지로 설정을 한다.
IE에서는 동작을 하나 FF 3.5에서는 동작을 안하니 사용시 각 브라우저별로 테스트 후에 사용해야 함

<a style="cursor:pointer" HREF onClick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://hmjkor.tistory.com');">시작페이지로</a>


 


 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<LINK REL="ShortCut ICON"  href="http://www.okjsp.pe.kr/favicon.ico">
<TITLE> New Document </TITLE>
<script language="Javascript">
function open_ShortCut() {
   var WshShell = new ActiveXObject("WScript.Shell");
   strDesktop = WshShell.SpecialFolders("Desktop");
   var oUrlLink = WshShell.CreateShortcut(strDesktop + "\\okjsp.url" );
   oUrlLink.TargetPath = "http://www.okjsp.pe.kr";
   oUrlLink.Save();
}
</script>
</HEAD>
<body>
클릭 <a href="javascript:open_ShortCut()">바탕화면아이콘 저장</a>
</BODY>
</HTML>

 
출처 : http://okjsp.pe.kr

1. vi 사용하기

커서 이동

명령 모드에서 h, j, k, l 키를 누르면 커서는 각각 왼쪽, 아래, 위, 오른쪽으로 한 칸 이동한다. 근래 vi 버전에서는 화살표 키를 사용해도 된다. h, j, k, l 키는 꽤나 편리한데, 일단 익숙해지면 키보드 가운데 줄에서 손을 떼지 않고도 커서를 움직일 수 있어서다. 현재 열어 놓은 파일에서 (화살표 키와) h, j, k, l을 사용해 커서를 이동해본다. h 키를 계속 두드려 행 맨 처음까지 이동해본다. 행 맨 처음에서 h 키를 계속 두드려도 커서가 이전 행으로 올라가지 않는다는 사실에 주목한다. 마찬가지로, 행 끝에서 l 키를 계속 두드려도 커서는 다음 행으로 넘어가지 않는다.

vi는 행 처음이나 마지막으로 커서를 단번에 이동하는 단축키도 제공한다. 0을 누르면 커서는 행 첫 번째 문자로 이동하고, $을 누르면 커서는 행 마지막 문자로 이동한다. 직접 실행해본다. vi에는 편리한 이동 명령이 아주 많아 (more나 less 명령처럼) 파일 보기 프로그램(pager)으로도 훌륭하다. 파일 보기 프로그램으로 vi를 활용하면 이동 명령을 기억하기도 쉬워진다.

이전 페이지나 다음 페이지로 이동하려면 ^F(컨트롤-F)와 ^B(컨트롤-B) 키를 사용한다. (vim과 같은) 근래 vi 버전에서는 Pg Up 키와 Pg Dn 키를 사용해도 된다.

낱말 단위로 커서 이동

vi에서는 낱말(word) 단위로도 커서를 이동할 수 있다. 다음 낱말 첫 번째 문자로 커서를 이동하려면 w 키를 누른다. 다음 낱말 마지막 문자로 커서를 이동하려면 e 키를 누른다. 이전 낱말 첫 번째 문자로 커서를 이동하려면 b 키를 누른다. 직접 실행해본다.

낱말 이동 명령을 연습하다 보면 vi가 "foo-bar-oni" 같은 표현을 다섯 낱말로 인식한다는 사실이 드러난다. 기본적으로 vi가 공백이나 구두점으로 낱말을 구분하기 때문이다. 즉 vi는 foo-bar-oni라는 표현을 "foo", "-", "bar", "-", "oni"라는 다섯 낱말로 인식한다.

그렇지만 foo-bar-oni를 한 낱말로 인식하고 싶을 때도 있다. 다행스럽게도 vi는 "큰 낱말(big word)"이라는 개념도 인식한다. 즉 vi에서 foo-bar-oni는 낱말(word) 수가 다섯 개지만 큰 낱말(big word) 수는 한 개다.

다음 큰 낱말과 이전 큰 낱말로 커서를 이동하려면 낱말 이동 명령을 대문자로 바꾼 키를 사용한다. 즉 W 키는 다음 큰 낱말 첫 번째 글자로 커서를 이동한다. E 키는 다음 큰 낱말 마지막 문자로 커서를 이동하고, B 키는 이전 큰 낱말 첫 번째 글자로 커서를 이동한다. 연습해본다. 차이를 이해할 때까지 낱말 이동 명령과 큰 낱말 이동 명령을 실행하고 비교해본다.

더 큰 단위로 커서 이동

컨닝 페이퍼를 만들기 전에 명령 몇 개만 더 살펴보자. ( 키와 ) 키는 이전 문장과 다음 문장 처음으로 커서를 이동한다. { 키와 } 키는 현재 문단과 다음 문단 시작으로 커서를 이동한다. 연습해본다.

종료

지금까지 기본적인 커서 이동 명령을 살펴보았는데, 알아야 할 명령이 몇 개 더 있다. :q 명령은 vi를 종료한다. 이 명령이 먹히지 않으면 실수로 파일을 수정했다는 뜻이다. 수정한 내용을 버리고 vi를 종료하려면 :q! 명령을 입력한다. 그러면 명령 프롬프트로 돌아간다.

vi에서 콜론(:)으로 시작하는 명령은 모두 ex 모드 명령이다. 이는 vi가 “ex”라는 비시각적인(non-visual) 편집기를 내장하기 때문이다. ex는 sed와 비슷하게 행 단위로 텍스트를 편집하는 프로그램이다. 또한, 방금 보았듯이 vi를 종료할 때도 ex 명령을 사용한다. 명령 모드에서 Q 키를 누르면 vi는 ex 모드로 전환하고 : 프롬프트가 뜬다. 이 때 엔터 키를 누르면 전체 화면이 위로 이동한다. ex 모드에서 vi 모드로 돌아가려면 그냥 vi만 입력한 후 엔터 키를 누른다.


2. 편집과 저장

커서 이동

계속해서 vi 명령을 살펴보자. 명령 모드에서 <행 번호>G를 입력하면 커서는 해당 행으로 이동한다. 파일 첫 번째 행으로 이동하려면 1G를 입력한다. 여기서 G는 대문자라는 사실에 주의한다.

특정한 텍스트 패턴을 찾아서 커서를 이동하려면 /regexp를 입력하고 엔터 키를 누른다. 여기서 regexp 대신 찾으려는 정규 표현식을 입력한다. 이 때 커서는 다음에 나타나는 텍스트 패턴으로 이동한다. 정규 표현식을 모른다고 당황할 필요는 없다. /foo라고 입력하면 다음에 나타나는 foo로 커서가 이동한다. 단, ^, ., $, \ 문자는 정규 표현식에서 사용하는 특수 문자이므로 주의한다. ^, ., $, W 문자가 들어가는 패턴을 찾으려면 문자 앞에 \ 문자를 붙인다. 예를 들어, /foo\.gif는 다음으로 나타나는 "foo.gif"를 찾는다.

검색을 계속 진행하려면, 즉 현재 커서 이후에 나타나는 패턴을 찾으려면, n 키를 누른다. 검색을 역으로 진행하려면, 즉 현재 커서 이전에 나타나는 패턴을 찾으려면, N 키를 누른다. vi 편집기에서 직접 연습해본다.

저장, 다른 이름으로 저장

앞서 :q 명령을 소개하면서 ex 명령을 설명했다. 변경한 내용을 저장하려면 :w를 입력한다. 변경한 내용을 다른 파일에 저장하려면 :w filename.txt를 저장한다. 파일을 저장한 후 vi를 종료하려면 :x 또는 :wq를 입력한다.

(elvis 같은 고급 vi 편집기에서도 마찬가지지만) vim에서는 동시에 버퍼 여러 개를 열어둘 수 있다. 새 창에서 파일을 열려면 :sp filename.txt를 입력한다. 그러면 현재 창이 나뉘면서 새 창에 filename.txt가 열린다. 창 사이를 전환하려면 ^w^w(컨트롤-w 두 번)을 입력한다. :q, :q!, :w, :x 명령은 현재 활성화된 창에만 적용된다.

간단한 편집

이제 간단한 편집 명령을 익힐 차례다. “간단한” 명령이라고 칭한 이유는 명령을 실행한 후에도 명령 모드를 유지하기 때문이다. 일부 복잡한 편집 명령은 자동으로 삽입 모드로 전환한다. 삽입 모드에서는 키보드로 입력하는 문자가 그대로 삽입된다. 복잡한 편집 명령은 나중에 다룬다.

지금은 커서를 옮겨가면서 x 키를 계속 눌러본다. 커서가 놓인 위치에서 현재 글자가 삭제된다는 사실을 발견하리라. 이제 문단 중간으로 커서를 옮긴 다음 (대문자) J 키를 누른다. 직접 눌러보면 알겠지만, J 키를 누르면 다음 행이 현재 행 끝으로 연결된다. 이제 문자 위에 커서를 놓고 r 키를 누른 후 새 문자 하나를 입력한다. 그러면 원래 문자가 새 문자로 교체된다. 마지막으로, 커서를 행 아무 데나 놓은 후 dd를 입력한다. 그러면 현재 커서가 놓인 행이 삭제된다.

반복과 삭제

. 키를 누르면 vi는 직전에 실행한 편집 명령을 다시 실행한다. dd....를 입력하면 행 네 개가 지워진다. J....는 행 네 개를 결합한다. vi가 제공하는 또 다른 편리한 단축키라 하겠다.

텍스트를 지우려면 d 명령과 이동 명령을 조합한다. 예를 들어, dw 명령은 현재 커서 위치에서 다음 낱말 시작까지 삭제한다. d) 명령은 현재 커서 위치에서 다음 문장 끝까지 삭제하고, d} 명령은 현재 커서 위치에서 문단 끝까지 지운다. 익숙해질 때까지 d 명령과 다른 편집 명령을 조합해서 연습해본다.

실행 취소!

삭제 명령을 익혔으니 실행 취소 명령도 알아두는 편이 좋겠다. 원래 vi 버전에서는 u 키를 누르면 가장 최근에 가한 변경만 복원한다. 그러나 (vim 같은) 근래 vi 버전에서는 u 키를 계속 누르면 파일에 가한 변경을 계속 거슬러 올라가면서 복원해준다. d 명령과 u 명령을 조합해 연습해본다.


3. 삽입모드

삽입 모드 이해

지금까지는 vi에서 커서를 이동하는 방법, 파일 입출력을 수행하는 방법, 기본적인 편집 작업을 수행하는 방법을 다루었다. 그런데 아직도 파일에 텍스트를 맘대로 입력하는 방법은 다루지 않았다. 의도적으로 뒤로 미루었는데, 처음에는 vi 삽입 모드가 다소 복잡해 보이기 때문이다. 그러나 삽입 모드에 익숙해지고 나면 삽입 모드의 복잡성(과 유연성)은 오히려 장점으로 작용한다.

vi 삽입 모드에서는, 다른 시각적 편집기와 마찬가지로, 화면에 텍스트를 맘대로 입력할 수 있다. 파일을 수정한 후 명령 모드로 돌아오려면 Esc 키를 누른다. 명령 모드에서 삽입 모드로 전환하려면 i 키나 a 키를 누른다. i 키를 누르면 입력하는 텍스트는 현재 커서 위치 앞에 삽입된다. a 키를 누르면 입력하는 텍스트는 현재 커서 위치 다음에 삽입된다. 텍스트를 입력한 후 명령 모드로 돌아오려면 Esc 키를 눌러야 한다는 사실에 주의한다.

삽입 모드의 장점

a 키와 i 키 명령을 직접 실행해본다. a 키나 i 키를 누르고 텍스트를 입력한 후 Esc 키를 눌러 명령 모드로 돌아온다. 다음으로는 a 키나 i 키를 누르고 텍스트를 입력한 후 Enter 키를 눌러본다. 이번에는 삽입 모드에서 화살표 키나 delete 키를 눌러 결과를 살핀다. 화살표 키나 delete 키를 사용하면 삽입 모드와 명령 모드를 오가지 않고도 상당한 편집 작업을 수행할 수 있다.

삽입 옵션

삽입 모드로 전환하는 편리한 방법 몇 가지를 더 소개한다. (대문자) A 키를 누르면 현재 커서 위치에 상관 없이 현재 행 끝에 텍스트를 첨부하기 시작한다. 마찬가지로, (대문자) I 키를 누르면 현재 행 시작부터 텍스트를 첨부하기 시작한다. (소문자) o 키를 누르면 현재 행 다음에 새 행을 만든다. (대문자) O 키는 현재 행 직전에 새 행을 만든다. 현재 행 전체를 새 행과 교체하려면 cc를 입력한다. 현재 위치에서 행 끝까지 내용을 교체하려면 c$를 입력한다. 현재 위치에서 행 시작까지 내용을 교체하려면 c0를 입력한다.

위 명령은 모두 특정한 작업을 수행한 후 삽입 모드로 전환한다. 즉 텍스트를 입력한 후에는 Esc를 눌러야 명령 모드로 돌아온다.

텍스트 변경

방금 cc, c0, c$ 등 c 명령을 언급했다. cc는 dd처럼 c 명령의 특수한 형태다. c0와 c$ 명령은 c 명령과 커서 이동 명령을 조합한 예다. 여기서 c 명령은 d 명령과 비슷하게 동작한다. 단, c 명령은 텍스트를 지우고 입력하도록 삽입 모드로 전환한다는 점이 다르다. cW, ce, c(. 등 c 명령과 커서 이동 명령을 다양하게 조합하여 연습해본다.

명령 조합

vi에서 명령을 조합하기 시작하면 vi는 더욱 강력해진다. d{나 cw 등이 좋은 예다. 커서 이동 명령에 숫자를 조합해도 된다. 예를 들어, 3w 명령을 입력하면 커서는 오른쪽 낱말 세 개를 건너뛴다. 12b, 4j 등도 좋은 예다.

(숫자)(커서 이동 명령) 조합에 더하여 d나 c를 숫자나 커서 이동 명령과 조합해도 된다. 즉 d3w는 오른쪽에 있는 낱말 세 개를 삭제한다. d2j는 현재 행과 다음 행 두 개를 삭제한다. c, d 명령 조합을 실습하면서 vi 편집이 얼마나 강력하고 간결한지 느껴본다. 이러한 명령 조합을 완전히 익히면 번개같은 속력으로 파일을 편집하게 되리라.


4. 생산성 기능

지금까지...

지금까지 커서를 이동하는 방법, 파일을 저장하고 vi를 종료하는 방법, 텍스트를 간단히 편집하고 삭제하는 방법, 삽입 모드로 전환하는 방법을 살펴보았다. 지금까지 살펴본 명령과 컨닝 페이퍼를 동원하면 vi로 하지 못할 작업이 거의 없으리라.

그러나 vi에는 이 외에도 강력한 명령이 매우 많다. 이 단원에서는 텍스트를 잘라내고, 복사하고, 붙여넣고, 검색하고, 교체하는 방법과 자동 들여쓰기 기능을 사용하는 방법을 소개한다. 이러한 명령을 활용하면 vi 사용이 훨씬 재미있어지고 생산성도 높아진다.

시각적 모드

텍스트를 잘라내 붙이려면 시각적 모드가 가장 편하다. 시각적 모드는 (vim이나 elvis 같은) 최근 vi 버전이 제공하는 특수 모드다. 시각적 모드는 "텍스트 선택(highlight text)" 모드로 생각해도 좋다. 일단 텍스트를 선택한 후에는 삭제하거나 복사하여 붙여넣을 수 있다.

시각적 모드로 전환하려면 v 키를 입력한다. 그러면 그림 3과 같이 편집기 왼쪽 하단에 VISUAL이라는 낱말이 표시된다. 시각적 모드에서 이동 명령이나 화살표 키로 커서를 이동하면 해당 텍스트가 선택된다. 만약 윈도우 관리자가 응용 프로그램에 대한 마우스 사용을 허가한다면 마우스 왼쪽 버튼을 클릭한 채 끌어서 텍스트를 선택해도 좋다.

vi 시각적 모드

vi 시각적 모드


일단 텍스트를 선택하고 나면 잘라내거나 복사할 수 있다. 텍스트를 복사하려면 y 키를 누른다. (여기서 y는 “yank”를 의미한다.) 텍스트를 잘라내려면 d 키를 누른다. 그러면 명령 모드로 돌아온다. 이제 복사한 텍스트나 잘라낸 텍스트를 삽입할 위치로 커서를 이동한 후 p 키나 P 키를 누른다. p 키를 누르면 텍스트가 커서 앞에 삽입된다. P 키를 누르면 텍스트가 커서 뒤에 삽입된다. 짜잔!! 이렇게 복사/잘라내기와 붙여넣기가 끝났다. 다음으로 넘어가기 전에 잘라내기/붙여넣기를 여러 차례 연습해본다.

텍스트 교체

텍스트 패턴을 교체하려면 ex 모드를 사용한다. 현재 행에서 첫 번째로 나타나는 패턴을 교체하려면 :s/regexp/replacement/를 입력하고 엔터 키를 누른다. 여기서 regexp는 찾으려는 패턴이고 replacement는 교체할 문자열이다. 현재 행에서 일치하는 패턴을 모두 교체하려면 :s/regexp/replacement/g를 입력하고 엔터 키를 누른다. 파일 내에서 일치하는 패턴을 모두 교체하려면 :%s/regexp/replacement/g를 입력하고 엔터 키를 누른다(대개 행보다는 파일에서 텍스트를 교체하려는 경우가 많다). 파일 내에서 일치하는 패턴을 모두 교체하면서도 교체하려는 패턴마다 확인을 받으려면 :%s/regexp/replacement/gc를 입력한 후 엔터 키를 누른다(여기서 c는 "confirm"을 뜻한다).

들여쓰기

vi는 자동 들여쓰기를 지원한다. 프로그램 원시 코드를 편집할 때 편리한 기능이다. (vim과 같은) 최근 vi 버전 대부분은 (.c 파일과 같은) 소스 파일을 편집할 때 자동 들여쓰기 모드를 자동으로 활성화한다. 자동 들여쓰기 모드가 활성화된 상태에서 ^d(컨트롤-d)를 입력하면 현재 들여쓰기가 한 단계 왼쪽으로 밀린다. ^t(컨트롤-t)를 입력하면 현재 들여쓰기가 한 단계 오른쪽으로 밀린다. 자동 들여쓰기 모드를 수동으로 활성화하려면 :se autoindent라는 ex 명령을 사용한다. 또한 들여쓰기 탭 크기를 변경하려면 :set tabstop 명령을 사용한다. :set tabstop=4가 가장 많이 쓰이는 설정이다.




컨닝페이퍼

컨닝페이퍼


출처 : http://www.ibm.com/developerworks/kr/library/tutorial/l-vi/index.html




 



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

linux - netstat  (0) 2011.02.14
linux에 mysql 설치하기  (0) 2010.01.05
[linux] 시스템(하드웨어) 사양 보기  (0) 2009.02.18
[linux] Tomcat 설치  (0) 2009.02.15
[linux] JAVA 설치  (0) 2009.02.15