Apache rewrite Module    -작성자 : 윤일-

 

Apache 는 추가적으로 사용할 수 있는 유용한 모듈들을 제공합니다.

이번강좌에서는 Apache의 URL Rewrite 모듈을 사용하기 위한 컴파일,설치와 httpd.conf의 설정방법 그리고 활용방법에 대해 알아보겠습니다.

 

Apache 다운로드 : http://www.apache.org

1. rewrite 모듈을 사용하기 위한 Apache 컴파일옵션

Rewrite 모듈을 쓰기위한 Apache 컴파일 옵션은 --enable-rewrite 입니다.

Configure 실행시에  --enable-rewrite 만 추가하시면 Apache에서 rewrite 모듈을 사용할 있게 됩니다.

[root@superuser root]# ./cofigure prefix=/usr/local/apache2 --enable-rewrite

[root@superuser root]# make

[root@superuser root]# make install

 

1. Rewrite 를 적용할 수 있는 범위

Rewrite 설정은 Server Config, Virtual Host, Directory, .htaccess 에 설정할 수 있습니다.

 Apache 서버 전체에 Global 설정과 특정 가상호스트에만 적용하도록 할수 있고 특정 디렉토리에만 적용시킬수도 있습니다.

 

2. Rewrite 모듈 지시자

RewriteEngine

설정문법 : RewriteEngine On|Off

Rewriteing 엔진을 사용할지 여부를 설정합니다. 기본설정은 당연히 Off로 되어 있으며 RewriteEngine On 으로 설정하지 않는 이상 Rewritng 엔진을 활성화 시키지 않습니다.

 

현재 Apache에서 실행중인 모든 RewriteRule을 비활성화 시킬 때 RewriteRule 라인을 주석처리 하기보다 RewriteEngin Off 로 설정하는 것이 더 간편하고 올바른방법입니다.

 

RewreteLog

설정문법 : RewriteLog FILE-PATH

RewriteLog 지시자는 Rewrite 엔진의 로그를 그록할 파일을 지정합니다.
RewriteLog 파일을 항상 남기기 보다 잘못된 Rewrite 규칙들을 디버킹할 때 사용하기를 권장합니다. 아파치와 마찬가지로 RewriteLog 파일도 방문자수가 많은사이트에서는 감당못할 정도의 로그파일을 남기기 때문에 시스템 여유공간이 많이 없는 시스템에서는 해당 파티션의 하드사용률 100%로 인한 재앙(?)을 불러올수도 있습니다. 다음강좌에서 소개될 로그파일 분석에서 언급하겠지만 로그파일은 유용한 디버깅 도구가 될수 있지만 잘못 관리하면 시스템의 치명적인 악으로 존재할수도 있습니다.

RewriteLog 지시자는 반드시 RewriteLogLevel 지시자와 함께 사용하여야 됩니다.

 

RewriteLogLevel

설정문법 : RewriteLogLevel Level

RewriteLogLevel 지시자는 RewriteLog 지시자로 설정한 로그파일에 기록할 로그들에 대해 얼마나 자세한 내용을 로그로 남길것인가에 대해 설정하는 지시자입니다.

기록할 로그 Level 은 0 ~ 9까지 사용할 수 있으며 0은 로그를 기록하지 않겠다는 의미입니다. Level 숫자가 높을수록 자세한 로그를 기록합니다

 

RewriteCond

설정문법 : RewriteCond TestStirng CondPattern

RewriteCond 지시자는 RewriteRule 과 함께 사용되는 규칙으로 RewriteCond 다음에 오는 RewriteRule은 RewrieteCond 에서 설정한 패턴과 일치해야지만 RewriteRule들을 실행한다.

 

RewriteRule

설정문법 : RewriteRule Pattern Substitution

Rewrite 모듈의 실질적인 Rewrite 규칙들을 적용하는 지시자입니다.

Pattern(Input URL) 을 Subtitution(Return URL)로 변경하기 위한 모든 규칙들은 이 지시자를 사용해서 설정해야 됩니다.

Pattern(Input URL) 에는 Perl 정규표현식을 사용할수 있기 때문에 Input URL 의 규칙을 유연하게 적용할 수 있습니다. 이 강좌에서는 기초적인 정규표현식 사용방법만 다루고 정규표현식에 대해 자세히 알고 싶으신 분은 정규표현식에 대한 강좌나 인터넷 문서를 참고하시기 바랍니다.

 

정규표현식 기초

. : 다수의 한문자

? : 0개 이상의 한문자

* : 0개 이상의 문자 또는 문자열

+ : 1개 이상의 문자 또는 문자열

(chars) : (, ) 안의 문자또는 문자열을 그룹으로 묶습니다. 이 문자그룹은 Substitution(return URL)에서 $N 의 변수로 활용할수 있습니니다.

^ : 문자열의 첫문(열)을 지정합니다.

$ : 문자열의 끝 문자(열)을 지정합니다.

\(역슬래쉬) : 정규표현식에서 특별한 의미로 사용되는 문자의 특수기능을 제거합니다.(예:(, ), [, ] . 등)

{n} : 정확히 n번 반복

{n,} : n번 이상 반복

{n,m} : n 이상 m 이하 반복

[chars] : 문자들의 범위 또는 표현할 수 있는 문자들을 설정합니다. 
예) [a-z] : a 부터 z 까지의 소문자, [tT] : 소문자 t 또는 대문자 T

 

정규표현식 단축표현들

[:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현

[:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현

[:digit:] : 숫자 [0-9] 와 같은 표현

[:upper:] : 대문자. [A-Z] 와 같은 표현

 

RewriteRule 플래그

forbidden|F : 요청하는 페이지를 403 에러로 redirect 시킵니다. RedirectRule 이 적용되고 있는 페이지를 일시적으로 사용중단을 시키거나 사용자로 하여금 페이지 접근을 할수 없게 할 때 사용합니다.

) RewriteRule ^/test /home/blog/html/test.php [F]

사용자가 /test 로 접근할 경우 403 에러를 보냅니다.

gone|G : 요청하는 페이지를 410 에러로 redirect 시킵니다. 410 에러는 페이지가 사라젔거나 존재하지 않는다는 메시지입니다. 이것도 forbidden 과 마찬가지로 RedirectRule 이 적용되던 페이지를 일시적으로 중단시킬 때 유용하게 사용할 수 있습니다.

last|L : 이 플래그가 적용되면 뒤에 어떤 룰이 있더라도 이룰 아래의 규칙들은 적용되지 않고 RewriteRule 을 빠져나가게 됩니다. C, Perl, PHP 프로그램에서 루프를 빠져나가는 break 와 같은 의미를 가집니다.

chain|C : 이 플래그의 결과를 다음 RewriteRule 의 input 값으로 사용합니다.
예)

RewriteRule ^(.+) %{HTTP_HOST}$1 [C]

RewriteRule ^([^.]+)\.domain\.com(.*) /home/$1/public_html$2

이 룰은 사용자 홈의 도메인을 2차 도메인으로 자동설정해 줄 때 많이 쓰는 룰입니다. RewriteRule의 input은 도메인을 제외한 URI 를 인식하기 때문에 도메인까지 인식을 시켜서 다음 RewriteRule 로 체크를 하기 위해 사용한 것입니다.

 http://user_id.domain.com/hello.html 이란 요청이 들어오면  /home/user_id/public_html/hello.html 로 redirect 시켜줍니다. 위와 같이 2차 도메인을 이용해 계정 사용자의 홈을 지정하기 위해서는 DNS 세팅이 선행되어야 됩니다.

 

RwriteRule 설정예

 

1. http://yourdomain.com/user_id  ->  http://yourdomain.com/home.php?id=user_id

 

RewriteRule ^/([a-zA-Z0-9])$   /home/user_id/public_html/home.php?id=$1

설명 : 도메인(http://yourdomain.com) 뒤에 오는 영문숫자로된 문자열을 지정하면서 그룹으로 묶었습니다. 이렇게 그룹으로 설정된 문자열 Pattern 은 Substitution(return URL) 에서 $1 이라는 변수로 받아 사용하게 됩니다. 즉 http://yourdomain.com/superuser 라는 페이지 요청이 들어오면 실제로는 http://yourdomain.com/home.php?id=superuser 라는 페이지로 redirect 시켜줍니다. 블로그나 카페(동호회) 사이트에서 블로그 사용자의 ID 로 개인 블로그 주소를 부여할 때 http://blog.com/user_id 로 부여해 주지만 실제 실행되는 파일은 이와 같이 redirect 시켜주는 경우가 많습니다.

 

2. http://yourdomain.com/daum  -> http://www.daum.net

RewriteRule ^/daum$  -> http://www.daum.net

설명 : http://yourdomain.com/daum 라는 페이지 요청이 들어오면 도메인이 다른 http://www.daum.net 이라는 페이지로 redirect 시켜줍니다.

 

 

RewriteOptions

설정문법 : RewriteOptions Options

현재 사용할 수 있는 option 은 MaxRedirects=number 를 사용할 수 있으며 설정된 number값에 도달하게 되면 500 Internal Server Error 를 남기고 RewriteRule을 종료합니다. 잘못된 RewriteRule에 의한 무한 루프를 방지하기 위한 목적으로 사용되는데 시스템이 이유없이 다운된다거나 할 때 이 옵션과 Log 기록을 참고하여 디버깅 및 시스템 다운을 방지할 수 있습니다.

이 지사자는 Apache 2.0.45 이상에서 사용할 수 있습니다.

 

3. 실제 적용예

가상호스트 www.superuser.co.kr 에 대해 Rewrite Rule을 적용한 예입니다. 이 부분은 실제 운영되는 블로그 사이트를 위해 RewriteRule 을 적용한 예입니다.

<VirtualHost 211.206.201.xxx>

DocumentRoot /home/blog/html

ServerName blog.xxx.ac.kr

# 여기까지는 일반적인 가상호스트 설정입니다.

RewriteEngine on

# RewriteRule을 사용하기 위해 On 으로 설정합니다.

 

RewriteLog /home/blog/rewrite_log_admin3.log

RewriteLogLevel 9

# Rewrite 실행중 Log를 남기기 위해 로그파일과 로그레벨을 지정했습니다.

 

RewriteRule ^/tb/([a-zA-Z0-9]+)/([0-9]+)$ /home/blog/html/blog/trackback\.php\?id=$1&post_no=$2

# 위설정은 블로그에 등록된 포스트의 트랙백 주소를 부여하기 위해 설정한 RewriteRule 로써 Pattern에 두개의 그룹이 존재하고 return URL에 순서대로 각 그룹을 $1 과 $2 로 받아 GET 변수로 치환한것입니다.

 

RewriteRule ^/xml/([a-zA-Z0-9]+)$ /home/blog/html/blog/rss_feed\.php\?id=$1

# 각블로그별 RSS 주소를 실제 파일로 지정한것입니다.

 

RewriteCond %{REQUEST_URI}     !^/admin$

RewriteRule ^/([a-zA-Z0-9]+)$ /home/blog/html/blog/main\.php?id=$1

# 먼저 RewriteCond 로 실제 존재하는 admin 이라는 디렉토리를 이어지는 RewriteRule에서 제외시키고 http://domain.com/user_id 로의 요청을 모두 /home/blog/html/blog/main.php?id=user_id로 redirect 시키는 룰입니다.

 

RewriteRule ^/([a-zA-Z0-9]+)/([0-9]+)$ /home/blog/html/blog/main\.php\?id=$1&post_no=$2

# /user_id/1345 로 요청하는 페이지를 /home/blog/html/blog/main.php?id=user_id&post_no=1345 로 redirect 시키는 룰입니다.

 

</VirtualHost>

 

4. 마치면서

위에서 언급한 RewriteRule 뿐만 아니라 여러가지 상황에서 RewriteRule을 잘 활용한다면 아주 유용하게 웹페이지를 컨트롤 할수 있습니다. RewriteRule 을 세팅하기 이전에 반드시 정규표헌식에 대해 어느정도 공부한후 적용해 보실 것을 권합니다.




Posted by finewoo
,

JDK 다운로드
http://java.sun.com/javase/downloads/index.jsp

리눅스 버전의 .bin파일을
/usr/local/src 에 다운로드
jdk-6u17-linux-i586.bin

root 계정인데도 허가 거부
권한 변경후 설치

# chmod 700 jdk-6u17-linux-i586.bin
# ./jdk-6u17-linux-i586.bin


라이정책 관련된 내용이 출력되는데 엔터키 계속 클릭...
.....
라이선스 동의에 y 입력
설치는 완료
jdk1.6.0_17 디렉토리 생성됨

/usr/local/java 경로로 옮김

#mv jdk1.6.0_17 /usr/local/java


[환경 설정]


#vi /etc/profile

파일 마지막 부분에 JDK 설정 추가

.....

# JAVA SDK 6

JAVA_HOME=/usr/local/java
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$
CLASSPATH:$JAVA_HOME/lib/*:.


변경된 내용 적용후 설치버전 확인.

[root@local]# source /etc/profile
[root@local]# javac -version
javac 1.6.0_17


설치완료.







'Linux' 카테고리의 다른 글

[fedora] Sendmail, dovecot, pop3, sasl  (0) 2009.12.21
MySQL설치중 오류:error: No curses/termcap library found  (1) 2009.11.24
Posted by finewoo
,

프로그래밍에서 자주 변하지 않는 일정한 값이나 설정 정보 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 '전역변수'와 같은 개념을 통해 접근하는 것이 비용도 줄이고, 효율도 높일 수 있다. 
자바에는 이런 전역변수 형태의 접근을 가능하게 만들어 주는 static(정적) 이라는 키워드가 있다.

클래스의 변수나 메소드를 static으로 선언하면 그 변수는 객체의 변수가 아니라 클래스 변수가 된다. 클래스 변수이므로 어떠한 객체라도 동일한 주소로 참조하게 된다.
일반적으로 클래스의 변수나 메소드는 해당 클래스가 인스턴스화 되기 전에는 사용할 수 없는데, static 으로 선언된 변수나 메소드는 해당 클래스의 인스턴스 여부와 상관없이 바로 접근이 가능하고, 사용이 가능하다.

그럼 실무에서 적용되는 static 사용의 예로 싱글톤(Singleton)이라는 것을 살펴 보자.

public class Example {  

     /* object 선언 */
    private static Example m_theInstance = null;

    private Example() {
    }
   
    /**
     * Create and Get Instance
     * applied Singleton Pattern.
     */
    public static Example getInstance() {
        if (m_theInstance == null)
            m_theInstance = new Example();
        return m_theInstance;       
    }
}


생성자를 private으로 선언하면 new 로 생성할 수 없게 되고, public static 으로 선언한 getInstance() 메소드를 통해서만 객체에 접근 가능하게 만들어 준다.  Singleton(싱글톤) 방식은 프로젝트에서 데이터베이스 연결등의 공용 자원 접근에 이런 방식의 static 적용하면 효율을 높일 수 있는 한 방법이 될 수 있다.

또다른 예로, 절대 변하지 않는 값을 final static으로 선언하면 GC(Gabage Collection)의 대상이 되지도 않고 클래스 로딩시 메모리에 적재되어 있으므로 효율을 높여 성능향상에 도움이 된다.

지금까지 설명한 static의 효율적인 측면과 함께 반드시 고려해야 할 면으로 static 키워드의 '전역변수'적인 성격때문에 적절하지 않게 사용하게 되면 오히려 시스템에 악영향이 되거나 심각한 오류의 원인이 될 수도 있다는 것을 고려해야 한다.
이말인 즉, 공용자원의 값은 누가 어떤때에 접근하든 일정한 값을 얻어야 하지만 해당 변수나 메소드를 의도하든 그렇지 않든 적절하지 않은 값이 저장될 수도 있다는 것이다.
애플리케이션의 디버깅 작업이나 테스트시 이런 '전역변수'적인 성격의 버그는 예상외로 찾아내기 힘들 수도 있다. 그 패턴이 일정하지 않기 때문이다.

정리하자면, 자주 변경되는 변수나 메소드에 static 키워드는 가능한한(?) 사용하지 않기를 권한다. --;
필요에 따라 static을 선언하게 되더라도 잘못된 값이 참조될 수 있는 부분은 차단하는 것이 바람직하다.

즉, 자주 변경되지 않는 부분이나 설정파일 정보인 경우 등 제한적인 용도로 사용한다면 애플리케이션 성능향상에 충분한 도움이 될 것이다.


Posted by finewoo
,

[Android] Data Storage

Android 2010. 2. 25. 01:08

애플리케이션에서 데이터를 저장, 가공, 표현하기 위해서 데이터 저장 메커니즘이 있다.
안드로이드 애플리케니션 또한 마찬가지로 Data Storage 메커니즘을 제공한다.

기본적으로 안드로이드 상에서, 모든 애플리케이션의 데이터는 그 애플리케이션에게 private하다.
그래서, Content Provider를 통해서 private한 데이터를 다른 애플리케이션에게 보여준다.
Content Provider는 애플리케이션 데이터에 읽기/쓰기 접근을 제공하는 컴포넌트이다. 
읽기/쓰기 접근은 그 Content Provider가 부과할 수도 있는 제약의 조건에 따른다. 그 Content Provider는 데이터를 요청하고 수정하는 것에 대한 표준 문법과, 그리고 리턴된 데이터를 읽는 것에 대한 표준 메커니즘을 구현한다. 

안드로이드는 데이터를 저장하고 가져오기 위해 다음의 네 가지 메커니즘을 제공한다.

1. Preferences
2. 파일(Local File)
3. 데이터베이스(SQLite)
4. 네트워크


Preferences 

Preference는 기본적인 데이터 타입에 대한 키와 값의 조합으로 데이터를 가져오는 가벼운 메커니즘이다. 
이는 애플리케이션이 시작될때 로드되어야 하는 기본적인 환경설정 사항들에 대한 정의로 자료형으로는 Boolean, float, int, long, String이 있다. 
이곳에 값을 읽고 쓰기 위해서는 Context.getSharedPreferences()를 호출한다. 만약 같은 애플리케이션 내의 다른 컴포넌트들에게 이것을 공유하고자 한다면, 프레퍼런스 집합에 이름을 할당하면 된다. 또한 호출하는 Activity의 private 영역에 그것을 유지하기 위해서는, 이름없이 Activity.getPreferences()를 사용한다. Content Provider를 사용하는 것에 의하지 않고서는 Preference를 공유할 수 없다.

    @Override
    protected void onCreate(Bundle state){         
       super.onCreate(state);
    
    . . .
    
       // Restore preferences
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       boolean silent = settings.getBoolean("silentMode", false);
       setSilent(silent);
    }


Files

Mobile Device 상에 또는 분리될 수 있는 저장 매체 상에 직접적으로 파일들을 저장할 수 있다. 
기본적으로 다른 애플리케이션들은 이러한 파일들에 접근할 수 없다.
만약 컴파일 시점에 애플리케이션과 함께 패키지할 정적(static) 파일을 가지고 있다면, 프로젝트의 res/raw/myDataFile로 
그 파일을 저장할 수 있으며, 그리고 나서 Resources.openRawResource(R.raw.myDataFile)를 사용해서 그것을 열수 있다. 그것은 파일로로부터 읽기 위해 사용할 수 있는 InputStream 오브젝트를 리턴한다.


Databases

안드로이드 API는 SQLite 데이터베이스를 지원한다. 각각의 데이터베이스는 그것을 생성한 애플리케이션에게 private하다.
SQLiteDatabase 오브젝트는 데이터베이스를 나타내고, 그것과 상호작용하는 메소드들을 가지고 있다. 데이터베이스를 생성하기 위해서는 SQLiteDatabase.create()를 호출하고, 또한 서브클래스 SQLiteOpenHelper를 호출한다.
SQLite 데이터베이스 시스템을 위한 지원의 일부로써, 안드로이드는 데이터베이스 관리 기능을 제공한다. 그것은 유용한 오브젝트들로 감싸진 복잡한 데이터 집합들을 저장하게 한다. 예를 들어 안드로이드는 contact 정보에 대한 데이터 타입을 정의한다. 그것은 성과 이름(문자열), 주소와 전화번호(또한 문자열), 사진(비트맵 이미지), 그리고 사람을 설명하는 다른 많은 정보를 포함하는 많은 필드들로 구성되어 있다.
안드로이드는 테이블 컨텐츠를 브라우즈하고, SQL 명령어를 실행하고, 그리고 SQL 데이터베이스의 다른 유용한 기능을 수행하는 것을 가능하게 하는 sqlite3 데이터베이스 도구를 함께 배포하고 있다.
모든 데이터베이스(SQLite와 그 밖의 것들)는 디바이스 상의 /data/data/package_name/databases 안에 저장된다.
그리고, 레코드에 대한 고유한 ID로 사용될 수 있는 자동증가 키값 필드(autoincrement value key field)를 포함할 것을 권장한다. 이것은 정적(private) 데이터를 위해서는 요구되지 않지만, 만약 컨텐트 프로바이더를 구현한다면, 그러한 고유한 ID 필드를 포함해야 한다. 


Network 

데이터를 저장하고 가져오기 위해 네트워크를 사용할 수 있다. 
네트워크 오퍼레이션을 하기 위해서는, 다음의 패키지에 있는 클래스를 사용한다.

java.net.*
android.net.*



Posted by finewoo
,
올림푸스 펜..
필름카메라의 향수가 그리울때..
주변 일상을 부담없이 담고 싶을때...
AUTO보단 수동모드를 찾게 되는 때가 많아질때..
덩치크고 시커먼 DSLR이 부담으로 다가올때...

이런때 짜~잔하고 등장한 PEN!!
한눈에 반했던... 그 PEN을...
드뎌 만나다.



















Posted by finewoo
,

"안드로이드 개발자 가이드 한글누리집" 사이트가 최근 베타 오픈하였다.

Kandroid가 공개한 안드로이드 개발자 가이드 한글누리집은 대부분 원문과 함께 한글번역이 되어있다.

http://www.kandroid.org/board/kandroid_dev.php








'Android' 카테고리의 다른 글

[Android] Intent  (0) 2010.03.25
[Android] Data Storage  (0) 2010.02.25
[Android] 안드로이드 설치 및 개발 환경설정  (0) 2010.02.05
[Android] 안드로이드란?  (1) 2010.02.02
[Android] 안드로이드 개발 관련 링크  (1) 2010.02.01
Posted by finewoo
,
웹 어플리케이션 개발에 있어서 개발 도구, 언어를 불문하고 MVC 패턴의 개발은 사실상 필수로 받아들여 진다.
그 이유는 다들 잘 알고 있으리라 생각한다.

Spac(Simple Php Action Class) 은 PHP를 사용해서 웹어플리케이션을 개발시 구조적이고 체계적인 개발을 할 수 있도록
도와주는 PHP를 위한 개발 프레임워크이다.

Spac은 MVC 를 지원하며 소스 또한 공개되어 있어 누구라도 무료로 사용할 수 있다.


PHP웹어플리케이션 개발을 위한 PHP프레임워크 Spac 관련 블로그.
http://spac.tistory.com/


그럼, 가볍고 빠르고 심플한 PHP Framework, Spac을 만나보세요~~^^


'Language > PHP' 카테고리의 다른 글

[PHP] Spac Php Framework  (0) 2010.03.17
Posted by finewoo
,

자바 애플리케이션이 수행되면 서버나 WAS에 프로세스가 생성된다.
그리고 하나의 프로세스에는 하나이상의 Thread(스레드)가 생성된다.
단일 스레드가 생성되었다가 종료될 수도 있고 여러개의 스레드가 생성되고 수행되다가 소멸될 수도 있다. 즉 1대多의 관계다.
스레드는 WAS가 관리하며 시스템 개발시에 스레드를 개발자가 직접 컨트롤하는 일은 별로 없으며, 오히려 제대로 알지 못한 상태에서 직접 제어하면 서비스의 안전성에 문제가 생길 수도 있으니 어떤 원리로 작동되는지 정도만 알아도 충분하다고 본다.

스레드는 같은 프로세스내에서 동일한 데이터를 공유한다. 따라서 하나의 데이터에 대해서 동시에 여러개의 스레드가 접근이 가능하게 되고 그에 따라 데이터의 일관성에 관한 문제가 생길 수가 있다.
그래서 자주 사용되는 것이 synchronized(동기화)이다. 동기화란 하나의 자원(데이터)에 대해서 여러 스레드가 사용하려고 할때 한 시점에서 하나의 스레드만 사용할 수 있도록 하는 것이다.
synchronized 식별자는 보통 메소드의 선언부에 쓰고 이 키워드가 붙은 메소드는 한번에 하나의 스레드만 접근이 가능하며
메소드가 사용중일 때 다른 스레드가 메소드를 호출하면 앞의 스레드가 종료될때까지 기다려야 한다.

이 정도 설명이면 synchronized가 어떤 의미인지는 알 수 있을 것이다.
synchronized는 하나의 객체에 여러개의 객체가 동시에 접근해 처리하는것을 막기위해 사용한다.

public synchronized void exampleMethod() {
//code
...
..
}


private Object obj = new Object();
public void exampleMethod() {
synchronized(obj) {
//code
...
..
}
}


메소드를 동기화하려면 메소드 선언부에 synchronized 식별자를 쓰고, 특정부분을 동기화 하려면 해당 코드 블록에 선언해서
사용하면 된다. 애플리케이션 성능에 있어 이 식별자의 영향력이 막강함에 비해 사용법은 의외(?)로 간단하다.
이말은 거꾸로 해석하자면 synchronized를 잘 알고 쓰면 애플리케이션 자원의 안전성에 득이 되지만 제대로 알지못한 상태에서 남용해서 사용하면 오히려 시스템 성능에 치명적인 독이 될수도 있다는 점을 반드시 인지해야 한다.

그렇다면 어떤 때에 synchronized 식별자를 선언해야 할까?
가장 대표적인 경우이다.

* 하나의 객체에 여러개의 스레드가 접근해서 처리하고자 할때
* static으로 선언한 객체에 여러 스레드가 동시에 사용할때

이런 상황이 발생했을시에 시스템의 안전성 및 데이터의 일관성에 문제가 생길 수 있는 때는
해당 메소드에 동기화를 부여해야 한다.
어쩌다 한번씩 생길 수 있는 오류라고 해도 개발자라면 항상 참이 될도록 가능한한 튼튼한 구조물을 지어야 하지 않을까...

한마디로 줄이자면,  synchronized... 꼭 필요한때만 사용하자!



Posted by finewoo
,

jQuery UI 웹사이트 :
http://jqueryui.com/

Components 다운로드 : jquery UI 모듈 다운로드.
http://jqueryui.com/download

Demo : datepicker 및 기타 컴포넌트 다운로드.
http://jqueryui.com/demos/datepicker/


<!doctype html>
<html lang="en">
<head>
    <title>jQuery UI Datepicker - Default functionality</title>
    <link type="text/css" href="http://finewoo.tistory.com/themes/base/ui.all.css" rel="stylesheet" />
    <script type="text/javascript" src="../../jquery-1.3.2.js"></script>
    <script type="text/javascript" src="../../ui/ui.core.js"></script>
    <script type="text/javascript" src="../../ui/ui.datepicker.js"></script>
    <link type="text/css" href="../demos.css" rel="stylesheet" />
    <script type="text/javascript">
    $(function() {
        $("#datepicker").datepicker();
    });
    $(function() {
        $("#datepicker1").datepicker({showOn: 'button',
buttonImage: 'images/calendar.gif',
            buttonImageOnly: true});
    });
    $(function() {
        $('#datepicker2').datepicker({
            changeMonth: true,
            changeYear: true
        });
    });
    </script>
</head>
<body>

<div class="demo">

<p>Date: <input type="text" id="datepicker"></p>
<p>Date1: <input type="text" id="datepicker1"></p>
<p>Date2: <input type="text" id="datepicker2"></p>

</div><!-- End demo -->

</body>
</html>




'기타 > jQuery' 카테고리의 다른 글

jQuery CDN  (0) 2010.09.06
[jQuery] Class 핸들링(addClass, removeClass, toggleClass)  (0) 2010.04.01
jQuery  (0) 2009.12.29
Posted by finewoo
,














































Posted by finewoo
,