Redmine 백업하기 - MySQL 백업.

개발 이야기/Java | 2010. 3. 5. 19:19
Posted by 시반

Redmine 백업하기 – MySQL 백업.

 

지난시간에는 cwRsync를 이용한 Redmine 파일 시스템 백업에 대하여 살펴보았다면 이번에는 DB백업에 대한 부분을 언급할까 한다.

Redmine을 서비스하기 위해 사용되는 DB PostgreSQL,MySQL,SQLite 세가지지만. 우리 팀에서야 MySQL을 사용하고 있으니MySQL을 중심으로 설명을 진행하도록 하겠습니다.

 

 

위 그림에서도 나와 있지만 대부분의 프로젝트들이 CharacterSet 으로  UTF-8을 사용하고 있지만 Redmine의 경우 기본 설치시

기본 인코딩 타입은 Latin1입니다. 그렇다고 Redmine에서 한글 저장이 안되는 것은 아니지만 DB이전등을 하려고 하는 경우

UTF-8 문자열들이 깨지는 경우가 있다고 하니 처음 설치할 때 utf8로 설정하는 것이 좋을 듯 싶습니다.

 

앞서 말한대로 이전작업을 위한 백업 및 복구 절차를 위한 것이기 때문에 이전시에 인코딩타입도 utf8로 한번 바꿔보았습니다.

 

1. 기존 데이터의 백업

mysqldump를 이용하여 기존 데이터를  old_db.sql이라는 이름으로 백업합니다.

 

c:\redmine\mysql>mysqldump –uroot –p –default-character-set=latin1 bitnami_redmine > old_db.sql

Enter password: ********

 

old_db.sql 파일을 열어 latin1 utf8로 일괄변환한 다음 new_db.sql 로 저장합니다.

 

2. 데이터베이스 생성

이전  서버에 mysql을 설치하고 bitnami_redmine이라는 이름으로 데이타베이스를 생성합니다.

 

c:\redmine\mysql>mysql –uroot –p

Enter password: ******** ~중략~

mysql> drop database bitnami_redmine;

mysql> create database bitnami_redmine COLLATE utf8_general_ci;

 

3. 데이터 복구 

새로만든 bitnami_redmine에 앞서 백업 받은 데이타파일을 기본 charactoer-set을 utf8로 해서 복구합니다.

 

c:\redmine\mysql>mysql –ubitnami –p –default-character-set=utf8 bitnami_redmine < new_db.sql

Enter password: ********

 

 

4. Redmine DB접속정보 변경 

MySQL 설치폴더에서  my.ini 파일을 열어 다음과 같이 수정합니다.

 

[client]
default-character-set=utf8

 

[mysqld]
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci

 

[mysql]
default-character-set=utf8

 

show variables like 'c%'; 로 확인해보면  대부분의 characterSet들이 utf8로 변경되어 있슴을 확인할 수 있습니다.

 

 

5. Apache 재시작

http://서버주소/redmine redmine이 정상적으로 보여지는지 확인하면 됩니다.

이 때 redmine은 정상적으로 뜨지만 메뉴 등의 글자가 ???? 등으로 표시된다면 redmine 이하 lang 디렉토리에서 ko.yml 파일을 열어 utf8 형식으로 저장합니다.

아니면  get/redmine 등이 표시되면서 redmine 페이지 자체가 열리지 않는 경우 redmine 이하 config 디렉토리의  database.yml  파일의 production 항목에 encoding:utf8을 추가해 줍니다.

간혹 반대로 database.yml encoding:utf8 이 있는 경우에도 동일 증상이 발생할 수 있습니다.

이 경우에는 오히려 이 구문을 삭제한 후 아파치를 재시작하면 정상적으로 로드되는 것을 확인할 수 있습니다.

 

마치며...

Redmine DB이전작업은 별 내용 없이 MySQL 백업 및 복구에 대한 부분만 처리했습니다. 앞서 말한바와 같이 DB이전 부분은 cwRsyn 이용한 백업 및 복구는 해보지 못했지만 차후 한번 시도해 봐야 할 부분이고 한가지 아쉬웠던 점은 Redmiine버젼의 최신버젼이  0.9X버젼인데 비해 현재 연구소 설치버젼은 0.8X 버젼이라 이번 기회에 업그레이드를 하려했지만  DB 마이그레이션 부분이 가이드만큼 쉽게 진행되지는 않아 동일버젼으로만 이전작업을 마치게 되었다는 점이다.

시간을 내서라도 다시 한번 시도해봐야 할듯 싶다. 일단은 여기서 마무리..

 

 

 

 

 

Vista용 테마패치 VistaGlazz

기타/유틸리티 | 2009. 9. 30. 09:54
Posted by 시반

예전에 XP sp3 용 테마패치에 대한 글을 포스팅한 적이 있는데 느낀건 아직도 xp를 쓰시는 분들이 많이 있구나 하는 생각이 드네요.

물론 나역시 몇몇 프로그램의 호환성 문제 때문에 다시 xp 로 바꾼적이 있고 아직도 회사에서는 사내 보안프로그램과의 호환 문제 때문에 xp로 사용하고는 있지만 vista 역시 서팩2도 나오고 window7도 나오는 터라 많이 괜찮아 지지 않았나 싶다는 생각이 드는데 말이죠.

덕분에 이제사  vista 테마패치를 소개하게 되네요.


당연하겠지만 vista 역시 여러가지 테마들이 존재합니다만 사용자 정의 테마파일들을 적용하기 위해서는 xp와 마찬가지로 UXTheme.dll 을 바꿔주어야 합니다. xp 의 경우 UXTender 라는 툴이 많이 사용되었는데 Vista는 VistaGlazz라는 것이 있네요.



첫 번째 아이콘이 UXTheme.dll 파일을 바꿔주는 패치구요.
두 번째 아이콘이 창이 최대화되더라도 반투명효과가 유지되도록 해주는 패치라고 합니다.

Windows Vista x86/x64 sp0/sp1.sp2 용 패치입니다.

 

Eclipse PlugIn – Properties Editor

 

자바프로그램에서는 propeties 라는 파일을 이용하여 설정이나 다국어 처리를 위해 사용하고 있습니다.

한가지 주의할 점은 다국어처리등을 위해 인코딩타입을 UTF-8 로 저장한 경우 이클립스의 기본 에디터인 Properties File Editor로 한글을 써 놓으면 깨져서 사용할 수 없습니다.

그래서 이 경우에는 한글을 유니코드로 변환시켜 저장해야 하는데 native2ascii.exe  프로그램을 쓰고는 했었습니다

 

Properties File Editor

앞서 말한바와 같이 유니코드로 저장한 경우에는 한글을 알아볼 수 없습니다. -_-a

PropetiesEditor

 

이클립스에서 Properties 파일 편집을 하기 위해  PropEdit 또는 PropertiesEditor 라 불리는 플러그인이 있습니다. 설치방법은 Help > New Install Software... 선택후 Add..을 클릭하여 다음 주소를 추가합니다.

 

http://propedit.sourceforge.jp/eclipse/updates/

 

 

PropertiesEditor 항목을 체크하고 설치를 진행합니다.

PropetiesEditor 로 편집하기

 

파일을 열 때 Open With > PropertiesEditor를 선택하면 Properties File Editor 대신 PropertiesEditor를 이용하여 Properties 파일을 편집할 수 있습니다.

아니면. 다음과 같이 PeropertiesEditor  기본값으로 설정하여 사용할 수도 있습니다.

 

 

 

이제 파일을 열어보면 두 Editor를 비교해보겠습니다


 

위에 것은 기존의 Properties File Editor 로 연것이고 아래것은 ProperitesEditor로 연 화면입니다.

같은 파일인데도 편집기에 따라 다르게 보인다는 것을 알수 있습니다

PropertiesEditor의 장점은 편집은 가독성있는 문자코드로 작성하고 저장시에만 유니코드로 자동변환되어 저장된다는 점입니다.

 

 

dom4j를 이용하여 웹서비스에서 데이터를 파싱하는 중에 나온 에러입니다.

JUnit으로 테스트할 때는 이상이 없던터라 데이타가 나오지 않아 깜짝 놀랐네요.

로그를 찾아보니  SAXException: Invalid byte 2 of 2-byte UTF-8 sequence

말 그대로 UTF-8 로 인코딩된 정보가 아니라는 거죠.

당연히 수신측과 송신측의 인코딩 타입은 동일해야 겠죠.

 

그동안은 보내는 쪽 코딩을 주로 했던터라. 저역시 대부분 UTF-8로 변환하여 보냈습니다만

이번에는 수신할 때가 문제였네요. 아마 그쪽에서 인코딩 타입을 EUC-KR 으로 사용했었나 봅니다.

 

  SAXReader xmlReader = new SAXReader();
  xmlReader.setEncoding("EUC-KR");
  Document doc = xmlReader.read(inputstream);

 

이렇게 stream 데이터를 읽기 전에 EUC-KR로 인코딩타입을 명시하니 이상없이 동작하네요.

 

 

 

 

 

요즈음  단위테스트로 JUnit를 많이들 사용하고 있는 듯 한데

JUnit 3.X와는 달리 JUnit 4.X 의 경우 @Test 에서 유효성 검사(Assert)를 하기  위해서 org.junit.Assert.assert*** 를 항상 static  import  해주어야 한다는 점은 다소 불편함이 있습니다..

더군다나 static import의 또하나의 불편한 점은 Eclipse에서 이를 사용시 기본적으로 추천(Intellisense)기능을 제공해 주지 않는다는 점이겠죠.

 

하지만 Eclipse에서 static import를 추천해 주도록 설정하여 조금 편하게 코딩할수 있는 Tip이 있어 간단히 소개하고자 합니다.

 

 

1. Window > Preferences > Java > Editor > Content Assist > Favorites를 선택합니다

 

 

2. New Type을 클릭하여 static type으로 org.junit.Assert를 등록합니다.
Browse..버튼을 클릭한 후 Type Selection 창에서 assert을 검색할 수 있습니다.
이 때 주의할 점은 JUnit4 는 기존 버전과의 호환성을 위해 org.framework.Assert 도 포함하고 있기 때문에 반드시 org.junit.Assert로 선택해야 합니다.

 

 

3. 이제 특별히 import 하지 않아도 위와같이 Assert 이하 함수들을 Eclipse Intellisense 기능을 이용하여 사용할 수 있습니다.(입력중 Ctrl+Space)

 

단순히 JUnit의 Assert 이하 함수들에  대하여 추천목록에 등록시켜 사용한 예이지만 기타 다른 추천기능을 제공하지 않는 static import 를 해야만 하는 다른 유형들을 Eclipse에서 좀더 유용하게 사용할 수 있을 듯 합니다.

 

MINA 기반의 어플리케이션 구조

개발 이야기/MINA | 2009. 5. 28. 18:01
Posted by 시반

MINA 기반의 어플리케이션 구조

개요                                                                                                            

MINA 기반의 어플리케이션의 구조에 대하여 많은 분들이 질문해오셨습니다. 기사를 통해 MINA 기반 어플리케이션이 어떤 아키텍처를 가지고 있는지 살펴보도록 하겠습니다.MINA 관련된 프레젠테이션 자료에서 발췌했습니다.

조감도 :

 

좀더 상세하게 알아볼까요?

 

이미지는 Apache MINA 이용하여 Network Application 빨리 개발하기(JavaOne 2008) 라는 이희승님의 발표자료에서 가져왔습니다.

크게 보면, MINA 기반의 어플리케이션은 3개의 레이어로 구분되어 집니다

·         I/O Service - 실제 I/O 수행하는 부분

·         I/O Filter Chain - 필터/변환, 바이트를 원하는 데이터 구조로 변환(역으로도 가능)

·         I/O Handler실제 비즈니스 로직이 들어가게 되는 부분

그럼 이제 어떻게 MINA 기반의 어플리케이션을 개발하는지 살펴 볼까요

1.    Create I/O service기본으로 제공하는 서비스 (*Acceptor)  또는 스스로 만든 I/O  서비스 중에서 선택합니다

2.    Create Filter Chain요청/응답간의 변환을 처리하기 위해 필터를 지정합니다. 필터는 기본으로 제공하는 필터 사용자 필터 중에서 선택합니다

3.    Create I/O Handler각기 다른 메시지들을 핸들링 하기 위한 비즈니스 로직을 작성합니다.
MINA
어플리케이션을 만드는 것은쉽죠~? ##########2*

 

ps. 마찬가지로 미나 레퍼런스를 번역한 글입니다.

원문은 http://mina.apache.org/mina-based-application-architecture.html 에서 확인할 수 있습니다.

'개발 이야기 > MINA' 카테고리의 다른 글

[MINA] Logging Configuration  (0) 2009.11.30
MINA에서 버퍼 제어하기 - IoBuffer  (0) 2009.06.01
MINA 2.0 에코서버 만들기  (0) 2009.05.21
 

아파치2.x에서 mod_ssl 설치하기.

기타 | 2009. 5. 28. 17:12
Posted by 시반
이 문서는 아파치를 설치하고 공유객체를 이용하여 동적으로 아파치 확장모듈을 설치하기 위한 가이드라인을 제공하기 위해 작성되었습니다. AIX5.3을 기준으로 작성되었지만 테스트 환경이 AIX였을 뿐 리눅스에서도 동일하게 테스트 할 수 있을것입니다. 운영중에 있던 아파치서버에 보안서버를 구축하던 중 mod_ssl이 설치되지 않아 아파치를 재설치를 해야 하는지에 대한 문의가 있었기 때문에 mod-ssl 등의 아파치 확장모듈을 등록하는방법 위주로 설명하겠습니다.(SSL 설정 등 보안서버 구축부분은 이번 문서에서는 제외하겠습니다).

 

준비사항
1. http://httpd.apache.org 에서 아파치 2.2.2(https-2.2.2.tar.gz)를 다운받는다
2.
http://www.ibm.com/servers/aix/products/aixos/linux/download.html에서  gcc를 다운받는다

  (gcc 4.0 ß GNU C compiler version 4 for AIX 5.3 )
3.
http://www.ibm.com/servers/aix/products/aixos/linux/download.html에서 AIX 5.3 을 위한 GCC라이브러리를 다운받는다.(libgcc 4.0)

AIX에서 Apache2설치하기

먼저 아파치의 컴파일과 설치에 대해 알아보겠습니다. 기본적으로 최소 50M이상의 여유공간과 ANSI-C 컴파일러(gcc추천), apxs등의 지원 스크립트를 위한  Perl5 인터프리터를 필요로 합니다. 여러 종류의 Perl이 설치되어 있는 시스템이라면 configure가 올바른 것을 찾을수 있도록 –with-perl 옵션을 이용합니다.

 

먼저 다운로드 받은 apache 설치 파일의 압축을 풉니다.

  • tar –xvf httpd-2.2.NN.tar.gz

설치파일은 httpd-2.2.NN.tar.gz의 형태를 가집니다. 이때 NN은 버전정보입니다.이제 configure를 이용하여 아파치 구성정보를 설정합니다,

  • configure --prefix=PREFIX --enable-so CC=/usr/bin/gcc
  • configure --prefix= PREFIX --enable-modules=all --enable-so --enable-ssl --with-ssl=/usr/bin/openssl CC=/usr/bin/gcc

첫번째 라인은 기본적인 아파치 설정구문입니다. PREFIX는 아파치 설치경로로서 기본값으로 /usr/local/apache2를 사용하게 됩니다. --enable-so는 운영중에 동적으로 공유객체를 이용하여 아파치를 확장하기 위한 옵션입니다. CC는 컴파일에 사용할 C컴파일러 명령어를 지정하는데요. 일반적으로 gcc를 사용하기 때문에 gcc가 설치된 위치를 지정하면 됩니다.

두번째 라인은 아파치 설치와 동시에 배포본에 있는 특정모듈을 함께 설치하고자  할 때 사용되는 예제입니다. 기본설정에서는 비활성화된 상태로 컴파일되는 mod_ssl을 사용하기 위해 --enable-ssl 옵션을 명시해야 합니다. 또한 mod_ssl을 사용하기 위해서는 아파치 설치전 openssl이 설치되어 있어야 합니다.(없으면 미설치) –with-ssl 옵션을 통하여 참조할 openssl위치를 지정합니다.

다음으로는 설정한 아파치를 컴파일해야 합니다

좀더 자세한 configure 구성옵션을 알기 원한다면 http://httpd.apache.org/docs/2.2/programs/configure.html 를 참조하세요.

  • make

다소 간단한 명령어지만 컴파일시간은 다소 시간이 걸립니다. 이 시간은 하드웨어와 포함한 모듈수에 따라 달라집니다. 또한 다시 설정을 하고자 한다면 make clean을 통해 컴파일내용을 초기화할 수 있습니다.

이젠 다음 명령어로 컴파일한 아파치를 지정한 설치 위치에 설치합니다.

  • make install

추가모듈이 있는 경우 httpd.conf파일에 LoadModule=추가모듈SDO가 자동으로 추가가 됩니다.

나중에 별도로 설치하는 경우에는 수동으로 직접 편집할  수 있습니다. 설치를 마쳤다면 운영환경에 맞춰 설정파일을 편집합니다

  • 아파치 설치디렉토리로 이동합니다(PREFIX)
  • vi PREFIX/conf/httpd.conf

설치디렉토리 하위디렉토리의 conf디렉토리에 들어있는 httpd.conf 파일을 열어 아파치 웹서버를 설정합니다.

ssl을 구성한다면 PREFIX/conf/extra/http-ssl.conf 파일에서 설정하도록 권장하고 있습니다.

단 이 구성정보를 사용하기 위해 httpd.conf파일에서 Include conf/extra/httpd-ssl.conf 항목의 주석을 해제해야 합니다. (또는 별도 설정파일 지정)

웹서버 설정파일과 관련하여 좀더 자세한 사항을 알기를 원하신다면 http://httpd.apache.org/docs/2.2/configuring.html 를 참조하세요.

  • PREFIX/bin/httpd –l  을 통하여 httpd를 통하여 등록된 모듈정보를 확인할 수 있습니다.
  • PREFIX/bin/httpd –t 를 통해 httpd.conf의 유효성검사를 수행할 수 있습니다.
  • http://httpd.apache.org/docs/2.2/mod/ 에서 아파치 패키지내 모듈에 대한 정보를 확인할 수 있습니다.

이제 구동 및 정지를 수행하도록 합니다.

  • PREFIX/bin/apachectl start 를 통하여 아파치를 구동합니다
  • start stop restart 를 사용할 수 있습니다.
  • 2.2 버전에서는 이전버젼에서 ssl 설정시 사용했던 apachectl startssl을 더 이상 사용하지 않습니다
  • 앞서 보았던 환경설정(http-ssl.conf)를 읽어 https를 지원합니다. (PREFIX/bin/apachectl start)

추후 버전 업그레이드를 하는 경우에는 기존 설치파일이 있는 경우 쉽게 진행될 수 있습니다. 기존 설치파일경로에 있는config.nice파일에는 소스를 구성할 때 사용했던 configure명령행 옵션을 그대로 저장하고 있기 때문에 추후 새로운 버전 소스에 config.nice파일을 복사하고 실행하면 됩니다.

  • config.nice 복사
  • make
  • make install

동적 공유객체를 이용하여 아파치 모듈 확장하기

앞에서는 아파치를 설치하면서 함께 확장모듈을 등록하는 방법을 살펴보았다면 이번엔 이미 설치된 아파치에서 DSO기능을 이용하여 어떻게 모듈을 추가하는지를 살펴보도록 하겠습니다.(http://httpd.apache.org/docs/2.2/dso.html 참고).

 

DSO기능을 언제 사용하는지 간략하게 요약하면 ..

  • 공유모듈을 나중에 사용하기 위해 아파치를 구성하는 경우
  • 아파치 배포본에 있는 추가모듈을 컴파일하고 설치하는 경우
  • 제삼자가 만든 아파치 모듈을 컴파일하고 설치하는 경우
  • 제삼자가 만든 아파치 모듈을 컴파일하고 설치하는 경우 apxs를 사용하여 설치하는 경우

머 어떤 경우라도 일단 공유모듈이 컴파일되면 httpd.conf LoadModule 지시어를 사용하여 아파치에 모듈을 추가할 수 있습니다.

먼저 공유모듈을 나중에 사용하기 위해 아파치를 구성하는 경우가 있는데 이건 앞에서 설치부분에서 설명한바 있으니깐 패스.

  • configure --enable-so
  • make install

제삼자가 만든 아파치 모듈을 컴파일하고 설치하는 경우는(예를들어mod_foo.c를 설치하는 경우) --add-module옵 사용하여 제삼자가 만든 아파치 모듈을 지정합니다 이때 해당 모듈을 공유객체로 지정한다는 의미로 –enable-foo=shared 옵션을 사용합니다

  • configure --add-module=module_type:/path/to/3rdparty/mod_foo.c --enable-foo=shared
  • make install

제 삼자가 만든 아파치 모듈을 컴파일하고 apxs를 사용하여 아파치 소스트리 밖에서 설치하는 방법입니다. 일반적으로 제 삼자가 만든 아파치 모듈의 경우 이 방법을 많이 매뉴얼로 제공하고 있습니다. 대부분 압축파일로 제공하고 있는 모듈의 압축을 풀어 해당 위치로 이동한후 아피치의 apxs를 이용하여 컴파일하고 설치를 진행합니다.(예를 들어 mod_foo.c 모듈을 설치하는 경우)

좀더 상세한 정보를 원하신다면 http://httpd.apache.org/docs/2.2/programs/apxs.html 를 참조하세요

  • cd /path/to/3rdparty
  • apxs -c mod_foo.c
  • apxs -i -a -n foo mod_foo.la

마지막으로 아파치 배포본(설치파일)에 있는 아파치 모듈을 설치하고자 하는 경우입니다. 이 문서에서 다루고자 한 부분이구요. 이번 예제는 앞서 설치 예제에서 보았던 ssl설정 부분을 아파치가 이미 설치가 된 이후에 추가하는 것으로 진행해보도록 하겠습니다.

앞서 말했듯이 PREFIX는 아파치가 설치된 경로를 말합니다. –with-apr 옵션을 사용하지 않는다면 배포본에 포함되어 있는 Apache Portable Runtime(APR)이 자동으로 웹서버와 함께 컴파일됩니다. 따라서 컴파일 및 설치시에 그만큼의 시간이 더 소모되기 때문에 이미 설치된 APR을 대신 사용한다는 것을 명시해주어야 합니다. APR 이 설치된 절대경로,파일명,디렉토리명을 사용할 수 있으며 지정한 디렉토리나 그 디렉토리의 하위 디렉토리 bin apr-config가 존재해야 합니다. 역시 마찬가지로 http 배포폰에 포함된 APU(apache portable runtime utilities) 대신 이미 설치된 아파치의 APU를 사용하기 위해 –with-apr-util 옵션을 사용하여 경로를 지정합니다. --enable-ssl 옵션은 기본설치에는 비활성화되어있으며 2.x 부터 통합된 mod_ssl을 사용하기 위한 옵션입니다. --with-ssl mod_ssl을 사용하는 경우 configure에서 설치된 openssl을 찾을수 있도록 하는 옵션입니다.openssl이 설치된 경로를 지정합니다. --enable-module=shared 옵션은 해당 모듈을 DSO모듈로 컴파일하는 옵션입니다.

마지막으로 CC는 추천하고 있는 C컴파일러의 경로를 지정합니다.

  • configure --prefix=PREFIX --with-apr=PREFIX/bin --with-apr-util=PREFIX/bin --enable-so --enable-ssl=ssl --with-ssl=/usr/bin/openssl --enable-module=shared CC=/usr/bin/gcc
  • make install

Q&A

 

설치에 관한 질문이 있다면…*^^*..

  • configure는 배포본의 최상위경로에서만 해야하나여?

configure는 특정플랫폼에서 아파치 웹서버를 컴파일하고 설치하기 위해 소스트리를 구성하기 위한 스크립트입니다.유닉스와 유닉스류 시스템에서는 최상위 디렉토리에서 실행하도록 되어있으며 다른 플랫폼을 사용한다면 해당 플랫폼 문서에서 확인할 수 있다고 하네요.

  • 아파치 패키지에 있는 추가모듈을 설치하고자 할 때 이미 아파치가 설치되어 있는 경우에는 기존 설정정보를 덮어쓰지 않을까요

확인 결과 패키지 내 추가모듈만을 설치할 때에는 기존 httpd.conf파일에 해당 부분이 추가가 될 뿐입니다. 단지 --with-apr --with-apr-util 를 명시하지 않은 경우에는 재설치로 해당 APR이나 APU  사용하기 위해 배포본에서 함께 컴파일 및 인스톨하게 됩니다. 패키지내 모듈을 추가하실 때에는 이 두 옵션을 사용하시면 됩니다. 참고로 새로이 설정작업을 하시는 경우에는 make clean을 통해 컴파일 정보를 삭제할 수 있습니다. 하지만 언제나 백업은 필수겠죠…..

  • 아파치 2.2버전에서 SSL을 추가 설치했는데요. mod_ssl.so를 확인할 수 없습니다.

아파치는 mod_so LoadModule 지시어로 실행중에 동적공유객체를 서버로 읽어들일수 있으며 이런 확장방식을 사용하기 위해서는 플랫폼이 DSO 기능을 지원하고 아파치 httpd 실행파일을 mod_so모듈과 함께 컴파일해야 합니다. apxs도구는 이 조건이 만족하지 않으면 실행되지 않습니다. httpd –l을 이용하면 설치된 모듈목록을 확인할 수 있습니다. 하지만 mod_ssl.c 항목을 발견하셨다면 해당 모듈이 앞서말한 이유로 공유객체가 아닌 정적으로 설치되었기 때문입니다. 즉 아파치가 구동과 동시에 항상 로드되도록 구성되었다는 의미이며  이 경우 httpd.conf에서 LoadModule ssl_module modules/mod_ssl.so 라인이 추가되지 않습니다. 하지만 정상적으로 설치된 상태입니다.

 

ThreadLocal의 사용법과 활용

개발 이야기/Java | 2009. 4. 3. 13:54
Posted by 시반

예전에 스트럿츠2의 아키텍쳐를 공부하던 중에 "액션 컨텍스트가 메소드 호출에 파라미터로서 전달되지 않도록 쓰레드로컬을 구현하고 있으며 -java.lang.ThreadLocal은 자바 1.2에서 추가된 기능이다- 액션 컨텍스트는 각 쓰레드가 객체 자신의 인스턴스를 소유하는 Thread-specific storage를 제공하며 쓰레드 로컬값을 얻기위한 Access 는 쓰레드 로컬값이 어느 곳에서도 다뤄질 수 있도록 하기 위한 정적메소드이다."라고 했던 문구에서 자바1.2 버전부터 지원했다는 쓰레드 로컬이란 이름이 왜 그리 낯설기만 한지 당시엔 기냥 이름 그대로 쓰레드 단위로 로컬변수를 할당하고 사용한다는 의미로만 이해했다.(나중에 알고보니 틀린말은 아니었지만..자바 개발한지 나름 꽤 오래되었다고 생각했는데 용어자체가 낯설게 느껴진다는게 정말 난 날코더인가 하는 생각이 들었던 순간이었다...).

이후로 기냥저냥 코드를 보고 그냥 저냥 그렇게 쓰이는구나라구 넘어가고 그럭저럭 다른 사람에게 이야기할정도로 자주 사용하게 된 기능이지만 자바캔 블로그 에서 로컬쓰레드에 대해서 설명을 한 글이 있기에 올려본다.

(솔직히 능력이 된다면야 ThreadLocal 에 대해 직접 글을 올렸겠지만 올렸다 하더라도 madVirus님처럼 설명할 자신은 정말 없다. -_- .그래서 더더욱 슬프당.흐미~)

 

쓰레드 단위로 로컬 변수를 할당하는 기능은 ThreadLocal 클래스를 통해서 제공되는데

다음 글에서는 ThreadLocal 클래스의 기본적인 사용방법과 활용 방법을 살펴보도록 한다.

ThreadLocal이란?

일반 변수의 수명은 특정 코드 블록(예, 메서드 범위, for 블록 범위 등) 범위 내에서만 유효하다.

{
    int a = 10;
    ...
   // 블록 내에서 a 변수 사용 가능
}
// 변수 a는 위 코드 블록이 끝나면 더 이상 유효하지 않다. (즉, 수명을 다한다.)

반면에 ThreadLocal을 이용하면 쓰레드 영역에 변수를 설정할 수 있기 때문에, 특정 쓰레드가 실행하는 모든 코드에서 그 쓰레드에 설정된 변수 값을 사용할 수 있게 된다. 아래 그림은 쓰레드 로컬 변수가 어떻게 동작하는 지를 간단하게 보여주고 있다.


위 그림에서 주목할 점은 동일한 코드를 실행하는 데, 쓰레드1에서 실행할 경우 관련 값이 쓰레드1에 저장되고 쓰레드2에서 실행할 경우 쓰레드2에 저장된다는 점이다.


ThreadLocal의 기본 사용법

ThreadLocal의 사용방법은 너무 쉽다. 단지 다음의 네 가지만 해 주면 된다.
  1. ThreadLocal 객체를 생성한다.
  2. ThreadLocal.set() 메서드를 이용해서 현재 쓰레드의 로컬 변수에 값을 저장한다.
  3. ThreadLocal.get() 메서드를 이용해서 현재 쓰레드의 로컬 변수 값을 읽어온다.
  4. ThreadLocal.remove() 메서드를 이용해서 현재 쓰레드의 로컬 변수 값을 삭제한다.
아래 코드는 ThreadLocal의 기본적인 사용방법을 보여주고 있다.

// 현재 쓰레드와 관련된 로컬 변수를 하나 생성한다.
ThreadLocal<UserInfo> local = new ThreadLocal<UserInfo>();

// 로컬 변수에 값 할당
local.set(currentUser);

// 이후 실행되는 코드는 쓰레드 로컬 변수 값을 사용
UserInfo userInfo = local.get();

위 코드만으로는 ThreadLocal이 어떻게 동작하는 지 잘 이해가 되지 않을테니, 구체적인 예제를 이용해서 ThreadLocal의 동작 방식을 살펴보도록 하겠다. 먼저 ThreadLocal 타입의 static 필드를 갖는 클래스를 하나 작성해보자.

public class Context {
    public static ThreadLocal<Date> local = new ThreadLocal<Date>();
}

이제 Context 클래스를 사용해서 쓰레드 로컬 변수를 설정하고 사용하는 코드를 작성할 차례이다. 아래는 코드의 예이다.

class A {
    public void a() {
        Context.local.set(new Date());
       
        B b = new B();
        b.b();

        Context.local.remove();
    }
}

class B {
    public void b() {
        Date date = Context.local.get();

        C c = new C();
        c.c();
    }
}

class C {
    public void c() {
        Date date = Context.local.get();
    }
}

위 코드를 보면 A, B, C 세 개의 클래스가 존재하는데, A.a() 메서드를 호출하면 다음 그림과 같은 순서로 메서드가 실행된다.


위 그림에서 1~10은 모두 하나의 쓰레드에서 실행된다. ThreadLocal과 관련된 부분을 정리하면 다음과 같다.
  • 2 - A.a() 메서드에서 현재 쓰레드의 로컬 변수에 Date 객체를 저장한다.
  • 4 - B.b() 메서드에서 현재 쓰레드의 로컬 변수에 저장된 Date 객체를 읽어와 사용한다.
  • 6 - C.c() 메서드에서 현재 쓰레드의 로컬 변수에 저장된 Date 객체를 읽어와 사용한다.
  • 9 - A.a() 메서드에서 현재 쓰레드의 로컬 변수를 삭제한다.
위 코드에서 중요한 건 A.a()에서 생성한 Date 객체를 B.b() 메서드나 C.c() 메서드에 파라미터로 전달하지 않는다는 것이다. 즉, 파라미터로 객체를 전달하지 않아도 한 쓰레드로 실행되는 코드가 동일한 객체를 참조할 수 있게 된다.

ThreadLocal의 활용

ThreadLocal은 한 쓰레드에서 실행되는 코드가 동일한 객체를 사용할 수 있도록 해 주기 때문에 쓰레드와 관련된 코드에서 파라미터를 사용하지 않고 객체를 전파하기 위한 용도로 주로 사용되며, 주요 용도는 다음과 같다.

  • 사용자 인증정보 전파 - Spring Security에서는 ThreadLocal을 이용해서 사용자 인증 정보를 전파한다.
  • 트랜잭션 컨텍스트 전파 - 트랜잭션 매니저는 트랜잭션 컨텍스트를 전파하는 데 ThreadLocal을 사용한다.
  • 쓰레드에 안전해야 하는 데이터 보관

이 외에도 쓰레드 기준으로 동작해야 하는 기능을 구현할 때 ThreadLocal을 유용하게 사용할 수 있다.

ThreadLocal 사용시 주의 사항

쓰레드 풀 환경에서 ThreadLocal을 사용하는 경우 ThreadLocal 변수에 보관된 데이터의 사용이 끝나면 반드시 해당 데이터를 삭제해 주어야 한다. 그렇지 않을 경우 재사용되는 쓰레드가 올바르지 않은 데이터를 참조할 수 있다.

 

도메인이란? 관리적인 개념으로서 단일 Administration Server로 관리하는 Server, Machine 및 Cluster의 그룹(인터넷 도메인 x)

- 시작 → 프로그램 → Oracle WebLogic → WebLogic Server 10gR3 → Tools → Configuration Wizard

- Create a new WebLogic domain 선택



- Generate a domain configured automatically to support to following products 선택



- User name과 User password 설정



- 서버 모드(개발, 운용) 및 JDK 설정



- 다른 옵션들 추가 설정



- 도메인 이름, 디렉토리 설정



- 도메인 생성 완료






※ html, jsp, Servlet 테스트

Test.war 파일을 배치하여 테스트 해봅시다.

- Test.war 파일을 적당한 위치로 옮깁니다.




- 서버를 실행합니다.
시작 → 프로그램 → Oracle WebLogic → User Projects → base_domain → Start Admin Server for Weblogic Server Domain



Administration Console을 실행합니다.



- 왼쪽의 Domain Structure 트리에서 Deployments를 선택합니다.



-
Install 클릭



- 배치할 파일이나 디렉토리를 설정합니다.
여기서 war, jar 파일이나 디렉토리가 선택이 되지 않으면 잘못 작성되었기 때문입니다.



- Next 클릭



- Finish 클릭.(더 자세한 설정을 하려면 Next로 더 설정할 수 있습니다)



- war 파일이 정상적으로 배치(deploy) 되었습니다.



- html 테스트



- jsp 테스트



- Servlet 테스트



앞서 말한바와 같이 antop님의 블로그에서 퍼왔습니다.

테스트 파일은 첨부파일로 별도 첨부합니다..

출처 : http://antop.tistory.com/

 

ExtJS에서 많이 쓰이는 것중 하나가 그리드 또는 트리패널이 아닐까 싶다.

데이타 갱신이나 검색시 해당 레코드나 트리 노드에 선택포커스를 주게 된다.

페이징처리가 되는 그리드나 노드가 그다지 많지 않은 트리패널에서야

selectRow() 메소드나 select() 메소드로 해당 레코드와 노드가 선택되었슴만 표시해도 상관없다.

하지만 스크롤링 되는 경우 패널 하단에 위치한 레코드나 노드가 선택될 때

선택마스크는 표시가 되는데 선택위치로 자동스크롤링이 되지 않는다.

즉 선택된 곳에 스크롤바가 위치하게 하고 싶을 때...

그럴때는 focusRow() 나 ensureVisible() 로 선택된 레코드나 노드위치로 자동스크롤링을 해줄수 있다.

 

그리드인 경우

그리드패널.getView().focusRow(선택된 레코드의 Index);

 

트리패널인 경우

선택된트리노드.ensureVisible();

 
블로그 이미지

시반

시반(詩伴)이란 함께 시를 짓는 벗이란 뜻을 가지고 있습니다. 함께 나눌수 있는 그런 공간이길 바라며...

카테고리

분류 전체보기 (233)
개발 이야기 (73)
WEB2.0 (57)
DB2 (24)
MySQL (6)
오라클 (26)
기타 (44)
취미 (0)
잡담 (2)