Ruby

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

라이브러리

UI와 API

UI는 User Interface의 약자다. 이것은 시스템과 사용자 사이의 접점을 의미하는데, 사용자의 의지를 시스템에게 전달하면서, 시스템의 상태를 사용자에게 알려주는 장치, 그래픽, 명령어들을 포괄적으로 UI라고 부른다. 다음 그림은 메시지 박스라는 UI의 한 형태인데, 시스템은 사용자에게 Coding Everybody!!라는 정보를 전달하고 있다. 또 사용자는 확인 버튼을 눌러서 메시지 박스를 닫으라고 시스템에게 명령할 수 있다.

API는 Application Programming Interface의 약자로 (운영체제나 언어 같은) 플랫폼과 그 플랫폼 위에서 동작하는 응용 프로그램이 상호작용하는 접점이라고 할 수 있다. 말이 어렵다. 아래 코드를 실행하면 위의 그림과 같은 메시지 박스가 실행될 것이다.

require 'tk'
msgBox = Tk.messageBox('message' => "Coding Everybody!!")
Tk.mainloop
위의 코드가 실행되지 않는다면 TK라는 모듈이 설치되지 않았기 때문일 것이다. 이 모듈의 설치여부는 지금 수업에서 중요하지 않다.

여러분이 위와 같은 코드를 통해서 메시지 박스를 실행했다고 치자. 그럼 메시지 박스를 만든 것은 여러분일까? 아닐까? 이 질문에 대해서 생각해보자.

위의 코드를 통해서 여러분이 시스템에게 지시한 것은 아래와 같다.

  • 1행 : tk 모듈의 로드
  • 2행 : 메시지 박스를 실행하면서 Coding Everybody!!를 출력

반면에 시스템에 지시한 적이 없는데 메시지 박스가 자체적으로 가지고 있는 기능들은 아래와 같다.

  • 사각형 박스의 상단에 Tk라고 적혀있다.
  • 오른쪽 상단에는 닫기 버튼이 있다. 이 버튼을 누르면 메시지 박스가 닫힌다.
  • 타이틀 바를 마우스로 드래그하면 마우스의 움직임을 따라서 메시지 박스가 움직인다.
  • 레이블 앞에는 느낌표 아이콘이 위치하고 있다.
  • 확인 버튼이 있어서 이것을 클릭하면 메시지 박스가 닫힌다.
  • 확인 버튼 위에 마우스를 롤오버하면 확인버튼이 미세하게 강조표시된다.
  • 메시지 박스의 시각적인 디자인

위에서 열거한 것처럼 메시지 박스는 여러분이 지시한 것 보다 훨씬 더 많은 일을 알아서 수행하고 있는 하나의 프로그램이다. 이 프로그램이 우연히 생길리는 만무하다. 이 메시지 박스는 require 'tk'를 통해서 로드한 tk 모듈 안에 이미 만들어져서 준비되어 있는 것이다. 여러분이 이것을 사용하고자 할 때 단지 Tk.messageBox()라는 메소드를 호출하면 되는데 바로 이 메소드와 같은 것을 API라고 부른다. 사용자가 UI를 이용해서 응용 프로그램이 제공하는 기능을 사용하듯이 여러분은 API를 이용해서 플랫폼(여기서는 루비)가 제공하는 기능을 자신이 만들고 있는 응용 프로그램에서 사용할 수 있게 되는 것이다. 

아래 예제는 현재 시간을 출력하는 예제다.

puts Time.now()

실행결과는 아래와 같은 형식으로 현재 시간을 출력할 것이다.

2013-06-17 00:58:44 +0900

객체 Time의 now 메소드를 호출함으로서 현재 시간을 알아낼 수 있었다. 자신의 응용 프로그램에서 현재 시간을 알아야 한다면 Time.now()라는 API를 사용해야 한다는 것을 알아야 한다. 응용 프로그램의 개발자에게 응용 프로그램의 플랫폼이 제공하는 API를 폭넓고 깊게 이해하는 것은 매우 중요하다.

라이브러리

코드를 작성하다보면 자주 사용되는 로직이 있다. 그럼 이 로직을 재활용하고 싶은 마음이 생기기 마련인데, 재활용 가능하도록 만든 로직을 라이브러리(library)라고 한다. 라이브러리는 자기 자신이 사용하기 위해서도 만들 수 있고, 불특정 다수가 사용할 수 있도록 공개할 수도 있다. 라이브러리를 사용하면 필요한 로직을 직접 구현할 필요가 없이 라이브러리에서 제공하는 API를 호출하는 것을 통해서 원하는 기능을 사용할 수 있게 된다.

루비의 라이브러리 문서

루비는 개발의 필수적 기능을 라이브러리로 제공하고 있다. 이 라이브러리의 사용법이라고 할 수 있는 API의 리스트는 아래의 링크를 통해서 열람할 수 있다.

http://www.ruby-doc.org/

Core

코어는 내장 클래스와 내장 모듈로 이루어진 라이브러리다. 내장(Built-in)이란 Ruby가 기본적으로 제공하는 것으로 require를 이용해 로드하지 않아도 사용할 수 있는 것들이다. 이 API들은 응용 프로그램이 시스템에 접근 할 수 있는 필수적인 기능을 제공한다. 다음은 코어 API의 리스트다.

이 내용을 하나씩 외우는 것은 권장되지 않는다. 어떤 것이 있는지만 눈으로 흩어보자. 전체적인 윤곽을 파악하기 좋도록 간단한 설명을 달았다. 아직 설명이 없는 것은 차차로 추가할 것이다.

Core API 리스트

루비의 코어 리스트는 아래의 URL을 통해서 열람 할 수 있다.

http://ruby-doc.org/core-2.0/

표준 라이브러리

표준 라이브러리(Standard Library)와 코어는 모두 루비 플랫폼에 기본적으로 내장되어서 제공된다는 점에서 같다. 즉 루비를 실행할 수 있는 환경에 있는 사용자라면 라이브러리를 이미 가지고 있을 것이라는 점을 보증한다는 것이다. 차이점은 코어가 로드(require)가 필요 없는 반면 표준 라이브러리는 사용하고자 하는 라이브러리를 명시적으로 로드해야 한다는 점이다. 다음은 코어 라이브러리들의 목록이다.

표준 라이브러리 리스트

루비의 코어 리스트는 아래의 URL을 통해서 열람 할 수 있다.

http://ruby-doc.org/stdlib-2.0/

라이브러리의 적용

아래 내용은 필자가 루비에서 파일을 생성하는 방법을 알아낸 과정을 기록한 내용이다. 더 좋은 방법도 있을 것이다. 또 필자는 이미 다른 언어를 통해서 파일을 다뤄본 경험이 있기 때문에 본인도 모르게 직관이 많이 작용했을 것이다. 아래 내용을 통해서 필자가 전달하고 싶은 것은 API를 파악하는 최선의 방법이 아니라 수단과 방법을 가리지말고 문제를 해결하라는 점이다. 이 과정을 반복하면 문제를 해결하기 위해서 필요한 시간이 점점 단축 될 것이다.

코어를 적용하는 예제를 하나 살펴보자. 어떤 내용을 파일로 저장하고 싶다고 하자. 그럼 어떻게 해야할까? 일단 라이브러리의 목록을 살펴본다. 다행히 File이라는 클래스가 있다. 그럼 File 클래스의 사용법을 살펴본다. 필자는 이미 다른 언어를 통해서 파일에 내용을 기록할 때는 대체로 write라는 API를 사용한다는 것을 경험으로 알고 있었다. 그래서 File 클래스의 메소드를 살펴보는데 write 메소드가 보이지 않는다. 이런 상황에서는 API만을 보고 도움을 얻는 것이 쉽지 않을 수 있다. 그럼 검색을 할 차례다. 필자는 구글에서 ruby file write를 검색어해봤다. 그 결과 stackoverflow의 페이지가 검색됐고 그 중에는 필자가 궁금해하던 내용이 있었다. 코드는 아래와 같다.

File.open(yourfile, 'w') { |file| file.write("your text") }

즉 File 객체의 open 메소드의 첫번째 인자로 파일의 이름을 입력하라는 것이다. 두번째 인자의 의미는 File.open 메소드의 API 문서를 참고하면 될 것 같았다. 그런데 2번째 인자에 대한 상세한 설명 대신 아래와 같이 적혀있었다.

See IO.new for a description of the mode and opt parameters.

이 뜻은 open의 두번째 인자인 mode에 대한 자세한 설명은 IO 객체의 new 메소드를 참고하라는 의미다. 왜 File 객체에 대한 내용을 IO 객체에서 참고하라는 것일까? 그것은 File 객체가 IO 객체의 자식 클래스이기 때문이다.  이 관계는 메뉴얼 왼쪽의 Parent 부분을 참고해서 알 수 있다.

객체들 간의 부모 자식 관계는 객체지향의 상속 개념을 공부하면 자연스럽게 이해할 수 있다.

IO.new API의 설명서에서 mode 옵션에 대한 자세한 설명을 구할 수 있었다. w 옵션이 파일을 생성하기 위해서 사용하는 것이고 만약 파일이 존재하지 않는다면 새로 생성하고, 존재한다면 기존의 내용을 삭제하고 처음부터 내용을 기록한다는 것을 알아냈다. 우리가 필요한 옵션이다. 그럼 마음놓고 w 옵션을 사용해도 되겠다.

메뉴얼에는 아래와 같은 내용도 포함되어 있었다.

If the optional code block is given, it will be passed the opened file as an argument and the File object will automatically be closed when the block terminates.

즉 코드 블록({..})을 사용한다면 file 인자로 File 객체가 전달된다는 것이다. 그리고 파일을 명시적으로 닫아줄 필요가 없이 코드 블록 내용의 실행이 끝나면 자동으로 close 된다는 의미다.

예 제로 다시 돌아와서 블록 안에는 file.wirte의 인자로 어떤 값을 전달하라고 되어 있다. write라는 이름만으로도 이 메소드가 파일에 내용을 기록하는 것이라는 것을 알 수 있다. 정말로 그런지를 확인하는 것이 좋다. 해서 File.write 메소드를 찾아봤지만 메소드 목록에는 없다. 이 메소드 역시 부모 객체인 IO가 가지고 있는 메소드라는 것을 짐작 할 수 있다. 객체 IO의 메소드를 뒤져보니 write 메소드가 있었다.

필자가 완성한 파일의 내용은 아래와 같다.

f = File.open('title.txt', 'w')
f.write('Coding Everybody!!')

위의 예에서 필자는 Ruby에서 제공하는 File 객체를 사용하고 있지만 특정한 라이브러리를 로드하지 않았다. File 객체는 코어이기 때문이다. 이처럼 필수적이면서 사용빈도가 높은 API는 코어로 분류되어 있기 때문에 언제든지 사용할 수 있다.

패키지 관리자 - Gem

패키지는 독립적으로 동작하는 응용 프로그램이나 응용 프로그램의 부품으로 사용되는 라이브러리를 포괄하는 개념이다. 패키지 관리자는 패키지를 관리해주는 도구라고 할 수 있다. 루비 젬(Gem)은 루비의 패키지 관리자로 루비로 만들어진 소프트웨어나 루비에서 사용할 수 있는 각종 라이브러리를 매우 편리한 방법으로 검색, 설치, 제거 할 수 있도록 도와주는 소프트웨어다. 모바일의 앱스토어와 비슷한 역할을 한다고 생각하면 된다.

gem의 설치

최신 루비 버전에는 gem이 기본적으로 내장되어 있다. gem의 설치여부를 확인하는 가장 좋은 방법은 콘솔에서 아래 명령을 실행해보는 것이다.

gem -v

버전이 출력된다면 gem을 사용할 수 있는 상태다. 만약 설치되지 않았다면 아래 URL을 참고해서 설치하기 바란다.

http://rubygems.org/

gem의 사용

gem을 이용해서 라이브러리를 다운로드&설치 후에 이것을 루비 에플리케이션에서 사용하는 방법을 알아보자.

1. 라이브러리 검색

PDF 파일을 생성하는 라이브러리 Prawn를 gem으로 설치해보자. Prawn의 홈페이지는 아래와 같다.

http://prawn.majesticseacreature.com/

콘솔에서 아래의 명령을 입력한다.

gem query -rn prawn

gem 뒤에는 query, install, server 등이 올 수 있다.

query는 gem의 패키지 저장소에서 필요한 패키지를 검색하는 명령이다.

-rn은 query 명령에 대한 옵션으로 r과 n에 해당하는 방법으로 검색을 수행한다는 의미다. r은 원격 저장소에서 패키지를 검색한다는 의미고, n은 정규표현식을 이용해서 패키지명을 검색한다는 의미다.

prawn은 prawn이라는 이름의 패키지를 검색한다는 의미다.

결과는 아래와 비슷할 것이다.

2. 라이브러리 설치

전 단계에서 패키지의 검색결과 prawn의 패키지 명을 찾았다. 이번에는 설치를 해보자.

gem install -r prawn --rdoc

install은 gem을 설치하라는 명령이다.

-r은 원격 저장소에서 패키지를 찾아서 설치하라는 의미다.

--rdoc는 라이브러리 사용법 문서인 rdoc을 생성하라는 의미다.

유닉스 계열에서는 일반 사용자의 계정으로는 설치가 되지 않을 수도 있다 .이럴 경우 앞에 sudo를 붙여주자.

sudo gem install -r prawn --rdoc

특별히 부정적인 메시지가 출력되지 않는다면 설치에 성공한 것이다.

3. 라이브러리 사용법

gem을 통해서 설치한 라이브러리의 사용법을 파악하는 방법은 두가지다.

a. Rdoc 파일을 직접 실행한다.

아래와 같이 명령을 입력하면 gem을 통해서 설치된 라이브러리가 저장되는 위치가 출력된다.

gem environment gemdir

위의 명령의 결과를 통해서 알아낸 디렉토리에서 doc>prawn>rdoc 디렉토리에 있는 index.html 파일을 웹브라우저로 실행한다.

b. gem server를 실행한다.

좀 더 간편한 방법이다. 아래의 명령을 입력한다.

gem server

아래와 같은 결과가 출력되면 gem server가 실행된 것이다.

웹브라우저를 열고 주소로 http://localhost:8808를 입력하면 된다. 아래와 같이 설치된 라이브러리들에 대한 정보를 볼 수 있다. prawn의 링크를 클릭해서 들어가면 prawn의 메뉴얼과 공식홈페이지의 링크가 있을 것이다. 이 정보를 참고한다.

4. 라이브러리 적용

그럼 PDF 파일을 생성하는 루비 에플리케이션을 만들어보자.

pdfgen.rb라는 이름의 파일을 만들고 아래와 같이 홈페이지에 있는 예제를 추가한다.

require 'prawn'

Prawn::Document.generate('hello.pdf') do |pdf|
  pdf.text('Hello Prawn!')
end

 위의 스크립트를 실행하면 hello.pdf 파일이 생성된다. 이 파일을 pdf 뷰어로 열어보면 Hello Prawn!이라는 텍스트가 담겨있을 것이다.

라이브러리 찾기

자신에게 필요한 라이브러리를 잘 찾는 것은 중요한 일이다. 이것은 많은 지식과 경험 그리고 요령이 필요하다. 아래와 같은 방법을 고려해볼 수 있을 것 같다.

댓글

댓글 본문
버전 관리
egoing@gmail.com
현재 버전
선택 버전
graphittie 자세히 보기