소프트웨어 프로젝트를 성공적으로 수행하기 위해선 개발에 참여하는 이해관계자들간에 사용하는 기술과 물적/인적 자원, 프로세스의 공유가 절대적으로 필요하다는 것은 소프트웨어 개발을 해본 사람이라면 누구나 공감할 것이다. 하지만 이러한 개발 환경과 관련된 문제들은 이해의 범위와 자원의 한계로 많은 한계에 부딪히고 실직적인 프로젝트 실패라는 고배를 마셔본 경험을 개발자라면 능히 한번쯤은 해 보았을 것이다.

인력이나 금전적 문제같은 물리적 자원의 부족으로 불안정한 상태의 프로젝트를 무리해서 진행하는 것보다는 안정화 단계를 거치는 것이 소프트웨어 품질 개선을 위한 최선의 방향이겠지만, 어디서부터 잘못 되었는지 찾아 내는 것 또한 그리 만만한 작업은 아닐 것이다. 이러한 문제들로 인한 자원낭비를 줄이기 위해 다양한 방법들이 개발자들간에 거론되고 다양한 시도가 실무에서 이루어지면서 지금은 소프트웨어 품질개선을 위한 솔루션들이 제품화되어 출시되고 있을 정도로 품질관리 영역 또한 소프트웨어 개발의 중요한 분야로 자리잡은 상태이다.

소프트웨어 공학에서 제안하는 수많은 개념 중에 다양화, 대형화 되고 있는 소프트웨어 프로젝트의 특성 때문에 고전적으로 빌드단계에서 품질관리가 이루어지던 방식에서 생산성과 안정성 확보를 주기적인 빌드를 통해 고품질의 소프트웨어 개발을 보장하고 통합운영할 수 있는 개념도 나오게 되었다.

세상에 변하지 않는 것은 없다는 불교의 진리처럼 이용자의 요구사항도 변하고, 소프트웨어의 기능도 변하기 때문에 소프트웨어의 지속적인 변화, 즉 업그레이드는 소프트웨어 분야에서 자연의 순리라 할 수 있다. 이런 과정을 보다 효율적으로 수행하기 위해 나온 것이 지속적 통합(Continuous Integration)으로 소프트웨어 개발 생명주기에 걸쳐서 코드 품질 보증에 대한 초점을 맞춘 방법이다.

소프트웨어의 지속적 통합은 소프트웨어의 품질 향상이란 근본적인 목적뿐 아니라 최소한의 백업 및 공유를 제공할 수 있기 때문에 프로젝트를 수행하는 데 꽤나 유용하리라 본다.

지속적 통합을 위해 기본적으로 충족되어야 할 것이 몇 가지 있는데

  • CVS, Subversion, Git와 같은 소스코드를 공유하고 이력을 관리할 수 있는 형상관리저장소
  • 지금 내가 프로그램이 아닌 버그를 만든 것은 아닌지를 확인할 수 있는 단위 테스트 환경
  • Ant 혹은 Maven 같은 빌드 자동화(Build Automation) 도구들

이 제공되어야 한다. 특히 CI와 빌드 자동화를 위한 프로그램은 허드슨(http://www.hudson-ci.org/)과 젠킨스(http://jenkins-ci.org)같은 프로그램들로 이미 유포되어 사용되고 있으며 역사가 조금 더 오래된 Hudson 의 경우는 몇몇 프로젝트 그룹에서 사용되어 괜찮은 평가를 받고 있다.

지속적 통합을 처음 접하고 어디서부터 시작하면 좋을지를 고민중인 개발자라면 Hudson 을 설치하고 Hudson 환경에 맞게 개발환경을 구축한다면, 제법 그럴듯한 지속적 통합 환경에서 평안하고 희망적인 개발을 기대할 수 있을 것이다.


허드슨 특징 및 다운로드

허드슨의 주요특징을 간략하게 설명하면 기본적으로 CI서버 기능을 제공하면서 플러그인 기반으로 동작하기 때문에 설치된 플러그인의 종류에 따라 다양한 분석을 수행할 수 있다. 자바로 개발되었기 때문에 JDK 6.0 이상이 설치된 환경에서 설치가 쉽고, 웹을 통해 서비스를 이용할 수 있다.
JDK 6.0 이상과 Apache Tomcat 5 이상이 설치되었음을 가정한다.

1. 우선 허드슨 홈페이지(http://www.hudson-ci.org/) 메인 페이지 좌측 하단을 보면 최신버전의 허드슨을 다운받을 수 있다. 웹 기반 서비스가 제공되기 때문에 Servlet Container 에서 서비스 될 수 있는 WAR(Web ARchive) 파일로 제공된다.



2. 시스템에 따로 설치를 할 필요 없이 다운받은 파일(hudson-3.1.1.war) 을 직접 실행하거나 톰캣 서버를 이용해 서비스를 실행할 수 있다. hudson 자체적으로 동작할 수 있도록 Jetty 서버를 탑재하고 있기 때문에 별도의 웹 어플리케이션 서버를 설치하지 않아도 실행은 가능하다.
- 허드슨에 내장된 Jetty 서버는 다음과 같이 실행시킨다.
> java -jar hudson-3.1.1.war 톰캣 서버를 이용하는 경우는 톰캣이 설치된 폴더의 webapps 폴더에 war파일을 복사해 붙혀 넣으면 된다.



3. Tomcat 서버를 실행하면 자동으로 war파일에 해당하는 컨텍스트 폴더가 생기고 웹 브라우저를 열어 주소창에 "http://localhost:8080/hudson-3.1.1" 를 입력하면 hudson 서비스 페이지로 이동하게 된다. hudson에 내장된 Jetty 서버를 이용하는 경우는 주소창에 "http://localhost:8080/"를 입력하면 톰캣에서의 결과를 확인할 수 있다. 처음 설치해 실행하는 경우엔 유용한 플러그인 선택 화면을 통해 필요한 플러그인 설치를 수행할 수 있다.




백업 및 복구 방법


허드슨의 모든 설정과 프로젝트 소스 코드는 허드슨 홈 디렉토리에 저장되기 때문에 홈 디렉토리를 복사하고 붙여넣는 것만으로 백업과 복구 작업이 가능하다. 허드슨 홈 디렉토리 이름은 .hudson 으로 되어 있으며, 윈도우즈의 경우는 "C:/uesrs/계정폴더/.hudson" 처럼 위치한다.





보안 설정

허드슨 메인 화면 왼쪽 메인메뉴의 "Hudson 관리"를 클릭하면 관리화면을 통해 플러그인을 관리하거나 시스템 로그를 확인할 수 있다. 관리화면에서 "Configure Security" 링크를 클릭하면 허드슨 보안기능, JDK/Ant/Maven 설치경로 및 이메일 통지 등을 설정할 수 있는 화면으로 이동하게 된다.




"Enable security" 체크박스를 선택하면 설정 폼이 활성화되어 설정을 계속 진행할 수 있다. Tomcat 설치 폴더의 conf 폴더의 tomcat-user.xml 파일에 설정되어 있는 Role을 이용한 그룹별 권한 설정 방법은 다음과 같다.

(1) 우선 톰캣서버의 tocmat-user.xml 에 role을 정의한다.



(2) 허드슨 보안관리 페이지의 Security Realm 에서 Delegate to servlet container 를 선택한다.



(3) Authorization 영역에서는 Matrix-based security 를 선택한다. Anonymous 그룹에는 Overall 의 read 권한만을 부여하고, 하단 User/group to add 에 추가할 tomcat-user.xml 에 등록된 그룹 이름을 입력한 후 "Add" 버튼을 눌러 추가한 후 권한 체크한 후 저장하게 되면 등록된 사용자 계정으로 로그인 할 수 있다.



(4) 시스템 설정
Manage Hudson 페이지의 Configure System 을 클릭하면 JDK, Maven, Subversion 등의 경로설정 및 이메일 통지 설정을 할 수 있다.
1) JDK 경로 설정
JDK 영역의 Add JDK 버튼을 클릭하면 JDK를 추가할 수 있는 입력폼이 나온다. 이미 설치되어 있는 JDK를 이용하기 위해선 Install automatically 체크박스 선택을 해제하고 이름과 JAVA_HOME 경로를 입력한 후 저장한다.





작업 등록

허드슨은 기본적으로 자바뿐만 아니라 C/C++ 의 프로젝트 빌드할 수 있다. 기타 다른 언어들도 지원하지만 그러기 위해선 프로젝트 유형에 맞는 플러그인을 설치해야 한다.

1. 허드슨 페이지 왼쪽 메인 메뉴에서 "새 작업"을 클릭하면 아래와 같이 간단한 작업으로 프로젝트를 등록할 수 있다. 4가지 항목 중에 "Build a free-style software job" 이 무난하기 때문에 이것을 선택해 프로젝트를 등록하도록 한다.




2. save 버튼을 눌러 작업을 등록하면 작업에 대한 보안설정 화면으로 이동하게 된다. 다른 선택사항들은 그대로 두고 Source Code Management 영역의 Subversion 설정을 보면 Repository URL 에 SVN 주소를 넣고 Local module directory 에 동기화할 폴더 경로를 입력한다. 기본적으로 동기화 폴더는 허드슨 홈 디렉토리(.hudson)에 하게 된다. 다른 설정들은 기본으로 한 후 저장한다. 플러그인이 설치 된 경우 CVS, Git 정보들에 대한 설정도 가능하다.




3. Build Triggers 영역을 보면 언제 프로젝트 빌드 작업을 수행할 것인지를 선택할 수 있게 되어 있다.
- Build after other jobs are built : 다른 작업들의 빌드 작업이 끝난 후에 빌드 수행
- Trigger builds remotely : HTTP를 통해 원격으로 빌드수행.
- Poll SCM : 형상관리 서버가 변경되었을 때 빌드 수행
- Build periodically : 설정한 일정에 따라 반복적으로 빌드 수행



4. Build 영역에서 빌드 설정을 할 수 있다. 콤보박스를 누르면 4가지 선택항목이 있다. 프로젝트 환경에 맞게 선택을 하면 된다.
- Invoke Maven 2 (Legacy) : Maven 형식의 자바 프로젝트를 빌드한다.
- Execute shell : 리눅스 플랫폼에서 서비스되는 경우 셸 스크립트를 실행할 수 있다.
- Execute Windows batch command : 윈도우 플랫폼에서 서비스되는 경우 사용된다.
- Invoke Ant : Ant를 이용한 자바 프로젝트를 빌드한다.



5. Post build Actions 영역에서 빌드가 완료된 후 수행할 작업들을 선택할 수 있다.
- Publish JUnit test result report : Junit 수행 테스트 결과를 게시한다.
- Archive the artifacts : 빌드하고 나서 target 디렉토리의 모든 Jar 파일을 아카이브 파일로 제공한다.
- Record fingerprints of files to track usage : 현재 프로젝트가 참조되는 프로젝트의 위치를 표시한다.
- Build other jobs : 다른 빌드 작업을 수행



모든 설정이 완료된 후 save 버튼을 눌러 저장하면 빌드작업 설정은 끝이난다. 생성된 작업 화면을 통해 프로젝트 빌드 이력관리, 상태정보 등을 확인하면서 누가 버그를 만들고 있는지 확인할 수 있다.


작성자 : 데이터사이언스센터 선임개발자 양성진

Posted by 人Co

2014/03/11 17:11 2014/03/11 17:11
Response
No Trackback , No Comment
RSS :
https://post-blog.insilicogen.com/blog/rss/response/149

장고(Django)의 CSRF 웹 취약점 대응

웹(WWW)이 대중화되고 많은 프로그램들이 웹으로 넘어오면서 웹 보안의 중요성은 날이 갈수록 강조되고 있습니다. 웹은 타 인터넷 네트워크 프로토콜에 비해 상대적으로 안전하다고 인식되기 때문에 일반적으로 서비스 포트(80)가 열려있으며 다양한 웹 어플리케이션이 동작하고 서비스됩니다. 그러다보니 웹을 통한 네트워크 취약점 또한 많이 연구되고 있으며, 악의적인 목적을 가진 임의의 공격자 역시 예전의 다양한 네트워크 프로토콜에 관련된 것보다는 직접 웹 어플리케이션의 취약점을 노리는 경우가 많습니다.

따라서, 웹어플리케이션을 구현할 때는 보안에 보다 더 주의해야 합니다. 국제 웹 보안 표준기구인 OWASP에서는 주기적으로 보안 10대 취약점을 발표하는데, 이 내용을 기준으로 자신의 웹 어플리케이션에 취약점이 없는가 점검하는 일은 매우 중요합니다.

OWASP 2007 Top 10 에 의하면 다양한 취약점들이 보고되고 있는데(조만간 2010년 Top 10이 발표될 듯 합니다), 그 가운데 매우 중요한 보안요소임에도 불구하고 많은 부분 신경쓰고 있지 못하는 취약점이 바로 CSRF 취약점입니다.

CSRF(Cross-site Request Forgery, 크로스사이트 요청 위조) 공격은 원클릭 공격, 사이드 재킹, 세션 라이딩 등으로도 알려져 있고, 약어로는 XSRF로도 알려져 있습니다. 이 공격은 사이트가 신뢰하는 사용자를 통해 공격자가 원하는 명령을 사이트로 전송하는 기법을 사용합니다. 공격이 사용자를 통해 이루어지기 때문에 공격자의 IP는 추적 불가능한 특성이 있습니다.

은행사이트를 예를 들자면, 공격자 A는 피해자 B가 접속하는 은행 사이트에 조작된 이미지 태그를 게시판에 남깁니다.
<img src="http://bank.example.com/withdraw?account=B&amount=100000&for=A" />
피해자 B 가 은행사이트에 접속하고 로그인하면 세션 정보가 남아있는 상태이고 이때 공격자 A가 게시판에 남겨놓은 글을 B 가 읽게 되면 해당 링크가 요청되면서 공격이 실행됩니다. 원래는 이미지를 불러오기 위해 지정된 이미지 링크롤 GET 메쏘드로 요청하게 되는데, 피해자 B가 인증되어 있는 상태인점을 이용하여 이렇게 우회공격을 할 수 있게 된 것입니다. 특히 대부분의 게시판들이 자바스크립트는 막아놓지만, 이미지 포스팅은 막지 않는 것도 공격에 유리한 상황을 만들어줍니다.

최근에 발생했던 옥션의 1800만명 개인 정보 유출 사고는 CSRF 공격을 당한 것으로 밝혀졌다고 합니다. 중국 해커는 직접 서버를 공격하는 대신, 옥션 운영진을 대상으로 악성 코드를 첨부한 메일을 대량으로 유포했습니다. 운영자가 메일을 확인한 순간 ID를 얻을 수 있었고, 해커는 이 ID를 이용하여 옥션 서버에 로그인할 수 있었다고 합니다. (용어사전 CSRF의 내용을 일부 인용했습니다.)

이러한 취약점을 막는 가장 기본적인 방법은 서버의 상태를 변경하는 요청에 대해 GET 을 쓰지 않는 것입니다. 하지만 만일의 경우 공격자가 스크립트를 이용하여 POST로 보낼 수 도 있으므로 POST 메쏘드인 경우에도 대비를 해야합니다. 따라서 가장 일반적인 해결 방법은,
 1. 서버의 상태를 변경하는 요청은 GET 을 쓰지 않고,
 2. POST 의 경우에도 hidden 필드에 임의의 키값을 전달하고 그 키값이 맞는가를 매번 확인하는 것입니다.

하지만, 실제 보통의 웹 어플리케이션은 2번의 방비가 되어있지 않습니다. 이는 불특정 사용자가 서버의 상태를 임의로 변경할 수 있는 약점을 가지고 있게 합니다.

장고(Django)에서는 1.2 버전부터 이러한 CSRF 취약점을 막는 기능을 기본으로 제공합니다. 모든 POST 방식의 폼 전송에는 hidden 필드로 세션에 따른 임의 키값을 전송하며, 해당 키 값이 유효한지를 매번 확인합니다.

이를 위해서는
 1. 설정파일(settings.py)에 미들웨어에 django.middleware.csrf.CsrfViewMiddleware를 추가하고,
 2. POST 가 사용된 폼 템플릿에 {% csrf_token %} 을 직접 삽입해야 합니다.
<form action="" method="post">{% csrf_token %}
만일 미들웨어를 쓸 수 없는 경우라면, django.views.decorators.csrf 의 csrf_protect 장식자(decorator)를 쓸 수 도 있습니다.
from django.views.decorators.csrf import csrf_protect
from django.template import RequestContext

@csrf_protect
def my_view(request):
    c = {}
    # ...
    return render_to_response("a_template.html", c,
                               context_instance=RequestContext(request))
특정 뷰에 대해 csrf를 적용하고 싶지 않다면 csrf_exampt 장식자를 사용합니다.
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def my_view(request):
    return HttpResponse('Hello world')
장고 뿐 아니라 최신의 웹 프레임워크 (Ruby on rails, Spring 등)은 모두 CSRF를 위한 별도의 방어 방법들을 제공합니다. 하지만 장고는 별도의 설정없이도 CSRF 대응이 가능하도록 구현되어 웹 초보개발자도 취약점이 존재하는 사이트를 만들 수 있는 여지를 사전에 차단한다는 점이 특징이라고 할 수 있습니다.

인실리코젠 KM팀에서 구현하는 대부분의 웹 어플리케이션은 최신 버전의 장고를 사용하고 있으며, 중요한 보안위험요소들을 주기적으로 검토하고 있습니다.

Posted by 人Co

2010/03/10 17:52 2010/03/10 17:52
, , ,
Response
No Trackback , No Comment
RSS :
https://post-blog.insilicogen.com/blog/rss/response/55

프로그래밍언어 파이썬(Python)과 웹프레임워크 장고(Django)는 당사 KM팀의 주요 개발 환경입니다. LabKM을 비롯한 다양한 프로젝트들이 파이썬과 장고를 이용하여 구현되었고, 개발중에 있습니다. 파이썬은 그 넓은 활용성과 다양한 적용분야와 활용사례에도 불구하고 국내에는 잘 알려지지 않았는데, 마침 파이썬이 어떤 언어인지 좀 알려달라는 고객분의 요청이 있어 간략히 소개하고자 합니다.

파이썬에 관하여,

파이썬은 동적형결정 객체지향 언어로 빠른 생산성과 다양한 라이브러리를 보유한 프로그래밍 언어입니다. 구글 내부에서 가장 많이 사용하는 언어로도 알려져 있습니다. 생물정보분야 및 각종 과학기술분야에 관련 라이브러리들이 잘 갖추어져 있어서, 과학기술용 어플리케이션을 만드는데 용이합니다.

개괄적인 설명은 위키피디아를 참조하시면 좋습니다.
 * 국문 : 파이썬
 * 영문 : Python

파이썬에 관련된 아래 포스팅들을 보시면, 실무경험자의 다양한 평가들을 확인할 수 있습니다.
 * 파이썬, 이슈에서 벗어나 대세로 자리매김
 * 프로그래밍 지형도를 바꾸는 파이썬
 * 파이썬을 배워야 하는 이유
 * 지식관리팀 주 개발환경 파이썬, 장고
 * 장고(Django)로 쉽고 빠른 웹개발

생물정보분야에도 많이 사용됩니다. 다음의 자료들을 확인해보세요.
 * 생물학 + 전산학 = 생물정보학 :
 * Python programming for Bioinformatics :
 * Python for Bioinformatics (서적)

인실리코젠에서 구축한 시스템 사례들도 있습니다.
 * 국립문화재연구소 고대유전자원정보시스템  (since 2009-11)
 * 국방부조사본부  6-25전사자유전자정보검색시스템 (본부 내부, 2009-11)
 * 가축유전자원시험장 가축유전자원종합관리시스템 (since 2009-01)
 * KIST 독성유전체분석시스템 (since 2009-02)
 * 대한환경위해성보건과학회 온라인논문투고 및 학회홈페이지 (since 2008-10)
 * 대한독성유전단백체학회 온라인논문투고 및 학회홈페이지 (since 2007-06)

인실리코젠 KM팀은 생물정보(과학기술용) 파이썬 라이브러리를 발전시키고 기술을 축적하며, 다양한 사용자의 요구사항의 반영이 용이하도록 준비함으로써 수준높은 웹 어플리케이션을 구현하고자 합니다. 많은 성원을 부탁드립니다.

Posted by 人Co

2010/02/12 17:17 2010/02/12 17:17
, ,
Response
No Trackback , No Comment
RSS :
https://post-blog.insilicogen.com/blog/rss/response/39

Django는 파이썬 웹 프레임워크로써 웹 개발을 편리하게 하기 위한 종합적인 환경을 제공한다. 편리한 웹 개발을 위해 제공되는 것들 가운데에는 객체관계매핑, 유연한 웹 템플릿 활용 등 다양한 것들이 있지만, 가장 중요한 특징은 바로 객체관계매핑이다. 본 포스팅은 초보 웹개발자를 위해 Django 에서는 어떻게 데이터베이스를 사용하고, 이를 객체로 연결하여 활용하는 가를 설명한다.

Database --> SQL in source code

일 반적인 테이터베이스 어플리케이션은 보통 위 다이어그램 처럼 직접 데이터베이스 질의언어(SQL)을 어플리케이션 소스코드에서 직접 조작하는 방식으로 구성된다. 데이터베이스의 특정 테이블의 내용을 추출하기 위해서는 SQL "select" 구문을 직접 문자열로 조작하여 데이터베이스 연결 커서에 질의를 수행한다. 잘 알고 있는 내용이지만, 새로운 레코드를 삽입할 경우에는 "insert", 기존 레코드를 수정할 경우에는 "update", 삭제할 경우에는 "delete" 구문을 사용한다. 이들 역시 SQL 구문을 문자열로 조작하여 데이터베이스를 조작하게 된다.

Database --> Django ORM --> Object in source code

Django 는 위 다이어그램 처럼 데이터베이스의 내용을 객체로 변환하는 ORM(Object Relation Mapper)를 중간에 갖고 있어서, 어플리케이션 소스코드에서 직접 객체를 조작할 수 있도록 구성되어 있다. 개발자는 데이터베이스를 조작하는데 SQL을 사용하지 않고 직접 객체를 사용할 수 있다.

Django에서 데이터베이스의 관계(Relation)를 객체(Object)로 바꿀 때의 수준 및 용어는 다음과 같다.

Relation

Object

비고

Database

Project (Application)

하나의 프로젝트는 여러개의 App로 구성된다. 이들은 모두 하나의 database 를 사용한다.

Table

Model

클래스 개념

Record

Object

객체 개념

Column

Attribute

.

이러한 방식으로 각각의 SQL 구문은 다음처럼 객체지향 프로그래밍이 가능한다.

1. SELECT --> Est.objects.all()
--> Est.objects.filter(id__contains='1')
--> exclude, get, count,...
1. INSERT --> Est.objects.create(name='a',...)
1. UPDATE --> est = Est.objects.get(id=1)
est.name = b; est.save()
1. DELETE --> est.delete()

기 존의 어플리케이션 작성시 반복적으로 나타나는 SQL 구문의 패턴을 수정하는 일은 많은 중복과 함께 관리가 귀찮은 면이 있으나, 객체로 활용하면 보다 직관적이고 관리가 용이한 형태의 개발이 가능하다. 이밖에도 다음과 같은 장점이 있다.

  1. RDBMS independant (Oracle, MySQL, PostgreSQL, Sqlite) : Django 에 구현된 각 RDBMS 별 wrapper 를 통해 RDBMS 의 종류가 어떤것인가에 상관없이 만들 수 있다. 개발 용 PC에서는 가벼운 sqlite 를 사용하고, 실제 서비스에서는 Oracle 로 사용하는데 소스코드의 수정이 거의 필요없다. (물론 테스트를 통해 검토해 볼 필요는 있음)
  2. 직관적인 객체지향 프로그래밍 : 다양한 웹 프레임워크 및 웹 관련 라이브러리에서 객체관계매핑이 구현되어 있으나, Django 는 가장 직관적이고 활용이 용이한 방식을 제공한다.
  3. 기존의 DB 기반 구성을 객체 기반 구성으로 확장하여, 컴포넌트를 조합하는 방식의 개발이 가능하다.

대 신 단점도 있다. 복잡한 SQL 질의인 경우, ORM에서는 성능이 낮을 수 있다. : ORM 에서는 SQL 구문의 생성을 추상화하여 구현하였으므로, 복잡한 쿼리의 경우 비 효율적으로 SQL 구문이 생성될 수 있다. 또한 불필요한 질의를 자주 수행함으로써 성능이 낮아질 수 있다. 하지만 Django에서는 이러한 경우를 위해 사용자가 직접 SQL문을 만들 수 있는 기능을 제공하고 있으며, 오픈소스 커뮤니티를 통해 지속적으로 성능이 개선되고 있으므로 그다지 문제가 되지 않는다.

여 러개의 RDBMS를 지원함으로써, RDBMS 간의 마이그레이션이 용이하다는 장점도 있다. Django 에서 현재 데이터베이스의 내용을 덤프받고, 새로운 설정에서 로드하기만 하면된다. 아래 소스코드는 이전 대상 모델들의 데이터를 JSON 형식으로 덤프받고 새 환경에서 로드하는 내용을 보여준다.

from django.core.serializers import serialize
result = []
models = (User, ...) # 이전대상 모델들
for model in models:
result.extend(model.objects.all())
print serialize('json', result)

뒤 코드를 backup.py 로 저장한뒤,

./backup.py > ../fixtures/initial_data.json

로 덤프받고, 새로운 환경에서

./manage.py syncdb

만 수행하면 마이그레이션이 완료된다.

Django 데이터 객체를 이용하여 데이터베이스를 검색하는 방법은 다음과 같다. 만일 Est 라는 모델이 있고, 속성이 name, identifier, sequence, data 가 있다면,

Est.objects.all() # 모든 EST 객체
Est.objects.filter(sequence__startswith='ATG') # sequence 속성이 ATG 로 시작하는 객체
Est.objects.filter( # 필터를 체인으로 연결
name__endswith='Etc.',
).exclude(
date__gte=datatime(2005,1,1),
).filter(
sequence__icontains('AGAGAG'),
)

q = Est.objects.filter(sequence__startswith='ATG')[:10] # queryset are lazy
print q
Est.objects.filter(amodel__bmodel__cmodel__name__startswith='abc') # field lookups related models

마지막 예제에서 처럼 1:다 혹은 다:1, 다:다 로 연결된 모델의 속성에 ''로 연결하여 연결(join) 검색을 수행할 수 있다는 점은 복잡한 관계에서의 편리한 데이터 검색을 가능하게 한다.

이 와 같은 연결된 모델 검색의 경우 다음의 경우가 다르다는 점을 주의해야 한다. 예를 들어 네이버같은 곳에서 여러개의 블로그를 운영하고 각 블로그에 여러 엔트리(글)이 있다고 가정한 뒤(블로그:엔트리 1:다), 특정 글을 갖고 있는 블로그를 두가지 조건으로 검색하는 방법은 다음의 두가지가 있다.

1. Blog.objects.filter(entry__headline__contains='Lennon',
entry__pub_data__year=2009)
2. Blog.objects.filter(entry__headline__contains='Lennon').filter(
entry__pub_data__year=2009)

1번의 방법은 두 조건을 동시에 만족하는 엔트리를 갖는 블로그를 찾지만, 2번의 방법은 첫번째 조건을 만족하는 엔트리를 갖는 블로그 목록에서 다시 두번째 조건을 찾는다.

위 기능들 이외에도, 버전 1.1 이후부터, 효과적인 검색을 위한 다음의 기능을 지원한다.

  1. F() object
  2. annotate()
  3. aggregate()

다음시간에 이 이상의 기능들에 대해 알아본다.

Posted by 人Co

2010/01/15 11:19 2010/01/15 11:19
, ,
Response
No Trackback , 1 Comment
RSS :
https://post-blog.insilicogen.com/blog/rss/response/33

지식관리팀과 생물정보팀의 주 개발환경은 파이썬(python) - 장고(django)입니다.

파이썬은 초보자부터 전문가까지 폭넓은 사용자층을 보유하고 있는 동적 타이핑(dynamic typing) 범용 프로그래밍 언어입니다. 다양한 플랫폼에서 쓸 수 있고, 라이브러리(모듈)가 풍부하여, 대학을 비롯한 여러 교육 기관, 연구 기관 및 산업계에서 이용이 증가하고 있습니다. 구글을 비롯한 다양한 기업에서 폭넓게 활용되고 있으며 쉬운 문법과 다양한 라이브러리를 통해 생물정보학을 비롯한 과학기술분야에도 많이 사용됩니다.

장고는 파이썬으로 만들어진 웹 프레임워크입니다. 라이브러리와 프레임워크의 차이점은 해당 기능을 빌려서만 사용하느냐, 전적으로 구현방식을 따라가느냐의 차이인데, 장고는 웹개발을 위한 프레임워크로서 개발자로 하여금 안정된 웹 어플리케이션을 신속하게 개발할 수 있도록 도와줍니다. 국내에는 워낙에 자바, JSP 기반 웹 어플리케이션이 많아 널리 알려지지는 않았지만, 그 안정성과 성능 및 쉬운 개발방식으로 전세계에 폭넓게 사용되고 있습니다.

얼마전, 국내에도 첫 번역서가 소개되어 많은 웹사이트들이 장고로 개발될 것으로 보여집니다. 지식관리팀 김형용 팀장이 이 책의 서평을 쓰기도 했습니다.

Django book Django book

장고의 중요한 특징 가운데 한가지는 특정 기능을 담은 어플리케이션을 컴포넌트 형태로 개발해서 이를 조합하여 운영할 수 있다는 점입니다. 지식관리 및 생물정보학에 관련된 다양한 기능들을 컴포넌트 형태로 독립구현하고, 사용자의 요구사항에 맞도록 조합하여 최적화된 서비스를 제공하고자 합니다. 당사 지식관리팀에서는 지식관리 중추역할를 위한 코어부분을 담당하고 있으며, 생물정보팀에서는 특정 생물정보 분석기능을 단위별로 구현하고 조합하며 고객의 요구사항에 부응하고 있습니다.

파이썬과 장고에 관심이 많고, 지식관리 및 생물정보 도메인에서 가치을 만들어 내고 싶은 분은 언제든지 지식관리팀으로 연락주시기 바랍니다. (참고로, 당사 공공사업팀의 주 개발환경은 Java입니다.)

Posted by 人Co

2009/05/19 15:40 2009/05/19 15:40
, , ,
Response
No Trackback , No Comment
RSS :
https://post-blog.insilicogen.com/blog/rss/response/17

PubMed 논문검색결과를 RSS로 받아보기

지난번 골라읽는 학술정보, RSS를 이용하여 내 분야의 최근 연구현황 파악하기를 통해서, 나의 관심 연구분야를 RSS로 받아봄으로써, 최근의 연구현황을 놓치지 않는 방법을 알아봤습니다. 당시, PubMed의 논문검색결과는 RSS로 제공되지 않는다고 말씀드렸었는데, 아니였습니다. Send to 라는 콤보박스 아래에 숨어있더라고요. 역시나 NCBI는 기대를 저버리지 않는군요. (biopython과 NCBI E-util로 만들어보려고 했는데, 찾아내서 다행입니다.)

먼저, 나의 관심 키워드를 검색해봅니다. http://www.ncbi.nlm.nih.gov 에 방문하여, 검색대상을 PubMed로 놓고, 제가 예전에 연구했던 selenocysteine을 입력해보겠습니다.

/wiki/InsilicoLog/2008-06-16?action=AttachFile&do=get&target=a.jpg

Preview/Index 탭을 열어보면, 나의 키워드를 조합해볼 수 있습니다. 1324개의 검색결과중에서 인간(human) 관련 논문만 보고싶다면,

/wiki/InsilicoLog/2008-06-16?action=AttachFile&do=get&target=b.jpg

검색결과를 546개로 줄일 수 있었습니다. 위 방법으로 검색필드 및 검색조건을 수정할 수 있습니다. 543개의 검색결과보기를 클릭하면, 다음의 검색결과 화면이 나옵니다.

/wiki/InsilicoLog/2008-06-16?action=AttachFile&do=get&target=c.jpg

"Send to" 라고 된 부분을 클릭하면, RSS Feed 라는 항목이 나옵니다. 이를 선택하게되면,

/wiki/InsilicoLog/2008-06-16?action=AttachFile&do=get&target=d.jpg

화면이 나오며, "Create feed"를 선택하면, 자주봤던 XML 아이콘이 보입니다.

/wiki/InsilicoLog/2008-06-16?action=AttachFile&do=get&target=e.jpg

자 이제 이제 이 Feed 주소를 RSS 수집 프로그램(bloglines 혹은 한RSS, 구글RSS리더 등)에 등록해 놓으면, 본 키워드로 새로 등록되는 논문들을 바로바로 받아볼 수 있습니다. 더이상 관련분야의 최신현황을 놓치지 마시길.

Posted by 人Co

2008/06/16 11:45 2008/06/16 11:45
,
Response
No Trackback , No Comment
RSS :
https://post-blog.insilicogen.com/blog/rss/response/6

지금 내가 연구하는 이 분야의 전세계적인 최근 소식은 무엇일까? 현대를 살아가는 연구자라면 늘 갖고 있어야 할 질문 가운데 하나입니다. 누군가 나와 비슷한 연구를 하고 있지는 않을까, 유사한 아이디어들이 등장하지는 않았을까, 늘 안테나를 쫑긋 세우고 고성능 레이더망을 구비하여 세상을 스케닝해야 하겠죠.

여기에 쓸만한 고성능 레이더망이 있습니다. 바로 RSS라는 기술을 이용하는 것입니다. RSS(Really Simple Syndication)란 Web2.0을 이야기할 때, 종종 소개되는 기술가운데 하나로서 뭔가 정보의 단편을 규격화해놓은 포맷입니다. 이 기술을 이용하여, 특정 분야의 최신 현황을 실시간으로 스케닝할 수 있는 레이더망을 구축할 수 있습니다.

RSS가 무엇인가 에 대한 설명은 RSS 등의 문서들을 참고하시고요, 간단히 예를 들어 설명하자면 다음과 같습니다.

내가 가입한 인터넷동호회가 다음에도 있고, 네이버에도 있고, 싸이월드에도 있다고 할 때, 매일 아침 이 모든 사이트의 새로 등록된 글들을 확인하고 싶다고 한다면, 일일이 로그인하고 들어가봐야 할 것입니다. 번거로움을 느낀 나머지, 각 웹사이트의 새글을 자동으로 수집하는 프로그램을 만들어야지라고 생각할 수 있을 것입니다. 물론 프로그래밍을 잘 하신다는 가정이지만요.

하지만, 이 문제의 경우, 프로그래밍을 잘 하더라도 쉽지 않습니다. 각 사이트의 웹페이지에 직접 접근해서 최근 글 부분이 어떻게 생겨먹었는지를 알아야 가져오든 말든 할텐데, 사이트마다 다 HTML 문서가 제각각이지요. 왠만큼 똑똑한 인공지능이 아니라면, 그 웹페이지의 글 구조를 알아차리기 쉽지 않겠죠. (유사한 시도가 있습니다. 기계학습이론을 적용해서 웹페이지에서 자동으로 RSS 만들기를 하기도 하지만 아직 실용화는 안되고 있습니다.)

문제는 형식을 통일하면 된다는 것입니다. 형식에 맞도록 각 사이트에
사용자 삽입 이미지
서 데이터를 주고, 내 프로그램이 그 형식에 맞도록 데이터를 취합하면 되니까요. 여기에 이야기된 그 형식이란 것이 바로 RSS 입니다. 블로그나 뉴스사이트에 가셨을 때 보이는 RSS 라는 마크가 그것을 의미합니다. (오른쪽의 그림처럼 생겼습니다.) 클릭해보면, XML이란 언어로 기술된 포맷에 컨텐츠가 담겨져 있습니다. 이제부터 프로그램은 그 RSS만을 이용하면 데이터의 취합이 훨씬 쉬워집니다. 어느부분이 새글이다, 등록시간은 몇시다라는 형식이 이미 정해져 있으니까요. 그것을 취합하는 프로그램은 이미 많이 있습니다. RSS 리더기라고들 이야기하죠. 웹으로도 제공되고 있고요, Bloglines한RSS 같은 곳이 대표적으로 사용자가 원하는 사이트들의 RSS를 취합하여 새로 등록된 글을 알려주는 서비스를 제공합니다. 이후, 나는 관심있는 사이트의 RSS들만 등록해 놓으면, 이후 자동으로 새글들을 취합하여 제게 보여줍니다.

위 방법으로 RSS리더기에 내 연구분야가 걸려들만한 사이트와 검색키워드들을 등록해 놓으면, RSS리더기가 새로운 정보들을 바로바로 알려줄껍니다. 자, 그러면, 내 연구와 관련된 RSS들은 어떻게 알 수 있을까요? 다음과 같은 방법들이 있습니다.

학술저널의 최신 출판 목록 받기


BaRf(Bioinformatics aggregated RSS feeds)라는 사이트가 있습니다. 어느 일본분이 많든 사이트로 추정되는 곳입니다. 여기는 PubMed의 주요저널별 최근 논문 초록의 목록을 RSS로 변환하여 제공합니다. 이 사이트의 저널목록에서 나의 연구분야를 대표하는 저널들을 선정하여, RSS 등록합니다. 이렇게 하면, 각 저널마다 새로운 논문이 출판되었을 때의 초록을 늘 받아볼 수 있습니다. 보아하니, 옥스퍼드 출판사에서 제공하는 Bioinformatics 저널의 RSS feed 주소는 http://barf.jcowboy.org/bioinformatics.xml 이군요. 이 주소를 복사해서 RSS 리더기에 등록하면 Bioinformatics 저널의 최근 논문들을 그때그때 자동으로 받을 수 있습니다.

위 사이트관리자의 언급에 의하면, 없는 저널의 경우, 메일로 알려주면 등록 추가하겠다고 합니다. 왠만한 생명과학관련 저널들은 다 찾아볼 수 있을 듯 합니다.

네이버 뉴스검색


국내 관련 분야 새소식 역시 중요합니다. 우리나라에 보도되는 대부분의 기사들을 네이버에서 통합제공하고 있지요. 네이버에 방문하여, 생물정보학 키워드로 뉴스를 검색해보면, 우하단에 ''뉴스검색 RSS 보기'' 라는 링크가 있습니다. 이렇게 생겼네요. 이 주소 역시 RSS 리더기에 등록하면, 해당 키워드의 국내소식을 가장 빠르게 알 수 있겠죠. 앞으로, 내 분야 관련 언론보도를 모르고 지나칠 일은 없을겁니다.


구글 블로그검색


블로거들의 정보 역시 빼놓을 수 없죠. 요즘 정말로 유용한 특정 정보들은 블로그에 많이 있습니다. 자기만의 독특한 분야를 자랑하기 좋아하는 블로그들의 취향으로 인해, 전문적이고도 실용적인 정보들을 구할 수 있습니다. 블로그들을 통합해서 검색해 주는 곳은 구글 만한 곳이 없죠. 만일 내가 selenocysteine관련 연구를 하고 있다고 한다면 구글사이트에 방문하여 selenocysteine을 검색어로 입력합니다. 구글검색결과화면의 좌상단을 보면 블로그만 보여주는 링크가 있네요. 클릭해보면 블로그 결과만 보여주고, 이 역시 RSS 가 제공됩니다. 이렇게] 생겼네요. 이 주소를 등록해놓으면, 이후 selenocysteine 관련 연구를 하는 특정 누군가가 블로그에 관련 글을 썼다면, 바로 나도 받아볼 수 있습니다.

구글의 검색능력은 정말이지 탁월해서, 필자의 경우, 필자의 블로그에 썼던 글이 블로그검색 RSS 로 제공되기까지 서너시간밖에 걸리지 않았습니다.


PubMed 에서 특정 키워드가 포함된 최근 논문 목록 받기


아쉽게도 이 부분은 아직 RSS로 제공되지 않고 있습니다. NCBI에서 이미 만들어서 서비스할 줄 알았는데, 아직은 안되고 있네요. (당사에서 서비스해야 겠습니다. PubMed API를 직접 이용할 수도 있고, biopython같은 라이브러리를 써서 만들 수도 있습니다. 논문의 목록을 RSS 형식으로 변환만 하면 됩니다.)

----
이상의 방법들을 이용해서 내 연구분야를 꼭 찝어낼만한 RSS 주소들을 모아모아서 RSS 리더기에 등록해 놓으십시오. 고성능 레이더망을 갖추신겁니다. 위에 언급된 방법들만으로도 자신의 연구분야의 최신현황을 가만히 앉아서 받아볼 수 있습니다. 요즘같은 시대, 왠만한 정보들은 다 인터넷으로 올라오고, 그것들은 구글이니, 네이버니 등등의 검색엔진등에 다 알아서 정리한다죠. 그 최신의 정보들이 자동으로 당신의 모니터로 제공될 것입니다.

Posted by 人Co

2008/05/29 12:32 2008/05/29 12:32
,
Response
No Trackback , No Comment
RSS :
https://post-blog.insilicogen.com/blog/rss/response/3