안녕하세요 멋사3기 Kyunni입니다.
이번 포스팅은 열한번 째 강의인 '데이터베이스 시드 & 이미지 업로드'에 관련된 포스팅 입니다. 사실 이번 강의를 들으면서는 강의를 내가 잘 따라가고 있다는 느낌보다는, 그대로 따라치고 있다는 생각이 많이 들었던 것 같습니다. 그래서 동일한 코드를 계속 쳐보고 분석해보면서 공부한 결과 완벽하게 이해할 수 있었습니다.
저는 수업 내용에 부가적으로 AWS에 대한 내용과(다다음 포스팅에서 연재할 계획) 이미지 업로드시 필요한 오픈소스인 'carrierwave'를 좀 더 자세히 설명해볼까 합니다. 그리고 메인 내용으로, 데이터베이스 시드와 이미지 업로드의 예제를 분석해보도록 하겠습니다.
# 프로젝트는 이전 포스팅에서 진행한 test 프로젝트에 이어서 진행하도록 하겠습니다.
Database seed
데이터를 디폴트로 입력해두는 것을 의미합니다. 즉, drop을 통해 Database를 리셋시켜버려도 디폴트 값으로 존재하는 데이터들입니다. (Database에 씨앗을 뿌려놓는다는 의미라고 합니다.)
test > db > seeds.rb
seed 파일은 컨트롤러에서 DB 작업을 하는 것과 동일하게 작성해주면 됩니다. 15~17번째 라인은 레일즈에서 미리 6, 7 번째 라인에서 예제로 제시한 내용을 참고해서 작성해보았습니다. (다양한 문법이 존재하니, 많이 활용해보고 스스로에게 맞는 문법을 사용해주면 됩니다.)
seed 파일을 적용하게 되면, db를 drop 시키더라도, 다시 rake db:seed라는 명령어를 터미널에 적용했을 때, 미리 seed 파일에 저장한 내용이 적용됩니다. (# 참고로 drop을 시키면 /db/development.sqlite3이 사라지게 됩니다.)
이미지 업로드
이미지는 AWS S3에 업로드하여 화면에 출력하는 형태로 진행하도록 하겠습니다. 매달 5기가까지 무료라고 합니다.
1. 아마존에 저장공간 생성하기 (http://aws.amazon.com/)
- My Account > AWS Management Console > 로그인
- Amazon Web Services 중 Storage & Content Delevery > S3 선택
왼쪽 상단의 create bucket > Bucket name 설정을 해줍니다. Region은 다른 지역은 서버가 느려지므로 Tokyo로 선택합니다.
Bucket에 접근 가능한 또 다른 유저 만드는 과정입니다.
우측 상단의 본인 계정명 클릭 > Security Credentials > 팝업: Continue to security credentials 클릭 > 좌측 사이드바에 Users > Create new user > Enter new username > Create > Show user security credentials > Access Key ID, Secret Access Key 반드시 따로 저장 (이후 루비에서 서버 접속시 코드로 사용합니다.)
Username 클릭 > Permissions 아래의 Attach Policy 클릭 > AmazonS3FullAccess 체크
# 별도의 유저를 만들어서 접근 권한을 제한적으로 주는 장치로, 이 유저는 아마존 S3에 대해 파일을 올리고 지울 수 있는 권한이 주어집니다.
2. 이미지 업로드 및 처리하는 코드 작성
write.erb
File을 주고받을 때에는 반드시 method는 POST 형식이어야합니다. 또한 파일은 일반적인 텍스트와 다르기 때문에
entype="multipart/form-data"를 폼 태그 내에 옵션으로 반드시 추가해주어야합니다.
# 참고로, 루비 명령문만으로 아마존에 접근하여 버켓을 찾고, 폴더를 만들어 파일을 올릴 수 있습니다. 그러나 자동차를 만들 때 엔진을 다시 설계하지 않듯이 소프트웨어도 좀 더 쉬운 방향성을 찾기 위하여 외부 라이브러리를 가져다 쓰는 것입니다.
# 이번 실습에서는 Carrierwave라는 오픈소스를 사용합니다. 아마존을 어떻게 이용하는 지에 대해 모두 정의가 되어있어, 따로 코드를 추가할 필요가 없기 때문입니다.
3. Carrierwave로 아마존 S3 이용하기
Carrierwave를 이용하여 파일 업로드 세팅을 하고 나면 한 줄만으로도 이미지 업로드가 가능하기 때문에 매우 편합니다. 사용하기 전에 컨텐츠를 정독하고 코드를 설계하는 것을 추천드립니다. (모든 내용이 깃헙에 자세히 명시되어 있으나, 포스팅 자체는진행하도록 하겠습니다.)
1) Carrierwave installation
gem 'carrierwave' 를 Gemfile에 추가하고, 콘솔창에 bundle install을 해주면 carrierwave가 설치됩니다.
2) Getting Started
ulion이라는 uploader를 생성해줍니다. 그러면 app/uploaders/ulion_uploader.rb 라는 파일이 생성됩니다.
uploader 파일입니다. 10번째 라인의 storage :file은 주석처리를 하고 storage :fog를 커멘트를 풀어줍니다. 이유는 우리가 아마존을 사용할 것이기 때문에, (클라우드 대신 fog(안개)라는 단어를 사용한 것으로 추측합니다.) file 대신 fog라고 해주어야 합니다.
fog를 사용하기 위해선 gemfile에서 gem 'fog'를 한 번더 설치해주어야 합니다. 이후 한 번 더 bundle install을 진행합니다.
3) ActiveRecord
우리가 이전 포스팅에서 쭈욱 진행해온 내용이 모두 ActiveRecord에 해당됩니다.
migration 파일
my_image라는 이름으로 DB에 저장을 해줍니다. 반드시 string으로 해주어야합니다.
models > posting.rb
model 파일에 3번째 라인을 추가합니다. 첫 번째 인자는 migration 파일에 추가한 이미지 db의 이름이고, 두번째 인자는 업로더의 대문자로 변환된 이름입니다. 반드시 명명법을 지켜야 동작하니, uploader 파일에서 복사해서 사용하는 것이 좋습니다.
4) Using Amazone S3
test > config > initializers > fog.rb 생성
carrierwave에서 Using Amazon S3 란을 보면, full example이라는 칸이 존재하는데 이것을 모두 복사해서 fog.rb에 붙여넣습니다.
첫 번째 코드는 복사/붙여넣기 한 내용, 두 번째 코드는 이를 수정한 내용입니다. 두 번째 코드를 기준으로 설명하면, 5,6 번째 라인은 아마존 user 생성시 따로 저장해두었던 id와 security key를 대입한 것입니다. region은 Tokyo로 지정했기 때문에 고유 region code를 사용했습니다.
# 참고로 첫 번째 2 라인은 오류로 삭제해야 동작합니다.
그리고 9번째 라인은 bucket 이름을 대입해주면 됩니다.
4. DB와 아마존 S3 연결하고 출력하기
11번째 라인에 파라미터로 넘어온 image_file을 db에 저장시켜주면 모든 작업이 완료됩니다.
1) 데이터베이스 리셋
rake db:drop
rake db:migrate
rake db:seed
db에 변경사항이 있으므로, 리셋시켜줍니다.
2) 서버 리셋
initializer 파일들은 서버가 뜰 때 차례로 한 번씩 실행됩니다. 서버를 띄어놓은 뒤에 fog.rb를 추가했으므로 서버에 반영되지 않은 상태입니다.
나아가, gemfile, config의 변경이 있을 때에는 항상 서버리셋을 해주어야합니다.
3) 이미지 출력
'RUBY ON RAILS' 카테고리의 다른 글
Mailgun을 이용해 이메일 보내기 (0) | 2015.08.10 |
---|---|
Rails 로그인하기 (Session & Cookie) (0) | 2015.07.31 |
데이터베이스 릴레이션 (0) | 2015.07.23 |
데이터베이스 UPDATE (0) | 2015.07.22 |
데이터베이스 Delete(Destroy) (0) | 2015.07.22 |