티스토리 뷰
이 전 시간에 Ruby on Jets를 설치를 해봤습니다.
그럼 이번에는 간단하게 Ruby on Jets 구조 소개 및 기본 몇 가지 명령어를 살펴보겠습니다.
앞으로 Jets를 하면서 해당 글에서 예제로 사용되는 명령어에 있어선 초반 인트로에 말했다 싶이 Ruby on Rails와 명령어가 아주 비슷합니다.
-
Ruby on Jets 구성
Ruby on Jets는 대략적으로 다음과 같은 구성으로 되어있습니다.
.
├── app
│ ├── controllers
│ ├── helpers
│ ├── javascript
│ ├── jobs
│ ├── models
│ └── views
├── bin
├── config
├── db
├── public
└── spec
디렉터리 혹은 파일 | 특징 |
app/controllers | 해당 Controller를 호출 시 내부 코드가 동작이 됩니다. AWS Lambda 배포 시, 해당 Controller 내 액션별로 함수가 생성이 됩니다. |
app/helpers | Controller 등에서 긴 코드를 효율적으로 분리하고 관리하기 위해 함수로 사용되는 방법 중 하나로서, 헬퍼 함수는 재사용이 가능합니다. |
app/javascript | Assets 기능이 활용되어 캐싱을 방지하고, image, javascript, css 파일들이 해당 폴더 내에서 관리가 됩니다. [https://kbs4674.tistory.com/17] |
app/jobs | Scheduler + Job으로서 활용되는 파일들의 모임으로서, 해당 Job 파일을 호출 시, 파일 내 코드가 작동됩니다. [https://kbs4674.tistory.com/106] |
app/models | 테이블 관리 및, Remote Connect 된 Database의 Table을 ORM으로 변환시키는 등으로 활용됩니다. |
bin | 실행파일들이 여기에 담겨져 있습니다. Jets에서는 기본적으로 webpackers 패키지가 있습니다. |
config | Database 설정, Router 설정, Environment 별 환경설정, 서버 실행 시 초기화 코드 설정, AWS Lamabda 설정 등을 해당 폴더에서 관리합니다. |
db | 모델(Database Table) 파일이 관리됩니다. |
public | 파일 관리에 사용되는 폴더로, Assets과는 다르게 캐싱이 되는 특징이 있습니다. [https://kbs4674.tistory.com/17] |
spec | 코드/Gem Test 시에 활용이 됩니다. |
.env | 환경변수 설정 시 활용됩니다. [https://kbs4674.tistory.com/110] |
-
MySQL2 데이터베이스 생성
Jets는 기본적으로 MySQL2 데이터를 사용합니다.
콘솔을 이용해서 기본적인 MySQL2 데이터베이서를 구축을 해보겠습니다.
1. 우분투 계정을 Super User 계정으로 전환합니다.
sudo su
2. MySQL 콘솔을 킵니다.
mysql -u root -p
이 때 암호를 묻긴 하지만, 그냥 엔터를 누르면 관리자 권한으로서 바로 로그인 및 콘솔로 진입됩니다.
3. MySQL 콘솔에 다음 내용을 입력해서 데이터베이스를 생성합니다.
# CREATE DATABASE [데이터베이스 이름];
CREATE DATABASE kcm_development;
CREATE DATABASE kcm_test;
CREATE DATABASE kcm_production;
참고 저는 development, test, production 환경을 대비해 데이터베이스를 3개 만들었습니다.
4. MySQL 사용자를 생성합니다.
CREATE USER 'kcm4674'@'%' IDENTIFIED BY '123456a';
5. 데이터베이스 접근권한 리스트에 사용자를 추가합니다.
GRANT ALL PRIVILEGES ON kcm_development.* TO 'admin'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON kcm_development.* TO 'admin'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON kcm_development.* TO 'admin'@'%' WITH GRANT OPTION;
6. 키보드에서 Ctrl + D 를 눌러서 MySQL 및 Superuser 권한 터미널에서 빠져나갑니다.
7. Database 환경설정을 관리하는 config/database.yml 파일을 열람합니다.
8. database.yml 을 다음과 같이 내용을 변경합니다.
default: &default
adapter: mysql2
encoding: utf8
username: <%= ENV["DATABASE_USER_NAME"] %>
password: <%= ENV["DATABASE_USER_PASSWORD"] %>
pool: 5
development:
<<: *default
host: localhost
database: <%= ENV["DATABASE_NAME"] %>_<%= Jets.env %>
test:
<<: *default
host: localhost
database: <%= ENV["DATABASE_NAME"] %>_<%= Jets.env %>
production:
<<: *default
host: <%= ENV["DATABASE_HOST"] || "localhost" %>
database: <%= ENV["DATABASE_NAME"] %>_<%= Jets.env %>
위 코드를 보면 ENV["DATABASE_NAME"] 과 같은 환경변수가 설정되어있는게 확인합니다.
이를 통해 코드 내 정보가 은닉처리 되어있음을 알 수 있습니다.
9. 환경변수 등록을 위해 프로젝트 루트위치에 보이는 .env 파일을 열람합니다.
부록 환경변수 등록 [클릭]
참고 혹시 .env 와 같은 숨김파일이 안보인다면 우측에 보이는 톱니바퀴 아이콘을 클릭 후, Show Hidden Files 를 클릭(숨김파일 활성화)
10. .env 파일에서 환경변수를 다음과 같이 등록합니다.
## .env
# DATABASE_HOST="15.164.32.14"
DATABASE_NAME="kcm"
DATABASE_USER_NAME="kcm4674"
DATABASE_USER_PASSWORD="123456a"
11. 이제 터미널을 통해 Database 생성 및 Migrate까지 진행합니다.
## 데이터베이스 생성
# JETS_ENV=production jets db:create
jets db:create
## 데이터베이스 Migrate (스키마 최신화)
# JETS_ENV=production jets db:migrate
jets db:migrate
## Seed파일 내 미리 입력된 더미데이터를 데이터베이스에 Write
# JETS_ENV=production jets db:seed
jets db:seed
## 데이터베이스 Drop
# JETS_ENV=production jets db:drop
jets db:drop
참고 rake 명령어도 되긴 하나, create, migrate 에서 Environment 인식을 제대로 못합니다.
유의사항 Database: Production Mode
AWS Lambda 함수 내 Database 활용에 있어, AWS Lambda 내에서 Database 사용에 있어 localhost 지원이 안됩니다.
그렇다보니 원격으로 Database를 연동해서 써야 할 필요가 있습니다.
부록 다른 AWS EC2 서버 내의 Database와 Remote Connect 하기 [클릭]
-
MVC Generate
Jets에서는 Ruby on Rails와 동일하게 MVC 패턴으로서 구조를 생성할 수 있습니다.
1. Controller/View
## Controller/View 생성
jets g controller homes index
## Controller/View 제거
jets degenerate controller homes index
Controller/View 생성 시 자동으로 Test코드 등록 및 config/routes.rb 에 자동으로 URI 경로가 등록됩니다.
하지만 scss 및 coffee script는 생성이 안됩니다.
2. Model
## Model 생성
jets g model user email password nickname
## Model 제거
jets degenerate model
Model 생성 시, Table 및 모델파일이 생성됩니다.
하지만 Test 코드는 생성이 안됩니다.
유의사항 파일 제거
파일 삭제는 다음과 같이 입력하면 됩니다.
## jets degenerate [controller | model | scaffold | ...] [NAME]
jets degenerate model user
참고 햇갈릴 수 있는게 간혹 Rails 때와 같이 다음과 같이 입력하곤 하는데
## jets d [controller | model | scaffold | ...] [NAME]
jets d model user
위 방식은 jets에서는 통하지 않습니다.
-
Scaffold 생성
실습 전 참고 사전에 Database 설정이 되어있어야 합니다.
간단히 Rails/Jets 내에서 CRUD를 생성해주는 Scaffold를 생성해보겠습니다.
1. Scaffold 생성
아래 명령어를 입력하면 아주 간단하게 scaffold가 설정이 됩니다.
jets scaffold post title content:text
더불어, 내부 동작도 Rails의 scaffold와 동일하게 이루어집니다.
-
URI 규칙 생성
Jets에서 URI 규칙은 Rails와 동일하게 config/routes.rb 에서 설정이 가능합니다.
일단 Jets에서는 기본적으로 Intro 화면을 보여주는 경로가 정의되어 있습니다.
Jets.application.routes.draw do
root "jets/public#show"
resources :posts
# The jets/public#show controller can serve static utf8 content out of the public folder.
# Note, as part of the deploy process Jets uploads files in the public folder to s3
# and serves them out of s3 directly. S3 is well suited to serve static assets.
# More info here: https://rubyonjets.com/docs/extras/assets-serving/
any "*catchall", to: "jets/public#show"
end
주의 AWS Deploy 시 과금주의
AWS Lamabda 배포 시, routes.rb 에 정의된 내용들이 API 게이트웨이 서비스 이용을 할 것으로 간주합니다.
API 게이트웨이란?
1. AWS Lamabda는 기본적으로는 Scheduling 등 방법으로 내부적으로 Lamabda가 호출될 시, 람다에 작성된 코드가 동작되게 하는게 기본원리입니다.
2. API 게이트웨이는 이런 단순한 Lamabda의 원리에 웹페이지 주소(URL)을 연동시켜서 홈페이지 주소를 통해 Lamabda에 접근 시, Lamabda 함수가 작동되게 할 수 있습니다.
하지만 API 게이트웨이는 서비스 유지에 있어 100만번 이상 접근 시 비용이 발생합니다.
저같은 경우는 Lambda 함수만을 사용하다보니 routes.rb 내용은 싹 다 지워버리고 시작합니다.
-
관련자료
1. Jets Docs : Project Structure [클릭]
2. Jets Docs : Controllers [클릭]
3. Jets Docs : Routing [클릭]
4. Jets Docs : Generators [클릭]
-
자료 참고
1. MySQL 콘솔 접근 [클릭]
2. MySQL 데이터베이스 생성 [클릭]
'프로그래밍 공부 > Ruby on Jets : 서버리스 프레임워크' 카테고리의 다른 글
Ruby on Jets : AWS Lambda Project 제거 (0) | 2020.01.21 |
---|---|
Ruby on Jets : Lambda 스케쥴링 Job (0) | 2020.01.20 |
Ruby on Jets : AWS Lambda 배포 (0) | 2020.01.20 |
Ruby on Jets : Jets 설치 (2) | 2020.01.20 |
Ruby on Jets : 소개 (2) | 2020.01.19 |