> For the complete documentation index, see [llms.txt](https://simian114.gitbook.io/blog/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://simian114.gitbook.io/blog/undefined/rubyonrails/undefined-2.md).

# ACTIVE STORAGE

{% hint style="info" %}
[**공식홈페이지**](https://edgeguides.rubyonrails.org/active_storage_overview.html)
{% endhint %}

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

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

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

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

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

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

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

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

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

```ruby
# 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** 모델이 있다고 해보자.

```ruby
class User < ApplicationRecord
  has_one_attached :avatar
end
```

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

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

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

```ruby
user.avatar.attached? # true
```

**has\_many\_attached** 도 사용법은 같으니 필요하면 공홈을 보자

### 3. 이미지 삭제하기

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

```ruby
user.avatar.purge
```

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

### 4. 파일에 링크하기

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

```ruby
url_for(user.avatar)
```

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