brunch

You can make anything
by writing

C.S.Lewis

by 김창현 Aug 30. 2023

Rails 사이트를 fly로 배포, ssh로 바로 DB

다루는 완벽한 방법

문과 박사인 나는 아직도 레일즈로 나만의 홈페이지를 만들고 싶은 욕심이 있다. 이미 그 과정에 대해서는 다음과 같이 썼던 바 있다. 홈페이지를 개발하고 싶은 문과생이라면 한 번 주목해볼 필요가 있다. 오늘은 ssh 터널에서 서버 DB를 직접 업데이트 하는 방법에 대해서 써보려고 한다. 이게 생각보다 고급 기술이다. 


https://brunch.co.kr/@skytreesea/162


내가 만든 페이지는 아래와 같이 생겼다. 홈페이지 로고도 바꾸고 했지만, 여전히 좀 촌스럽다. 자매품인 다음 인사이트 사이트도 있다. 지금까지는 인사이트 사이트에 훨씬 기능이 많고, 더 많은 DB가 저장되어 있다. 

대학원생이라면 꼭 한 번 사용해보길 권장한다. 

예전에 운영하던 홈페이지를 다시 활성화시켜 봤다. 

오늘 쓰려고 하는 것에 대해서 내가 잘 풀어낼 수 있을지 자신은 없지만, 한 번 시작해본다. 


1) 루비온레일즈 

기본적으로 내가 만드는 사이트는 루비온레일즈를 기반으로 한다.  내가 루비온레일즈를 좋아하는 이유는 (사실 루비온레일즈 말고 딱히 잘 할 수 있는 웹언어가 없어서가 주된 이유이지만) 여러 번 글로 밝힌 바 있다. 예를 들어, 간략히 말하면, 파이썬과 루비를 간단히 비교해보기도 했다. 여기서 내 주장은 하나다. 파이썬만 배우면 장고나 플라스크 등으로 백엔드는 훌륭하게 만들 수 있지만, 결국 프론트엔드는 다시 배워야 한다. 그런데 기본적으로 루비온레일즈는 프론트와 백을 같이 다루기 때문에 상대적으로 적은 노력을 들이고도 홈페이지 하나를 온전히 만들어볼 수 있다. AirBnB, 초기 트위터, 깃헙 등 사이트도 레일즈로 만들었다. 


2) 로컬(local)과 서버(server)

웹페이지의 본질은 정보를 주고 받는 것이다. 로컬은 말 그대로 당신의 컴퓨터 안에 있는 정보를 의미하고, 서버(server)는 떠받드는 사람이라는 원래 뜻에서도 알 수 있듯이, 클라이언트(client)의 요청(request)를 받아 일을 처리하는 곳이다. 우리가 흔히 보는 모든 페이지는 기본적으로 정보의 가공/전달을 목표로 한다. 


우리가 클라이언트에게 정보를 주는 방법에는 두 가지가 있겠다. 하나는 정보를 순식간에 모아서 주는 것이다. 검색사이트가 이런 기능을 한다. 구글에서 뭔가 타이핑해보자. 구글은 순식간에 검색해서 결과를 내준다. 그게 하나의 방법이다. 웹의 정보를 모아 주는 것이다. 


다른 하나는 서버에 정보를 저장해놨다가 주는 것이다. 예를 들어 네이버 부동산 사이트를 보자. 모 아파트의 실거래가를 보니 다음과 같다. 매매가 20억 밖에 안 한다. 빨간 점은 실제로 계약이 된 가격이다. 이 정보는 어디에서 왔을까? 이 정보는 출처를 표기해놓은 것으로 보아 네이버 서버 어딘가에 저장이 되어 있을 것이다. 전국의 모든 아파트뿐만 아니라 단독주택, 빌라, 공장 등 모든 부동산 정보를 저장해놓으려면 어마어마한 용량의 DB가 필요할 것이다. 

아파트 실거래가를 만들어서 착실하게 그래프까지 그려놓았다. 

 여러분이 회사에서 사용하는 엑셀은 정보가 10만개를 넘어가면 버벅되기 시작한다. 경우에 따라서 컴퓨터는 100만개 혹은 1조개 이상의 정보를 처리해야 할 일도 있다. 이럴 때 우리는 DB라는 것을 사용한다. SQLite,  MySQL, Maria, PostgreSQL 등이 DB 되시겠다. 

DB 종류는 어마어마하게 많으니 골라서 편안한 걸 쓰셔유. 

3) SQLite

루비온레일즈는 기본 설정이 SQLite로 되어 있다. SQLite는 용량이 조금만 커져도 버벅되기 때문에 장기적으로 사용하기에는 무리가 있지만, 일단 시작할 때 이거 저거 생각하면 머리 아프기 때문에 그냥 시작한다. 


4) 레일즈로 정적사이트 간단한 구성

레일즈로 사이트 만드는 방법을 여기서 자세히 다루지는 않겠다. 

그런데 

rails new my_app 

여러분 컴퓨터에 레일즈를 설치했다면 위 문장 하나로만 기본 사이트가 설치되고 여러분은 로컬에 여러분의 페이지를 만들 수 있게 된다. 

rake db:migrate

지금은 이해가 안되겠지만, 위 명령어를 넣으면 자동으로 당신의 로컬환경에 db가 심어진다. 아까 말한 sqlite 어쩌고 저쩌고 하는 것을 활용할 수가 있게 된다는 의미이다. 

rails s

이 명령어를 치면 로컬 서버에 여러분의 공간이 만들어진다. 물론 이 다음에 엄청나게 많은 과정이 있지만, 오늘은 일단 이렇게 갈음한다. 사실 이 과정만 해도 다른 프로그램에 비해 웹에 접근하는 방법을 엄청나게 단순화시켰다고 보여진다. 달랑 명령어 세개면 여러분만의 페이지가 만들어진다. 


5) Fly.io로 루비 프로젝트를 론칭하기 

자, 어찌어찌 여러분이 HTML 문법과 Rails 문법을 배워서 로컬에 여러분의 사이트를 만들었다고 치자. 이제 여러분의 앱을 배포하려고 한다.  


그러니께, 사이트에는 두가지 사이트가 있다. HTML만 만들면 정적 사이트는 쉽게 만들 수 있다. 예를 들어 내가 아주 옛날 옛적에 만든 다음 사이트가 정적 사이트 되시겠다. 정적사이트는 netlify에서 어렵지 않게 배포할 수 있으니께, 참고하시기 바란다. 본인이 자료만 적고 창의적으로 정리해보고 싶다면 정적사이트로 시작해보는 것도 나쁘지 않다. 처음 론칭하고 배포할 때 기쁨을 지금도 약간 잊기가 어렵다. 대신 HTML 문법 쬐끔 배울 필요가 있다. CSS도 배우면 좋고....

정적사이트도 뭔가 정보를 저장해놓기에는 그렇게 나쁘지 않다. 예전에 만든 사이트

이런 사이트도 사실 잘 만들면 멋있기는 할텐데, 우리는 그냥 정보를 제공하는 것보다는 이런 저런 기능이 있고, 뭔가를 클릭하고 입력하고, 정보를 가공하고 싶다. 그런 것을 우리는 전문용어로 "동적 사이트"라고 한다. 동적 사이트는 아무래도 만들기가 더 어렵다. 내가 위에서 소개한 내 사이트들은 그래도 동적 사이트에 해당한다. 


역시 플라이를 설치하고 실행하는데에도 약간의 구글질이 필요하기는 하지만, 직관적으로 금방할 수 있다. 설치가 되었다면 

fly launch

이 단 하나의 명령어로 여러분의 사이트를 론칭할 수 있다. 참고로 fly에서는 사이트 하나까지는 무료로 배포해준다. 

만약 여러분의 앱이 로컬에서 실행된다? rails s 명령어로 간단한 페이지가 여러분의 브라우져에서 실행된다. 그러면 그 상태로 다음 명령어만 쳐보자. 

flyctl deploy

그러면 컴퓨터에서 난리가 날 것이다. 주르륵 주르륵 뭐가 내려가고 어쩌고 저쩌고... 

rails s 로 로컬에서 자신이 원하는 화면을 만들면 fly로 배포를 시도해보자. 

자 이 상태에서 다른 문제가 없다면 마지막에 이런 화면으로 끝난다. 잘 배포되었으니 한 번 클릭해보라고 한다. 클릭하면 자신의 페이지로 넘어간다. 

새롭게 배포된 skyapp.fly.dev사이트에 방문해보라고 한다. 클릭해보자. 


6) 직접 ssh를 통해 서버를 다루기 

여기서 ssh를 통해서 직접 서버를 다룬다는 말은 이런 것이다. 

잘 생각해보면 여러분이 컴퓨터에서 DB를 다룬다는 것은 이런 의미이다. 컴퓨터에 심어진 특정 파일을 손대고 있는 것이다. 그렇다 보니, 여러분이 DB를 로컬에서 업데이트했다고 해도 서버에서는 업데이트되지 않는다. 


이 때 서버에 직접 ssh로 연결해서 서버 쪽 DB를 다루는 명령어는 다음과 같다. 

fly ssh console --app [여러분 앱의 이름]

이렇게 하면 여러분은 희한한 루트를 보게 될 것이다. 

이상한 루트가 나온다. 

바로 서버의 ssh로 접근을 하는데 성공한 것이다. 여기에서 rails 명령어를 사용하면 드디어 서버 쪽의 DB를 직접 움직일 수 있게된다. 

bundle exec rails c

이 때 이렇게 명령어를 쳐보자. 레일즈가 실행되면서 이제 여러분은 서버쪽에서 직접 코드를 만질 수 있게 된다. 사실 경고창이 보여주고 있듯이 서버를 켜놓은 상태에서 코드를 손대는 것이 권장할만한 일은 아니다. 

그러나 오늘은 실습 차원에서 DB만 잠깐 만져보기로 하자. 이제 우리는 로컬 환경이 아니라 서버 환경에서 ssh를 통해서 레일즈에 접속한 것이다. 로컬이 아니라 서버이다. 

권장하는 방법은 아니지만, 오늘은 DB만 가볍게 만져보기로 한다. 

참고로 나는 Wall이라는 이름의 클래스를 이미 가지고 있다. 

wall = Wall.new
wall.title = "db를 ssh를 통해 직접 만지기 성공"
wall.content = "많은 라이크 부탁드립니다."
wall.save

자 어떻게 되었을까? 

위 글이 내용이 서버에 입력된 것을 확인할 수 있다. 

정리한다. 


fly ssh console --app [여러분 앱의 이름]

bundle exec rails c

wall = Wall.new

wall.title = "db를 ssh를 통해 직접 만지기 성공"

wall.content = "많은 라이크 부탁드립니다."

wall.save


이와 같이 하면 fly에서 ssh를 통해 db를 곧바로 수정할 수 있다. 

사실 이 글의 난이도가 조금 애매한 것이, 컴퓨터를 잘 아는 사람이라면 이 과정 자체를 내가 알려주는 것이 큰 의미는 없을 것 같다. 


사실 aws를 통해서 서버를 다룰 때도 ssh를 통해서 접근하는 것이 사실이다. 이 때 서버를 잠시 꺼놓는 센스도 필요하다. 하지만 fly를 통해서 서버를 다룰 때에도 이렇게 직접 DB를 다룰 수 있게 된다면 여러분은 여러 가지 재밌는 시도를 할 수 있다. 


DB에 재밌는 자료를 잔뜩 넣어놓고, 클라이언트가 호출할 때마다 보여준다든지 하는 연산들이 가능하다. 예전에 이 같은 방법으로 72만개 문장을 인사이트 페이지에 집어넣은 적 있다(관련 글 참고). 



제 글이 자신만의 페이지를 구축하고 싶은 모든 분들께 조금이나마 도움이 되기를 바랍니다. 


세상에 자신의 아이디어를 배포할 수 있는 방법은 정말 여러가지 입니다. 


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari