어머니와 동생이 함께 미용실을 운영하게 되었는데 여기서 쓸 프로그램을 하나 만들어 달라고 한다. 회원을 관리하는 아주 간단한 프로그램이라하기에 흔쾌히 수락했다. 물론 누군가가 사용하는 프로그램을 만들어 본 적은 없으나 이번 기회에 실력을 쌓을겸 해서 Rails를 통해 애플리케이션을 만들기 시작했다.


설계에 앞서 동생을 통해 어떠한 형태의 동작을 원하는지 간단한 요구분석과정을 거쳤다.



(- _-;)


어차피 간단한 프로그램을 원하는 듯 하니 적당히 필요한 구성만 짜서 포함시키려 한다.

이를 바탕으로 대략적인 데이터베이스를 구성해 보았다.



이제 이 데이터베이스 구성을 위한 Rails를 생성하였다.

개발환경은 다음과 같다.


개발OS: macOS Sierra

개발도구: Ruby on Rails

데이터베이스: sqlite3


$ rails new charmbitHair

$ cd charmbitHair

$ rails generate scaffold designer name:string phone:string

$ rails generate scaffold member name:string phone:string designer:references

$ rails generate scaffold category name:string

$ rails generate scaffold content name:string price:integer category:references note:text

$ rails generate scaffold history member:references date:date content:references price:integer point:integer note:text is_cash:boolean

$ rake db:migrate


기본적인 scaffold 생성을 마쳤다. 서버를 구동시키고 테스트를 해본다.

$ rails s


아래와 같은 주소로 모델에 접근할 수 있다.

http://localhost:3000/designers


메인 페이지가 없으니 간단히 만들어 본다.

$ rails generate controller welcome


app/views/welcome/welcome_page.html.erb 파일을 만들고 원하는 내용을 아무거나 적는다.

config/routes.rb에 아래와 같은 내용을 추가하자.

Rails.application.routes.draw do
  ...
  get "welcome/welcome_page"
  root "welcome#welcome_page"
  ...
end


메인 페이지에 접근하자.

http://localhost:3000/


시작이 반이라 했던가. 일단 간단한 Scaffold만 생성했는데도 뭔가 다 한것 같은 느낌이다. 겨우 몇줄로 이정도 소프트웨어가 작성되는건 놀랍긴 하다.

다음에는 메인 페이지에 출력한 내용을 링크로 연결 시키고, 공통 레이아웃을 작성해 볼 것이다.

    사실 몇 주 전까지 아무런 준비도 하지 않았다. 유럽 여행에 대한 기대는 가득하지만, 막상 준비하려니 너무나 귀찮았다. 그전까지 나에게 여행은 그저 출발 전날 기차 예약하고 버스카드 하나만 잘 챙기면 대충 옷가지 쑤셔 넣고 떠나도 아무 문제가 없는 그런 것이었다. 국내 여행이 전부였기에 나올만한 당연한 불평이었다.

    준비 안 하냐는 어머니의 닦달에 못 이겨 하나하나씩 조사하기 시작했다. 너무나 다른 교통 환경과 숙박시설, 그리고 수많은 관광지가 눈앞을 캄캄하게 만들었다. 어디서부터 시작해야 할지 감을 잡을 수 없었다. 속된말로 멘탈이 와르르 무너졌다. ‘, 괜히 혼자 유럽 여행한다고 깝댔나’, ‘영어도 제대로 못 하는 게, 가서 미아 되고 영영 못 오는 거 아닐까?’ 하는 오만 망상이 들었다. 정말로 유럽은(혹은 여행은) 그 분위기를 한껏 느낌 있게 담은 사진을 통해 감상하는 것이 직접 가는 것보다 더 나은 게 아닐까 하는 생각을 하기에 이르렀다. 사진은 여태껏 내가 가졌던 유럽에 대한 기대를 저버리지도 않을 것이고, 움직여야 하는 수고를 덜어주며, 그 나라에 대한 동경과 환상을 깨지 않는다는 점에서 더 나은 것이 아닌가 싶기도 했다. 정말로 알랭 드 보통의 에세이 <여행의 기술>에 언급된 위스망스처럼상상력이 실제의 천박한 경험보다 더 나은 대체물을 제공한다는 의견에 순간 동의하기도 했다.

    이런 두려움과 긴장 탓에 여행 준비에 온 정신을 쏟기 어려웠다. 그저 필요한 짐을 챙기고 간략한 동선만 만든 것이 준비의 전부였다. 정작 여행에서 보게 될 것이 무엇이고, 지나가는 모든 것에 대한 더 많은 호기심을 제공할 유럽의 문화에 관한 공부는 거의 하지 못했다. 긴장이 미리 오는지 이상하게 밥맛이 떨어졌다. 소화도 잘 안 되고 머리도 아파지고 그랬다. 간밤에는 비행기를 타고 먼 곳으로 떠나야 한다는 두려움이 온 정신을 마비시켰다. 그 때문에 머릿속은 뒤죽박죽이 되어 쉬이 잠을 이룰 수 없었다. 새벽 즈음이 되어서야 얕은 잠을 잘 수 있었다.

    아침에 일어나니 이상하게도 어제의 두려움과 긴장감은 전혀 느껴지지 않았다. 몇 시간 잠을 자지 못했는데도 왠지 모르게 개운했고, 몇 주 내내 번갈아 날뛰었던 신경들도 잠잠해진 듯했다. 자포자기의 마음으로돈 아까우니 일단 가고 보자는 생각 때문에 그런가 싶었다. 하지만 배낭을 메고, 집을 나와 택시를 타고, 여객 터미널을 거치고, 인천공항으로 향하는 버스에 타고 이동하는 과정에서 느껴지는 행복감은 그런 어떻게든 되겠지 하는 생각에서 나오는 게 아니라는 것을 깨달았다. 그동안 나에게 두려움을 안겨줬던 것들 - 즉 내가 도달하게 될 곳이 어떤 장소인지, 그리고 어떤 아름다움을 가지고 있고 내가 가지고 있던 기대에 부응하는지는 중요한 것이 아니었다. 어디론가 미지의 곳으로 떠나는 행동 그 자체가 나를 들뜨게 하고 있었다. 몸으로나 마음으로나 정말 추웠던 지난 몇 달의 기억이 있는 이곳을 떠날 수만 있다면, 그 어느 곳으로든 도달한다는 것이 행복이었다. 일상의 따분한 대학 생활에서 내가 타고 있는 버스가 경로를 이탈하여 어디론가 모르는 곳으로 도달한다면 즐겁지 않을까 하는 쾌감이 실현되는 순간이다. 도착하는 그곳이 나에게 어떠한 행복과 실망을 안겨주든지 상관없다. 그곳으로 향하게 하는 버스와 비행기, 그리고 머무는 여객터미널과 공항에서의 기억이 어쩌면 여행 중에 가장 행복한 기억이 될 수도 있지 않을까.

----

* 2014년 3월에 유럽여행을 떠나며 느낀 것을 다시 이곳에 옮겨 적는다. 볼 때마다 그때의 즐거운 긴장감이 느껴지는 듯하다.

아래는 그 후 여행하며 떠나간 흔적들.




* 글 작성에 앞서, 이 글의 목적은 숙달자의 정보전달이 아니라 초심자의 기록 남기기에 가깝다. 이해가 부족한 상태에서 경험의 과정을 적으니, 미숙한 점이 많이 있을 것이므로 양해 부탁드린다. 또, 미숙함에 대한 지적은 대환영이지만 기본적으로 이 포스팅은 대부분 일방적인 기록 남기기에 가까우니 피드백이 적을 수 있다. 다만 필자뿐 아니라 같은 글을 보는 다른 독자들을 위해 또 하나의 필자가 되어 부연설명을 해 주신다면 감사할 따름이다.


Rails 애플리케이션은 기본적으로 sqlite를 데이터베이스로 사용한다. 따라서 다른 데이터베이스를 사용하기 위해서는 추가적인 설정이 필요하다.

먼저 MySQL을 사용하기 위해 로컬에 MySQL을 설치하고, Amazon RDS에도 MySQL 인스턴스를 생성해보자. 그리고 Rails의 데이터베이스 설정파일 수정을 통해 데이터베이스 설정을 바꿔보자.


작업환경: macOS Sierra


1. 로컬에 MySQL 설치


Homebrew를 이용해서 설치하자.

$ brew install mysql

$ brew info mysql

MySQL 설치 완료

무작정 $ mysql -uroot 명령어를 실행하면 아래와 같은 에러를 내뿜는다.

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

info를 확인하여 실행하기 전에 데이터베이스 설치작업을 마무리해주는 과정을 확인하여야 한다.



$ mysql_secure_installation


비밀번호 강도 설정과, 초기 비밀번호설정, anonymous 유저 삭제 등의 과정을 진행하게 된다.



$ mysql -u root -p

설치 작업이 완료되었다.



$ gem install mysql -- --with-mysql-config=mysql_config 파일 위치

$ rbenv rehash


2. Amazon RDS에 MySQL 인스턴스 만들기


개발/테스트 용도로 선택해야 free 티어의 데이터베이스 생성이 가능하다.


DB Instance Class에 가장 작은 t2.micro로 만들어야 왼쪽에 free tier로 설정된다.


인스턴스의 이름과 데이터베이스의 마스터 이름과 비밀번호를 설정하자.


Database 이름을 설정하고 나머지는 그냥 그대로 넘어가자


인스턴스가 생성되었다. Endpoint 주소를 통해 이후 접근해 보도록 하자.



3. Rails 애플리케이션과 Amazon RDS 연동하기


지난 글에서 생성해서 사용했던 Rails 애플리케이션인 myFirstRailsApplication을 활용하겠다.

해당 애플리케이션 디렉토리 안의 config/database.yml 파일을 수정하자.


Gemfile에 mysql2 젬을 추가해주자.


$ vi Gemfile

...

gem 'mysql2'

...


터미널에서 Amazon RDS에 원격으로 접속해서 development 데이터베이스를 생성하자.

test와 production 데이터베이스도 같이 생성해주자.


$ mysql -h 데이터베이스의 Endpoint 주소 -u root -p

> CREATE DATABASE development DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

> CREATE DATABASE test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

> CREATE DATABASE production DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;


* 데이터베이스의 character set을 utf-8로 설정하지 않고 기본 설정으로 생성하게 되면 latin1으로 초기값이 설정되어 한글 문자열이 있는 데이터를 insert할 때에 다음과 같은 오류를 발생시킨다.

rake aborted!

ActiveRecord::StatementInvalid: Mysql2::Error: Incorrect string value: (입력 데이터)

참고http://develop.sunshiny.co.kr/385


  2016.12.30 추가

  ssh를 통해 원격접속하여 my.cnf 파일을 수정하여 utf8 설정을 할 수 없기에 대신 AWS RDS에서는 Parameter Group이라는 형태로 설정 할 수 있다.



4. 테스트


이 테스트 단계는 내 pc의 개발단계의 애플리케이션과 Amazon RDS를 연동하는 과정이다. 테스트 과정에서 사용된 예는 '퍼펙트 루비 온 레일즈, 제이펍'을 참고하였다.

이제 데이터베이스 설정은 끝냈으니 rails 애플리케이션에서 모델을 생성해보자.

$ rails generate model book isbn:string title:string price:integer publish:string published:date cd:boolean

$ rake db:migrate


위에서 데이터베이스가 생성되어있지 않으면 rake 명령시에 위와 같이 데이터베이스를 찾을수 없다며 에러를 표시한다.

항상 데이터베이스를 먼저 생성해주자.



다시 데이터베이스에 원격접속하여 테이블이 생성되었는지 확인해보자.


$ mysql -h 데이터베이스의 Endpoint 주소 -u root -p

> use development;

> desc books;



책에 관한 테이블을 만들었으니 데이터를 입력해보자. fixture 파일을 이용하여 데이터를 입력하자.

데이터: https://github.com/Jpub/RubyonRails4/blob/master/test/fixtures/books.yml

위의 yml 파일을 '/test/fixtures/books.yml'에 덮어씌우자.

그리고 다음과 같은 명령을 수행한다.

$ rake db:fixtures:load FIXTURES=books

아무런 에러가 표시되지 않는다면 정상적으로 수행된 것이다.

MySQL에서 확인해보자.

> SELECT * FROM books;



이제 이 모델을 이용한 간단한 컨트롤러를 만들고 배포해보자.


$ rails generate controller books


이제 컨트롤러에 다음과 같은 코드를 입력하여 데이터베이스에 저장되어있는 책 목록을 화면에 출력해보자.


controllers/books_controller.rb

class BooksController < ApplicationController
  def list
    @books = Book.all
  end
end

views/books/list.html.erb

<table border="1">
  <tr>
    <th>ISBN 코드</th><th>이름</th><th>가격</th>
    <th>출판사</th><th>출간일</th><th>CD-ROM</th>
  </tr>
  <% @books.each do |book| %>
  <tr>
    <td><%= book.isbn %></td>
    <td><%= book.title %></td>
    <td><%= book.price %></td>
    <td><%= book.publish %></td>
    <td><%= book.published %></td>
    <td><%= book.cd %></td>
  </tr>
  <% end %>
</table>

라우트 경로를 설정해주자.


$ vi config/routes.rb

...

get 'books/list'

...


서버 데몬을 실행하고 정상적으로 작동하는지 확인하자.

$ rails s


그리고 아래 주소로 접속해보자.

http://localhost:3000/books/list/


5. 배포하기


이제 배포하여 확인해보자.

$ git add .

$ git commit -m "books controller, view and route"

$ eb deploy

$ eb open


deploy에 오류가 발생한다면 데이터베이스의 Security Group이 현재 개발중인 pc의 ip만 접근 가능하도록 설정 되어있기 때문에 ec2 인스턴스가 migrate시에 데이터베이스에 접근하지 못해 발생하는 것이다. 필자는 Security Group의 Inbound를 모든 곳에서 접근할 수 있도록 모두 열어버렸다. 보안상 이렇게 하지 않는것이 좋을것이나 동시에 두개의 ip를 적용하는 방법을 몰라 일단 이렇게 설정해 둔다. :(

데이터베이스의 Security Group도 EC2 콘솔에서 설정을 바꾼다. EC2 - Security Group에서 현재 사용중인 데이터베이스의 그룹을 찾아 변경해주자.


/books/list 경로로 들어가서 확인해 보자.

배포(production) 환경에 있는 데이터베이스에는 현재 어떠한 값도 들어있지 않기 때문에 아래와 같이 페이지가 비어있게 된다.

직접 데이터베이스에 들어가 테이블이 생성되었는지 확인하고 임의로 데이터를 넣어보고 확인해보자.

> use production

INSERT INTO books (isbn, title, price, publish, published, cd) VALUES('978-4-7741-5878-5', '안드로이드 개발자를 위한 자바', 33600, '제이펍', '2013-08-20', false);



정확히 들어간 것을 확인할 수 있다.

+ Recent posts