[RoR 학습] 4장 루비언어 1/2

개인적으로 “레일스와 함께하는 애자일 웹 개발(개정 4판)” 이북으로 틈틈히 루비온레일스를 학습하고 있는 중이다. 이 포스팅은 학습한 내용을 복습,정리하는 차원에서 쓰고 있다. 이전 포스팅은 아래를 참고하면 된다.

사실 지금 진도는 6장을 진행 중이지만 이번주는 연구실 일이 바빠 포스팅할 시간이 없었다. 일단 4장의 제목은 “루비소개”이다. 레일스 프레임워크가 루비 언어를 기반으로 하기 때문에 루비 언어에 대한 설명이 4장의 주를 이룬다. 물론 프로그래밍 언어 공부를 한 번이라도 해 본 분들은 문법이나 예약어 등의 차이를 제외하면 객체지향 언어의 특징이 유사하기 때문에 그리 어렵지 않게 읽고 넘어갈 수 있다.
USA ray ban sunglasses
4장의 내용은 “Programming Ruby”라는 소위 곡괭이 책 1이라 불리우는 데서 대부분 차용했다. 따라서 루비 언어를 제대로 학습하고 싶은 사람은 곡괭이 책을 볼 것을 저자가 제안한다. 바로 곡괭이 책을 찾아 봤다. 그러나… 라이브러리에 대한 상세한 설명이 포함된 것을 감안해도 곡괭이 책은 936페이지나 되기 때문에 단기일에 학습하기에는 분량이 너무 많다. ㅠ 4장의 내용만 이해한 후 나중에 필요에 따라 곡괭이 책은 쿡북형태로 참고하기로 결정했다 2.
oakley sunglasses cheap
간단하게 나마 루비언어의 특성을 살펴보자면 잠깐 언급한대로 루비도 객체지향 언어이다. 따라서 클래스를 정의할 수 있고 객체와 메서드를 통해서 연산한다. 변수나 메서드 등의 이름을 작성할 때 사용하는 관용적인 방법은 자바와 다르다. 자바는 소위 낙타허리와 같이 중간에 나오는 단어의 첫 글자는 대문자를 쓰는 표기법을 취하지만 루비에서는 소문자와 ‘_’를 통해서 사용한다. 변수의 타입은 명시적으로 선언할 필요가 없다. 배열과 해시뿐 아니라 정규표현식까지 루비도 지원한다.
air max 95
루비 언어가 좋은 점 중 하나는 괄호를 사용하지 않는다는 점이다. 이는 파이썬도 동일한데 루비는 들여쓰기와 “def, end”를 통해서 클래스나 메서드의 영역을 구분한다. 반복문과 같은 블록들도 동일하다. 따라서 메서드 정의는 루비에서 다음과 같이 작성된다.

루비에서 볼 수 있는 독특한 문법으로 블록이 있다. 코드의 일부를 하나로 묶는 것을 말하며 한 줄일 경우는 “{}”로 표현하고 여러 줄이면 do/end를 사용한다. 함수형 언어의 람다와 비슷한 듯 하다. 보통 yield 명령어와 함께 많이 쓰인다고 하는데 갑자기 왠 yield? 책에선 제대로 설명이 나와 있지 않아 yield가 무엇인지 곡괭이 책을 참조해야 했다. 일단 예제를 먼저 한번 보자.

결과는 예상하듯이 다음과 같이 나온다.
oakley military sunglasses
블록 실행화면

즉 yield는 메서드 뒤에 매개변수로 붙은 블록코드를 실행시키는 데 사용된다. 또 다른 예제로 &표시로 블록을 매개변수로 받아 메서드 안에서 실행시키는 것이다.
설명으로만 읽어서는 정확하게 용례가 와닿지는 않지만 다음 책의 예제를 보면 대략의 쓰임새는 알 수 있다.

마지막으로 블록코드 내에서 “||” 수직바 안에 변수를 넣으면 여기에 값을 전달받는 기능도 있다. 다음의 예제를 보면 쉽게 이해할 수 있다.

첫 번째 줄은 animals라는 배열에 각 문자열을 할당하는 것이다. 두 번째 줄에서 each 메서드에 블록을 넘기는데 여기서 ||수직바 안에 animal이라는 변수를 통해 값을 받아서 화면에 뿌린다. 결과는 예상하는 것처럼 다음과 같이 나오게 된다.
buy ray ban sunglasses
블록 실행화면2

오늘은 루비언어를 간략히 살펴보면서 루비의 특징적인 기능 중 하나인 블록에 대해서 간단히 살펴보았다. 이제 막 루비를 공부하는 시작단계라 블록의 장점이 피부에 와닿지 않지만 블록을 활용하여 코드를 훨씬 더 간결하게 할 수 있다고 하니 차근차근히 공부해 보자.

Notes:

  1. 책의 표지가 곡괭이다. 마치 전산 학부 과정중 Operating Systems 교재의 정석이라 불리우는 공룡책과 같다.
  2. 실제로도 6장을 학습하는데 루비 문법때문에 이해하지 못할 일은 없다.

[RoR 학습] 2장 실습 그리고 3장 MVC 패턴- 레일스 아키텍쳐 이야기

2장 공부한 것을 복습하는 차원에서 2장 끝 부분에 있는 실습을 간단하게 진행했다. 새롭게 시작하려고 하는데 맞닿뜨린 문제가 있었다. 기존에 demo라는 앱을 생성해서 연습했었는데 실습을 위해 새롭게 다른 앱을 생성했는데 이 앱이 웹서버에 적용이 안 된 것이다.
air jordan 1 retro
생각해보니 보통 아파치나 톰캣을 쓰면 웹앱이 포함되는 폴더가 명시되어 있는데 본 실습에서는 일단 레일스가 제공하는 WebBrick 서버는 이런 과정이 없다. 그냥 알아서 자동으로 배포해서 실행시켜 주는 것이다. 따라서 당연히 새로 생성한 앱을 인식하지도 못하는 것이다. 다시 확인해 보니 처음에 서버를 실행시킬 때 해당하는 앱 폴더경로 상에서 실행시키는 것이 중요했다. 엉뚱한 위치에서 “rails server”를 아무리 쳐 봤자 서버가 실행되지 않는다. 반드시 실행시킬 앱의 폴더에서 서버를 실행시켜야 한다.
oakley razrwire nbt sunglasses
다시 돌아와서, 새롭게 앱을 생성하고 4가지 간단한 실습을 위해서 컨트롤러와 4개의 액션을 다음과 같이 생성시켰다.
Where Can I Buy ray ban sunglasses
Screenshot from 2013-07-25 22_05_31

첫 번째 실습은 아주 간단하게 사칙연산을 확인하기 위함이고 실제 연산은 컨트롤러에 넣어두고 변수 만 받아서 보여주는도록 뷰의 코드는 간단하게 했다.
nike air max uptempo
두 번째 실습은 문자열을 붙이는 실습이며 뷰의 코드는 첫 번째와 거의 같다.

세 번째 실습은 역시 시간함수를 사용한 것으로 첫 번째와 두 번째와 동일하게 루비코드는 컨트롤러에 있고 뷰에서는 변수만을 사용한다. 첫 번째부터 세 번째까지의 뷰의 코드는 거의 동일하다. 아래 코드는 첫 번째 뷰의 코드이다.
oakley razrwire nbt sunglasses
Screenshot from 2013-07-25 22_06_15

여기서 한 가지 추가된 것은 내부 링크를 거는 실습이다. 위 캡쳐화면에서 4번줄 코드가 바로 내부링크를 하는 과정이다.
Oakley sunglasses Spain
루비에서는 “link_to”라는 메서드를 통해서 아주 간단하게 내부링크를 걸 수 있다. 다른 언어처럼 괄호를 사용해서 파라미터를 받지 않는 것이 특이한 점이다. link_to 뒤에는 두 개의 파라미터가 붙는다. 첫 번째 파라미터는 링크를 걸 문자열이고, 두 번째 파라미터가 루비에서 미리 정의된 형식이다. 두번째 파라미터의 형식은 {컨트롤러 이름}_{해당 액션}_path 처럼 써 주면 된다. 위에서 쓴 link_path_FileList_path는 “link_path” 1가 컨트롤러 명이고 “FileList”가 내부적으로 링크 걸 액션이 되는 것이다.

네 번째 실습은 현재 폴더 리스트를 출력하는 실습이다. 책에 적혀 있는대로 “Dir.glob(‘*’)를 통해서 현재 폴더 내 파일명을 어레이로 받아올 수 있는 것 같다. 이를 뷰에서 for문을 통해서 다음과 같이 구현했다.
Screenshot from 2013-07-25 22_06_31마지막으로 위에 모든 실습에 해당하는 액션들은 다음과 같다.
all air jordan shoes
Screenshot from 2013-07-25 22_03_28

첫 실습이라 그리 어렵지 않다. 이어지는 3장도 분량은 많지 않다. 여기서는 다시 한번 레일스의 아키텍쳐인 MVC 패턴을 이야기한다. MVC 패턴에 대한 이야기는 레일스라고 해서 특별한 것은 아니다. 한 번 읽어보는 것으로 복습한다. 필요하면 링크를 참조한다. 2

다만, 레일스에서 MVC 패턴을 강조하는 이유는 “관심사에 따라 분리”(Separation of Concerns, SOC)가 코드 간의 결합도를 낮추기 때문에 사용한다는 점을 책에서는 설명하고 있다. 또한 레일스가 고집하는 “설정보다 관례(convention over configuration)” 철학으로 폴더 구조를 강제시켜 철저하게 MVC 패턴으로 개발하게 한다는 점이다. 이는 개발역량을 기능개발에 집중하게 하려는 의도라고 한다.

다음으로 나온 핵심적인 개념은 ORM, 즉 객체관계매핑이다. 대부분의 웹애플리케이션은 DB를 통해 저장된 데이터를 모델이 가지고와서 처리하여 뷰를 통해 보여준다. 여기서 문제가 개발은 객체지향언어로 하는데 DB는 집합이론을 기반으로 한 관계형 DB를 쓴다는 점이다. SQL로 데이터를 다루는 것을 OOP로 바꾸는데 공수가 많이 들어가는 것이 문제라는 것이다. 그래서 레일스에는 이러한 시간을 줄이고자 DB의 관계형 모델을 객체지향 개념과 맵핑을 시킨 것이다. 아주 간단하게 설명하면 테이블을 클래스로, 행을 객체로, 열을 객체의 속성으로 맵핑한다. 그리고 이를 통해서 아주 간편하게 DB 안에 있는 데이터들을 불러오고 저장할 수 있는 것이다. 아래 루비 코드가 책에서 보여주는 예제인데 눈으로만 봐도 SQL을 쓰지 않고도 이게 어떻게 데이터를 다루는지 감이 올 것이다.

구글링을 통해 ORM과 액티브 레코드 사이에 관계를 확인해 본 바 그리 어려운 것이 아니었다. ORM은 위에서 설명한 대로 관계형 DB와 객체를 맵핑하는 기술이며 이를 구현한 것이 액티브 레코드이다. 다시 액티브 레코드는 액티브 레코드 패턴으로부터 탄생했으며 Martin Fowler가 쓴 Patterns of Enterprise Application Architecture에서 처음 나온 개념이라고 한다 3. 결론적으로지금까지 살펴본 액티브레코드가 레일스에서 Model을 담당하여 비즈니스 로직과 데이터를 담당하게 된다.

마지막으로 3장에 액션팩에 대한 이야기가 나온다. 뷰톼 컨트롤러를 단일 컴포넌트로 묶어서 제공한다고 설명하는데 자세한 예제나 추가 설명이 없다. 추후에 다시 나올 것으로 기대하고 패스한다.

Notes:

  1. 일부러 컨틀롤러 명으로 ‘_’ 사용되는지 확인하기 위해 이름을 이렇게 썼다. 레일스에서 알아서 잘 파싱해준다.
  2. https://en.wikibooks.org/wiki/Computer_Science_Design_Patterns/Model%E2%80%93view%E2%80%93controller
  3. http://edgeguides.rubyonrails.org/active_record_basics.html

[RoR 학습] 루비온레일즈 설치와 Hello World 찍기!

방학을 맞아 전부터 머릿 속에 구상하던 아이템을 하나 구현하려고 마음먹었다. 웹애플리케이션 개발을 뭘로 할까 하다가 전부터 콕 집어두었던 루비온레일즈를 선택했다. 루비는 프로그래밍 언어이고, 레일즈가 루비를 기반으로 한 웹프레임워크이다. 이전부터 페북과 구글 그룹스에서 루비개발자 그룹에 가입해서 눈팅을 해왔던 터라 대충 루비의 장단점을 알고 있었다. 간략하게 이야기하면 루비가 가지고 있는 최대의 장점은 개발생산성이고 단점은 퍼포먼스 쯤이 되겠다. 지금 내 상황을 고려했을 때 대학원 공부하면서 그 때 그때 구상한 아이디어를 빠르게 구현할 수 있고 퍼포먼스가 당장 중요한 이슈가 아니기 때문에 루비온레일즈가 가장 적절한 선택인 것 같다 1.

File:Ruby on Rails logo.svg

개발언어를 선택하고 나서 학습을 위해 선택한 참고도서는 입문서로 가장 유명한 “레일스와 함께하는 애자일 웹 개발(4판) 2“이다. 인사이트 출판사에서 4판은 E-Book으로도 판매하고 있어서 이북으로 구매해서 아이패드에 넣고 보기도 좋을 것 같아 이 책으로 선택했다.
Norway Oakley sunglasses
머리말에서 의미있는 점은 레일스 프레임워크에 관련된 이슈였다. 레일스 기반으로 개발을 하려면 레일스 프레임워크에 대한 학습비용과 프레임워크에 종속될 수 있다는 문제가 있기 때문이다. 그러나 레일스가 애자일방법론과 MVC 패턴을 극대화해서 녹여 낸 프레임워크라 하니 현장에서 급박한 상황이 아닌 공부하는 학생의 입장에선 레일스 프레임워크를 사용하면서 레일스 개발의 철학을 이해한다는 측면에서 나쁠 것이 없을 것 같다. 책을 통해 기본적인 개발능력을 갖추고 나면 그 때 필요에 따라 시나트라와 같은 다른 프레임워크도 경험해 볼 수 있으니까 말이다. 일단 시작하는 입장에서는 찬밥 더운밥 가릴 처지는 아니지만 적어도 역자가 집고 넘어가는 이야기는 흘려듣지 말아야겠다.
ray ban sunglasses Low Price
서두가 길었으나, 어찌 되었든 이 포스팅은 순전히 실습한 내용의 복습 차원에서 글로 적은 것이다. 따라서 내용상의 오류와 문제가 있을 수도 있다.
nike air max Sweden
1장과 2장에서는 모든 언어의 출발과 동일하게 개발환경 구축과 Hello World 찍기이다. 기본적으로 루비는 윈도우 환경에서 작업하기는 상당히 애로하기 때문에 OS 환경은 제일 간편한 Ubuntu 12.04(LTS) Client 버전을 설치했다. 설치한 후에는 책에서 제시한 대로 다음과 같이 최소한의 기본적인 패키지들을 설치했다.

설치 중간에 mysql 비번 입력하라고 할 때 입력하면 된다. 그리고 나서 루비를 설치해야 하는데 이 부분은 책과 조금 다르다. 루비 설치를 간펴하게 하기 위해서 보통 RVM을 많이 사용하는데 rvm 사이트 주소가 변경되었다. 따라서 책에 있는 url이 아닌 다음의 url로 rvm을 설치 해야 한다.

설치를 마친 후에는 필요한 추가 라이브러리를 설치하는 작업을 해야 하고 바로 루비를 설치하면 된다. 루비 버전은 책에서 설치한 1.9.3 버전을 설치했다. 루비 설치후 버전 확이으로 설치가 정상적으로 됬는지 확인하고 바로 동일한 방법으로 레일스 설치와 버전 확인을 했다.

여기까지 진행하는데 역시 책대로 되지 않는 부분이 몇가지 있다. 우선 rvm이 제대로 작동을 하지 않는 것이다. terminal의 설정 문제인 것 같고 알려준 url 3로 찾아가 설정을 변경하니 잘 되었다. 두 번째는 레일스를 설치하고 나니 책에서 사용한 버전과 달리 최신 버전인 4.0.0이 설치되었다. 나중에 실습할 때 버전 차이 때문에 호환되지 않는 것이 있을까봐 책에 나온 방법대로 3.2 버전도 설치한 후에 3.2버전을 사용하게 끔 설정을 변경했는데 전혀 말을 듣지 않는다.; 이 부분은 나중에 다시 확인해 볼 예정이다. 일단은 4.0.0 버전으로 시작하기로 했다.
Oakley sunglasses Korea
이후 기타 편집기나 기본적인 개발환경 설정을 맞춘 후 mysql2, sqlite3 어댑터만 gem install 명령어를 사용하여 추가해 주면 모든 설치가 끝!

앞으로 실습할 폴더를 하나 생성하고 이 폴더에서 다음과 같은 아주 간단한 명령어 하나면 웹애플리케이션 폴더가 하나 생성된다.

그리고 나서 rails가 기본으로 제공하는 웹서버를 작동시켜 localhost:3000으로 바로 확인해 볼 수 있다.

참 간단하다.
nike air jordan 4
Hello World를 찍기 위해서 페이지를 생성하는 것도 간단하다. 다만 레일스는 철저하게 MVC패턴을 따르고 있기 때문에 내 맘대로 html 페이지를 생성하면 안 된다. 이미 처음부터 폴더구조가 MVC 패턴에 따라 나뉘어져 있기 때문이다. 다만 이때도 아주 간단한 명령어 하나면 위에서 자동으로 소스를 생성해 주는데 다음 명령어는 say라는 컨트롤러를 생성하고 각각 hello와 goodbye라는 액션을 생성하겠다는 뜻이다. 놓치면 안 되는 점은 이 명령어는 반드시 생성한 웹앱 폴더에서 실행해야 작동한다는 점이다.

와우 자동으로 파일이 생성되었다. 이제 브라우저에서 localhost:3000/say/hello로 들어가면 Hello가 찍힌 감동적인 모습을 볼 수 있다. 쉽다. 미리 생성된 소스는 {앱폴더}/app/views/say/hello.html.erb 이다 4. 뒤에 erb 확장자는 루비 인터프리터가 읽기 위한 것이다. 왜냐하면 이 소스 안에 직접 루비 코드를 JSP와 비슷하게 <%= %> 이 안에 넣어서 쓸 수 있기 때문이다. 책에 나온 예제대로 Hello World를 찍으면서 간단하게 현재시각을 보여주는 루비코드가 포함된 소스를 보자.

특별한 것이 없다. 중간에 루비소스코드만 있다는 것을 빼면 말이다. 마지막으로 html 코드에서는 view만 담당하고 시간을 보여주는 역할을 컨트롤러에게 넘겨보면서 마무리하자 컨트롤러 소스는 {앱폴더}/app/controllers/say_controller.rb 이다. 이 파일을 열어서 다음과 같이 수정하자.

여기서 사용하지는 않았지만 딱 봐도 처음 생성한 say 컨트롤러 파일 안에 hello와 goodbye 액션의 메소드가 미리 정의된 것을 확인할 수 있다. 여기서 우리가 필요한 time 부분만 변수를 선언해서 시간을 받고 @time 변수를 html 코드에서 Time.now 대신에 쓰면 된다.
Oakley sunglasses New Zealand
1,2강 실습하면서 느낀 루비는 참 간결하다는 점이다. 명령 몇 줄 치고 나서 웹애플리케이션이 간단하게 구동된다는 점은 Java 기반의 웹 개발할 때와는 다른 쾌적함인 것 같다. 앞으로 재미있을 것 같다. 문제는 대학원 학업보다 이게 우선되면 안되는데 조심해야겠다.

Notes:

  1. 물론 퍼포먼스도 여러가지 방법을 통해서 해결 가능한 것 같다.
  2. http://ebook.insightbook.co.kr/ebooks/4fbad65fbf6e100370000002
  3. https://rvm.io/integration/gnome-terminal
  4. goodbye도 이름만 다르지 동일하다.