2014년 3월 31일 월요일

애자일 개발의 불편한 진실

요즘들어 신문1면을 자주 차지하는 각종 보안관련 문제들의 원인중 상당부분이 하청중심의 소프트웨어 제작 관행에 있다는 것이 밝혀짐에 따라 많은 기업들이 사내개발을 검토/강화 하는 추세이다. 외주개발을 사내개발로 전환하는데 있어서 큰 어려움 중 한가지는 개발 프로세스를 확립하는 것 인데, 개발 프로세스는 구성원들의 성향에 기반한 기업문화와 밀접한 관련이 있기 때문에 아무리 좋은 옷이라도 몸에 맞지 않으면 소용이 없는것처럼 사내 구성원들간의 이해관계나 문화적인 배경 등을 제대로 고려하지 않는다면 제대로 뿌리내리기 힘들다.

 개발 프로세스 도입에 대한 컨설팅 하다보면 많은 고객들이 애자일 개발에 대해 관심을 가지고 문의를 해 오는데, 잘못된 관점으로 애자일 개발을 인식하고 있는 경우가 많다. 이는 각자의 위치에서 편한쪽으로 애자일 개발을 해석하려는 경향이 있기 때문이다.

동일한 대상이라도 바라보는 관점에 따라 여러가지 오해를 낳는다
오늘은 애자일 개발에 대한 올바른 접근방식을 이해하기 위해 애자일 도입시에 흔히 볼 수 있는 오해들에 대해 살펴보고자 한다.

애자일 개발은 쉽다

애자일 개발을 실패로 이끄는 가장 흔하면서 심각한 오해이다.
애자일 개발은 고도의 소프트웨어 공학에 대한 지식을 기반으로 하는 개발 방법론이다. 필자의 경험상 애자일 개발을 제대로 소화해 내기 위해서는 반복형 개발의 요소들을 완전히 마스터 해야만 한다. 프로세스 자체는 간단해 보이지만, 요건정의,모델링,설계,구현,테스트의 모든 과정에서 상당히 높은 수준의 소프트웨어 공학 지식이 종합적으로 요구된다.
컨설팅을 진행하면서 흔히 보는 풍경은 의욕 가득한 젊은 개발자와 매니저가 책 몇권을 읽고 애자일 팀을 꾸려나가다 좌절하는 것이다. 애자일 개발은 절대 쉽지 않다. 애자일 개발팀에는 고도의 모델링에 대한 지식을 기반으로 자동화 테스트, 이슈트랙킹, 지속적 통합, 형상관리와 같은 최신 개발 환경의 효율적인 운용이 필수로 요구된다.
처음 도입하는 팀에서 이러한 부분들을 모두 자체적으로 해결하기는 쉽지 않으므로, 전문가의 컨설팅을 받거나 최소한 경험자를 정기적으로 초빙함으로서 시행 착오를 최소화 해야 한다.

누워서 떡 먹기 조차 말처럼 쉽지 않다 (출처:서울속편한내과?)

애자일 개발은 상향식이다

애자일 개발 도입에 대한 컨설팅을 진행하다보면 2~3년차의 개발자가 중심이되어 애자일 개발팀을 꾸려 나가는 경우를 흔히 본다. 2~3년차라면 사실상 이제 막 초보 개발자를 졸업하는 시기로 아직 개발 역량 뿐만 아니라 정치적 역량도 부족하다. 애자일 개발을 원활히 진행하기 위해서는 프로젝트를 둘러싼 여러 이해관계자와의 긴밀한 의견조정이 필수인데, 이 부분은 윗선의 지원이 없이는 사실상 불가능하다.
애자일 개발도입의 성공을 위해서는 일선 개발자들의 주도적이고 자발적 참여 만큼이나 경영진으로부터 시작되는 하향식 서포트도 중요하며, 도입 또한 대규모 프로젝트의 경우 하향식 도입이 더 효과적인 경우도 많다.
 무엇보다 윗선의 이해를 제대로 구하지 못한 상태에서 개발자들 주도로만 진행하게 될 경우 개발 과정에서 발생하는 크고 작은 문제에 대해서 '거 봐라. 그러길래 하던데로 하지...'라는 비아냥과 함께 최악의 경우 프로젝트 자체가 기존 개발방식으로 돌아가 버리는 경우도 발생하기 쉽다.

애자일 개발을 도입하면 일의 양이 적어진다

어떤이는 불필요한 문서화 작업을 줄일 수 있어 작업량이 줄어든다고 애자일 개발에 대해 설명한다. 하지만 애자일 개발의 도입한다고 해서 일의 양이 적어지진 않는다. 오히려 반복형 개발의 경우 폭포수형 개발에 비해 이터레이션 내에서 설계,구현,테스트,배포가 매번 실행되야 하기 때문에 일의 양이 엄청나게 많아지는데, 그렇기 때문에 테스트,빌드,배포와 같은 기계적인 작업을 자동화 하여 최대한 사람의 일을 줄이지 않으면 안되는 것이다. 바꿔 말하자면, 이러한 자동화 툴의 도움 없이 진행하는 애자일 개발은 반드시 실패하게 될 것이다.

애자일 개발은 프로젝트 성공률을 올려준다

여러 조사에 의하면 애자일 개발이 성공률을 획기적으로 올려주지는 않다. 대신 만들어지는 소프트웨어의 가치를 높여준다. 애자일 개발과 같은 반복형 개발이 지니는 가장 큰 장점은 기간이나 예산면에서 실패를 하더라도 핵심 요구조건 조차 전혀 움직이지 않는 최악의 상황은 면할 수 있다는 점 이다. 따라서 애자일 개발의 장점을 부각시키고자 한다면 성공률을 올려준다기 보다는 실패할 확율을 줄여줄 수 있다고 설명하는것이 더 적절할 것이다.

애자일 개발에는 계획이 필요 없다

폭포수형 개발과 비교해 계획의 형식이 달라질 뿐 계획 자체는 애자일 개발이라 하더라도 반드시 필요하다. 프로젝트 실행의 기본 사이클인 PDCA(Plan,Do,Check,Action)는 애자일에서도 유효 하며 특히나 추정과 결과에 대한 피드백은 정확하고 빠르게 이루어져야 한다.

모든 일에는 계획이 필요하다 (출처:사망공책)


애자일 개발은 고객의 부담을 덜어준다

고객의 적극적 참여는 애자일 개발의 핵심 요소이다. 애자일 개발에서는 고객이 원하는 가치를 만들어 내기 위해 보다 많은 고객의 참여를 필요로 한다. 비단 애자일 개발 뿐만 아니라 모든 고객의 참여 없는 개발은 등대없이 밤바다를 항해하는것과 같아서 절대 목적지에 다다를 수 없을것이다.

애자일 개발은 개발기간을 단축시켜준다

애자일 개발은 이터레이션을 통해 빠른 피드백을 가능하게 해 주지만, 전체 개발 기간이라는 면 에서는 기존의 폭포수형 개발에 비해 절대 빠르다 할 수 없다. 오히려 현실적인 추정이 가능해 지기 때문에 예상 개발 기간은 폭포수형 개발에 비해 늘어나는 경우도 있다. 하지만 이것을 생각해보자. 계획한 기간 내에 끝나는 폭포수형 개발이 과연 얼마나 될까? 게다가 개발기간이 예상보다 늘어나는 경우 필연적으로 품질저하가 따라온다.

애자일 개발은 테스터가 필요 없다

매 이터레이션마다 테스트가 동반되는 반복형 개발에서 테스터의 필요성은 폭포수형 개발보다 높을 수 밖에 없다. 이상적인 테스터는 요건을 가장 정확히 이해하고 있는 고객이므로 여기서 또한 고객의 참여가 절실히 필요해 지는 부분이다.

애자일 개발에는 설계가 필요 없다

설계없이 개발을 하겠다는것은 지도 없이 세계일주를 하겠다는것과 같다. 애자일 선언서의 "포괄적인 문서보다 작동하는 소프트웨어를"이란 문구가 의미하는것은 문서작성 자체가 필요 없다는 뜻이 아니라 꼭 필요한 문서만 만들라는 의미이다.
애자일 개발에서 설계는 두꺼운 서류뭉치가 아닌 그때그때 이해당사자들 간의 커뮤니케이션을 보조해 줄 도구로서의 역할을 해 줄 수 있는것 이면 무엇이든 충분하다.
애자일 개발이 정착된 팀에서의 문서작성은 UML모델을 적극적으로 사용하며 특히 임시문서의 경우 화이트보드에 그린 내용을 사진찍는것으로 대체하는 경우가 많다. 애자일 개발의 설계/문서화에 대한 내용은 "애자일 시대의 모델링:애자일 팀의 확장에 따른 문서화에 대한 조언"을 살펴보기 바란다.




2014년 3월 24일 월요일

테스트 주도 개발(TDD)을 넘어서 - 동작 지향 개발(behavior driven development; BDD)

동작 지향 개발(behavior driven development; 이하 BDD)는 프로그램 개발 방법의 일종으로, 테스트 주도 개발(test driven development; 이하 TDD)에서 파생되었다.

BDD는 테스트 케이스를 먼저 작성하고 실제 동작 코드를 나중에 작성하는 TDD에서 한발 더 나아가 테스트 케이스 자체가 요구사양이 되도록 하는 개발 방식이다. 테스트케이스가 사양과 일체화 됨으로서 , 사양작성 -> 코딩 -> 테스트 라는 일련의 흐름이 테스트케이스작성 작업을 중심으로 자연스럽게 구현된다.

The Behavior-Driven Development Cycle (출전: MSDN)


TDD를 정착시킨 개발현장에서는 테스트 코드의 가독성을 높이고 JavaDoc과 같은 API문서 생성 프레임워크를 이용하여 테스트에서 프로그램에 기대하는 움직임을 기술함 으로서 테스트케이스가 상세설계서를 대체 할 수 있도록 하는 움직임이 있어 왔는데, BDD는 이것을 결합테스트와 시나리오 테스트까지 확장하여 각각에 해당하는 사양문서를 대체한다.

사양 전체를 테스트 케이스에 포함시키기 위해서는 메소드 중심의 Unit Test 뿐만 아니라 어플리케이션의 동작을 기술하는 스토리 프레임워크와 오브젝트의 동작을 기술하는 스펙프레임워크를 필요로 하게 되는데, 각각의 언어에서 BDD를 구현하기 위해 사용 할 수 있는 스토리/스펙 프레임워크는 다음과 같다.(출전: 위키피디아)


도메인 주도 개발(domain driven design; DDD)과의 궁함

BDD는 2003년 Dan North에 의해 처음 개념이 언급되었고 이후 TDD지지자들의 성원속에 스토리(시나리오)테스트의 자동화라는 형태로 지원 프레임워크가 속속 등장하게 된다.

BDD는 특히 자동화 테스트를 중요하게 생각하는 애자일개발과 오브젝트 지향 프로그래밍의 본질을 추구하는 도메인 주도 개발과의 궁합이 매우 좋다.
트랜젝션 스크립트 패턴 중심의 개발에서 결합테스트나 시나리오 테스트를 하기위해서는 결국 바운더리 인터페이스를 이용해야만 하는 경우가 많다. 즉, 웹 어플리케이션의 경우 화면을 테스터가 직접 조작하거나 HTTP레벨에서 이를 시뮬레이션해 주는 JMeter와 같은 툴을 사용하는 형태로 시나리오 테스트가 진행되는 경우가 많은데, DDD의 경우 도메인 오브젝트가 바운더리와 분리되어 있기 때문에 스토리/스펙 테스트가 보다 용이해 지는것이다.

BDD개발 프로세스

BDD의 핵심 개념은 사양이 바로 동작하는 테스트케이스(또는 시나리오)가 된다는 점 인데, 기술에 문외한인 이해관계자stakeholders도 테스트케이스로 작성된 사양을 작성하거나 읽을수 있어야 한다.
일반적으로 BDD에 기반한 개발은 다음과 같은 프로세스를 거치게 된다.

  • 비전을 달성하기 위해 각각 다른 프로젝트 이해관계자들이 공유할 수 있는 골을 설정한다.
  • 골을 달성하기 위한 기능들을 그려낸다.
  • 이해관계자를 포함해서 소프트웨어의 외형을 구현한다.
  • 구현된 외형을 이용하여 어플리케이션의 동작을 묘사한다.
  • 동작 시나리오를 작성한다. 
  • 스토리 내부의 단위 테스트를 작성한다. 
  • 프로그램 구현(Mock 포함)
  • 단위테스트를 실행한다.
  • 스토리 테스트를 실행한다.

스토리 테스트 작성시 주의해야 할 점은 유닛 테스트와 마찬가지로 반드시 모든 테스트가 실패하는것을 확인해 주어야 한다. 이를 불필요한 과정으로 인식하고 넘어가는 경우, 잘못 작성된 코드도 성공해 버리는 테스트 불량을 검출할 수 없게 된다.







2014년 3월 22일 토요일

책이야기 - 코딩호러가 들려주는 진짜 소프트웨어 개발 이야기


코딩호러가 들려주는 진짜 소프트웨어  개발 이야기


제법 긴 제목을 가진 이 책은 두가지 면에서 나에게 특별하다.

저자인 제프 앳우드는 책 제목과 같은 코딩호러라는 블로그를 운영하는 유명 블로거인데, 사실 블로그보다도 조엘 스폴스키와 공동으로 세운 스텍 오버플로의 창업자로서 더 유명하다. 인기 블로거인 그는 다른 블로거들이 그러하듯이 대단한 독설가이다. 생활속에서 접하게 되는 IT이슈들에 대해서 개발자의 시선에서 섬세하게 관찰하고 비평을 함에 있어서 거침이 없다. '얽힌 삼을 한 방에 자르다.'라는 뜻을 지닌 쾌도난마라는 단어가 잘 어울리는 블로거이고 이 책또한 그러하다.

또 한가지 특별한 면은 번역자인 임백준씨이다. 개인적으로 뉴욕의 프로그래머로 처음 저자의 이름을 알게 된후 최근의 ZDNet Korea의 컬럼에 이르기까지 저서와 번역서를 꼬박꼬박 챙겨보는 팬이다. 이 분의 글은 읽기가 편하다. 저서는 물론 번역도 모든 문장들의 의미가 명확하고 깔끔하다. 전문 번역가가 들어가지 못하는 기술자만의 영역을 저자는 잘 파악하고 있기 때문이 아닐까 한다. 그러한 이유로 임백준씨가 이름을 올린 책들을 구입함에 있어서는 그다지 고민을 하지 않는 편이다.

책 자체는 제프 앳우드의 코딩호러 블로그의 글을 중에 책의 부제인 '엉터리 개발자에서 벗어나 진정한 개발자로 거듭나라!'의 문맥에 속하는 글들을 모아 놓은것이다. 모든 글은 유머가 넘치고 지루하지 않다. 그러면서도 내용을 지닌다.

책 내용 자체를 여기서 소개하지는 않겠다. 내용을 들여다 보는데는 전자서점의 책 소개와 목차를 살펴보는것으로 충분하다. 다만 책이 지닌 가치에 대해서 의견을 적어보자면 '블로거 글 모아 놓은 것 으로 엉터리 개발자에서 벗어날 수 있을까?'라는 질문에 대해서 '그렇다. 정말이다.'라고 자신 있게 말씀 드릴 수 있다. 내가 20년 가까이 걸어온 엉터리 개발자의 길에서 벗어날 한줄기 빛을 이 책에서 발견했듯이 여러분도 진정한 개발자로에의 길을 찾아내길 바란다.

2014년 3월 21일 금요일

지속적 통합(Continuous Integration)을 넘어 지속적 인도(Continuous Delivery)로 - DevOps개념 정리

구글, 페이스북, 아마존, 세일즈포스등과 같이 오늘날 IT서비스 시장을 선도하고 있는 기업들이 가지는 공통점이 있다. 바로 높은 품질을 유지하면서도 개발의 사이클이 엄청나게 짧다는 점 인데, 오늘 이야기 하고자 하는 DevOps는 바로 이러한 고속 출시를 가능하게하는 새로운 소프트웨어 개발 패러다임이다.

개발,운영,품질보증 유기적으로 연동되는 개발 패러다임인 DevOps. 출전:Wikipedia


DevOps라는 단어 자체는 Velocity 2009라는 행사에서 플리커의 엔지니어인 John Allspaw과 Paul Hammond가 발표한 "하루에 10번 배포하기10 deployas per day"라는 제목의 강연에서 처음 쓰여졌다.
DevOps는 개발Development과 운영Operations이 합쳐져서 만들어진 합성어로 개발과 품질보증Quality Assurance,운영이 한개의 사이클로 묶여 유기적으로 연동되는 개발 패러다임을 의미하며 클라우드 환경과 빠른 개발사이클이 보편화 되는 현 시점에서 빠르게 기존 운영 패러다임을 대체해 나가고 있다.

앞서 말한 고속 출시를 실현하기 위해서는 요구사항 수집에서 부터 구현과 품질보증(QA), 릴리스에 이르기까지 고객에게 가치를 전달하는 과정이 끊임없는 흐름이 되어야 하는데, 전통적인 개발방식에서는 상상도 하지 못할 만큼 많은 작업들이 한꺼번에 이루어져야 하기 때문에 개발 프로세스의 근본적인 개선 없이는 실현이 불가능하다. NIKKEI SYSTEMS의기사 "적시개발로 IT현장을 효율화 하라"에 의하면, DevOps를 구현하기 위해서는 반드시 다음의 세가지 요건이 선행되어야 한다.
  1. 반복되는 작업의 자동화: 테스트, 디플로이, 릴리스등의 작업은 기능 추가시 마다 수작업으로 진행하게 되면 사용자의 요구를 제때에 대응 하기 어렵다. 따라서, 지속적인 통합(CI)도구를 중심으로 테스트, 디플로이, 릴리스를 연동시킨 새로운 개발 체제 구축이 필수적이다.
  2. 재작업의 원인이 되는 작업미스의 제거: 개발환경이나 운영환경등의 환경 구축 작업에서 흔히 발생하는 매개변수의 설정 미스나 조작미스는 모두 수작업이 원인이 된다. 수작업을 최대한 억제함으로서 재 작업이 발생할 소지를 줄이는것은 개발 효율화에 있어서 매우 중요한 이슈이다. 
  3. 작업 공정 및 성과물의 정확한 파악: 소스코드와 문서, 맴버들의 작업상황, 요구/과제의 대응상황, 장애모니터링을 집중하여 관리하고 개발팀 내부에서 효과적으로 공유할 수 있게 해야 한다. 이렇게 함으로서 작업의 지연이나 문제가 쌓이게 되는 원인을 재빨리 발견하고 대응 할 수 있게된다.
내용을 읽어보면 CI와 다른점이 없다는 생각이 들 것이다. 사실, CI를 개발자 사이드의 지속적 통합이라 한다면, DevOps는 이를 운영에까지 확장시켜 지속적 인도(Continuous Delivery)를 구현한 것이라 보는것이 정확할 것이다.

출전: http://continuousdelivery.com/2014/02/visualizations-of-continuous-delivery/


즉, DevOps의 구현은 환경 구축에서 시작하여 디플로이,릴리스와 같은 작업들을 포괄적으로 자동화 하는것에 있으며 이를 실현하기 위한 툴 로서 ChefPuppet이 주목받고 있다.

특히 인프라스트럭쳐 시장에서 클라우드가 점차 보편화 되고 있는 최근 추세에 따라 이러한 자동화 툴의 도입은 개발에서 운영에 이르기까지 개발의 전 과정에서 진척상황에 맞추어 필요한때에 필요한 환경을 자유로이 확장/축소할 수 있게 해 줌으로서 시스템 스케일링에 상당한 자유도를 제공한다.

참고자료



2014년 3월 20일 목요일

오라클 DB에서 대량의 데이터를 빠르게 삭제하는 방법

지난번에 포스팅한 'RDB 대용량 테이블의 성능향상을 위한 팁'에 이어서 오늘은 대용량의 테이블에서 특정 조건을 만족하는 대량의 데이터를 빠르게 삭제하는 방법에 대해서 설명해 보겠다.

컨설팅을 진행하다보면 테이블의 데이터를 전혀 지우지 않아 문제가 되는경우를 종종 보게 된다. 이러한 시스템은 어떠한 타당한 이유가 있어서 그렇게 만들어졌다기 보다는 단순히 물리 삭제할 경우 발생하는 영향을 고려해야 하는 것에 부담을 느껴 임시방편적으로 논리 삭제 플러그를 세우는 것으로 대응하다가 시간의 경과와 함께 점차 늘어나는 데이터가 성능문제로 이어지는 경우가 대부분을 차지한다.

테이블 전체를 삭제하는것은 Truncate table이나 Drop table을 이용해 빠르고 손쉽게 가능하다. 문제는 특정 조건을 만족하는 대량의 데이터를 삭제하는 경우인데, 조건이 단순한 논리삭제 플러그라 할 지라도 데이터가 수억건에 이르게 되면 처리에 상당한 시간이 걸리게 된다.

이러한 데이터 라이프 사이클 관리에서 오는 성능 문제는 엄연히 기술적 채무에 해당하는데, 이전 포스팅에서 밝힌바와 같이 문제가 표면화 되는 즈음에는 원인을 제공한 담당자는 이미 자리를 뜬지 오래이고 현재 담당자는 이 문제가 얼마만큼 심각한지에 대해서 인식이 부족한 경우가 많아 서툴게 작업을 진행하다 낭패를 보는경우가 많다.

이제부터 소개하는 방법은 레코드 수가 수억건 이상의 대용량 테이블에서 3할 이상의 데이터를 삭제해야 하는 경우에 매우 유용한 것으로,  일반적인 delete문을 이용한 삭제에 비해 수배에서 수십배의 효율을 보인다.

대량 데이터 고속 삭제 절차

  1. 대상 테이블의 DDL을 이용해 삭제 대상외의 데이터를 담을  임시테이블을 작성. (이 단계에서는 테이블만 작성하고 인덱스 및 제약조건등의 설정은 하지 않는다.)
  2. Insert into Select를 이용해 비삭제 대상의 레코드를 임시테이블에 복사.
    이때 APPEND NOLOGGING PARALLEL hint를 이용하면 속도를 비약적으로 향상시킬 수 있다. Create as Select를 이용하면 1번을 생략하고 테이블 생성과 복사를 한번에 할 수도 있다.
  3. 오리지널 테이블에 설정된 외부키,인덱스, Synonym, Materialized View등을 해제.
  4. 오리지널 테이블 드롭(또는 Truncate)
  5. 복사 테이블을 리네임.
  6. 인덱스, 외부키, Synonym, Materialized View등을 설정.
위의 방법으로 레코드를 삭제할 경우 자동적으로 테이블 세그먼트와 인덱스의 재편성이 이루어져 최적의 성능을 발휘 할 수 있게 된다.

2014년 3월 16일 일요일

RDB 대용량 테이블의 성능향상을 위한 팁

엔터프라이즈 어플리케이션에 있어서의 성능문제의 80%는 DB에서 발생하는것으로 알려져 있다. 인덱스 미설정에서 오는 Full Table Scan과 같은 단순한 문제라면 해결이 쉽지만 레코드수가 수억건에 이르는 대용량 테이블이 가져오는 성능저하는 어플리케이션 수정만으로는 대응이 쉽지 않은 경우가 많다. 이번 포스팅에서는 수억건 이상의 레코드를 지니는 대용량 RDB를 운영함에 있어서 적용 가능한 성능 향상 팁에 대해서 알아보고자 한다.

성능향상의 핵심은 밸런스

오라클, SQL Server, MySQL과 같은 관계형DB(이하 RDB) 성능을 좌우하는 세가지 요소는 I/O,  메모리, 그리고 CPU이다. RDB성능 튜닝은 이 세가지 자원에 걸리는 부하를 적절하게 분산시켜 비용대비 최적의 성능을 뽑아내는것이 핵심이다.




  • I/O: 디스크에 파일 형태로 영속화된 데이터의 읽기/쓰기에 해당한다. 데이터베이스라는것이 결국 데이터를 찾아서 읽고 쓰는것이 주된 역할인 만큼 세가지 요소중에 가장 큰 비중을 차지한다. RDB에서 저장장치로 주로 사용되던 하드디스크의 경우 오랜기간 성능개선이 정체되어 있었는데 SSD의 등장으로 비약적인 발전을 이루고 있다. 
  • 메모리: 적절하게 설정된 메모리는 캐쉬를 통해 I/O의 부담을 크게 줄여주는 역할을 한다. 특히 빈번하게 발행되는 SQL의 경우 캐쉬 히트율 (Cache hit ratio)은 SQL성능을 결정적으로 좌우하는 경우가 많다. OS자체가 지닌 메모리와는 별도로 DB가 사용 가능한 메모리는 DB설정에 의존하므로 빈번히 실행되는 SQL임에도 불구하고 캐쉬 히트율이 낮을 경우는 반드시 DB서버 어플리케이션에 할당된 메모리 용량을 체크해 보아야 한다.
  • CPU: CPU는 처리속도 전반에 관여하므로 당연히 성능에 주는 영향도 크다. 최근들어서는 멀티 코어 프로세스가 일반화 되어 처리속도가 크게 향상된 관계로 CPU로 인해 처리속도가 늦어지는 경우는 드문편에 속하지만, 취득한 데이터를 소팅한다던지 특정한 포멧으로 가공하는등의 데이터 가공을 대량으로 실시하는경우 성능저하를 가져오기도 하므로 프로파일링 데이터를 확인할 때에는 CPU Time의 비율을 반드시 확인해 주어야 한다.

성능과 관련된 세가지 요소중에 I/O를 맨 위에 올려놓은것은 이 글의 주제가 대용량 테이블의 성능 향상에 대한 것이기 때문이다. 대용량 테이블의 성능문제는 I/O의 오버헤드가 중심에 위치하게 되며 해결의 실마리는 이 오버헤드를 CPU와 메모리에 적절하게 분산시키는데에 있다.

수억건 이상의 데이터를 다루는 테이블에서의 성능문제

최근 필자가 수행했던 컨설팅 업무에서 발생한 사례를 소개해 보겠다. 문제가 된 것은 월 단위로 수행 되는 일괄처리(batch process) 어플리케이션의 성능이었는데, 운영 환경의 로그와 DB프로파일링 레포트(Oracle AWR Report)를 조사해 본 결과 원인은 수억건의 데이터를 지니고 있는 어느 테이블과 관련된 검색SQL의 실행 시간이 전체 일괄처리 시간의 상당부분을 차지하고 있다는것이 밝혀졌다. 처음에는 수천개에 해당하는 IN구를 포함한 비 효율적인 SQL 구조를 성능저하의 원인으로 지목하였지만, 실행 계획 분석등을 통해 근본적인 원인이 복수의 대용량 테이블을 조인하여 사용하는 관계로 엄청난 양의 I/O가 발생하는데 있음을 확인할 수 있었다.
 일반적으로 대용량 테이블이라 하더라도 인덱스가 제대로 작동하고 있다면 검색 자체가 성능저하를 가져 오지는 않는다. 다만, 복수의 JOIN과 같이 대량의 네스티드 루프가 발생한다면 엄청난 양의 I/O가 발생하고 이것이 RDB전체의 성능을 크게 저하시키는 원인이 되기도 한다.

대용량 테이블 성능개선 팁

SSD

수백퍼센트의 극단적인 성능향상을 추구하는 고객에게 가장 확실한 해결책으로 SSD 도입을 권하는것은 이미 DBA사이에서는 2년전부터 대세로 자리잡았다. 그만큼 SSD는 하드디스크와 비교하여 엄청낭 성능향상을 기대할 수 있는데, 특히 DB성능을 구성하는 중요한 요소인 랜덤 억세스에 대해서는 거의100배가 넘는 성능향상을 보이기도 한다.

A Comparison of Solid State Drives to Serial ATA (SATA) Drive Arrays for Use with Oracle

DB저장장소로서 SSD를 고려할 때에는 비용적인 문제와 안정성이 중요하게 고려되어야 한다. SSD는 하드디스크와 비교하여 값이 매우 비싸고 안정성부분에 있어서 기대 수명이 HDD의 절반밖에 되지 않기 때문이다.

안정성 문제에 대한 해결방안으로 레이드 구성이 유효하다 할 수 있는데, 여기서 한가지 주의해야 할 점은 동일한 공정으로 생산된 제품의 경우 비슷한 시기에 수명이 다할 확율이 높으므로 가급적 다른 LOT넘버를 지닌 제품으로 레이드를 구성해야 한다는 점이다.

또 한가지 SSD 사용을 위한 전략은 속도가 빠른 SSD를 캐쉬전용으로 사용하고 영속저장소로는 HDD를 이용하는 방법이다. 이러한 경우 안정성을 크게 높이면서도 속도에 이득을 가져 올 수 있으면서 비용적인 측면에서도 억세스가 덜 일어나는 영속저장소에 HDD를 활용 가능하다는 점에서 높은 가격대비성능을 기대 할 수 있다. 오라클의 경우 이미 이러한 방식의 사용을 지원하며 SQL Server또한 2014버전부터 이러한 방식을 지원할 예정이다.

Accelerating Oracle database performance with SSD

테이블 압축

테이블 압축은 테이블 데이터를 압축해서 보관함으로서 파일 I/O를 감소시키는것을 목적으로 한다. 오늘날 멀티코어가 보편화 됨에 따라 CPU자원은 상당히 여유가 있는 대신, 처리해야 하는 데이터의 양은 크게 증가하여 I/O 병목현상이 흔히 발생하고 있다. 테이블 압축의 근본적인 아이디어는 I/O의 오버헤드를 상대적으로 여유가 있는 CPU로 전가하는것으로, 데이터의 내용이나 CPU의 구성에 따라 다르기는 하지만 필자의 경험상 테이블 용량은 1/3이하에 탐색속도는 30%이상 향상을 가져 올 수 있있다.
 테이블 압축은 단순히 디스크에 저장되는 세그먼트화일의 크기만이 아니라 메모리에 로드되는 데이터의 양도 크게 증가시키기 때문에 캐쉬매모리를 크게 증가시키는 효과를가져옴으로서 캐쉬 히트율을 늘려준다.
 테이블 압축을 하는경우 읽기, 쓰기, 업데이트의 성능변화가 각각 다르게 나타나며 RDB의 제품에 따라 다른 특징을 지니므로 이를 고려햐여야 한다. 오라클의 경우 읽기에는 상당한 성능향상을, 쓰기(삭제)는 변화가 없으며, 업데이트는 비압축보다는 약간 느려지는것으로 알려져 있다.

Advanced Compression with Oracle Database 11g 

SQL Server 2008 Page Compression: Compression ratios with real-world databasesSQL Server 2008 Data Compression: Impact of Data DistributionSQL Server 2008 Page Compression: Performance impact on table scansSQL Server 2008 Page Compression: Performance impact on insertsSQL Server 2008 Page Compression: Using multiple processors
RDB에 있어서의 테이블 압축은 위에서 소개한 SSD와 더불어 사용할 경우 성능향상과 비용이라는 두마리 토끼를 잡는데 매우 유용하며, Full Table Scan이 발생하는 경우 SSD + 압축으로 200배의 성능향상을 이끌어 낼 수 있다는 기사도 찾아 볼 수 있다.
Oracle 11g Data Compression Tips for the Database Administrator

테이블 파티셔닝

테이블의 데이터를 특정 조건(날자나 ID등)으로 분리할 수 있다면 테이블 파티셔닝이 성능향상에 효과적일 수 있다. 다만, 파티셔닝은 한가지 조건으로만 가능하므로 다양한 조건으로 검색되는 테이블의 경우 파티셔닝이 특정 조건에서는 유리하게 작용하지만 다른 조건에서는 불리하게 작용 될 수도 있다.

일반적으로 수억건에 이르는 데이터를 지니는 테이블이라 할 지라도 실제 빈번하게 억세스되는 유효 데이터의 건수는 얼마 되지 않는 경우가 많다. 이러한 유효 데이터와 통계등의 수치취득을 위해 남겨놓는 데이터를 별도 파디션으로 분리하여 관리하고 여기에 SSD나 압축과 같은 테크닉을 첨가한다면 대단히 효율적인 데이터베이스의 구축이 가능할 것이다.

Partitioning in Oracle Database 11g

결론

성능문제는 대부분 시스템이 운영되고 일정시간이 흐른 후에 주요 과제로 부각되기 시작한다. 따라서, 시스템이 가진 대부분의 문제점들이 발생에서 해결까지의 시간이 비용과 정비례한다는 사실을 고려 할때 성능 문제의 해결에는 많은 비용이 발생기 마련이다. 
 DB튜닝에 의한 어플리케이션 성능 개성은 어플리케이션 구조의 변경없이 가능한 경우가 많기 때문에 성능문제가 발생되었을 경우 우선적으로 고려되는 경우가 많은데, 그렇다고 해도 아무런 고려 없이 DB부터 들여다 보는것은 피해야 한다.
 성능개선의 작업방향을 결정할 때에는 DB이외에도 관계되는 요소들이 많으므로 프로파일링과 코드레뷰를 병행하여 각각의 모듈에서 어느정도의 처리비용이 발생하고 있는지 입체적으로 살펴볼 필요가 있다. 때에 따라서는 간단한 캐쉬사용만으로도 불필요한 DB접속을 줄여 전체 성능의 비약적 향상을 가져 올 수 있는 경우가 흔히 있기 때문이다.