메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

Perl을 Python으로 포트하기

레거시의 테스트하지 않은 Perl을 Python으로 마이그레이션하기 위한 기술

Noah Gift , Founder, GiftCS, LLC
Photo of Noah Gift

Noah Gift is the co-author of Python For UNIX and Linux System Administration by O'Reilly, and is also working on Google App Engine In Action for Manning. He is an author, speaker, consultant, and community leader, writing for publications such as Red Hat Magazine, O'Reilly, and MacTech. His consulting company's website is http://www.giftcs.com, and much of his writing can be found at http://noahgift.com. You can also follow Noah on Twitter.

He has a Master's degree in CIS from Cal State Los Angeles and a B.S. in Nutritional Science from Cal Poly San Luis Obispo. He is an Apple- and LPI-certified sysadmin, and has worked at companies such as Caltech, Disney Feature Animation, Sony Imageworks, Turner Studios, and Weta Digital. In his free time, he enjoys spending time with his wife, Leah, and their son, Liam, composing for the piano, running marathons, and exercising religiously.

요약:  레거시 Perl을 Python으로 포트하는 것은 어려운 태스크가 될 수 있습니다. 이 기사에서는 금기 사항을 비롯하여 레거시 코드를 처리하는 작업에 숨겨진 일부 이론에 대해 학습합니다.

원문 게재일:  2010 년 9 월 01 일 번역 게재일:   2010 년 12 월 21 일
난이도:  고급 원문:  보기 PDF:  A4 and Letter (32KB | 6 pages)Get Adobe® Reader®
페이지뷰:  3121 회
의견:  


필자는 Damian Conway의 Perl Best Practices:의 다음과 같은 문구를 인용하여 이 글을 시작하겠다. "'오브젝트 지향'에 대한 Perl의 접근방식은 거의 너무 Perl적이다(Perlish). 이를 수행하는 방법은 엄청나게 많다... 가능한 구현, 구조 및 시맨틱의 조합이 너무나 많기 때문에, Perl 00의 동일한 스타일을 정확하게 사용하는 두 개의 관련 없는 클래스 계층을 찾는 것이 매우 드물다."

Perl 언어의 설계 측면에서 이러한 내재된 유연성은 당연히 Perl 코드의 유기적 축적을 초래하였다. 이는 기술적으로 실행되기는 하지만 변경하기에는 손상되기 쉽고 이해하기에는 어려웠다. 문제가 심각해지는 것은 원래의 개발자가 다른 프로젝트나 다른 회사로 이동하여 더 이상 없을 수 있는 경우이다. 레거시 코드에 대한 부담 이외에도 프로덕션 요구사항은 변경될 수 있고, 또는 더 새로운 공급업체 API가 Python에서만 사용 가능할 수도 있다. 이 때에 Perl을 Python으로 포트하는 기념비적인 위업이 시작된다.

이러한 결정에 도달하면 문제를 해결하기 위해 최선의 정책을 선택해야 한다. 다행히 전체 테스트 커버리지를 갖춘 잘 쓰여진 오브젝트 지향 Perl의 코드 기반이 있는 경우, Perl에서부터 Python으로 유닛 테스트를 포트한 다음에 적절한 Python 코드가 새롭게 포트된 Python 유닛 테스트를 패스하도록 만드는 것만큼 간단할 수 있다. 잘 문서화되고 읽기 가능한 코드를 쓰는 유능한 Perl 프로그래머들이 많다고 하더라도 이들은 가능한 것만큼 일반적이지는 않다. 아마도 Perl 코드가 정확히 어떻게 작동하는지 몰라서 작동하는 것을 관찰할 수 밖에 없는 상황이 될 것이다. 여기에서 Perl을 Python으로 포트하기의 애로점이 실제로 시작된다.

금기 사항: 새 Python 코드에서부터 Perl 코드 호출

Python에서 테스트 생성 자동화하기

Python 프로그래머들은 너무 우쭐해하지 말아야 한다. 많은 수의 사람들이 Python은 고도로 읽기 가능한 언어로 만드는 방식으로 설계되었다고 인정하지만, 레거시의 테스트하지 않은 Python 코드에는 여전히 문제가 있을 수 있다. 무엇보다도 Python은 자체적으로 테스트 하지 않는다. 그렇지 않은가?

레거시의 테스트하지 않은 Python을 처리하는 잠재적인 방법 중 하나는 테스트 생성 도구 Pythoscope를 사용하는 것이다. Pythoscope의 강령은 "Python으로 쓰인 레거시 시스템에 대해 유닛 테스트를 자동 또는 반자동으로 생성할 쉽게 사용자 정의할 수 있고 확장할 수 있는 오픈 소스 도구 작성하기"이다. 게다가 실행을 기반으로 하여 자동으로 기능을 테스트하는 시작점을 정의할 수도 있다. 이를 작동하는 방법의 자세한 예제는 참고자료를 참조하자.

이를 수행하기 위한 권장 방법을 설명하기 전에 먼저 금기 사항에 대해 살펴보자. 도전과제에 직면했을 때 가장 저항이 적은 경로를 선택하는 것은 인간의 본성이다. 10년 간 유기적으로 성장하고 테스트하지 않은 Perl 코드를 Python으로 포트하는 것은 어려운 문제이기 때문에, 가장 명백한 솔루션은 그 Perl 코드 전부를 다시 쓰는 것과 관련하여 방법을 찾는 것으로 보인다. 이렇게 생각하다 보면 Python에서 Perl 인터프리터를 임베드할 수 있는 perlmodule이라는 모듈까지 생각하게 된다. 이는 새 Python으로부터 이전 Perl 코드를 호출하여 수행하는 것처럼 단순해 보인다.

이는 실제로는 매우 좋지 않은 생각이다. 왜냐하면 시작할 때보다 이제 더 큰 문제가 발생하기 때문이다! 이해하지 못하는 레거시 코드가 생겼고, 이해하지 못하는 코드를 호출하는 새 코드가 생겼다. 이는 또다른 카드에서 현금 선지급을 사용하여 다른 신용 카드 대금을 지불하는 것과 같다. —필연적인 일을 미루고 기술적 부채(technical debt)를 늘리는 것일 뿐이다(기술적 부채에 대한 자세한 정보는 참고자료의 링크 참조). 설상가상으로 테스트하기 어렵거나 테스트가 불가능한 사소한 버그를 통합하여 새 코드가 "감염될" 것이다. 마침내 그 프로젝트에 나중에 합류한 신규 개발자는 테스트하지 않은 Perl과 부적절하게 테스트한 Python이 위협적으로 혼합된 코드 기반을 사용하여 작업하게 될 것이다.


스펙을 새로 작성하기 위해 nose로 레거시 코드 기능적 테스팅

Working Effectively With Legacy Code이라는 책의 저자인 Michael Feathers는 "기존 코드에 대해 테스트를 쓰려고 시도하면 거의 모든 사람은 그 코드가 테스트하기에 얼마나 엉망인지를 느끼게 된다." 레거시의 테스트하지 않은 Perl을 Python으로 포트하는 것에 대해 생각할 때에 아마도 이와 같이 느낄 것이다.

심리적이며 기술적인 중요한 단계 중 하나는 포트하려고 시도하는 중인 Perl 코드의 최종 결과를 정확하게 포착하는 기능적 테스트를 작성하는 것이다. 예를 들어, 대형 로그 파일을 구문 분석하고 콤마로 분리된 값 보고서를 생성하는 Perl 스크립트를 포트하는 경우, 쓰고 있는 새 코드에서 이것이 실제로 발생하는지 확인하는 간단한 실패의 기능적 테스트를 쓸 수 있을 것이다.

이 새 예제를 따라 하려면 nose를 설치해야 할 것이다. Python easy_install 도구가 이미 설치되어 있는 경우 easy_install nose 명령을 간단하게 실행할 수 있다. 그렇지 않은 경우, 먼저 setuptools 설치 지시사항을 따라 setuptools를 설치할 수 있다.

이를 사용하여 준비가 되면, 여기에 예제 nose 테스트가 있다.


목록 1. 의도적으로 실패하는 nose 기능적 테스트

#!/usr/bin/env python
"""First pass at porting Perl to Python"""

import os

def test_script_exists():
    """This test intentionally fails"""
    assert os.path.exists("myreport.csv")

계속 진행하여 실제로 이 테스트를 실행하면 다음과 같이 표시되어야 한다.


목록 2. 테스트 결과

linux% /usr/local/bin/nosetests
F
======================================================================
FAIL: test_failing_functional.test_script_exists
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/Python/2.5/site-packages/nose-0.10.4-py2.5.egg/nose/case.py", 
    line 182, in runTest 
      self.test(*self.arg)
  File "/usr/home/ngift/tests/test_failing_functional.py", line 7, in test_script_exists
    assert os.path.exists("myreport.csv")
AssertionError

----------------------------------------------------------------------
Ran 1 test in 0.037s

FAILED (failures=1)

이 실패 테스트에서 확인 가능한 대로 이 파일을 작성하기 위해 아무 것도 하지 않았기 때문에 어설션은 실패했다. 이는 처음에는 무의미한 것처럼 보이지만, 레거시 코드의 어두운 배후에서 가능한 한 많은 것을 맵핑 아웃하는 프로세스에서 하나의 단계이다.

이전 코드의 기능적 스펙을 가능한 한 많이 채워 넣어서 기능적 테스트를 쓰면, 모듈형의 테스트 가능하고 잘 쓰인 Perl 부분에 대해 실패하는 유닛 테스트를 작성하는 것까지 식별할 수 있는지 확인할 가치가 있을 것이다. 합리적인 스펙이 모양을 갖추기 시작할 때까지 코드의 이러한 부분에 대해 실패하는 테스트를 더 많이 쓸 수 있다.

실제로 가장 어려운 부분인 마지막 단계는 작성한 이 테스트를 패스하는 Python 코드를 쓰는 것이다. 불행히도 묘안은 없다. 레거시의 테스트하지 않은 코드를 Perl이나 다른 언어에서 포트하는 것은 말 그대로 어렵지만, 실패하는 테스트를 쓰는 것은 큰 도움이 될 수 있으며, 합리적인 전략이다.


결론

Guido Van Rossum의 기사인 "Strong Versus Weak Typing"의 다음 글을 인용하여 마무리하자. "버그를 모두 없애지는 못할 것이다. 코드를 읽고 쓰기에 더 쉽고 소스 코드를 검토할 독자의 팀에게 더 분명하게 만드는 것이 훨씬 더 가치있을 수 있다...."

궁극적으로 읽기 가능하고 테스트 가능한 코드를 작성하는 것은 조심스럽게 말한다면, Python과 같이 새 언어로 레거시 코드를 포트하는 것의 주요 목표 중 하나이다. 이 이상을 수용하면 그 프로세스의 두려움과 고통을 어느 정도 없앨 수 있다. 행운을 빈다!


참고자료

교육

제품 및 기술 얻기

  • 자신에게 가장한 적합한 방법으로 IBM 제품을 평가해 보자. 시험판 제품을 다운로드하거나, 온라인으로 제품을 사용해 보거나, 클라우드 환경에서 제품을 사용하거나, SOA Sandbox에서 SOA(Service Oriented Architecture)를 효과적으로 구현하는 방법을 배울 수 있다.

토론

  • developerWorks community에 참여한다. 개발자가 운영하고 있는 블로그, 포럼, 그룹 및 위키를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.

필자소개

Photo of Noah Gift

Noah Gift is the co-author of Python For UNIX and Linux System Administration by O'Reilly, and is also working on Google App Engine In Action for Manning. He is an author, speaker, consultant, and community leader, writing for publications such as Red Hat Magazine, O'Reilly, and MacTech. His consulting company's website is http://www.giftcs.com, and much of his writing can be found at http://noahgift.com. You can also follow Noah on Twitter.

He has a Master's degree in CIS from Cal State Los Angeles and a B.S. in Nutritional Science from Cal Poly San Luis Obispo. He is an Apple- and LPI-certified sysadmin, and has worked at companies such as Caltech, Disney Feature Animation, Sony Imageworks, Turner Studios, and Weta Digital. In his free time, he enjoys spending time with his wife, Leah, and their son, Liam, composing for the piano, running marathons, and exercising religiously.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=리눅스, 오픈 소스
ArticleID=604109
ArticleTitle=Perl을 Python으로 포트하기
publish-date=09012010
author1-email=noah.gift@giftcs.com
author1-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.