본문 바로가기

Ruby on Rails

이미지 업로드와 이틀간의 사투

사투를 벌이긴 했으나 적은 나를 적으로 보고 있지도 않았다.
아주 간단한 문제를 심각한 문제로 여기고 엉둥한데서 해결책을 찾으려 헤고 있었던 것이다.
간단한 코드 몇줄의 자리 이동으로 문제는 해결 됐다.
그렇게 승부는 참으로 어이없이 끝났다.

문제가 생기면 한걸음 물러서서 그 문제를 바라 보아야 해결책이 떠오른다거나, 여러 각도에서 그 문제를 바라 보아야 해결책을 찾기가 쉽다는 생각은 언제나 하고는 있으나 정작 문제에 당면하게 되면 머리가 아주 딱딱해지는 느낌이다 --;

이미지 업로드 내지 첨부attachment와 관련된 레일스의 플러그인은 File Column, Acts As Attachment (이하 줄여서 AAA로 부름) 그리고 AAA를 만든 Rick Olson이 AAA를 다시 뜯어 고친 Attachment_fu 정도가 많이 쓰이는 것으로 보인다.

Rick Olson이란 친구는 레일스 코어 팀의 일원인데 Acts As Authenticated 등 Acts As ..시리즈 플러그인을 많이 만든 친구다. (내친구는 아니다--;) 이 자리를 빌어 고맙다는 말을 전하고 싶다.  사실 플러그인을 내가 잘 못 적용해 놓고서는 이틀간 이 친구 원망 많이 했다.

아무튼, 그러고 보니 Acts As Authenticated 도  AAA일쎄? 그러면 이렇게  AAAttachment는 그 이전에 깔아줘야 하는 것들이 좀 있다. 저 위에 링크한 튜토리얼 페이지들에 가면 설명이 있긴 하지만 한글로 좀 써보자면,

먼저 RMagick이라는 gem을 하나 깔고, Rmagick을 통해서 연결되는 이미지 변환 프로그램인 ImageMagick이나 GraphicsMagick 프로그램을 깔아야 한다. 이 세가지를 다 합쳐서 Rmagick이라고 부른단다.

이 프로그램들은 이미지 사이즈를 변환시켜주는 역할을 한다. 썸네일을 만들거나 너무 큰 이미지가 서버에 저장되는 것을 막을 수 있다.

나는 이미지가 깨져서 올라가는 문제를 겪었는데 어느 순간 해결이 되어 있었다. 하도 이것 저것 다시 깔아댔기 때문에 뭘 다시 깔았을 때 되기 시작했는지를 모르겠지만 아무튼 이미지가 깨진채로 저장된다면 저 둘을 다시 깔아보도록 하시라.



그리고 내가 겪은 문제의 핵심을 이야기 하자면. 스캐폴드로 기본적으로 만들어지는 화면들은 하나의 모델, 그러니까 하나의 테이블에 대한 조회 수정 화면들인데 프로그램을 짜다보면 테이블 하나로 해결되는 경우가 어디 흔한가? 그건 데모화면 만들때나 있을 법한 상황이다.

이번 문제도 바로 문서의 내용은 A와 B 모델 업로드할 사진의 정보는 제 3의 C 모델에 들어가는 구조이기 때문에 생긴것이다. 여러모델을 가지고 하나의 컨트롤러와 뷰를 만들때의 상세한 설명은 현재까지는 어느 예제에서도 못본듯 하다.

나는 일단 A와 B모델을 포함하는 컨트롤러를 원래 A의 컨트롤러를 수정해서 만들었고 뷰도 원래 A의 것을 가져다가 수정하고 있었다. 그러다 보니 A의 뷰 중에 포함되는 _form.rhtl안에다가 이미지를 업로드 하는 코드를 넣었다.

그리고 기본적으로 AAAttachment 플러그인은 모델 플러그인라서 모델에만 acts_as_attachment 절을 넣어 주는 것으로 그 모델에 화일 업로드 데이타가 들어가게 되는것이다.

그런데 문제는 _form.rhtml를 감싸고 있는 폼이 원래 A모델의 것이어서 _form.rhtml 안에 넣어둔 이미지 업로드 폼이 AAAttachment가 적용된 C모델을 참조해야 하는데도 불구하고 A모델을 참조하고 있는 꼴이어서 content_type이라는 메소드가 정의가 안됐다는 에러를 업로드 버튼을 누르자마자  뿌려주고 있었다.
(라고 생각 했으나 뷰는 컨트롤러와 연결되는 것이지 모델과 연결되는 것이 아닌바. html 소스를 보니 폼 안에 폼이 들어 있던 것이 따로분리된 것 이외에는 변화가 없었다. 근본 원인 아직도 파악중 --;)

난 그걸 보고 플러그인이 작동을 하지 않는게 아닌가 하고 엄한데서 뻘짓 많이 했다. 거기에 이미지까지 깨져서 rmagick 말고 이미지 사이언스인가 뭔가를 깔아보기도 했으나 그건 아예 업로드 화면도 뜨기 전에 당당하게 에러를 내주었었~드랬다.

결국 문제는 브라우저에서 소스보기를 해보니 실체가 드러났다. 진작 좀 봤으면 어디 덧나나 --;;
업로드 폼이 엉뚱한 모델을 참조 하고 있는게 거기선 바로 보이는데, 그걸 가지고 이틀이나 헤매다니 --;
미치고 팔짝 뛸 노릇이 아닌가.

오늘의 교훈!
문제의 원인을 지레짐작하고 한쪽 만파지 말고, 다양한 원인이 있을 수 있다는 가정하에 문제를 여러 각도에서 바라 보자.