ACTIVE STORAGE

액티브 스토리지를 이용한 이미지 관리 - 유저의 대표이미지, 길드의 이미지 등...

우리의 서비스에서 각 유저와 길드들은 자신을 나타내는 이미지를 갖고 있다. 그렇게 하기 위해 각 테이블들은 자신의 속성으로 image_url 을 가지고 있다.

잠깐. 이상한게 있다. 서비스 이용자가 이미지를 서버에 업로드하면 분명 이미지 자체가 서버에 들어올텐데 왜 속성으로는 image_url, url 을 이용하는거지? 여기서 하나 더 생각할 부분이 존재한다. 보통 실제 서비스? 에서는 레일즈가 돌아가는 서버와 실제 서버가 다르다. 즉, 레일즈를 내 로컬에서 돌리고 있다면 유저가 업로드한 이미지는 로컬 서버가 아닌 AWS 등의 클라우드 서버에 저장되는것! 따라서 이미지들의 실체는 전부 클라우드에 있고 우리의 로컬 레일즈는 클라우드에 존재하는 이미지들의 url 을 이용하는것.

이건 당연한 이유 때문이다. 왜냐하면 이미지 자체를 각 레코드에 삽입하는 것은 너무 에너지 소모가 크기 때문이다.

따라서 레일즈는 이런 에너지 소모를 줄이기 위해 이미지를 스토리지(storage)에 저장하고 저장된 이미지의 주소를 URL 로 만든다!!!!! 이렇게 만들어진 image_url 을 각 레코드의 속성값으로 넣어주면 되는 것이다.

이렇게 만들어진 image_url 을 프론트에서 처럼 사용하면 이미지가 보여지게 된다.

그러면 실제로 어떻게 사용하냐?!

1. 설정파일을 건들여주자!!!

우리의 경우 레일즈가 돌아가는 로컬서버에서 이미지를 관리한다. 따라서 로컬 속성을 만들어주면 된다.

# config/storage.yml
test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

2. 각 모델에 이미지를 attach 해주자!!!

모델은 이미지를 하나 또는 그 이상을 가질 수 있다. 하나의 이미지를 가질 때는 has_one_attached 를 사용하고 여러개의 이미지를 가질 때는 has_many_attached 를 사용한다.

자신의 아바타 이미지 하나를 갖는 User 모델이 있다고 해보자.

class User < ApplicationRecord
  has_one_attached :avatar
end

이 모델을 이용해서 만든 user 레코드 에 이미지를 붙여보자

user = User.new(...)
user.avatar.attach(params[:avatar]) # 프론트에서  file을 보냈을 때

자 이렇게 user 레코드에 이미지가 생겼다. 이제 이미지가 잘 있는지 확인해보자.

user.avatar.attached? # true

has_many_attached 도 사용법은 같으니 필요하면 공홈을 보자

3. 이미지 삭제하기

유져에 아바타이미지가 생겼다. 만약 이 이미지를 삭제하고 싶다면 어떻게 해야할까? 간단하다. 아래처럼하자

user.avatar.purge

주의할 것은 서버상에서 실제 이미지 자체도 삭제 된다는 것!

4. 파일에 링크하기

이전에 이미지 자체는 사이즈가 크기 때문에 그 URL 만을 이용해서 이미지에 접근해서 사용할 것이라고 말을 했었다. 그렇다면 image_url 을 어떻게 알아낼까? 간단하다. url_for 을 사용하자!!!

url_for(user.avatar)

진짜 진짜 주의할 건. url_for 은 컨트롤러에서만 사용할 수 있다!!!

Last updated