<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>정목이의 블로그</title>
	<link>http://niceview.egloos.com</link>
	<description>정목이의 블로그에 오신걸 환영합니다~~</description>
	<language>ko</language>
	<pubDate>Sun, 15 Apr 2007 22:35:27 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>정목이의 블로그</title>
		<url>http://pds.egloos.com/logo/1/200404/04/16/b0000216.jpg</url>
		<link>http://niceview.egloos.com</link>
		<width>80</width>
		<height>51</height>
		<description>정목이의 블로그에 오신걸 환영합니다~~</description>
	</image>
  	<item>
		<title><![CDATA[ 미투데이 초대권 ]]> </title>
		<link>http://niceview.egloos.com/3117043</link>
		<guid>http://niceview.egloos.com/3117043</guid>
		<description>
			<![CDATA[ 
  오랜만의 포스팅입니다. :)<br />
<br />
바쁜 하루하루를 보내다 보니 글이 정말 뜸해졌군요.<br />
<br />
썰렁한 블로그를 살짝 깨워볼까 싶어 미투데이 초대권을 배포(?) 하겠습니다.<br />
<br />
초대권을 갖고 있으면서도 게을러서 여기저기 퍼뜨리지 못했더니 반성하라는 의미인지 왕창 초대권이 생기는 바람에... <br />
<br />
<br />
그동안 미투데이에 관심이 있으셨지만 초대권이 없으셨던분들은 http://myid.net 에서 아이디를 만드시고 이 글에 비밀글로<br />
<br />
1. myid 아이디<br />
2. myid 가입시 적었던 이메일<br />
3. 미투데이를 알게된 경로<br />
<br />
를 적어주시면 매일 꼬박꼬박 초대권을 보내드리겠습니다. :)<br />
<br />
(흑 웬지 무슨 판촉행사같아요.)<br />
			 ]]> 
		</description>

		<comments>http://niceview.egloos.com/3117043#comments</comments>
		<pubDate>Sun, 15 Apr 2007 22:35:27 GMT</pubDate>
		<dc:creator>정목</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Apache + Mongrel 에서 X-Sendfile로 파일전송 최적화하기 ]]> </title>
		<link>http://niceview.egloos.com/3063904</link>
		<guid>http://niceview.egloos.com/3063904</guid>
		<description>
			<![CDATA[ 
  저희 전산 동아리 PAIM에서 만든 프로젝트 중 현재 가장 많은 학우들이 애용하고 있는 프로젝트는 단연 강의록 사이트입니다. 교수님들께서 의대 수업의 특성상 PPT를 수업 프리젠테이션으로 많이 사용하시다 보니 다들 강의록 PPT에 필기를 하고 뽑아보고 나눠보고 돌려보죠. PPT파일의 크기는 적게는 1MB미만에서 크게는 100MB에 이르기까지 다양합니다만, 거의 100여명의 학생들이 동시에 50~100MB의 파일을 다운로드 받는 때에는 서버가 버티질 못하더라구요. 하긴 39만원짜리 PC서버에서 무얼 더 바라겠냐마는, 뭔가 근본적인 문제가 있는게 아닌가 의심되었습니다. 아니나 다를까 강의록 사이트 총 책임자인 <a href="http://blog.naver.com/mizuguri/">호종이</a>가 레일스의 send_file의 문제점을 파악했습니다. 메모리에 파일을 다 올리지 않고 조각내서 전송하겠다고 다짐한 send_file이건만 파일이 전송될 때 마다 메모리를 뭉텅 뭉텅 소모하는 것이지요.<br />
<br />
<a href="http://rubyforge.org/pipermail/mongrel-users/2006-August/000867.html">Mongrel 제작자인 Zed의 이야기</a>에 따르면 send_file의 구현이 OS 마다 다르다 보니 Mongrel 1.0 부터는 안정성의 문제로 send_file를 지원하지 않기로 했답니다. 어쩐지 Mongrel을 업그레이드 하기 전에는 적어도 서버가 죽는 일은 없었는데 말이죠.<br />
사실 지금에 와서 생각해보면 레일스의 send_file의 문제라기보다는 Apache + Mongrel 조합에서 생겨날 수 밖에 없는 필연적인 문제였습니다. 아무리 Mongrel이 send_file 해준다고 하더라도 결국 client는 Apache를 통해서 파일을 전송 받기 때문에 Mongrel이 찔끔 찔끔 파일을 보내줘봤자 그걸 잠시 보관해야할 Apache를 위해서라도 메모리는 소모되는 것이지요. 게다가 proxy_balancer로 여러 Mongrel을 띄웠다면 매번 서로 다른 Mongrel이 파일을 찔끔찔끔 직접 읽고 있으니 서버가 감당하지 못한 거지요.<br />
<br />
Lighttpd에는 X-Sendfile이라는 개념이 도입되었습니다. 웹 프로그램이 파일을 읽어서 웹 서버에 보내는 것이 아니라 웹 프로그램은 파일 위치만 헤더(Header)로 알려주고 웹 서버가 send_file처럼 전송해야할 파일을 직접 전송해주는 것이지요. 이걸 Apache에서도 가능하게 하는 모듈이 <a href="http://celebnamer.celebworld.ws/stuff/mod_xsendfile/">mod_xsendfile</a>입니다.<br /><br />우선 모듈을 컴파일 해야죠. mod_xsendfile 링크에서 소스를 받아서 아파치의 동적 모듈로 컴파일 합니다.<br />
 <blockquote>curl -O http://celebnamer.celebworld.ws/stuff/mod_xsendfile/mod_xsendfile.c<br />
       <code>apxs2 -cia mod_xsendfile.c</code><br />
 </blockquote>apxs2에서 애러가 난다구요? 없는 명령이라구요? 데비안을 쓰신다면 아파치 모듈 컴파일이 되도록<br />
 <blockquote>apt-get install apache2-prefork-dev</blockquote>로 development 패키지를 설치합니다. <br />
 apxs2 -cia의 옵션을 잠깐 설명드리면 -c는 동적 모듈로 컴파일을 하겠다는, -i는 설치를 하겠다는, -a는 설정파일까지 수정하겠다는 의미입니다. 설정 파일 수정이 자동으로 안되시면 /etc/apache2/httpd.conf파일에 다음을 추가하세요<br />
 <blockquote>LoadModule xsendfile_module /usr/lib/apache2/modules/mod_xsendfile.so</blockquote>그리고 다음처럼 모듈을 사용하겠다고 추가하세요<br />
 <blockquote>XSendFile on<br />
 XSendFileAllowAbove on<br />
 </blockquote>만약 데이안 다운 모듈 관리를 원하신다면 위의 모듈 로드, 모듈 설정 내용을 /etc/apache2/mods-available/xsendfile.load와 xsendfile.conf에 담으시고 a2enmod xsendfile 이라고 터미널이 입력해보세요. 알아서 두 파일을 /etc/apache2/mods-enabled 디렉토리에 링크를 걸어줘서 웹서버를 재시작하면 모듈이 올라갑니다.<br />
 <br />
 이제 send_file로 파일을 직접 전송하는 것 대신에 헤더만 써주면 됩니다. 다음처럼요.<br />
 <blockquote>response.headers['Content-Type'] = "application/force-download" <br />
 response.headers['Content-Disposition'] = "attachment; filename=\"#{filename}\"" <br />
 response.headers["X-Sendfile"] = local_file<br />
 response.headers['Content-length'] = File.size(local_file)<br />
 response.headers['Cache-Control'] = 'must-revalidate'<br />
 render :nothing =&gt; true<br />
 </blockquote>:) 좀 부담이 줄었나요??<br />
 <br />
 덤으로 팁입니다. 헤더가 잘 전송되고 있는지 보려면 curl --head http://..... 를 이용해보세요. 헤더 정보만 볼 수 있어서 잘 되고 있는지 테스트 하실 수 있습니다. 만약 헤더에 X-Sendfile...이라는 내용이 있다면 헤더는 잘 만들었는데, 아파치가 처리를 안하고 있다는 것입니다.<br />
 <br />
 <br />
 또 덤으로...<br />
 저의 경우 한글 인코딩 문제로 고생을 많이해서 서버를 UTF-8으로 통일했습니다. 그래도 파일 이름이 겹치는 것을 처리하기 귀찮아서 파일이 업로드되면 원래의 파일 이름을 DB에 저장하고 서버에는 그 DB의 id로 이름을 바꿔서 저장합니다. "한글.jpg"라는 파일이 101번째 업로드된 파일이라면 서버에는 "101"이라는 파일로 저장되지요. 그리고는 다음과 같이 전송합니다.<br />
<blockquote> a = Attachment.find(params[:id])<br />
 a.hit!<br />
 if @request.env["HTTP_USER_AGENT"] =~ /IE/<br />
 &nbsp; filename = Iconv.iconv('euckr', 'utf8', a.original_filename) <br />
 else<br />
 &nbsp; filename = a.original_filename<br />
 end<br />
 # send_file(File.join(UPLOAD_DIR, a.id.to_s), :filename =&gt; filename, :type =&gt; a.content_type)<br />
 local_file = File.join(RAILS_ROOT, UPLOAD_DIR, a.id.to_s) <br />
 response.headers['Content-Type'] = "application/force-download" <br />
 response.headers['Content-Disposition'] = "attachment; filename=\"#{filename}\"" <br />
 response.headers["X-Sendfile"] = local_file<br />
 response.headers['Content-length'] = File.size(local_file)<br />
 response.headers['Cache-Control'] = 'must-revalidate'<br />
 render :nothing =&gt; true</blockquote><br />
 주석처리된 send_file 문과 비교해서 보세요. 헤더에 파일 이름을 따로 지정할 수 있기 때문에 DB상의 파일 이름을 넣어주고 아파치의 파일 전송을 위해 절대 경로를 알려줍니다. 혹여 DB상의 파일 이름이 "한글.jpg"에서 "../../../../etc/passwd" 등으로 조작되더라도 중요한 시스템 파일이 유출되는 일은 없겠지요. 어짜피 전송할 파일은 DB의 id로 지정되어있으니까요. 그리고 윈도우+IE일때는 UTF-8으로 된 파일을 처리하지 못하기 때문에 filename로 손봐줬습니다.<br />
<br />
<br />
휴우~ 글이 길어졌습니다. Mongrel이 정적인 파일 전송에 쥐약이기로 유명하다는 소문은 들었지만 막상 서버가 죽어나가니 뭔가 대안을 찾아야했습니다. 강의록 사이트의 과부하 때문에 Lightttpd로 옮겨볼까도 생각했습니다만, Apache의 X-sendfile 덕분에 한시름 놨습니다. 혹시 대용량 파일 전송으로 고민하고 계신분들은 X-sendfile을 시도해보세요~ :)			 ]]> 
		</description>
		<category>Ruby &amp; Rails</category>

		<comments>http://niceview.egloos.com/3063904#comments</comments>
		<pubDate>Tue, 20 Mar 2007 14:36:46 GMT</pubDate>
		<dc:creator>정목</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 단순한 인터페이스의 아름다움 ]]> </title>
		<link>http://niceview.egloos.com/3052383</link>
		<guid>http://niceview.egloos.com/3052383</guid>
		<description>
			<![CDATA[ 
  사람은 단순한 것을 좋아합니다. 배우기 쉽고 간단하고 재미있는 것을 좋아하죠 (그런 면에서 미투데이는 정말 좋아요~)<br />
실수를 하지 않기 위해서는 단순한 것이 "좋은" 정도가 아니라 "필요" 내지는 "완전 소중" 합니다.<br />
<br />
제가 요즘 절대로 실수를 하지 않아야하는 것은 딱 두가지가 있습니다. 하나는 환자의 ABO/Rh 혈액형 검사를 위핸 채혈을 하는 것과 다른 하나는 쌍둥이 출산에서 제대혈을 잘 담는 일이지요. 첫번째 것의 중요성은 굳이 자세히 말씀드리지 않아도 좋을 것 같습니다. 저 검체는 잘못 나가서 혹여나 수혈 사고가 발생하면 초대형 대박 사건이기 때문에 꼭 기사화가 되죠. 서울대병원에선 몇가지 방비책을 두고 있는데, 가장 단순하면서도 실용적인 방법이 "채혈자 이름과 환자 이름을 기입하기"입니다.<br />
대형 병원에서의 혈액 검사는 긴급을 요하는 경우가 많고 양이 엄청나기 때문에 진단검사의학과에는 혈액 및 검채 검사가 자동화되어있습니다. 컨베이어 벨트에 혈액 튜브가 즐비하게 줄을 맞추어 자동으로 검사가 되죠. 이런 자동화된 툴을 이용하기 위해선 검체 라벨을 붙이게되는데요, 그냥 스티커를 붙여놓고 다른 환자의 혈액을 담으면 대박 사건의 시발점이 되는 것이죠.<br />
그래서 검체 라벨을 붙이고도 한번 더 확인한다는 의미에서 환자의 이름을 물어보고 스티커에 네임펜으로 씁니다. 그리고 책임을 분명하게 하겠다는 분위기를 환기하기 위해 채혈자의 이름도 쓰게 되어있죠. 이 네임 스티커가 안붙어있으면 ABO/Rh 검사를 하지 않고 도로 병동으로 올려보냅니다. 새로 받아서 다시 보내라고.<br />
<br />
어찌보면 구시대적인 냄새를 풍기지만, 정말 단순하면서도 명쾌하죠.<br />
<br />
<br />
저의 두번째 중요 업무인 제대혈 샘플 담기. 보통 제왕절개 분만을 하면 3가지 샘플이 나옵니다. 제대동맥혈 1cc, 제대정맥혈 50cc, 양수 10cc. 이게 쌍둥이, 세쌍둥이의 경우에는 그 배수로 샘플이 나오겠죠. 샘플을 정리하는동안 새로운 샘플이 나옵니다. 무균상태를 유지하기 위해 주사기엔 아무런 표시도 할 수 없죠. 자칫 잘못 샘플을 정리했다간 신생아의 혈액 검사치가 바뀌어 나오겠죠. 태어난지 하루도 안된 아기에게서 혈액을 뽑을 수도 없고 정말 난처해집니다. 이를 막기 위한 기가막힌 대처방법. 두번째 아기를 위한 샘플 주사기에는 무균 처리된 고무줄을 하나 묶어둡니다. 그러면 수술중인 교수님도 당신께서 지금 제대로된 주사기에 담는 것인지 알 수 있고, 샘플을 정리하는 저도 제대로된 주사기란 걸 알 수 있죠. 하나에 몇 원도 안되는 고무줄 하나가 수술장에선 그 누구보다 중요한 역할을 하는 겁니다.<br />
<br />
<br />
이렇게 제가 있는 곳에는 "단순함"이 기호를 넘어선 가장 중요한 미덕입니다. 웹에서 "단순함"은 매력 포인트에 '불과'하겠지만 여기선 목숨이 달렸죠. 저는 어떻게든 저의 일과를 "단순하게" 유지해서 실수하는 일이 없도록 하기 위해 부단히 노력합니다. 그러다 보니 "인터페이스"란 참 중요한 것이더군요.<br />
<br />
<br />
요즘 하루에 꼭 4~5분의 보호자분들은 분만장에 일단 들어오셔서는 간호사님을 찾습니다. 분만장을 들어오는 입구는 굳게 닫혀있고, 분명히 입구 옆에 호출용 비디오폰이 달려있는데 말이죠. 게다가 분만장 입구 바닥에는 산모들이 오셔야할 분만장 병실로 가는 길과 부인과 질환을 갖고계신 환자분들이 가셔야할 복강경실로 가는 길이 표시가 되어있음에도 꼭 반대로 오시는 분들이 계십니다. 간호사님들은 이런 실수를 하시는 분들을 '가르치시죠'. 아닙니다. 그분들이 잘못한게 아니라 "인터페이스"가 잘못된겁니다. 이런 일이 반복된다면 "왜 환자들은 바보같이 길을 헷갈리는 걸까?"라고 묻는게 아니라 "대체 우리가 뭘 잘못 표시한걸까?"라고 되물어야 합니다.<br />
<br />
역시 사람은 필요한 곳에만 집중을 하는가 봅니다. 사이트의 성공을 결정짓는 "웹 인터페이스", 사람의 목숨이 달린 "검체 접수 인터페이스"에는 신경 쓰면서 사람들이 길을 헤매는 이유인 잘못된 인터페이스는 왜 무관심한지..<br />
<br />
<br />
루비 책 번역과 관련하여 대산님과 출판사를 찾아가는 길에 지하철 갈아타는 길을 잠깐 헤맨 일이 있습니다. "이건 제 잘못이 아니라 인터페이스가 잘못 된거에요"라는 대산님의 한마디가 기억납니다. :)<br />
<br />
<br />
이렇든 인터페이스는 모든 곳에 존재합니다.			 ]]> 
		</description>
		<category>병원 일기</category>

		<comments>http://niceview.egloos.com/3052383#comments</comments>
		<pubDate>Wed, 14 Mar 2007 13:59:01 GMT</pubDate>
		<dc:creator>정목</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 환자의 손을 잡아주기 ]]> </title>
		<link>http://niceview.egloos.com/3045119</link>
		<guid>http://niceview.egloos.com/3045119</guid>
		<description>
			<![CDATA[ 
  원래 일요일은 10시부터 근무입니다만, 오전에 불임시술을 받는 분이 있으셔서 8시반까지 병원에 왔습니다.<br />
불임 시술의 단계를 매우매우매우 간략하게 설명하자면, 1) 호르몬 약물로 난소를 자극해서 난자를 많이 만들게 하고 2) 그 난소를 뽑아서 3) 수정관 수정을 하고 4) 다시 자궁에 넣어줍니다. 오늘 오신분은 2번을 하러 오신 분이었죠. 저는 산과 분만장에만 있기 때문에 부인과 시술이나 수술은 잘 모릅니다. 시술 하는 동안 모니터링을 해야한다고 해서 갔었는데, 비품들이 어디있는지도 잘 모르고 모니터도 쓰던거랑 완전 달라서 좀 버벅거렸네요.<br />
환자분께 IV라인을 잡고 혈액 채취를 해야해서 설명을 드리는데, 아 이분 너무 긴장하셨더라구요. 잔뜩 겁을 먹으셔서는 떨고 계시실래 "추우세요?"라고 물어볼 정도.<br />
<br />
시술이 시작되었는데, 이게 좀 많이 아픕니다. 그래서 약도 좀 쓰긴 하는데, 너무 예민하신 분이라 시술 내내 괴로워하시더라구요. 저라도 좀 무서울 것 같습니다. 시술 부위를 무균상태로 유지하기 위해서 얼굴 위까지 갑갑하게 방포로 가려놓고 자기들끼리의 언어로 쒤라쒤라~. 아무도 설명해주지 않고 "다 끝났어요~~" 라고 하면서 계속되는 아픈 시술들...<br />
<br />
원래 정신이 딴 곳에 팔리면 아픈 것도 잘 모르곤 하죠. 이럴 땐 대화라도 해서 주의를 산만하게 하는게 좋아요. 제가 시술의 과정을 자세히 알았더라면 좀 더 자세히 설명해 드릴 수 있었을 텐데, 하는 아쉬움을 갖고 본과 3학년때 학생 실습때 한번 본 걸 억지로 기억해내서 설명해드렸습니다. 너무 불안해하시길래 '효과가 있을까?' 반신반의하면서 "손 잡아드릴까요?"라고 했죠.<br />
<br />
괴로운 시술이 끝나고 회복실로 갔습니다. 환자분께서 한숨 놓인다고 하시면서 걱정했던 것 보단 괜찮았다고 하시더라구요. 그러면서 "손 잡아주셔서 정말 도움이 되었어요. 감사드려요."라는 한마디. 제 작업 컴퓨터가 회복실에 있는 관계로 계속 회복실을 들락날락거렸는데 보호자분께도 제 이야길 하시고, 너무 고마워하시더라구요.<br />
<br />
<br />
저번주까지만 해도 라인잡고 채혈하고 그런 것들이 아직 미숙하고 시키는대로 하는 것에 급급해서 환자분들에게 "채혈 하러 왔어요~"라고 왕창 피만 뽑아갔는데, 이제는 좀 여유가 생겨서 왜 검사하는지 설명도 해드리고, 간밤에 편안했는지 안부도 묻고 농담도 좀 하고 그럽니다. 그런데 오늘만큼 환자에게 도움이 되었다는 감사의 이야기가 뿌듯한 적은 없었던 것 같네요.<br />
<br />
채혈, 라인잡기를 하면서 한마디 건내기, 모니터링 중에 손잡아주기, 대화하기... 생각해보면 정말 사소한 것인데도 환자분들께서 좋아하시는 것 같습니다. 그래도 여유로울 때가 아니면 쉽지가 않죠. 응급 상황에선 정말 정신없거든요. 교수님게서 말씀하신 "실력이 없으면 친절이고 뭐고 아무 소용없어"라는 말이 떠오르는 군요. 얼른 수기들을 능숙하게 할 수 있도록 실력을 쌓고 여유부리면서 친절한 인턴이 되어야겠어요.			 ]]> 
		</description>
		<category>병원 일기</category>

		<comments>http://niceview.egloos.com/3045119#comments</comments>
		<pubDate>Sun, 11 Mar 2007 06:18:37 GMT</pubDate>
		<dc:creator>정목</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 산부인과 인턴을 돌고 있습니다. ]]> </title>
		<link>http://niceview.egloos.com/3034097</link>
		<guid>http://niceview.egloos.com/3034097</guid>
		<description>
			<![CDATA[ 
  잠시 짬이 나서 글을 올려봅니다. 인턴 생활이라는 것이 오프때 잠들고 나면 다음날 바로 당직이 시작되는 고로 매우 규칙적인 생활을 하게 됩니다. 몸은 피곤하지만 이것 저것 배우는 재미에 아직은 신기하고 즐겁습니다. :)<br />
<br />
블로그는 웬지 긴 글을 써야 될 것 같아서 부담스럽지만, 가끔씩 한 10분정도씩 짬이 날때 마다 <a href="http://me2day.net/niceview">http://me2day.net/niceview</a>에 글을 올리는 재미가 솔솔하군요. :)<br />
<br />
아직 일이 완전히 익숙하진 않아서 정신 없지만, 좀 여유가 생기면 블로그에도 글 올리고 그럴게요. 쓰고 싶은 글은 많은데 마음의 여유가 없네요. :)<br />
<br />
p.s 쓰고보니 마치 미투데이 글 3개를 올린 듯 해요. ㅎㅎ			 ]]> 
		</description>
		<category>병원 일기</category>

		<comments>http://niceview.egloos.com/3034097#comments</comments>
		<pubDate>Mon, 05 Mar 2007 15:11:13 GMT</pubDate>
		<dc:creator>정목</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 미투데이! ]]> </title>
		<link>http://niceview.egloos.com/3020817</link>
		<guid>http://niceview.egloos.com/3020817</guid>
		<description>
			<![CDATA[ 
  요즘 <a title="" href="http://me2day.net/niceview">미투데이</a>에 푹 빠졌습니다. :)			 ]]> 
		</description>
		<category>나의 일기</category>

		<comments>http://niceview.egloos.com/3020817#comments</comments>
		<pubDate>Mon, 26 Feb 2007 16:39:38 GMT</pubDate>
		<dc:creator>정목</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 변화에 대한 기대 ]]> </title>
		<link>http://niceview.egloos.com/3011116</link>
		<guid>http://niceview.egloos.com/3011116</guid>
		<description>
			<![CDATA[ 
  오늘 서울대병원 전공의 협의회 모임에 다녀왔습니다. (저는 인턴 대표 자격으로 참석했어요~)<br />
<br />
저는 병원, 특히 우리병원은 '변화', '혁신' 등의 단어는 어울리지 않다고 생각해왔었습니다.<br />
<br />
하지만, 오늘 저는 변화의 최 끝단에 서있는 느낌을 받았습니다.<br />
<br />
변화의 의지를 갖고 계신 교수님들을 중심으로 큰 물결을 탈 것 같습니다.<br />
<br />
Feedback, Agile, Bottom up, ...<br />
<br />
경영 혁신이나 IT 개발팀에서나 들어보았던 제가 동경하는 단어들.<br />
<br />
오늘 모임의 느낌은 저런 단어들로 요약되는 자리였습니다.<br />
<br />
<br />
Agile이란 꼭 IT에만 한정되는 것은 아닌가 봅니다.			 ]]> 
		</description>
		<category>나의 일기</category>

		<comments>http://niceview.egloos.com/3011116#comments</comments>
		<pubDate>Wed, 21 Feb 2007 15:04:31 GMT</pubDate>
		<dc:creator>정목</dc:creator>
	</item>
	<item>
		<title><![CDATA[ acts_as_list에서 scope를 사용하기 ]]> </title>
		<link>http://niceview.egloos.com/2996858</link>
		<guid>http://niceview.egloos.com/2996858</guid>
		<description>
			<![CDATA[ 
  acts_as_list는 레일스에서 간편하게 모델에 리스트 구조를 도입하는데 사용할 수 있습니다.<br />
레일스 API(<a href="http://api.rubyonrails.org/classes/ActiveRecord/Acts/List/ClassMethods.html#M000667">1</a> <a href="http://api.rubyonrails.org/classes/ActiveRecord/Acts/List/InstanceMethods.html">2</a>)를 참조하시면 보다 자세히 아실 수 있는데요, 오늘은 :scope를 보다 복잡하게 사용하는 방법을 알아보겠습니다.<br />
<br />
제가 :scope를 응용하게된 이유는 게시판 순서를 정렬하기 위해서였습니다. 인턴 커뮤니티에는 여러개의 게시판이 있는데, category 필드를 이용해서 일반 게시판과 인수인계 게시판으로 분류해 두었습니다. 게시판 목록을 화면 오른쪽에 항상 띄워두는 디자인이었는데, 게시판 개수가 많아서 게시판 목록을 그리기 위해서 모든 게시판을 하나하나 순서대로 표시하도록 하였습니다. 문제는 순서를 바꾸는 일이 너무 귀찮다는 것이었습니다. acts_as_list를 이용하고 position을 지정해서 사용했는데, 관리자 화면에서 간단하게 게시판의 순서를 바꿔주고 싶었습니다. 문제는 category에 의해 두가지 분류로 게시판이 나뉜다는 것이지요. <blockquote>class TodoList &lt; ActiveRecord::Base<br />
  has_many :todo_items, :order =&gt; "position"<br />
end<br />
<br />
class TodoItem &lt; ActiveRecord::Base<br />
  belongs_to :todo_list<br />
  acts_as_list :scope =&gt; :todo_list<br />
end</blockquote>위의 예제는 레일스 API에 있는 예제입니다. 위와 같이 사용하면 TodoItem을 리스트 구조로 사용하면서도 TodoList별로 순서를 유지하게 되지요.<br />
<br />
인턴 게시판의 문제는 위의 예제처럼 has_many - belongs_to 관계가 없다는 것입니다. 그냥 category 필드로 분류가 되어있지요. 그래서 이리저리 고민하다 다음과 같이 썼습니다.<br />
<br />
<blockquote>class Board &lt; ActiveRecord::Base<br />
&nbsp; acts_as_list :scope =&gt; 'category = \'#{category}\''<br />
end</blockquote><br />
네, category 필드별로 position을 따로잡겠다는 의미입니다.<br />
<br />
여기서 주의해야할 것은 :scope를 지정할 때 쌍따옴표가 아닌 홑따옴표를 사용했다는 겁니다. 만약 여기서 쌍따옴표를 사용하면 category란 메소드가 없다며 애러를 냅니다. 홑따옴표로 #{category}부분을 온전히 넘겨줌으로써 ActiveRecord가 만들어내는 SQL문에 동적으로 삽입되도록 하는 것이 묘미입니다.<br />
<br />
저는 관리자가 로그인 한 경우 게시판 오른쪽에 위쪽 화살표와 아래쪽 화살표를 두고 각각 move_higher, move_lower 메소드를 호출하게 하여 게시판 순서를 쉽게 바꾸도록 했습니다. 가장 위에 있는 게시판은 더이상 올라갈 곳이 없으니 first? 메소드를 사용해서 위쪽 화살표를 표시하는 조건문으로 사용했지요. 물론 아래쪽도 비슷하게 말이죠.<br />
<br />
여기에 사용된 홑따옴표와 #{}를 이용한 :scope 지정은<br />
<blockquote>has_many :boards, :conditions =&gt; 'id = #{special_id}'<br />
</blockquote>와 같이 사용될 수도 있습니다. SQL로 변환되는 곳에서 응용해서 사용해보세요.			 ]]> 
		</description>
		<category>Ruby &amp; Rails</category>

		<comments>http://niceview.egloos.com/2996858#comments</comments>
		<pubDate>Tue, 13 Feb 2007 17:15:18 GMT</pubDate>
		<dc:creator>정목</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 인턴 연수를 다녀왔습니다. ]]> </title>
		<link>http://niceview.egloos.com/2993824</link>
		<guid>http://niceview.egloos.com/2993824</guid>
		<description>
			<![CDATA[ 
  토~일 이틀동안 용인에 있는 연수원에 다녀왔습니다.<br />
<br />
서울대병원 인턴 임용장도 받고, 일년 동안 사용할 가운도 받고, 어찌어찌하다보니 인턴 대표도 되었습니다. 원하는 과를 배정받으려고 거의 이틀동안 친구들이랑 고민해서 턴 교환도 끝내고 연수원 일정을 마치고 돌아오니 이제는 학생이 아니다라는 실감이 듭니다.<br />
<br />
고객 만족에 대한 강좌, 팀 협업에 관한 강좌를 듣고 있다보니 확실하게 '신입 사원'이 된 기분이 듭니다. :)<br />
			 ]]> 
		</description>
		<category>나의 일기</category>

		<comments>http://niceview.egloos.com/2993824#comments</comments>
		<pubDate>Mon, 12 Feb 2007 10:39:59 GMT</pubDate>
		<dc:creator>정목</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Rails 1.2.2가 나왔습니다. ]]> </title>
		<link>http://niceview.egloos.com/2985306</link>
		<guid>http://niceview.egloos.com/2985306</guid>
		<description>
			<![CDATA[ 
  Rails 1.2.2가 나왔습니다. RubyGems이 업그레이드 되면서 require_gem을 못쓰게 됨에 따라 매번 애러 메세지를 보거나 boot.rb파일을 수정해줘야했는데 그 부분을 손보았군요.<br />
<br />
이외의 자잘한 버그도 수정되고 singular resource도 도입되었네요.<br />
<br />
1.2를 쓰시던 분들은 모두들 업그레이드 하세요.<br />
<br />
<blockquote>sudo gem update -y</blockquote><br />
로 Rails 1.2.2로 업그레이드 하신후,<br />
<br />
프로젝트 디렉토리에서<br />
<br />
<blockquote>rake rails:update</blockquote><br />
로 스크립트들도 1.2.2로!<br />
<br />
마지막으로 /config/environment.rb파일에서 레일스 버전을 수정해주시는거 잊지마세요~			 ]]> 
		</description>
		<category>Ruby &amp; Rails</category>

		<comments>http://niceview.egloos.com/2985306#comments</comments>
		<pubDate>Wed, 07 Feb 2007 18:09:17 GMT</pubDate>
		<dc:creator>정목</dc:creator>
	</item>
</channel>
</rss>
