티스토리 뷰

 

때론 프로젝트를 하면서 B 프로젝트에서 A 프로젝트가 가지고 있은 데이터베이스를 참고해야 하는 경우가 종종 생기곤 합니다.

즉, B 프로젝트는 데이터베이스를 연동(Remote)을 해서 활용을 해야한다는 겁니다.

 

이번 시간에는 다른 서버의 Database와 연동(Remote) 연결(Connect)을 하는 법에 대해 알아보겠습니다.

 

 참고 

1. 해당 프로젝트에서는 DB를 가지고 있는 메인 프로젝트는 EC2, DB를 Remote Connect할 프로젝트의 호스트는 EC2 및 Goorm IDE로 진행하겠습니다.

2. Database는 PostgreSQL을 기반으로 진행합니다.

3. 사전에 레일즈 프로젝트(DB를 가지고 있는 레일즈 프로젝트, DB가 아예 없는 레일즈 프로젝트)를 준비해주세요.

4. 해당 프로젝트의 Database를 가지고 있는 EC2 서버는 데이터베이스 셋팅/설정 과정은 생략합니다.

해당 과정에 대해서는 [여기] 를 클릭해서 참고해주세요.

 

 

 Chapter 1  AWS EC2 : PORT 인바운드 허용

메인 EC2에서 작업해주면 됩니다.

사전에 데이터베이스 원격 연동에 앞서, 주체가 되는 AWS EC2는 기본적인 Port 보안이 걸려있는 상태입니다.

그러니까 쉽게말해서, PostgreSQL의 기본 포트번호인 5432 포트를 허용을 하지 않으면 AWS EC2 서버 자체에 접근도 못합니다.

시작에 앞서 이 5432 포트를 허용해보겠습니다.

1. AWS EC2 서비스로 이동합니다.

 

1. 좌측메뉴를 보면  인스턴스  이라는 메뉴가 있습니다.

해당 메뉴를 클릭해주세요.

 

2. 인스턴스 중, 데이터베이스의의 주체가 되는 EC2 서버를 클릭을 하면 하단에 표시된 정보 중, 보안 그룹이 보일겁니다. 보안그룹 번호를 클릭해주세요.

 

3. 보안그룹을 클릭 시, EC2의 보안그룹 메뉴로 이동이 되는데, 여기서 자신의 보안그룹에 우측마우스 클릭 후,

인바운드 규칙 편집을 클릭합니다.

 

4. 인바운드 규칙이 바로 허용 포트번호에 대해 설정을 하는 곳인데요,

저희는 PostgreSQL DB에 있어 다른 호스트에서의 접근을 허용해줘야 하니 5432 포트를 허용해줍니다.

 

 

 Chapter 2  AWS EC2, Goorm IDE : 데이터베이스 원격 접속 설정

 

이번엔 일반적인 EC2서버에서 메인 EC2 서버의 데이터베이스와 연동해보는 작업을 해보겠습니다.

저는 사전에 프로젝트를 만든 상태에서 해보겠습니다.

 

1. AWS 및 Goorm IDE에 있는 Rails 프로젝트에서  Gemfile  로 이동 후, 다음 내용들을 입력해주세요.

gem 'figaro'
gem 'pg'

그리고 Gem을 설치해주세요.

bundle install

 

2. AWS 및 Goorm IDE에 있는 Rails 프로젝트에서  config/database.yml  파일을 열람 후, 자신의 기호에 맞게 데이터베이스 정보를 입력해주세요.

 참고  Database를 가지고 있는 EC2 서버의 database.yml 내용을 그대로 복사/붙여넣기 후, 데이터베이스와 통신이 이루어지는 host 부분만 바꿔줘도 됩니다.

## config/database.yml

default: &default
  adapter: postgresql
  host: <%= ENV["REMOTE_HOST"] %>
  encoding: utf8
  username: <%= ENV["USER_NAME"] %>
  password: <%= ENV["USER_PASSWD"] %>
  pool: 5

development:
  <<: *default
  database: <%= ENV["DB_NAME"] %>_<%= Rails.env %>

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: <%= ENV["DB_NAME"] %>_<%= Rails.env %>

production:
  <<: *default
  database: <%= ENV["DB_NAME"] %>_<%= Rails.env %>

 

3. AWS 및 Goorm IDE에 있는 Rails 프로젝트에서  config  폴더에 application.yml 파일을 만든 후, 기호에 맞게 환경변수를 입력해주세요.

## config/application.yml
## 실습자 분들의 서버 환경에 맞게 입력해주세요.

REMOTE_HOST: "52.78.207.35" ## 원격 접속할 Database Host
DB_NAME: "catch" ## 공통적인 데이터베이스 이름 (서버의 Environment에 따라 catch_development, catch_test, catch_production 으로 이름이 붙여지게 됩니다.)
USER_NAME: "admin" ## DB 접근권한을 가진 유저 ID
USER_PASSWD: "aA@1274821" ## 유저 암호

 

 

 Chapter 3  AWS EC2 : 데이터베이스 접근 허용 설정

지금 원격접속을 시도를 하려 하면

다음과 같은 에러를 겪게됩니다..ㅠ

 

이는 본서버에서 다른 호스팅에서 5432 포트로 접근 시도에 있어 이를 허용해줘야 하기 때문입니다.

마지막으로 본서버에서 호스트 허용에 대한 작업을 해보겠습니다.

 

1. Database를 가지고있는 본 호스팅 터미널에서 다음 내용을 입력합니다.

sudo find / -name pg_hba.conf
sudo find / -name postgresql.conf

위 명령어는 내 서버에서 'pg_hba.conf' 및 'postgresql.conf' 파일을 찾는 명령어입니다.

탐색 결과 아래와 같은 결과가 나왔습니다.

위 결과 중 postgresql.conf 파일같은 경우는 두 군데에서 탐색이 되었는데, tmpfiles.d 경로는 임시파일 저장공간이라고 생각되어 아예 배제해버렸습니다.

 

2. 터미널에 다음 내용을 입력해서 PostgreSQL 사용자로 전환합니다.

sudo su - postgres

 

3. PostgreSQL 사용자로 전환 후,  pg_hba.conf  파일을 vi 에디터로 열람합니다.

## OS, 서비스 서버에 따라 위치가 다를 수 있습니다.

vi /etc/postgresql/10/main/pg_hba.conf

맨 아랫줄로 가게되면 다음과 같은 DATABASE 접근을 설정하는 설정이 있습니다.

위 설정을 아래와 같이 규칙을 추가해줘야 합니다.

위 추가된 설정 중, IP주소는 통신하고자 하는 호스트의 IP(AWS EC2 및 Goorm IDE의 IP주소)를 적어내면 됩니다.

그리고 저장해주고 나가주세요.

 부록  PostgreSQL 메소드 개념 [클릭]

 

4. 이어서 PostgreSQL 사용자 상태에서  postgresql.conf  파일을 vi 에디터로 열람합니다.

## OS, 서비스 서버에 따라 위치가 다를 수 있습니다.

vi /etc/postgresql/10/main/postgresql.conf

약 59번 째 줄에 보면 listen_addresses 라고 보일겁니다.

이는 외부에 요청하는 호스트에 대한 설정입니다.

저는 이걸 주석을 해제하고, 모든 요청을 받는걸로 하겠습니다.

 

5. 키보드에서  Ctrl+D  혹은 터미널에 exit 를 입력해서 PostgreSQL 사용자에서 나갑니다.

 

6. 터미널에 다음 내용을 입력해서 PostgreSQL 설정을 최신화 합니다.

sudo service postgresql restart

 

7. 서버를 킵니다.

rails s -b 0.0.0.0 -p 80

 

 

 Chapter 4  데이터베이스 원격통신

이제 모든 준비는 끝났습니다..

이제 AWS EC2 및, Goorm IDE의 서버에서 원격으로 데이터베이스에 접근 및 통신을 시도해보겠습니다.

 

1. 터미널에서 다음 명령어를 입력합니다.

rails db

 

2. 과거에 원격이 접근되었던 것 과는 비교되게 이제는 뭔가 암호를 물어봅니다!

암호는 Database의 권한을 쥐고있는 계정의 비밀번호 입니다.

 

3. 암호를 입력해냈다면 다음과같이 PostgreSQL 쿼리창이 뜨게 됩니다.

 

4. 현재 AWS EC2의 데이터베이스에는 hit_products 라는 테이블 내에 다음과같은 데이터가 있습니다.

저는 여기서 created_at Time 기준으로 최근 5개의 상위데이터를 불러오는걸로 해보겠습니다.

SELECT title FROM hit_products ORDER BY created_at DESC LIMIT 5;

위와같이 무사히 통신이 잘 되는게 확인됩니다!

 

 

 추가 부록  ORM 사용

일단 기본적으로는 데이터베이스와 원격 접속으로 연동된 Rails Project는 ORM 사용이 안됩니다 ㅠㅠ

하지만 이를 해결할 수 있는 법은 다음과 같습니다.

 

 

  • TABLE ↔ ORM 객체 맵핑법

1.  app/models  폴더에 Model 파일을 만듭니다.

 참고1  저는 테이블 이름이 hit_products 인걸 사용할 것이므로, Rails의 규칙에 맞게  hit_product.rb  라는 이름의 모델 파일을 만들겠습니다.

 참고2  꼭 Model 파일 이름이 Remote 연결된 DB의 table 이름과 같지 않아도 됩니다.

 

2. 만들어진 모델 파일에 다음과 같이 입력합니다.

class [Model Name, PascalCase] < ApplicationRecord
  establish_connection "[DATABASE ENVIRONMENT]".to_sym
  self.table_name = "[REMOTE TABLE NAME]"
end

제 기준으로서는 아래와 같이 만들었습니다.

class HitProduct < ApplicationRecord
  establish_connection "#{Rails.env}".to_sym
  self.table_name = "hit_products"
end

 

3. 다시 Console로 돌아가서 ORM으로 데이터를 조회해보겠습니다!

 참고1  이미 Console이 켜져 있는경우, 콘솔 명령어에  reload!  라고 입력하면 Model 수정이 반영된 상태로 콘솔 최신화가 됩니다.

 참고2  ORM(데이터 객체) 이름은 Model의 Class 이름과 동일합니다.

rails c
HitProduct.select(:id, :title).each do |t|
   puts "#{t.id} : #{t.title}"
end

 

이제 잘나오네요!! ㅎ

하지만 여기서, 아직 끝난게 아닙니다.

 

 

  • 원격 데이터베이스 연동 시 유의사항

1. 만약 테이블 간의 관계(belongs_to, has_many)를 정의해야 할 경우, Model 파일에 이를 정의해 줘야 합니다.

class HitProduct < ApplicationRecord
  establish_connection "#{Rails.env}".to_sym
  self.table_name = "hit_products"
  
  has_many :book_marks
  ...
end
class BookMark < ApplicationRecord
  establish_connection "#{Jets.env}".to_sym
  self.table_name = "book_marks"
  
  belongs_to :app_user
  ...
end

 

2. 유효성 검사가 필요한 테이블인 경우, 이 역시 Model 파일에 정의를 내려줘야 합니다.

class BookMark < ApplicationRecord    
  establish_connection "#{Jets.env}".to_sym
  self.table_name = "book_marks"
  
  validates_uniqueness_of :title
  ...
end

 

 

  • 자료 참고

1. PostgreSQL 메소드 [클릭]

2. DB 원격접속 상태에서 ORM 사용법 [클릭]

3. ActiveRecord::AdapterNotSpecified: database configuration does not specify adapter 에러 해결법 [클릭]

댓글
댓글쓰기 폼
공지사항
Total
37,630
Today
22
Yesterday
231
링크
«   2020/08   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
글 보관함