# 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 은 컨트롤러에서만 사용할 수 있다!!!***


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://simian114.gitbook.io/blog/undefined/rubyonrails/undefined-2.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
