[펌]세상을 변화시킬 기술들

ITWeb/스크랩 2008. 7. 16. 14:04
아래 막강한 기술에서 제가 해보거나 관심 있어 했던것들은...

3. 소셜네트워크/소셜소프트웨어
4. 클라우드 컴퓨팅/ 클라우드 웹플랫폼
5. 매시업
6. 유저 인터페이스
10. 시맨틱스

흠.. 저도 벌써.. 한 5가지는 관심 및 경험이 있는 거내요.. ^^*
앞으로 기술적으로 뒤쳐지지 않으려면.. 열심히 더 갈고 닦아야 할듯 하내요.. :)

ref. http://www.eetkorea.com/ART_8800534311_480103_NT_2d630d17.HTM?click_from=RSS

가트너에 의하면 소셜 네트워킹 기술들, 웹 매시업, 멀티코어 및 하이브리드 프로세서들, 그리고 클라우드 컴퓨팅은 향후 5년 동안 IT의 지형을 변화시킬 10가지 가장 파괴적인 기술들에 속하는 것들이라고 한다.

파괴적인 기술이란 비즈니스 모델, 프로세스, 수입의 흐름, 산업 역학, 소비자 행동을 포함하여 ‘어떤 일을 하는 받아들여진 방식’에 주요한 변화를 일으키는 기술이다.

가 트너의 분석가 David Cearley 씨는 조직들이 직원들의 협력을 향상시키고 고객들의 커뮤니티 피드백을 이용할 방법을 모색함에 따라 비즈니스 IT 어플리케이션들이 Facebook이나 MySpace 같은 인기있는 소비자 소셜 소프트웨어에서 발견되는 특징들을 따라하기 시작할 것이라고 말했다.

“소셜 소프트웨어는 직원과 고객들의 참여와 피드백을 똑같이 장려하는 플랫폼을 제공한다”고 그는 말했다. “비즈니스를 위해 새로 부가된 가치는 이 피드백을 종합적인 태도들을 반영하는 한 곳으로 모을 수 있게 하며, 이것은 비즈니스 전략을 짜는데 도움이 될 수 있다.”

멀티코어 프로세서들은 소프트웨어로 가능한 것들의 지평을 확대해주지만 싱글 스레드 어플리케이션들은 이들의 파워를 이용할 수 없을 것이라고 Cearley 씨는 말했다. 그러므로 기업들은 멀티코어 시대에 서비스 레벨 요건들을 계속 충족시키도록 개선이 필요한 어플리케이션들을 찾아내기 위해 검사를 수행한다.

가트너는 공중이 이용할 수 있는 소스들로부터 나온 콘텐츠를 믹스한 웹 매시업이 2010년에는 새로운 기업용 어플리케이션을 만드는데 있어서 지배적인 모델(80퍼센트)이 될 것이라고 예측했다.

“매 시업은 쉽고 빠르게 만들어질 수 있기 때문에, 이들은 보통 개발 비용을 끌어들이지 않는 새로운 종류의 단기 어플리케이션 또는 폐기 가능한 어플리케이션들이 생겨날 수 있도록 한다”고 Cearley 씨는 말했다. “정보를 일반 대쉬보드에 합치거나 위치 추적 또는 매핑 소프트웨어를 이용하여 비주얼화하는 능력은 매우 강력하다.”

가트너에 의하면 향후 5년 안에 정보가 OLED, 디지털 종이 및 전광판, 홀로그래피 및 3D 이미징, 스마트 패브릭 같은 새로운 유저 인터페이스들을 통해 나타내어질 수 있을 것이라고 한다.

2010 년이면 장비가 언제 그리고 어떻게 움직이는 지를 감지하기 위해 전자 장비 일부에 3축 가속도계를 추가하는데 1달러 미만이 들게 될 것이다. 이 3축 가속도계는 닌텐도의 Wii 컨트롤러 같은 디바이스를 허용한다. “가속과 자세(기울기)는 무선 같은 기술들과 합쳐져 ‘터치를 통해 명함을 교환하는 것’과 같은 기능들을 수행할 수 있다”고 Cearley 씨는 말했다.

기존의 틀을 넘어서라

Cearley 씨는 CIO(Chief Information Officer)들이 자신들의 일을 “데이터 센터 가동을 유지시키고, 비즈니스 연속성을 계획하며, 사람들에게 보여줄 새로운 기술 장난감들을 찾는 것” 정도로 여긴다면 앞으로 살아 남을 수 없을 것이라고 말한다. 대신, 이들은 앞으로 널리 사용될 기술들을 식별하기 위해서 종래의 제약을 넘어서서 생각해야 한다.

가 트너는 CIO가 새로 떠오르는 추세와 기술들을 평가하기 위하여 공식적인 메커니즘을 세우고, 최고의 스태프로 가상 팀을 구성하며, 이들에게 새로운 아이디어와 혁신들, 특히 컨수머 및 웹 2.0 기술에 의해 유도된 것들을 탐구할 시간을 줄 것을 권한다.

“CIO는 비즈니스에서 기술까지 도랑 역할을 할 필요가 있다. 그는 비즈니스가 확인한 문제들을 풀기 위하여 이러한 기술들을 사용하는 것이 어떻게 가능한 지를 살펴보아야 한다”고 Cearley 씨는 말했다.




:

야후 블로그 랭킹 검색..

ITWeb/스크랩 2008. 7. 15. 10:16
야후코리아에서 블로그 랭킹 검색을 선보였내요.. ^^*
전직장이라 그런지 뭐든 좋은 기능들이 하나씩 추가 되는걸 보면 저도 기분이 좋답니다.

저 역시 회사를 나오기 전까지 관심 있게 봤던 부분이 그리드 컴퓨팅 부분 이였는데..
야후에서는 hadoop 을 가장 잘 쓰고 있는 회사이지요..
저 역시 검색쪽 일을 많이는 못했지만.. 2년 정도 한것 같내요.
검색 업무를 하다 보니.. 역시 재밌더라구요..
알아야 할것도 많고 배워야 할것도 많고.. 야후코리아가 한국에서는 실력발휘를 못하고는 있지만 그 기술적인 부분에서는 역시 라는 생각을 해봅니다..

야후를 6년 다니고 나왔는데.. 아직 그 향수병에서 벗어나지는 못한것 같내요.. ^^;
그 만큼 좋은 회사라는 거겠죠..

앞으로도 야후 화이팅 입니다..

그럼.. 저는 몇등일까요???
http://kr.blog.search.yahoo.com/search/comm?p=jjeong&subtype=CommBlogger&x=27&y=15

블로그명 [총 55 개중 1 - 20]

jjeong 닉네임 : jjeong

jjeong.tistory.comrss | 랭킹 182,633위 정보보기

jjeong♥[박준석.에이시아.가비엔제이] 닉네임 : jjeong

blog.daum.net/jjeongrss | 랭킹 1,053,635위 정보보기

jjeong0909 닉네임 : jjeong0909

blog.daum.net/jjeong0909rss | 랭킹 43,023위 정보보기


상단에 "블로그명" 검색 라디오 버튼을 선택 하고 검색을 하시거나 오른쪽 중간 쯤에 있는 블로그랭킹 검색을 함 해보심 됩니다..

관련 뉴스
- http://itviewpoint.com/64342
- http://itnews.inews24.com/php/news_view.php?g_serial=342680&g_menu=020300&fm=rs
- http://www.eetkorea.com/ART_8800534347_839577_NT_d4f5785e.HTM?click_from=RSS

:

[펌]소프트웨어 테스터와 프로그래머의 화합(和合)의 법칙

ITWeb/스크랩 2008. 7. 9. 08:57
소프트웨어 테스터와 프로그래머.. 흠..
지금까지 개발을 해오면서 내가 만든 소프트웨어나 제품에 대해서 문제점을 지적해 주고 오류를 찾아 주는건 고맙다고 생각 한다.
하지만 오류와 문제점에 대한 지적만 할 뿐 그 과정에 대한 설명 없이 들이대는 분들을 종종 많이 보았다.
아래 글을 읽어 보면 알겠지만 모든 일에는 상호 존중과 이해를 기반하지 않고서는 서로 멱살 잡고 싸우기 일수가 아닐까 싶다.. (상호 존중과 이해 역시 담당자들의 실력이 뒷받침 되지 않는 다면 만들어 지지도 않겠지만.. )

배고픔 ㅡㅡ^

ref. http://www.ibm.com/developerworks/kr/library/dwclm/20080708/?ca=drs-kr

소프트웨어 테스터와 프로그래머의 화합(和合)의 법칙



이영석이영석 stone@sqe.co.kr

SOAP, 웹 서비스 등 XML 기반 기술과 BPM을 통한 프로세스 시스템 신봉자로 소프트웨어 품질에 대한 정통부 GS인증 업무를 수행하는 등 개발자 출신 QA라는 흔치 않은 경력을 가지고 있다. 현재 와이즈스톤(www.wisestone.kr) 대표이며, 소프트웨어 품질관리 교육 및 컨설팅 등을 하고 있다.

2008년 7월 8일



얼마 전 프로젝트 종료 후, 참여원들의 정보와 경험을 교환하는 클로징(closing) 회의 중 이런 얘기가 나왔다. "참여 프로그래머들이 같은 회사 사람들이니 다행이지, 서로 모르는 사이였다면 멱살잡고 싸웠을 겁니다." 모두 한참을 웃었다. 프로젝트에 참여한 프로그래머와 테스터 모두 크게 공감한다는 웃음이었다.

실제로 테스팅에 관한 많은 칼럼과 서적에서 빈번하게 언급되는 이슈가 '어떻게 서로 커뮤니케이션을 할 것인가'라는 의사소통에 관한 주제다. 그만큼 프로그래머와 테스터가 함께 참여하는 개발 프로젝트에서 의사소통 문제는 빈번하게 일어난다.

필자도 이전에 본 컬럼을 통해 이러한 문제에 대한 해결 방안의 하나로 BTS(Bug Tracking System) 같은 시스템 도입을 제안한 적이 있다. 서로 얼굴을 맞대고 문제를 논의하는 것보다는 시스템을 통해 감정을 배제한 의사소통이 효율적이라는 이유에서였다.

이번에는 평화로운(?) 의사소통을 위해 테스터와 프로그래머가 서로를 이해하는 데 도움이 될만한 '소프트웨어 테스팅 법칙 293가지'[1]라는 책에 소개된 몇 가지 재미있는 이야기를 소개하고자 한다.

테스터 관점의 이야기이지만, 프로그래머들도 자신들을 이해하고자 하는 테스터의 노력을 이해하고, 테스터의 눈으로 투영되는 자신들의 모습을 되돌아보는 기회가 되기를 바란다. 서로를 이해하고자 하는 노력과 그 결실인 화합이야말로, 성공적인 프로젝트의 가장 기본 전제이며 왕도(王道)이기 때문이다.


법칙 1. 프로그래머들의 사고방식을 이해하라

프로그래머들은 대부분 전문적이다
프로그래머는 자신이 개발해야 하는 모듈과 컴포넌트에 집중하며, 맡은 업무에 대해서는 적어도 팀 내 최고의 전문가라 할 수 있다.
테스터의 업무적 관점은 다르다. 테스터는 테스트할 시스템에 대해 다방면의 정보를 알고 있어야 하고, 각 모듈의 전체적인 조화에 집중한다.

프로그래머는 시스템에 적용된 자신의 논리에 집중한다
프로그래머는 자신이 만든 모듈과 다른 프로그래머가 만든 모듈의 연관성에 대해 이해하고 있다. 또한 발생할 수 있는 오류 처리에 대한 방안도 준비한다. 이러한 이유로 테스터가 오류를 보고할 때 프로그래머들은 종종 그러한 오류가 발생한다는 사실을 믿지 못하고 의심한다. 그러므로 테스터는 프로그래머가 코딩 시 기획했던 데이터 처리의 논리를 염두에 두고 철저하게 증거를 수집해 결함을 찾아야 한다.

프로그래밍은 복잡한 행위다
얽히고설킨 복잡한 구조의 프로그래밍 작업은 집중이 필요로 한 일이다. 이러한 업무 중에 다른 신경 쓰이는 일이 생기는 상황이 유쾌하지는 않을 것이다. 테스터에게는 이러한 프로그래밍 업무에 대한 이해가 필요하다(물론 테스팅이라는 업무 역시 장시간 집중이 필요한 업무라는 것을 프로그래머도 알아야 할 것이다).

프로그래머는 종종 어려운 상황을 감수한다
프로그래머들은 잦은 요구사항 변화에 따른 코드 변경 요구, 버그에 대한 수정 요구 등 작업 집중에 방해되는 환경 속에서 업무를 수행한다.

많은 프로그래머들은 일상적인 반복 업무를 싫어하며, 주어진 반복 업무를 도구나 스크립트를 작성하여 자동화한다
이러한 업무 성향으로 인해 프로그래머들은 테스터들의 매뉴얼한 반복 작업을 비효율적이고 최적화되지 못한 작업으로 이해하기도 한다. 만약 작은 코드 개발에 참여해 프로그래머가 되어 볼 수 있는 기회를 갖는다면, 개발자들을 이해하는 데 좋은 경험이 될 것이다.



위로


법칙 2. 프로그래머와 신뢰를 쌓아라

테스트할 프로그램을 작성하는 프로그래머와 불필요한 적대 관계를 만들 이유가 없다. 프로그래머들과 함께 개발 계획, 요구사항 분석, 초기 프로토타입 등을 공유할 수 있다면 개발자들을 이해하는 데 도움이 될 것이다.

또한 테스터는 프로그래머들이 자신이 이미 아는 내용에 대해 듣고 싶어하는 것이 아니라는 것을 알아야 한다. 가령 예를 들어 개발 초기에 아직 작성하지 않은 오류 처리 방안이나 개발해야 하는 기능에 대해 듣고자 하는 것이 아니라는 것이다. 이러한 부분은 프로그래머가 몰라서 안 되어 있는 것이 아니라 아직 작업을 하지 않은 것뿐이다. 프로그래머가 각 상황에 따라 무엇을 듣고자 하는지에 대한 이해 역시 중요하다.


법칙 3. 서비스를 제공하라

다음 몇 가지 서비스를 제공하는 것으로 둘 사이의 신뢰에 큰 도움이 될 것이다.

  • 서드파티 컴포넌트를 테스트하라. 테스트 결과를 공유함으로써 프로그래머들은 제품에 해당 컴포넌트를 사용할 것인지 여부를 결정할 수 있으며, 또한 어떻게 사용해야 하는지에 대한 정보를 얻을 수 있다.
  • 프로그래머가 스스로 테스트할 수 있는 테스트 환경을 지원하라.
  • 자신이 개발한 모듈을 테스트하기 위해 프로그래머가 부여 받은 테스트 지원 요구사항에 대해 검토하라. 프로그래머들은 애매모호한 요구사항 때문에 난처한 상황에 처하는 경우가 많으므로 테스터가 도와준다면 기뻐할 것이다.

테스팅 업무는 서비스를 제공하는 성향의 업무이므로 테스터가 프로그래머가 필요로 하는 업무에 대해 적극적으로 서비스를 제공한다면 둘 간의 관계는 대립이 아닌 화합의 관계가 될 것이다.


법칙 4. 성실하고 능력을 갖춰야 존중을 받는다

테스터는 고객의 대변자다. 즉 테스터의 궁극적인 업무는 사용자가 겪을 문제점을 보고하는 일이다. 하지만 아무리 좋은 의도를 담은 행동이라도 잘못된 부분을 지적하는 결함에 대한 보고는 유쾌하다고 하기 어렵다. 훌륭한 보고를 위해 다음과 같은 사항을 고려해야 한다.

문제점을 명확하게 보고하라
불필요한 과정과 정보는 생략하고, 버그가 발생되는 운영 절차와 버그에 대한 현상만을 명확하게 기술해야 한다. 프로그래머가 이해하기 쉽고, 버그 발생 과정을 따라 해보기 쉽게 보고해야 한다. 프로그래머가 간결하고 명확한 보고서를 통해 시간을 아낄 수 있다면, 테스터의 시간도 소중하게 생각할 것이다.

제품에서 실제로 수행한 동작을 판단 기준으로 삼는다
프로그래머는 누구보다도 더 프로그램 내부를 잘 안다. 그러니 테스터는 직접 봤던 것에 대해서만 이야기하면 된다. 어떤 점이 문제를 일으켰는지에 대한 추측으로 시간을 낭비할 필요가 없다.

나쁜 소식은 직접 전달하라
프로그래머가 문제 상황을 인식하고 대처할 시간을 준 다음, 상급자에게 보고하라. 또한 이 문제를 상급자에게 보고할 것이라는 것을 개발자에게 이야기해 주어야 한다.

모르는 것을 아는 체 하지 말라
어설픈 추측이 문제 해결을 방해하는 장애물이 될 수 있다.

버그 리포트를 과대 포장하지 않는다
버그 보고는 사실 그대로를 정확하게 전달해야 한다. 발견한 버그를 과대 포장하지도, 과소 평가하지도 말아야 한다. 또 중요한 버그를 찾았다고 그것을 뽐내도 안 된다. 테스터와 프로그래머가 한배를 탄 운명 공동체라는 것을 명심해야 한다.



위로


법칙 5. 사람이 아닌 작업에 집중하라

버그를 발견하면 '버그'를 보고하라. 프로그래머 아무개가 잘못했다는 식으로 보고해서는 안 된다. 문제가 있는 프로그래머를 보고하는 것이 자신의 업무라고 생각한다면, 모든 프로그래머는 여러분과 정보를 공유하지 않을 것이고, 여러분을 피하려고 할 것이다. 이렇게 된다면 신뢰는 깨진다. 테스터의 업무는 잘못하는 프로그래머를 찾는 것이 아니라, 버그를 찾는 것이다.


법칙 6. 프로그래머들은 자신의 일에 대해 이야기하는 것을 좋아한다. 궁금한 점이 있으면 직접 물어보라

프로그래머와 이야기를 통해 정보를 얻기가 어렵다고 말하는 테스터가 많다. 하지만 프로그래머들이 다루는 설계 문서를 이해하고 그것에 관해 이야기를 시작해보자. 가능하면 코드도 살펴보자. 프로그래머 관점에서 이해하고 그 용어를 가지고 개발자들의 화법으로 이야기하고자 한다면 프로그래머들이 얼마나 자기 일에 대해 이야기하기를 좋아하는지 알게 될 것이다.

이런 대화는 시스템을 구축하는 사람들의 마음속에 있는 전제조건을 알아내는 데 도움이 된다. 또한 시스템을 오동작하게 하는 방식을 찾아낼 수 있다. 테스터가 C++나 자바 등 개발 언어를 알고 있다면 좀 더 도움이 될 것이다. 프로그램이 멀티스레드로 동작한다면 스레드가 어떤 것인지 이해하는 것은 중요한 일이다.

어떻게 하면 제품에서 오류가 발생하도록 할 수 있는지에 대해 고민하는 것이 테스터의 업무라 생각할 수 있다. 그러나 팀의 일원으로 지금 만들고 있는 제품의 진정한 가치를 이해해야 한다.


법칙 7. 프로그래머는 테스트를 도와주고 싶어한다

대부분의 프로그래머는 자기가 작성한 프로그램을 테스트하고 싶어한다. 개발자들은 프로그램을 작성하는 중에 자신이 실수했을 수도 있다는 사실을 인정하며, 이러한 실수를 발견해 주기를 기대하고 있다.

테스터는 프로그래머에게 테스트를 쉽게 해주는 테스트 용이성(testability)을 요구하지만 쉽게 목적을 이루지 못한다. 테스트 용이성 확보를 위한 요청에는 다음 핵심 사항이 있어야 한다.

  1. 프로그래머의 언어로 이야기하라.
  2. 빨리 요청하라.
  3. 현실적이어야 한다.

테스터의 요청이 어느 모듈의 어떤 인터페이스를 원하는지 구체적이라면 프로그래머는 훨씬 쉽게 테스터의 요청을 이해할 것이다. 또한 프로젝트 초기에 테스팅에 관한 요청이라면 개발 일정에 그러한 요구사항을 고려하여 일정을 계획할 수 있어 프로그래머의 업무 진행에 대한 부담이 줄어든다(빠듯한 개발 일정 중간에 테스팅을 위한 지원 요청은 프로그래머에게 정말 감당하기 힘든 스트레스가 된다). 테스트 지원을 위한 코드 추가가 제품을 만들기 위한 프로그래밍보다 부담이 된다면 그러한 요구 또한 옳지 못하다.

많은 테스터들이 프로그래머가 항상 핑계를 댄다고 말한다. '테스트를 위해 포함되는 그 코드가 소프트웨어 보안에 문제를 일으킬 것 같아요', '성능 저해 요인이 될 것입니다' 그러나 이러한 이야기는 오히려 개발자들이 테스트를 위한 코드에 관심이 많다는 의미일 수 있다.

테스터는 프로그래머로 하여금 테스터를 도와주는 것이 궁극적으로 자신에게 도움이 된다는 사실을 인식시키는 것이 무엇보다 중요하다!



위로


후기

대다수의 프로그래머들에게 테스터를 존중하는 마음이 부족한 것이 사실이다. 테스터들을 자신들의 생산품인 프로그램의 '옥의 티'와 같은 흠을 찾아내 닦아주는 흡사 도우미(maid) 정도로 생각한다.

그렇다면 테스터는 이러한 인식을 가진 프로그래머에 대해 어떤 생각을 가지겠는가. 사람 마음은 인지상정(人之常情)이라 똑같지 않을까? 자신을 존중하지 않는 상대에게 좋은 감정을 갖기는 어려울 것이다. 어쩌면 테스터들 눈에는 결점 가득한 프로그램을 만든 프로그래머가 그 코드처럼 결점투성이의 부족한 사람으로 보일 수도 있을 것이다.

원론적인 결론이지만 서로 업무를 존중하고, 개인적인 친분을 위해 노력하는 것이 원만한 상호 관계를 유지하는 방법이라 할 수 있을 것이다. 성서에도 있지 않은가. 사람이 목숨을 유지하기 위해서는 눈, 코, 입, 손, 발 중 하나만 있어서 되는 것이 아니라, 중요한 것은 모두의 화합이라고.



위로


[1] Cem Kaner, James Bach, Bret Pettichord, 소프트웨어 테스팅 법칙 293가지(LESSON LEARNED IN SOFTWARE TESTING: A CONTEXT-DRIVEN APPROACH), 정보문화사, 2004


:

[펌]MySQL log document 해석

ITWeb/서버관리 2008. 7. 2. 11:42
ref. http://database.sarang.net/?inc=read&aid=24921&criteria=mysql&subcrit=columns&id=&limit=20&keyword=&page=1

5.11.1 The Error Log
The error log는 서버가 시작, 종료시간, 치명적인 에러를 저장한다.
예기치 못한 서버종료와 재시작이 필요한 경우, 테이블에 에러가 있어 자동으로 복구한 경우 로그를 남깁니다.
OS에 따라 서버가 종료될 때 a stack trace가 남는데, 어떤 동작을 하다 종료되었는지 알 수 있다. (E.1.4, “Using a Stack Trace”. 을 참고하라.)
--log-error[=file_name] 옵션으로 로그파일 이름과 저장경로를 지정할 수 있다. (기본 host_name.err, data directory)
FLUSH LOGS를 실행하면 파일 이름에 -old 문자를 추가하고 새로운 로그파일을 만든다. --log-error 옵션이 없다면 파일이름을 바꾸지 않는다.
--log-error 가 없거나 윈도우 시스템에서 --console 옵션을 사용하면 에러는 the standard에 기록된다.
윈도우 시스템에서 --console 옵션이 없다면 .err 파일에 기록된다.


5.11.2 The General Query Log
--log[=file_name] or -l [file_name] 옵션으로 사용하면 MySQL에서 발생하는 것을 기록한다.
기본 로그파일명은 host_name.log 이다.
접속기록과 실행문장을 기록한다.
사용자에게 에러가 발생한 내용이나 사용자가 실행한 내용을 알아내는데 유용하다.
로그는 실제 실행된 순서와 다를 수도 있다. 이것은 쿼리문이 실행될 때 기록되는 update log 와 binary log와는 달리 락이 풀릴 때 (실행이 완료될 때)를 기준으로 로그가 기록되기 때문이다.
이 로그는 모든 문장을 포함하지만 binary log는 select 같은 문장은 포함하지 않는다.

서버가 재시작 되거나 FLUSH LOGS를 실행하여도 새로운 로그파일을 만들지 않는다.
윈도우 시스템에서는 서버를 중지하고 파일이름을 변경하여야 하고 다른 시스템은 아래 실행문으로 변경할 수 있다.
shell> mv hostname.log hostname-old.log
shell> mysqladmin flush-logs
shell> cp hostname-old.log to-backup-directory
shell> rm hostname-old.log


5.11.3 The Binary Log
Binary Log는 더 효과적인 포맷과 트랜잭션을 포함하여 Update Log 에 있는 유용한 모든 정보를 저장하고 있다. Binary Log는 데이타를 업데이트하는 모든 문장과 수정하지 않는 문장(일치하는 값이 없는 Delete 문) 을 저장한다. 문장은 수정된 내용을 표현하는 이벤트의 형식으로 저장된다. Binary Log는 Update Log 대신 사용해 왔다. Update Log는 MySQL5.0에서는 사용할 수 없다.
Binary Log는 각각의 문장이 데이타베이스를 업데이트하는데 걸린 신간도 포함하고 있다. 데이타를 수정하지 않는 문장은 포함하지 않는다. 만일 장애 수정등의 쿼리문을 보고싶다면 General Query Log를 사용하라.
Binary Log를 사용하는 첫번째 이유는 백업된 이후에 모든 업데이트 문장을 포함하고 있기 때문에 복구명령을 사용할 때 가능한 모든 부분을 업데이트하기 위한 것이다.
Binary Log는 slave서버에 전송된 문장들이 기록되어 replication server에 사용된다.
Binary Log를 사용하면 시스템 성능이 1%정도가 감소하지만 복구와 백업서버 운영에 상당히 유용하다.
--log-bin[=file_name] 옵션으로 시작하면 모든 데이타를 수정하는 SQL명령을 기록한다. 파일명을 기입하지 않으면 -bin다음에 호스트명이 파일명이 된다. 경로가 없는 파일명은 데이타 디렉터리가 기본이 된다.
파일에 확정자를 붙여도 숫자로된 확장자가 자동으로 붙는다. 서버가 재시작하거나 Flush Logs를 실행하면 숫자가 자동 증가한다. 또한 로그파일 크기가 max_binlog_size 에 도달하면 자동으로 증가한다. 많은 양의 트랜잭션을 사용하면 트랜잭션 로그는 로그파일에 나눠서 저장될 수 없기 때문에 max_binlog_size가 조금 커질 수도 있다.
어떤 binary log 파일들이 사용되었는지 알기 위해 사용된 파일이름을 저장하는 인덱스파일을 만든다. 파일명은 로그파일명, 확장자는 .index로 생성되는데 --log-bin-index[=file_name] 을 사용하여 파일명을 지정할 수 있다. 서버가 실행중일 때는 수동으로 편집할 수 없다.
모든 binary log파일은 RESET MASTER 문과 PURGE MASTER LOGS 문으로 삭제할 수 있다. Section 13.5.5.5, “RESET Syntax” and Section 13.6.1, “SQL Statements for Controlling Master Servers” 부분을 참고.

binary log format 은 백업과 복구에 제한이 있는데 Section 6.7, “Replication Features and Known Problems” 부분을 참고하라.
Binary logging 에서 프로시저(stored routines) 와 트리거(triggers)는 Section 17.4, “Binary Logging of Stored Routines and Triggers”를 참고하라.


다음은 binary log에 사용되는 옵션이다.

--binlog-do-db=db_name
db_name 은 binary log 를 사용할 디비를 선택하는 옵션이다. 선택되지 않은 디비는 로그가 남지 않고 현재 작업중인 디비를 업데이트 한다는 것을 확인하기 바란다.
Tells the master that it should log updates to the binary log if the current database (that is, the one selected by USE) is db_name. All other databases that are not explicitly mentioned are ignored. If you use this, you should ensure that you only do updates in the current database.


CREATE DATABASE, ALTER DATABASE, and DROP DATABASE 문장은 예외이다. (현재 디비의 로그를 남겨야 할지 명확하지 않는 문장인 구문이기 때문이다.)
Observe that there is an exception to this as regards the CREATE DATABASE, ALTER DATABASE, and DROP DATABASE statements, which use the database manipulated to decide if it should log the statement rather than the current database.


예상한 것과 다르게 로그가 남기는 예로
sales 디비를 사용하는 옵션(binlog-do-db=sales)으로 서버를 시작하여 prices 디비를 사용하다 UPDATE sales.january SET amount=amount+1000;라는 쿼리문을 실행하면 이 로그는 binary log에 남지 않는다.
An example of what does not work as you might expect: If the server is started with binlog-do-db=sales, and you do USE prices; UPDATE sales.january SET amount=amount+1000;, this statement does not get written into the binary log.


--binlog-ignore-db=db_name
현재 사용중인 디비에서 실행한 쿼리문의 로그가 저장되지 않는다.
Tells the master that updates where the current database (that is, the one selected by USE) is db_name should not be stored in the binary log. If you use this, you should ensure that you only do updates in the current database.

위에 거와 같음.
An example of what does not work as you might expect: If the server is started with binlog-ignore-db=sales, and you do USE prices; UPDATE sales.january SET amount=amount+1000;, this statement is not written into the binary log.


--binlog-do-db 옵션과 비슷한 경우로 CREATE DATABASE, ALTER DATABASE, and DROP DATABASE 문은 로그가 없다.
Similar to the case for --binlog-do-db, there is an exception to the CREATE DATABASE, ALTER DATABASE, and DROP DATABASE statements, which use the database manipulated to decide if it should log the statement rather than the current database.


여러개의 디비를 지정하려면 각각의 디비마다 적당한 옵션을 실행해야 한다.
To log or ignore multiple databases, use multiple options, specifying the appropriate option once for each database.


아래 규칙에 따라 binary log 에 업데이트할지 옵션을 활성화 한다. CREATE/ALTER/DROP DATABASE 문은 예외이다.
The server evaluates the options for logging or ignoring updates to the binary log according to the following rules. Observe that there is an exception for CREATE/ALTER/DROP DATABASE statements. In those cases, the database being created, altered, or dropped replaces the current database in the rules below.

Are there binlog-do-db or binlog-ignore-db rules?

No: Write the statement to the binary log and exit.

Yes: Go to the next step.

There are some rules (binlog-do-db or binlog-ignore-db or both). Is there a current database (has any database been selected by USE?)?

No: Do not write the statement, and exit.

Yes: Go to the next step.

There is a current database. Are there some binlog-do-db rules?

Yes: Does the current database match any of the binlog-do-db rules?

Yes: Write the statement and exit.

No: Do not write the statement, and exit.

No: Go to the next step.

There are some binlog-ignore-db rules. Does the current database match any of the binlog-ignore-db rules?

Yes: Do not write the statement, and exit.

No: Write the query and exit.


예를 들어 only binlog-do-db=sales 옵션으로 운영되는 슬레이브 서버는 현재 사용중인 디비가 sales 일지라도 binary log에 로그를 남기지 않는다. (다른 말로 binlog-do-db는 때로 다른 디비는 무시하라(ignore other databases) 를 의미하기 때문이다. 슬레이브는 다른 컴퓨터니까 다른 디비로 인식한다는 것 같은데요.)
For example, a slave running with only binlog-do-db=sales does not write to the binary log any statement whose current database is different from sales (in other words, binlog-do-db can sometimes mean “ignore other databases”).


만약 복제서버를 운영하고 있다면 모든 슬레이브 서버가 더이상 binary log 를 필요하지 않을 때 삭제해야 한다. 간단한 예로 매일 mysqladmin flush-logs 명령을 한번 실행하고 3일전에 실행한 로그를 지워라. 수동으로 지우던가 binary log에 대한 인덱스 파일을 안전하게 업데이트 하려면 PURGE MASTER LOGS를 사용하여 지워라. Section 13.6.1, “SQL Statements for Controlling Master Servers” 참고.
If you are using replication, you should not delete old binary log files until you are sure that no slave still needs to use them. One way to do this is to do mysqladmin flush-logs once a day and then remove any logs that are more than three days old. You can remove them manually, or preferably using PURGE MASTER LOGS (see Section 13.6.1, “SQL Statements for Controlling Master Servers”), which also safely updates the binary log index file for you (and which can take a date argument).


SUPER 권한(루트권한?) 이 있는 사용자는 SET SQL_LOG_BIN=0 문을 사용하여 로그에 로그를 안남길 수 있다. Section 13.5.3, “SET Syntax” 참고.
A client with the SUPER privilege can disable binary logging of its own statements by using a SET SQL_LOG_BIN=0 statement. See Section 13.5.3, “SET Syntax”.


mysqlbinlog 유틸을 사용하여 binary log 파일을 확인할 수 있다. 로그파일에 있는 기록을 다시 실행할 때 유용하다. 예를 들어 아래처럼 binary log 를 이용하여 서버를 업데이트 할 수 있다.
You can examine the binary log file with the mysqlbinlog utility. This can be useful when you want to reprocess statements in the log. For example, you can update a MySQL server from the binary log as follows:


shell> mysqlbinlog log-file | mysql -h server_name


더 많은 mysqlbinlog에 대한 정보와 사용법은 Section 8.6, “mysqlbinlog ? Utility for Processing Binary Log Files” 을 참고.
See Section 8.6, “mysqlbinlog ? Utility for Processing Binary Log Files” for more information on the mysqlbinlog utility and how to use it.


트랜잭션을 사용한다면 백업을 위해 update log 대신에 MySQL binary log를 이용해야 한다.
If you are using transactions, you must use the MySQL binary log for backups instead of the old update log.


binary log 는 쿼리가 완료된 직후에 기록된다. 이것은 테이블의 락이 풀리거나 commit 명령이 완료되기 전일 수도 있다. 즉, 실행 순서에 따라 로그가 기록된다는 것이다.
The binary logging is done immediately after a query completes but before any locks are released or any commit is done. This ensures that the log is logged in the execution order.


트랜잭션을 사용하지 않는 테이블은 실행된 직후에 binary log에 저장된다. BDB or InnoDB 같은 트랜잭션 테이블에서 테이블을 변경하는 모든 업데이트문장은 COMMIT 명령이 서버로부터 전달될 때까지 적용하지 않지만 COMMIT 명령이 실행되기 전에 모든 트랜잭션은 binary log에 저장된다. 트랜잭션을 관리하는 스레드가 시작되면 buffer queries 에 buffer of binlog_cache_size 를 할당한다. 만일 문장 크기가 더 크다면 스레드는 스랜잭션을 임시파일에 저장한다. 스레드가 종료되면 임시파일은 삭제된다.
Updates to non-transactional tables are stored in the binary log immediately after execution. For transactional tables such as BDB or InnoDB tables, all updates (UPDATE, DELETE, or INSERT) that change tables are cached until a COMMIT statement is received by the server. At that point, mysqld writes the whole transaction to the binary log before the COMMIT is executed. When the thread that handles the transaction starts, it allocates a buffer of binlog_cache_size to buffer queries. If a statement is bigger than this, the thread opens a temporary file to store the transaction. The temporary file is deleted when the thread ends.


Binlog_cache_use 의 상태변수를 보면 쿼리문을 저장하는데 이 버퍼(임시파일 포함)를 사용하는 트랜잭션 수를 알 수 있다. Binlog_cache_disk_use는 얼마나 많은 트랜잭션이 실제로 사용한 임시파일 수를 알 수 있다. 이 변수들은 임시파일을 사용하지 않을 정도의 충분한 binlog_cache_size 용량을 튜닝하는데 유용하다.
The Binlog_cache_use status variable shows the number of transactions that used this buffer (and possibly a temporary file) for storing statements. The Binlog_cache_disk_use status variable shows how many of those transactions actually did have to use a temporary file. These two variables can be used for tuning binlog_cache_size to a large enough value that avoids the use of temporary files.


max_binlog_cache_size 는 4G가 기본이고 트랜잭션이 이보다 클경우 모두 롤백된다.
The max_binlog_cache_size (default 4GB) can be used to restrict the total size used to cache a multiple-statement transaction. If a transaction is larger than this, it fails and rolls back.


update log 또는 binary log를 사용하고 있다면 CREATE ... SELECT 또는 INSERT ... SELECT 를 사용할 때 concurrent inserts은 normal inserts 로 변환된다. 백업된 로그를 적용해서 동일한 테이블을 생성할 수 있다.
If you are using the update log or binary log, concurrent inserts are converted to normal inserts when using CREATE ... SELECT or INSERT ... SELECT. This is to ensure that you can re-create an exact copy of your tables by applying the log on a backup.


MySQL 5.0에서 binary log format은 복제기능 향상을 위해 이전의 다른 버전과 다르게 되어 있다.
Note that the binary log format is different in MySQL 5.0 from previous versions of MySQL, due to enhancements in replication. See Section 6.5, “Replication Compatibility Between MySQL Versions”.


기본적으로 binary log 는 모든 쓰기문장을 디스크에 동시에 저장하지는 않는다. OS에서 충돌이 발생하면 마지막 쿼리문을 기록하지 로그에 기록하지 않을 수 있다. 이것을 막으려면, sync_binlog global variable를 사용하여 Nth binary log 를 기록한 후에 바로 디스크에 기록할 수 있다. (1로 설정하는 것이 가장 안전하지만 가장 느리다.) Section 5.3.3, “Server System Variables” 참고.
sync_binlog 을 1로 설정하더라도 시스템상에 충돌이 있다면 테이블과 로그의 값이 다를 수 있다. 예를 들어 InnoDB 테이블을 사용하면서 COMMIT 명령이 실행되면 모든 트랜잭션을 binary log 에 저장하고 InnoDB 에 값을 적용한다. 두가지 수행과정중 충돌이 발생하면 InnoDB에 의해 트랜잭션은 롤백되지만 binary log에 여전히 로그가 남아 있게 된다. 이 문제를 해결하려면 --innodb-safe-binlog 옵션을 사용해야 InnoDB 테이블과 binary log 사이에 일관성이 유지된다. (Note: --innodb-safe-binlog 는 MySQL 5.0.3 버젼에서는 필요하지 않다. 이 문서는 XA 트랜잭션 지원을 위해서 만들어 졌다.)
By default, the binary log is not synchronized to disk at each write. So if the operating system or machine (not only the MySQL server) crashes, there is a chance that the last statements of the binary log are lost. To prevent this, you can make the binary log be synchronized to disk after every Nth binary log write, with the sync_binlog global variable (1 being the safest value, but also the slowest). See Section 5.3.3, “Server System Variables”. Even with sync_binlog set to 1, there is still the chance of an inconsistency between the tables content and the binary log content in case of crash. For example, if using InnoDB tables, and the MySQL server processes a COMMIT statement, it writes the whole transaction to the binary log and then commits this transaction into InnoDB. If it crashes between those two operations, at restart the transaction is rolled back by InnoDB but still exists in the binary log. This problem can be solved with the --innodb-safe-binlog option, which adds consistency between the content of InnoDB tables and the binary log. (Note: --innodb-safe-binlog is unneeded as of MySQL 5.0.3; it was made obsolete by the introduction of XA transaction support.)


더 향상된 안전성을 위해 MySQL 서버는 모든 트랜잭션에 대해 디스크와 binary logsync_binlog=1, InnoDB logs(기본설정) 를 동시에 작업한다. 이 옵션은 충돌이 발생한 이후 재시작할 때 트랜잭션을 롤백하고 binary log에서 InnoDB 트랜잭션을 하지 못하게 막는다. binary log는 InnoDB 테이블의 정확한 데이타를 반영하고 슬레이브 서버 또한 주 서버와 일관성을 유지하게 한다.
For this option to provide a greater degree of safety, the MySQL server should also be configured to synchronize to disk, at every transaction, the binary log (sync_binlog=1) and (which is true by default) the InnoDB logs. The effect of this option is that at restart after a crash, after doing a rollback of transactions, the MySQL server cuts rolled back InnoDB transactions from the binary log. This ensures that the binary log reflects the exact data of InnoDB tables, and so, that the slave remains in sync with the master (not receiving a statement which has been rolled back).


--innodb-safe-binlog 옵션은 InnoDB가 아닌 다른 저장엔진을 업데이트할 때에도 사용된다. 단지 InnoDB 테이블에 영향을 미치는 문장/트랜잭션이 InnoDB의 충돌이 발생할 때 binary log에서 삭제된다는 것이 핵심이다.
만일 충돌 복구 과정에서 (sync_binlog=1 이고 the disk/filesystem이 동일성이 유지된다면 발생하지 않지만) binary log 가 더 짧아진 것을 발견한다면 에러 메시지("The binary log <name> is shorter than its expected size")를 출력할 것이다.
이런경우 binary log 는 부정확한 것이고 복제서버는 정확한 주서버의 데이타로 다시 시작해야 한다.
Note that --innodb-safe-binlog can be used even if the MySQL server updates other storage engines than InnoDB. Only statements/transactions affecting InnoDB tables are subject to being removed from the binary log at InnoDB's crash recovery. If at crash recovery the MySQL server discovers that the binary log is shorter than it should have been (that is, it lacks at least one successfully committed InnoDB transaction), which should not happen if sync_binlog=1 and the disk/filesystem do an actual sync when they are requested to (some don't), it prints an error message ("The binary log <name> is shorter than its expected size"). In this case, this binary log is not correct, replication should be restarted from a fresh master's data snapshot.


binary log file 과 binary log index file에 기록하는 것은 MyISAM 테이블과 같은 방식으로 기록한다. Section A.4.3, “How MySQL Handles a Full Disk” 참고.
Writes to the binary log file and binary log index file are handled in the same way as writes to MyISAM tables. See Section A.4.3, “How MySQL Handles a Full Disk”.


아래는 게시물 올라온건데 그냥 올려봅니다.

I spend 2 hours figuring out why it does not work on Windows.
Finally added under [mysqld]
set-variable=log-bin=C:\mysql\data (C:/mysql/data )

If you are doing bin-log on a slave server -- for instance for backup in the slave machine -- remember to use the option "--log-slave-updates".


5.11.4. The Slow Query Log
--log-slow-queries[=file_name] 옵션은 long_query_time 에 설정한 시간보다 실행시간이 더 긴 문장을 로그에 저장한다. 테이블에 락을 하는 시간은 실행시간에 포함되지 않는다. long_query_time 의 최소시간은 1초이다.
파일명이 없으면 기본파일명은 -slow.log 뒤에 호스트명이 붙고 경로가 없으면 data directory에 저장된다.
쿼리문이 실행되고 모든 락이 풀린 후에 로그에 저장된다. 저장된 순서는 실제 실행 순서와 차이가 있을 수 있다.

실행하는데 오랜 시간이 걸린 쿼리문을 알아내어 최적화 또는 튜닝에 도움이 된다.
로그에 많은 기록이 있다면 로그의 요약된 쿼리문을 얻기 위해 mysqldumpslow 명령을 사용하기 바란다.

인덱스를 사용하지 않는 쿼리문이 많이 저장될 수 있는데 인덱스를 사용하지 않는 느린 쿼리문을 저장하고 싶지 않다면 --log-short-format 옵션을 사용해라. mysqld Command-Line Options 참고.

OPTIMIZE TABLE, ANALYZE TABLE, and ALTER TABLE 같은 관리자 명령을 로그에 저장하고 싶다면 --log-slow-admin-statements 옵션을 사용해라.

query cache 에 의해 수행되는 쿼리문은 로그에 남지 않고, 열이 없거나 하나있는 테이블에는 인덱스가 하나 있는 쿼리문도 로그에 남지 않는다.


5.11.5. Log File Maintenance
서버는 여러개의 로그파일을 작성하여 서버가 무슨 일을 하고 있는지 쉽게 알 수 있게 해준다. 그러나 로그파일이 많은 디스크용량을 차지하지 않게 주기적으로 로그관리를 하여야 한다.

주기적으로 백업하고 오래된 로그파일을 지우고 새로운 로그파일을 만들고 싶다면 5.9.1, “Database Backups” 부분을 보세요.
Linux (Red Hat) 에서는 mysql-log-rotate script 를 사용할 수 있다. RPM 으로 설치하였다면 자동으로 설치되어 있다. 복제서버에 binary log 를 사용하고 있다면 이 기능을 조심스럽게 사용하기 바란다. 모든 복제서버에 정상적으로 적용되었다고 확신하기 전에는 binary logs 파일을 삭제하지 말라.

다른 시스템에서 이 기능을 사용하고 싶다면 cron 이나 로그를 관리할 수 있는 프로그램을 스스로 설치하여 사용하기 바란다.

mysqladmin 에서 flush-logs 나 SQL 문에서 FLUSH LOGS 를 사용하여 새로운 로그파일을 생성할 수 있다.

FLUSH LOGS 명령은 다음과 같은 작업을 한다.

=> --log 또는 --log-slow-queries 옵션을 사용하고 있다면 로그파일을 닫았다 다시 연다. (기본파일명 mysql.log and `hostname`-slow.log)

=> --log-update 또는 --log-bin 옵션을 사용하고 있다면 로그를 닫고 새로운 파일명(시퀀스-숫자를 추가하여)의 로그파일을 만든다.

=> update log만 사용하고 있다면 파일명을 바꾼 후 FLUSH LOGS 를 실행하고 DB 백업을 하기 바란다

:

[펌]AOP

ITWeb/개발일반 2008. 6. 30. 19:02
ref. http://www.ibm.com/developerworks/kr/library/mar06/pollice/index.html



Aspect-Oriented Programming: AOP에 대한 실제적 접근방식 (한글)

developerWorks
문서 옵션
이 페이지를 이메일로 보내기

이 페이지를 이메일로 보내기


제안 및 의견
피드백

난이도 : 초급

Gary Pollice, Professor of Practice, Worcester Polytechnic Institute

2006 년 4 월 24 일

Aspect-Oriented Programming에 대한 대부분의 소개서들은 신기술 측면만을 다루고 있습니다. 바로 이러한 점 때문에 AOP의 실제적인 가치를 전혀 배울 수 없었습니다 . 이 글에서 AOP 기술을 소프트웨어 개발 프로젝트에 적용하는 방법을 설명합니다.

illustration최 근에 나는 Software Engineering Research Group (SERG)에서 Aspect 지향 프로그래밍(AOP)에 대한 토론을 진행해 줄 것을 부탁 받았다. 토론회가 시작되기 몇 시간 전, 한 학생이 나에게 물었다. "Aspect가 도대체 어디에 좋은가요? 그런데 로깅 예제는 안주셔도 됩니다. 내가 Aspect에 대한 것을 읽을 때 마다 보는 것이니까요. "

그 학생의 질문으로 나는 소프트웨어 시스템에 AOP를 적용하는 효과적인 방법을 생각하게 되었다. 또한 새로운 방식을 채택할 방법과 시기를 고려해야 할 필요성도 느꼈다. AOP는 새로운 방식이다. AOP가 효과적으로 사용될 수 있는 방법에 대해 이야기 하고자 한다. 또한 최근 AOP가 어떻게 진화했는지도 볼 것이다.

나는 Aspect 지향 자바를 예제로 사용할 예정이다. 하지만 자바 외에도 다른 여러 언어들의 Aspect 구현이 있다. AspectC++과 AspectL이 그것인데 이것은 Aspect 지향 Lisp 구현이다.1

AOP 개념 리뷰

AOP가 생소하다면 관련 개요서를 참조하기 바란다. 내가 쓴 2004년 2월의 기술자료를 참조해도 좋다.2 AOP 소개서의 많은 부분이 Aspect의 개념을 설명할 때 로깅을 예제로서 사용하고 있다. (로깅은 많은 사람들이 이해하고 있는 것이고 AOP가 사용되는 방법을 보여주는 좋은 예제이다.) Aspect는 크로스커팅을 하는 영역이다. 다시 말해서, 하나의 클래스에 쉽게 캡슐화 되지 않는다. 하지만 객체 지향 패러다임을 엄격히 따라간다면 그와 같은 영역을 일관되고 관리가 가능한 방식으로 나타내야 한다. 종종 크로스커팅 책임을 개별 helper 클래스로 위임해야 하고 영역에 의해 표현되는 기능을 필요로 하는 모든 클래스에 의존하여 호출들이 적절한 장소에서 그 위임에 대한 호출을 포함시켜야 한다. 코드의 적절한 포인트에 로그인을 지속적으로 삽입하는 것을 확인하기란 어려운 일이다. Aspect는 불완전 하지만 이러한 상황을 향상시킬 수 있는 방식을 제공한다.

AOP의 논의에 참여하기 위해서는 몇 가지 개념을 알아야 한다. 핵심 개념은 조인 포인트(join point)이다. 이 개념은 프로그래머에게는 익숙한 개념이지만 다시 한번 짚고 넘어가자. 조인 포인트는 "프로그램 플로우에서 정의가 잘된 포인트"이다. 3 메소드 호출 또는 메소드 리턴 같은 많은 유형의 조인 포인트가 있다. 정상 리턴이나 예외가 될 수 있다.

AOP의 경우 한 프로그램에 조인 포인트를 규명할 방식이 필요하다. AspectJ는 포인트컷(pointcut)을 사용하여 한 개 이상의 조인 포인트를 설명한다. 포인트컷은 조인 포인트를 기술하는 식(expression)이다. 포인트컷을 조인 포인트 세트를 리턴하는 코드의 쿼리로 생각할 수 있다.

조인 포인트 세트를 선택할 때 여기에 대한 어드바이스(advice)를 제공한다. 어드바이스는 프로그램이 실행하는 동안 조인 포인트를 만나게 될 때 실행되는 코드이다. 조인 포인트, 포인트컷, 어드바이스는 소프트웨어의 동적 속성을 나타낸다. 어드바이스는 프로그램 코드의 실행 특성을 변화시킨다.

시스템의 정적인 본질을 다루는 한 가지 개념이 있다. 바로 inter-type declaration이다. inter-type declaration은 프로그램의 정적 구조를 변화시킬 수 있다. 메소드와 변수를 추가하고, 지정된 규칙에 따라 상속 계층을 변경할 수 있다.

자바에서 클래스가 모듈의 단위이듯, Aspect는 AspectJ의 추가 모듈 단위이다. Aspect는 크로스커팅 영역을 위해 조인 포인트, 포인트컷, inter-type declaration, 어드바이스를 캡슐화 한다. AOP는 객체 지향 분석과 디자인의 대체 개념이 아니다. OO 방식이 우리가 원하는 솔루션을 제공하지 못하는 상황 속에서 새롭게 생겨난 것이다.

AOP 예제

이제 AOP 예제를 살펴보도록 하자. 제품 시스템과 제품 및 개발 상황 속에서 예제를 가져왔다. 두 개의 예제부터 시작하다.

실행 트레이싱

많은 개발자들이 프로그램의 실행을 디버깅 하거나 트레이싱 하기 위해 코드에 일종의 print 문을 포함시킨다는 것에 놀랐다. 물론 디버거는 정보를 잘 제공한다. 하지만 지금 우리는 디버거를 논할 것은 아니다. 프로그램의 텍스트 트레이스가 만들어지기를 기다리는 이유가 있다. 현재 Eclipse의 AspectJ Development Tools (AJDT)는 프로그램 실행 트레이스를 구현하는 좋은 예제이다. Eclipse 도움말에서 자세한 내용을 참조하라. AspectJ Programming Guide에도 자세한 내용이 있다.

이 예제는 원과 사각형 같은 이차원 그림을 표현하는 클래스를 가진 작은 자바 애플리케이션이다. 두 개의 원과 사각형을 만들고, 영역, 길이, 중앙 포인트 간 거리를 프린트하는 메인 메소드도 있다. 이 프로그램을 실행하면 그림 1과 같은 아웃풋이 나온다.

Figure 1: Input from the shape program

그림 1: shape 프로그램의 인풋

호출된 메소드의 실제 시퀀스를 보고 싶다면 두 가지 방법이 있다. 첫 번째 방법은 메소드의 이름과 클래스를 가진 메시지를 프린트하는 각 메소드의 시작에 코드를 삽입하는 것이다. 이를 각 메소드 마다 수행해야 한다. 두 번째 방법은 정확히 같은 일을 수행할 Aspect를 만드는 것이다. 이때에는 애플리케이션 코드를 변경할 필요가 없다.

트레이싱 예제는 Aspect를 사용하는 여러 버전의 트레이싱 솔루션들로 구성된다. 우리는 마지막 버전만 보도록 하겠다. 기타 다른 버전들은 AspectJ Programming Guide를 참조하기 바란다.

강력한 트레이싱 메커니즘에 대한 솔루션은 두 개의 파일로 구성된다. 하나는 추상 Aspect이다. 프로그래머가 파생된 클래스에서 일부 코드를 구현해야 하는 곳의 추상 클래스와 비슷하다. 이 경우는 파생된 Aspect이다. Trace라고 하는 추상 Aspect는 메소드 또는 구조체의 시작과 종료에 대한 메시지를 프린팅하고 아웃풋을 포맷팅 할 여러 가지 표준 메소드들을 갖고 있다. Aspect를 사용하고 있지 않다면 이 메소드들은 트레이스 정보를 출력할 때 사용할 헬퍼 클래스에 있을 것이다. 또한 프로그래머가 TRACELEVEL이라는 속성을 설정하여 트레이싱 유형을 설정할 수도 있다. 세 가지 레벨이 있다. 메시지 없음(no messages), 들여쓰기가 되지 않은 메시지(messages that are not indented), 중첩된 호출을 보여주도록 들여쓰기 된 메시지(messages that are indented to show nested calls).

Trace는 세 개의 포인트 컷을 정의한다. 이중 두 개는 구체적인 것이고 하나는 추상적이다. (그림 2) 추상 포인트컷인 myClass는 Trace를 확장하는 Aspect에서 제공된다. 포인트컷의 목표는 어드바이싱 될 조인 포인트를 포함하고 있는 객체용 클래스를 선택하는 것이다. 따라서 개발자는 트레이스 아웃풋에 어떤 클래스를 삽입할 지를 결정할 수 있다.

Figure 2: Pointcuts in the trace aspect

그림 2: 트레이스 Aspect의 포인트컷

myConstructor 포인트컷은 myClass가 선택한 클래스에 있는 객체용 구조체의 시작 부분에서 조인 포인트를 선택한다. 조인 포인트는 실제 구조체 바디이다. myMethod는 myConstructor와 비슷하지만, 이것은 선택된 클래스에서 메소드의 실행을 선택한다. 어드바이스에서 사용되는 toString 메소드의 실행은 생략했다는 것에 주목하라.

이 Aspect에서 제공하는 어드바이스는 매우 단순하다. 각 조인 포인트 전에 삽입되는 어드바이스와 조인 포인트 후에 실행되는 어드바이스가 있다. (그림 3)

Figure 3: Advice in the Trace aspect

그림 3: Trace aspect의 어드바이스

Trace Aspect를 사용하려면 이것을 확장하여 추상 포인트컷에 구체적 구현을 제공해야 한다. 그림 4는 예제 프로그램의 TraceMyClasses Aspect의 바디 모습이다. 포인트컷은 TwoDShape, Circle, Square의 인스턴스인 객체들만 선택할 것을 명령한다. 메인 메소드는 TRCELEVEL을 설정하고 트레이스 스트림을 초기화 하며 예제의 메인 메소드를 실행한다.

Figure 4: Concrete tracing aspect

그림 4: 구체적인 트레이싱 객체

그림 5는 아웃풋의 일부이다. 이 아웃풋은 각 객체에 대한 정보를 출력하고 있다. 이것은 각 메소드의 toString 메소드의 일부이다. myClasses 포인트컷이 객체를 어드바이스에 퍼블리시 하기 때문에 어드바이스는 객체에 대한 정보를 쉽게 추가할 수 있다.

Figure 5: Example trace output

그림 5: 트레이스 아웃풋

트레이스 코드를 직접 삽입하는 것 보다 AOP를 사용하는 것이 더 좋은 이유는? 여러 가지가 있다.

  • 한 장소(두 개의 Aspect)에 트레이싱 영역에 속해있는 모든 소스 코드를 둘 수 있다.
  • 트레이싱 코드를 삽입 및 제거하기가 쉽다. 구현 설정에서 Aspect를 제거하면 된다.
  • 트레이스 코드는 원하는 곳 어디에나 있다. 심지어 새로운 메소드를 목표 클래스에 추가하더라도 말이다. 따라서 오류를 줄일 수 있다. 또한 모든 트레이스 코드가 제거된다는 것을 알 수 있고, 구현 설정에서 Aspect를 제거할 때 어떤 것도 간과하지 않게 된다.
  • 적용 및 강화될 수 있는 재사용 가능한 Aspect를 가진다.

Design by Contract 또는 방어적 프로그래밍

Bertrand Meyer는 Design by Contract개념을 도입했다.4 이 원리는 클래스의 디자이너와 클래스의 사용자가 클래스 구현에 대한 생각을 공유한다는 것이다. 이 콘트랙트에는 불변 값, 전제 조건, 사후조건이 포함되어 있다. Design by Contract로 인해 클래스 디자이너는 인자의 유효성을 신경 쓰지 않고 클래스 기능을 구현하는 로직에만 집중할 수 있다. 물론 이것은 콘트랙트가 인자에 대한 사전 조건을 명시할 경우이다. Design by Contract는 클래스의 모든 클라이언트가 콘트랙트를 지킨다면 한 과잉 코드를 방지하고 퍼포먼스를 높인다.

광범위하게 사용할 라이브러리를 구현 할 때 메소드로 전달되는 인자의 유효성에 대해 잘 모를 경우가 있다. 각 메소드의 로직으로 처리하기 전에 인자를 검사해야 한다. 이것이 디펜스 프로그래밍(defensive programming)이다. 잘못될 가능성이 있는 것을 예견하고 이를 효과적으로 처리하는 것이다.

간단한 형상 프로그램을 공개적으로 사용한다고 해보자. 첫 번째 Euclidean 쿼드란트에 모든 좌표가 있어야 한다. 다시 말해서 x와 y 좌표는 비음수 값이다. 이는 포인트가 윈도우의 좌표에 나타난다면 유효한 제약조건이다. 대부분의 윈도우 시스템들은 좌측 상단 점을 (0,0)으로 시작하고 x 좌표를 오른쪽으로 늘리고 y 좌표를 아래쪽으로 옮긴다. 내부적인 필요에 의해서 Design by Contract를 사용해야 한다. 이 클래스를 사용할 개발자들에 대한 제어권이 있기 때문이다. 이것을 외부 클라이언트로 퍼블리시 할 때 인자를 검사하고 인자가 무효할 경우 예외를 던져야 한다. Aspect는 필요한 것을 구현할 수 있는 좋은 방법을 제공한다.

퍼블릭 메소드에 모든 인자를 검사할 Aspect를 구현해야 한다. 첫 번째로 해야 할 일은 포인트컷을 구현하는 일이다. 이전 예제에서 myClass 포인트컷을 사용하고, 인자 체킹을 필요로 하는 구조체를 선택하기 위해 포인트컷을 추가한다. 그림 6은 우리에게 필요한 포인트컷 세트이다. 두 번째 포인트컷은 포인트컷의 목표가 TwoDShape의 인스턴스라는 것을 지정한다. 이 같은 객체에 있는 거리 메소드로의 유일한 호출은 이 포인트컷에 의해 선택된다는 것을 의미한다.

Figure 6: Pointcuts for argument checking

그림 6: 인자 검사를 위한 포인트컷

마지막으로 적당한 어드바이스를 추가한다. 간단히 하기 위해 무효 인자를 만났을 때 메시지를 프린트 하고 실제 값을 0으로 바꾸고 무효 값이 전달될 때 거리에 대한 호출을 무시한다. 그림 7은 두 개의 어드바이스 아이템이다.

Figure 7: Argument checking advice

그림 7: 인자 검사 어드바이스

다음을 실행하면,

Circle c3 = new Circle(3.0,2.0,-2.0);

c1.distance(null>);

우리 프로그램에서는 다음과 같은 아웃풋을 얻게 된다.

Negative argument encountered at: execution(tracing.Circle(double, double, 
	double)) All arguments changed to 0.0
Null value given to distance at: 
	call(double tracing.Circle.distance(TwoDShape))

정확한 라인 번호와 소스 파일 이름을 보여줄 수 있지만 이 예제에서는 기본적인 기술만 보도록 한다.

많은 클래스가 있고 여러 인터페이스를 노출하는 큰 프로젝트에서 인자 검사를 구현하는 Aspect를 위해 개별 디렉토리를 구성해야 한다. 쉽게 구분할 수 있고 관리할 수 있도록 Aspect를 구성하는 여러 가지 방법들이 떠오른다. 내부적으로 사용할 시스템을 구현할 때 내부 구현 설정을 사용하고, 외부적으로 사용할 것을 구현할 때에는 Aspect가 포함된 설정을 사용한다. EclipseAJDT를 사용하면 새로운 구현 설정이 간단해 진다.

Aspect와 디자인 패턴

AOP는 기존 패턴을 향상시키고 새로운 것을 발견할 수 있도록 해준다. 사실, 크로스커팅 영역으로의 코드 투입도 하나의 패턴이다. 현재, 일부 연구원들은 AOP 방식을 사용한 디자인 패턴의 구현을 평가하고 있다. University of British Columbia의 Jan Hannemann은 그의 박사 논문에서 이것을 연구한다. http://www.cs.ubc.ca/~jan/AODPs/를 참조하라.5 Nicholas Lesiecki 역시 IBM developerWorks에 Aspect와 디자인 패턴에 대한 글을 기고하고 있다. 6

AspectJ에서 표준 디자인 패턴인 Adapter 패턴을 구현하는 방법을 알아보자.

그림 8은 Adapter 패턴에 대한 Unified Modeling Language (UML) 다이어그램이다. 이 패턴을 보면, 클라이언트는 서비스를 필요로 하고 서비스 요청을 한다. 많은 서비스 공급자들이 있고 이들 각각은 다양한 서비스 이름이나 서비스 요청자가 지켜야 할 비 표준 요구 사항들을 갖고 있다. 객체 지향 디자인에서는 목표 인터페이스에서 서비스에 대한 요청을 캡슐화하고, 인터페이스에 대해 프로그래밍 하며, 클라이언트와 서비스 간 중재자로서 작동할 어댑터(이 다이어그램의 경우 Adaptee)를 구현하도록 하고 있다.

Figure 8: Adapter pattern

그림 8: Adapter 패턴

이 방식은 매우 합리적이다. 하지만 어댑터 같은 패턴으로 설계되지 않았던 레거시 시스템이 있다면? 또한 서비스로의 호출이 애플리케이션 전체로 퍼져나갈 수 있다. 새롭고 향상된 서비스를 어떻게 구현할까? Aspect가 없다면 시스템을 리팩토링 하고, 모든 호출을 서비스에 배치시키고, 어댑터를 설계하고, Adapter 패턴을 구현해야 할 것이다. 이는 매우 힘든 일이다. 코드 향상을 위한 리팩토링은 가치 있는 목표이다. 하지만 언제나 그럴 수는 없다.

이 경우 Adapter 패턴의 AOP 버전을 구현하여 문제를 해결하도록 한다.

그림 9에서 서비스를 사용하는 클라이언트를 보자. 이 서비스는 한 지점에서 현재의 Client 객체로 거리를 리턴할 것이다.

Figure 9: Simple client

그림 9: 클라이언트

이 서비스용 인터페이스는 하나의 메소드를 기술하고 있다.


double useService(Client clt, double x, double y);

새로운 서비스 공급자는 다른 이름이 붙여진 메소드를 갖고 있다. 매개변수도 다르다. 이것의 인터페이스는 아래와 같다.


double useNewService(double x0, double x1, double y0, double y1);

오래된 서비스를 호출하고, 새로운 서비스에 대한 알맞은 인자를 얻고, 새로운 서비스를 호출하고, 그 결과를 클라이언트에 리턴하는 어댑터를 구현하고 싶다. 클라이언트를 변경하지 않고 말이다. 우리의 Aspect가 바로 이러한 일을 한다. (그림 10)

Figure 10: Adapter aspect to invoke the new service

그림 10: 새로운 서비스를 호출하는 Adapter aspect

너무 간단하다. 포인트컷을 선언하여 원래 서비스의 useService 메소드에 대한 모든 호출을 구분하고 있다. 그런 다음 around 어드바이스를 사용하여 새로운 서비스에 대한 호출로 대체한다.

이 방식에도 장단점은 있다. 우선 하나의 단순한 Aspect를 사용하여 애플리케이션에 있는 모든 코드를 변경할 수 있다. 또한 서비스를 호출하는 영역을 한 장소에 캡슐화 할 수 있다. 새로운 서비스가 더 새로운 서비스로 대체된다면 Aspect의 코드만 변경하면 된다. 시스템이 더욱 강해질 것은 자명하다.

사용되지 않는 오래된 클라이언트가 여전히 새로운 시스템에 있다는 것이 큰 단점이다. 시간이 충분하다면 표준 Adapter 패턴을 사용하도록 시스템을 리팩토링 할 수도 있다. 하지만 현재로서는 원래 서비스의 useService 메소드를 0.0 같은 더미 값을 리턴하는 코드를 사용하여 변경할 수 있다.

산업 강화 사용

지금까지, 매우 제한되었지만 유용한 AOP 적용 예제를 보았다. 기술력을 향상시킬 수 있는 방법이 궁금할 것이다. 여기에서는 간단한 예제 한 가지를 설명하겠다.

Spring Framework을 다들 알 것이다.7 Spring Framework은 엔터프라이즈 애플리케이션의 개발을 지원하는 애플리케이션 프레임웍이다. 복잡한 엔터프라이즈 애플리케이션을 구현할 수 있는 레이어드 J2EE 프레임웍을 제공한다. Spring의 기반이 되는 기술 중 하나가 AOP이다. Spring은 런타임 시 크로스커팅 로직이 코드에 적용될 수 있도록 하는 자체적인 Aspect 구현을 개발했다. AspectJ를 Spring Framework으로 쉽게 통합할 수 있는 통합 기능도 제공한다.

Spring은 현재 많은 기업들이 사용하고 있고 더 낳은 애플리케이션을 구현하는데 사용되고 있다. 개발 시간이 적게 들고 설계도 잘 되어 있다. 실제 사례들에 Aspect를 적용할 수 있는 좋은 예제라 할 수 있다.8

전망

앞으로 AOP는 소프트웨어 개발자 툴킷의 일부가 될 것이다. AOP가 주요 디자인 메커니즘으로 간주되는 시스템을 구현하는 것 까지는 아니더라도 OO 디자인을 향상시킬 수 있다고 생각한다. 이를 위해서는 몇 가지 조건이 필요하다.

첫째, 안정적인 표준의 AOP 구현이 필요하다. 이 작업은 이미 시작되었다. EJB Version 5는 두 개의 대표적인 자바 AOP 언어인 AspectJ와 AspectWerkz를 합친 것이다. C++ 같은 기타 언어들의 표준 구현 역시 도움이 될 것이다.

둘째, AOP를 특정 시스템에 적용했을 때의 효용성을 입증할 메트릭스를 개발해야 한다. AOP를 사용하여 디자인 패턴을 재구현 한다면 과연 이것이 OO 패턴 보다 더 나을까? 더 나은 점은 무엇이고, 그렇지 않은 부분은 무엇인가? 이러한 메트릭스를 개발하기 위해 우리가 해야 할 일은 무엇일까? 우리는 경험적 증거에 입각하여 구현 및 디자인 결정을 내려야 한다. 9

세 번째, AOP를 지원하는 툴을 지속적으로 개발해야 한다. Eclipse용 AJDT는 훌륭한 툴이라고 감히 말하고 싶다. 이 툴은 우리가 필요로 하는 지원 부분을 계속 향상시키고 있다.

Aspect는 여기서 멈추지 않는다. 주류 애플리케이션의 일부가 되려면 멀었지만 더 가까이 다가선 것 만은 틀림없다.

1 http://www.aspectc.org/, http://common-lisp.net/project/closer/aspectl.html

2 The Rational Edge: http://www.ibm.com/developerworks/rational/library/2782.html

3 AspectJ Programming Guide: http://www.eclipse.org/aspectj/doc/released/progguide/index.html

4 Bertrand Meyer, Object-Oriented Software Construction, 2d ed. Prentice Hall 1998.

5 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides의 Design Patterns

6 http://www-128.ibm.com/developerworks/java/library/j-aopwork5/

7 http://www.springframework.org/

8 Pro Spring, Rob Harrop and Jan Machacek, Apress 2005.

9 AOP 메트릭스 개발

기사의 원문보기

: