개발환경과 배포환경을 구분하여 개발을 진행해야한다. (나누어 진행하지 않는다면?? 매우 힘들다…) serverless 는 serverless-offline 이라는 서비스를 지원하며 람다를 통해 배포한 환경과 동일한 환경에서 테스트를 로컬에서 실행이 가능하도록 해주는 패키지이다.
그래서 난 로컬환경에서 serverless-offline 을 통해 실행함과 더불어 일반적인 express 개발 환경처럼 직접 express 를 구동할 수 있도록 설정하기로 했다.
docker exec -it <데이터베이스 컨테이너> bash # 컨테이너 접속 후 psql -U <name> -d <database> # psql 접속 후 COPY (select * from <tablename>) To '/path/fiilename.csv' With CSV DELIMITER ',' HEADER;
스크립트 작성으로 만들기
1 2 3 4 5 6
docker exec <데이터베이스 컨테이너> \ su - postgres -c \ ' psql -U <username> -d "<database name>" \ -c "COPY (select * from <table name>) To '"'/path/fiilename.csv'"' With CSV DELIMITER '"','"' HEADER; " '
주의사항: 따옴표 내부에서 문자열 조건이나 경로 입력 시 ‘“‘문자열’”‘로 감싸서 작성해야 문자열로 인식한다.
csv 파일 import 하기
psql 접속하여 실행하는 법
1 2 3 4 5 6 7
docker exec -it <데이터베이스 컨테이너> bash # 컨테이너 접속 후 psql -U <name> -d <database> # psql 접속 후 COPY <tablename> FROM '/path/filename.csv' DELIMITER ',' CSV HEADER;
Gemfile 에 grape 젬을 추가해준뒤 bundle install 명령어를 실행한다.
설정하기
적용하기 위한 프로젝트의 레일스 버전이 7버전으로 grape github README 를 따라 6버전 이상의 세팅 방법을 따라 진행 하였다.
path: ./config/initializers/inflections.rb 아래의 코드가 이미 작성되어있고 주석처리가 되어있다. 해당부분 주석을 제거하고 작성해주면 된다.
1 2 3
ActiveSupport::Inflector.inflections(:en) do|inflect| inflect.acronym "DefaultController"# 베이스가 되는 클래스의 이름을 입력하는 부분이다. end
컨트롤러 생성
1 2 3 4
cd app mkdir api touch base_api.rb touch default_controller.rb
path: ./app/api/base_api.rb
1 2 3 4 5 6 7 8
classBaseApi < Grape::API # 기타 공용 함수들? helpers do defserver_port Rails.env['PORT'] ||3000 end end end
path: ./app/api/default_controller.rb
1 2 3 4 5 6 7 8 9
classDefaultController < BaseApi version 'v1', using::path format :json prefix :api
get 'alive'do "rails server run #{server_port} port" end end
path: ./config/routes.rb
1 2 3 4
Rails.application.routes.draw do # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html mount DefaultController => '/' end
curl을 이용하여 요청하기
User Controller 생성하기
1 2 3
# work dir: ./app cd user_controller touch user_api.rb
resource 'users'do helpers do defpost_params params.as_json(only: %i[email password name nick_name age gender]) end end # GET /api/v1/users/all get 'all'do users = User.all { total: users.count, result: users.map { |r| Entities::UserEntity.represent(r) }, } end
# POST /api/v1/users post do user = User.create(post_params) present user, with: Entities::UserEntity end end end end
# Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE3000
# Configure the main process to run when running the image CMD ["rails", "server", "-b", "0.0.0.0"]
빌드를 시작해도 아직 레일스 세팅이 안되어있다. docker 컨테이너를 이용하여 레일스 설치를 진행한다.
1
docker-compose run --no-deps web rails new . --api --force --database=postgresql
실행 시 뭔가 쭉쭉 설치되고 로컬 디렉토리와 컨테이너 볼륨을 지정해줬기 때문에 작업 디렉토리에 레일스 폴더, 파일들이 생성된다.
3. database.yml 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# ./config/database.yml
default:&default adapter:postgresql encoding:utf8 # For details on connection pooling, see Rails configuration guide # https://guides.rubyonrails.org/configuring.html#database-pooling pool:5 host:database# docker 환경 데이터베이스와 연결을 하기위해서는 컨테이너 이름으로 지정해주어야 한다. username:juren password:juren