<?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://nolja.egloos.com</link>
	<description>nolja.egloos.com</description>
	<language>ko</language>
	<pubDate>Fri, 21 Aug 2009 08:47:42 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>까망</title>
		<url>http://pds2.egloos.com/logo/1/200512/07/62/a0002562.jpg</url>
		<link>http://nolja.egloos.com</link>
		<width>80</width>
		<height>89</height>
		<description>nolja.egloos.com</description>
	</image>
  	<item>
		<title><![CDATA[ 변경됐다 ]]> </title>
		<link>http://nolja.egloos.com/1940791</link>
		<guid>http://nolja.egloos.com/1940791</guid>
		<description>
			<![CDATA[ 
  변경됐다...<br>수정하는데 얼마나 걸리냐.....<br>하루다.<br>변경해라<br>또 수정이 필요하다. 얼마나 걸리냐<br><br>얼마나 걸리냐가 중요한게 아니라.................변경을 왜 해야하는지가 중요한듯<br><br>당장 바꿔야하는건가?.........<br>바꾸는 시간은 얼마 걸리지 않겠지만 또 바뀔꺼란 생각에 변경하는데 걸리는 시간을 조사한다는 것은 의미가 없지 않은가?<br><br>바뀌어야 할 것들을 모두 모아...한꺼번에 바꾸고 싶다...<br>			 ]]> 
		</description>
		<category>┣느낌표</category>

		<comments>http://nolja.egloos.com/1940791#comments</comments>
		<pubDate>Fri, 21 Aug 2009 08:41:50 GMT</pubDate>
		<dc:creator>까망물꼬기</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 읽을만한 책 ]]> </title>
		<link>http://nolja.egloos.com/1872999</link>
		<guid>http://nolja.egloos.com/1872999</guid>
		<description>
			<![CDATA[ 
  <dt><span class="bimg"><a onclick="clickcr(this,'bil.image','98000001_0000000000000000002C0F7B','',event);" href="http://book.naver.com/bookdb/book_detail.php?bid=2887547"><img height="154" src="http://bookimg.naver.com/hash_coverimg/kangcom/l_pic/0/0/0/1/200703300001.gif" width="104"></a></span> </dt><dd class="info"><span class="point gray05"><span class="gray05 ">평점</span> <img style="MARGIN: 0px 1px -1px" height="13" src="http://static.naver.com/book/detail/ico_star9.gif" width="74"> <span class="p16 o02 b0">9.40</span> <span class="p11 gray01">5 참여</span><span class="gray08" style="MARGIN: 0px 1px 0px 3px">|</span> <a class="gray03" onclick="clickcr(this,'bil.rrew','98000001_0000000000000000002C0F7B','',event);" href="http://book.naver.com/bookdb/book_detail.php?bid=2887547&amp;menu=nview">네티즌리뷰</a> <span class="p11 gray01">5건</span> <!-- span class="gray08" style="margin:0 1px 0 3px">|</span> <a href="/bookdb/book_detail.php?bid=2887547&menu=mview" class="gray03">미디어리뷰</a> <span class="p11 gray01">0건</span></span--><span class="place gray05">도서관 소장정보 : <a class="gray05" onclick="clickcr(this,'bil.nl','','',event);" href="http://www.nl.go.kr/search/web_search/search/detailNaver.php?control_no=KMO200721064&amp;mat_class=1" target="_blank">국립중앙도서관</a> </span><span class="money gray05">가격 <strike>32,000원</strike> → 최저가 <span class="p16 o02 b0">24,000</span>원 </span></span></dd><dd class="btn"><a onclick="clickcr(this,'bil.zzim','98000001_0000000000000000002C0F7B','',event);" href="javascript:book_zzim('2887547');"></a>&nbsp;<a onclick="clickcr(this,'bil.buy','98000001_0000000000000000002C0F7B','',event);" href="http://book.naver.com/bookdb/book_detail.php?bid=2887547&amp;menu=compare"></a>&nbsp;<a onclick="clickcr(this,'bil.wrew','98000001_0000000000000000002C0F7B','',event);" href="http://book.naver.com/bookdb/book_detail.php?bid=2887547&amp;menu=nview&amp;nmode=netizen_input"></a> </dd>			 ]]> 
		</description>
		<category>┣느낌표</category>

		<comments>http://nolja.egloos.com/1872999#comments</comments>
		<pubDate>Wed, 18 Feb 2009 04:22:32 GMT</pubDate>
		<dc:creator>까망물꼬기</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 읽고 싶은 책 ]]> </title>
		<link>http://nolja.egloos.com/1872563</link>
		<guid>http://nolja.egloos.com/1872563</guid>
		<description>
			<![CDATA[ 
  <dl class="book_info_area" style="OVERFLOW: hidden"><dt><span class="bimg"><a onclick="clickcr(this,'bil.image','98000001_0000000000000000004AFCCF','',event);" href="http://book.naver.com/bookdb/book_detail.php?bid=4914383"><img height="154" src="http://bookimg.naver.com/hash_coverimg/aladdin/cover/cover/8/9/8/9/8989975921_1.jpg" width="104"></a></span><br>&nbsp;★ 추천의 글 ★<br><br>이 책 서문에서 저자 마이클 페더스는<br>“…그러자 다음과 같은 일이 일어났다...”<br>라는 문장으로 자신이 소프트웨어에 대한 열정을 품기 시작한 때를 설명했다.<br>“…그러자 다음과 같은 일이 일어났다...”<br>당신은 이러한 감정을 이해할 수 있는가? 당신은 자신의 인생에 있어서 단 한 순간이라도 “…그러자 다음과 같은 일이 일어났다...”라고 말할 수 있었던 때가 있는가? 인생의 방향을 송두리째 바꿔 놓아 결국 당신이 이 책을 집게 됨으로써 내 서문을 읽게 만든 사건이 한 번이라도 있었는가?<br><br>초등학교 6학년 때였다. 당시 나는 과학과 우주 그리고 과학기술에 관련된 모든 것에 관심이 있었다. 내 어머니는 제품 카탈로그를 보시고는 플라스틱 껍데기 안에 든 작은 디지컴(IDigi-Comp I)이라는 컴퓨터 한 대를 주문했다. 40년이 흐른 지금 그때의 작은 컴퓨터는 내 책상 위에서 명예로이 한자리를 차지하고 있다. 그 컴퓨터는 내가 소프트웨어에 끊임없이 열정을 갖게 하는 기폭제가 됐다. 나는 사람들이 지닌 문제들을 컴퓨터를 통해 푸는 게 얼마나 즐거운 일인지 처음으로 어렴풋이 깨닫게 됐다. 당시 내 컴퓨터는 플라스틱 S-R 플립플랍(flip-flop) 3개, 플라스틱 AND 게이트(and-gate) 6개로 이루어진 물건이었으나 그것만으로도 충분했다. <br><br>하지만 얼마 가지 않아 기쁨은 곧 사라지고 말았다. 소프트웨어 시스템은 결국 엉망진창이 되어 버린다는 사실 때문이었다. 프로그래머들이 처음에 생각해낸 명료한 설계는 결국 시간이 지남에 따라 상한 고기처럼 부패하게 된다. 우리가 작년에 구축한 시스템은 내년에는 함수와 변수로 뒤엉켜 버린 늪으로 변하고 만다.<br><br>왜 이런 일들이 일어날까? 왜 시스템은 부패해 가는 걸까? 왜 시스템은 깨끗한(clean) 상태에 머물러 있지 않을까?<br><br>때때로 우리는 고객에게 책임을 돌린다. 고객의 요구사항이 변경됐기 때문이라고도 말한다. 고객의 요구사항이 정확히 반영되고 고객이 반영사항에 만족해 한다면, 설계도 분명히 훌륭할 것이라는 믿음 하나로 우리는 스스로를 위안한다. 요구사항 변경은 고객의 잘못 탓이다.<br><br>여기서 중요한 소식을 하나 전하겠다. 요구사항은 반드시 변하게 되어 있다. 요구사항 변경을 수용할 수 없다면 설계가 서투른 탓이다. 변경을 수용하는 설계를 생성해내는 일은 모든 유능한 소프트웨어 개발자에게 있어 영광스러운 일이다.<br><br>견고한 설계를 만들어 내는 일은 아주 어려운 문제를 푸는 것처럼 인식된다. 실제로도 이런 작업은 너무나 힘든 탓에 제작된 모든 시스템은 서서히 부패해 결국 망가지는 과정을 겪게 된다. 이 같은 부패는 너무나도 침습력이 강해 우리는 썩은 프로그램에 걸맞은 특별한 이름을 준비했다. 바로 ‘레거시 코드’다.<br><br>레거시 코드라는 말은 프로그래머들의 가슴에서 구토를 유발한다. 마치 끈적이는 거머리와 날카로운 침을 가진 날벌레들로 뒤덮인 덤불 천지의 음산한 늪지대를 걸어가는 것과 같은 이미지를 연상시킨다. 또한 암흑, 점액, 고인물, 내장에서 나는 악취를 떠올린다. 프로그래밍에 대한 즐거움은 매우 강렬하지만, 레거시 코드를 다뤄야 하는 고통은 개발자들의 열정을 꺾어 버리고도 남을 만큼 충분히 크다. <br><br>누구나 우리가 만들어놓은 코드가 레거시 코드로 전락하지 않도록 방지하는 방법을 다각도로 찾아보려고 노력했다. 그간 많은 저자가 프로그래머들이 시스템을 깨끗하게 유지하는 데 도움을 줄 수 있는 원칙(principles), 패턴(patterns), 실행법(practices)에 대한 책을 다수 저술했다. 하지만 마이클 페더스는 우리들 대다수가 간과한 사항에 대한 통찰력을 갖고 있었다. 예방만으로는 완전할 수 없다. 최고 원칙을 숙지하고 최고 패턴을 사용하며 최선의 실행법을 따르는 가장 잘 훈련된 개발팀에서조차 때때로 작업을 망치는 일이 종종 일어난다. 부패는 계속 쌓여가고 부패를 방지하는 것만으로는 충분하지 않다. 부패를 역전(reverse)시킬 수 있어야만 한다.<br><br>이 점이 바로 이 책이 이야기하려는 내용이며 이는 곧 부패를 역전시키는 방법인 셈이다. 이 책은 복잡하게 얽힌 불명료한 시스템을 한 조각씩 단계를 밟아가는 점진적인 방법을 통해 단순하면서 잘 구조화되어 있고 훌륭하게 설계된 시스템으로 변모시키는 방법을 알려준다. 이른바 엔트로피 역전(reversing entropy)에 대한 책이라고 말할 수 있겠다.<br><br>여러분이 지나치게 흥분하기 전에 한마디 경고하고 싶다. 부패를 역전시키기는 쉽지 않을 뿐더러 단시간에 수행할 수도 없다. 저자가 이 책에서 제시하는 기법이나 패턴, 도구는 효과적이긴 하지만 여러분의 노력과 시간, 인내, 주의를 요구한다. 이 책은 결코 특효약을 제시하지는 않는다. 하룻밤 사이에 어떻게 시스템에 쌓인 모든 부패를 제거하는지에 대한 방법은 제시되지 않을 것이다. 대신 여러분이 현업에 종사하는 데 있어서 갖춰야 할 원칙과 개념, 그리고 태도에 대해 이야기할 것이다. 결국, 성능이 저하되고 있는 시스템을 서서히 향상되는 시스템으로 반전시키는 데 도움을 줄 것이다.<br><br>로버트 C. 마틴<br><br>★ 저자 서문 ★<br><br>도대체 레거시 코드의 정체는 무엇일까? 난 여태 이 말을 제대로 정의도 하지 않고 사용해 왔다. 좀더 엄밀히 정의해 보면 레거시 코드는 다른 사람한테서 가져온 코드다. 우리 회사가 다른 회사로부터 코드를 얻어 왔을 수도 있고 원래 팀에 있던 사람들이 다른 프로젝트로 옮겨가서 코드를 얻어 왔을 수도 있다. 이처럼 레거시 코드는 단순히 다른 사람이 작성한 코드를 말하지만 프로그래머 입장에서 말하자면 이 말은 사실 그 이상을 의미한다. 시간이 지날수록 그 의미와 중요성에 대해 생각하게 만드는 용어다.<br><br>레거시 코드라는 말을 처음 들었을 때 어떤 생각이 들었는가? 당신이 나와 같은 생각을 했다면, 여기저기 얽힌 난해한 구조를 가져 제대로 알 수는 없지만 변경시켜야 하는 코드를 떠올렸을 것이다. 쉬울 것으로 생각했던 특징들을 추가하느라 며칠 밤을 지샌 추억을 떠올릴 수도 있고, 더 이상 어떻게 할 수 없는 코드에 질려 사기가 저하된 당신을 떠올릴 수 있다. 이런 경우 당신의 모든 노력은 무가치해 보인다. 레거시 코드의 정의는 누가 그 코드를 작성했는가와는 무관하다. 코드가 나빠지는 길은 여러 갈래가 있고, 실제로 그 중 대부분은 코드가 다른 팀에서 왔는지 여부와는 무관하다.<br><br>업계에서 레거시 코드는 이해할 수 없고 변경시키기 힘든 코드를 지칭하는 용어로 종종 사용된다. 하지만 지난 수년간 여러 팀들과 함께 작업하고 그 팀들이 여러 가지 심각한 코드 문제들을 해결하는 데 도움을 주면서 마침내 난 또 다른 정의에 다다르게 되었다.<br><br>내게 있어서 레거시 코드는 테스트 루틴이 없는 단순한 코드일 뿐으로서, 난 이 정의에 대해 유감을 가져왔다. 과연 코드 불량 여부와 테스트 루틴은 어떤 관련이 있을까? 내게 이 질문에 대한 답은 그다지 어렵지 않으며 이 책 전반에 걸쳐 난 이 점에 대해 상술할 것이다.<br><br>코드가 얼마나 훌륭하게 작성되어 있는지 여부와는 상관없이 테스트 루틴이 없는 코드는 불량 코드다. 얼마나 멋지게 작성되어 있는가와 객체지향의 사용 여부, 그리고 캡슐화의 정도도 참작 요소가 전혀 되지 못한다. 테스트 루틴이 있으면 코드의 동작을 빠르고 검증 가능하게 변경시킬 수 있다. 하지만 테스트 루틴이 없으면 실제로 우리 코드가 더 나아지는지 더 나빠지는지를 알 수 없게 된다.<br><br>지금까지는 심각한 경우를 설명했다. 깨끗한 코드인 경우에는 어떨까? 코드 베이스가 매우 깨끗하고 잘 정의된 구조를 가진다면 충분하지 않겠는가? 아마 실수를 저지르지는 않게 될 것이다. 난 깨끗한 코드를 좋아한다. 내가 아는 대부분의 사람들보다 훨씬 더 좋아할 것이다. 하지만 깨끗한 코드만으로는 충분하지 않다. 팀들은 테스트 루틴 없이 대규모 변경을 가하는 경우에 중대한 도전에 직면하게 될 것이다. 이것은 마치 안전그물망 없이 공중 곡예를 하는 것과 비슷하다. 이 작업은 엄청난 기술과 각 단계에서 어떤 일이 일어날지에 대한 명확한 이해를 필요로 한다. 당신이 변수 몇 개를 변경시켰을 때 어떤 일이 일어날지를 정확히 아는 것은 마치 당신이 공중에서 재주를 넘었을 때 다른 동료가 당신 팔을 잡아줄지 말지를 미리 아는 것과 같다. 당신이 깨끗한 코드를 가지고 일하는 팀의 일원이라면 다른 대부분 프로그래머보다 훨씬 더 좋은 상황에서 일하는 셈이다. 필자는 일하는 동안 모든 코드를 명쾌하게 이해하고 작업하는 팀들을 거의 본 적이 없다. 그들은 마치 통계적 예외사항인 것처럼 보인다. 그리고 당신이 지원 테스트 루틴 없이 작업한다면 코드 변경은 기존 방법에 비해 더 느리게 수행될 것이다.<br><br>어떤 팀들은 점점 나아지고 좀더 깨끗한 코드를 작성하기 시작할 수 있다. 하지만 오래된 코드가 깨끗해지는 데는 시간이 오래 걸린다. 그리고 많은 경우에 완전히 깨끗해지기란 거의 불가능하다. 그렇기 때문에 나는 레거시 코드를 테스트 루틴 없는 코드라고 정의할 수 있다. 이것은 현재 사용되는 정의이며 해결책을 지시하기도 한다.<br><br>난 지금까지 테스트 루틴에 대해 이야기해 왔으나 이 책은 테스트에 대해 얘기하지는 않을 것이다. 이 책은 어떤 코드 베이스에서도 확신을 가지고 변경을 가할 수 있는 방법을 다룬다. 여러 장에 걸쳐서 코드를 이해하고 코드를 테스트 루틴 하에 두며 코드를 리팩토링하고 특징을 추가하는 기법을 설명할 것이다.<br><br>여러분이 이 책을 읽어가는 데 있어서 유의해야 할 점 중 하나는 이 책이 훌륭한 코드에 대해 설명하는 책은 아니라는 사실이다. 나는 고객과의 비밀유지 협정을 맺고 일하기 때문에 이 책에서 사용한 예제들은 모두 책에 넣기 위해 특별히 새로 만들었다. 하지만 대부분 예제에서 나는 현업에서 보아 왔던 정신을 코드에 그대로 유지하려고 애썼다. 모든 예제들이 상황에 맞는 대표적인 것들인지는 장담할 수 없다. 분명히 이것들보다 훨씬 훌륭한 코드가 많을 것이고, 반대로 내가 사용한 예제보다 훨씬 못한 코드들도 있을 것이다. 고객 비밀유지 사항에 대한 고려 이외에도, 내용이 너무 지루해 눈물이 날 지경에 이르거나 세부내용의 늪에 빠져 허우적거리지 않도록 내용을 채우는 데 애썼지만 실제로는 그렇게 저술할 수밖에 없었다. 결과적으로 몇 개의 예제들은 상대적으로 간결해졌다. 그 중 몇 개를 들여다 보면 “아니야, 이 친구는 내가 작업하는 메소드들이 여기에 있는 것들보다 훨씬 더 거대하고 훨씬 더 고약하다는 걸 이해하지 못하고 있군”이라는 생각이 들 수도 있다. 하지만 예제가 단순해 보이더라도 제발 제시하는 충고를 액면 그대로 받아들이고 그 충고가 어떻게 적용되는지를 살펴보라.<br><br>여기에 제시하는 기법들은 내가 꽤 큰 코드 조각들에 테스트해 왔던 것들로, 책 포맷의 제약으로 인해 예제를 작게 만들었을 뿐이다. 특히 여러분이 다음과 같이 코드 조각 내에서 생략 기호(…)를 보게 되면 “500줄에 이르는 코드가 더 있겠구나”라고 생각하면 된다.<br><br>m_pDispather-&gt;register(listener);<br>…<br>m_nMargins++;<br><br>이 책이 훌륭한 코드에 대한 책이 아니듯이 훌륭한 설계에 대한 책은 더더욱 아니다. 훌륭한 설계는 우리 모두가 추구하는 목표이긴 하지만, 레거시 코드에서는 몇 단계를 거치면 다다르게 되는 것이다. 몇개 장에서는 기존 코드 베이스에 새로운 코드를 추가하는 법과 훌륭한 설계 기법을 염두에 두고 코드를 추가하는 방법을 설명했다. 여러분은 레거시 코드 베이스 안에 있는 우수한 코드 부분에서 시작해 그 부분을 확대해 나가는 식으로 작업을 시작할 수 있다. 하지만 변경을 가하는 데 필요한 단계들을 밟다 보면 약간의 코드가 더 보기 흉하게 될 수도 있는데 그렇다고 놀라지는 말자. 이러한 작업은 외과 수술과 같다. 여러 곳을 절개해야만 하고 내장 사이를 관통해야 하며 미학적인 판단은 유보해야 할지도 모른다. 이 환자의 주요 기관과 내장은 이전보다 나아질 수 있을까? 물론이다. 환자의 긴급한 문제에 대해서는 잊어버리고 절개부위를 봉합한 후에 환자에게 잘 먹고 꾸준한 운동을 하라고 말한다. 물론 이렇게 할 수도 있으나 우리에게 진정 필요한 것은 환자를 있는 그대로 보고 그가 가진 문제를 고쳐 좀더 건강한 상태가 되도록 이끄는 것이다. 다시는 국가대표 육상선수가 되지는 못하겠지만 ‘최상의 상태’가 ‘더 나빠지지’는 않게 할 수 있다. 코드 베이스는 더 건강하고 작업하기 쉽게 변경될 수 있다. 환자가 더 낫다고 느낀다면, 그 때가 바로 환자가 좀더 건강한 라이프 스타일을 약속할 수 있도록 도와줄 만한 적기인 것이다. 이것이 바로 우리가 레거시 코드를 가지고 달성하려는 바이다. 우리는 편안함을 느끼는 지점에까지 다다르려고 노력한다. 그 지점에 이를 때까지 열심히 노력하고 또한 코드 변경이 용이해지도록 노력한다. 팀 내에 이러한 정신을 계속 주입한다면 설계는 향상될 것이다.<br><br>여기에 소개하는 기법들은 동료들이나 고객들과 일하면서 발견하고 그들에게서 배운 것이다. 오랜 기간 고객들과 일하면서 규칙 없이 짜여진 코드 베이스들에 대한 제어를 만드는 과정에서 나온 것이다. 나는 우연하게 이러한 레거시 코드에 대해 주목하기 시작했다. 처음으로 오브젝트 멘토(Object Mentor)와 관련된 일을 했을 때, 나는 많은 중요한 문제를 가진 팀들이 고품질 코드를 정기적으로 인도하는 단계에 이를 때까지 그들의 기술과 상호작용하는 법을 개발하면서 많은 경험을 쌓았다. 우리는 종종 팀들이 각자의 작업을 제어하고 서로 잘 협력하며 인도하는 데 도움을 주고자 익스트림 프로그래밍(XP, Extreme Programming) 방법론을 사용했다. 난 종종 XP는 훌륭한 소프트웨어를 2주마다 릴리스해야 하는 임무를 가진 잘 훈련된 팀을 만드는 데 사용되기보다는 소프트웨어를 개발하는 데 사용할 수 있는 방법이라고 느낀다.<br><br>하지만 처음부터 문제가 하나 있었다. 초창기 XP 프로젝트의 상당수는 ‘그린필드(Greenfield)’ 프로젝트들이었다. 내가 만나는 고객들은 엄청나게 거대한 코드 베이스들을 가지고 있었고 그들은 문제에 직면해 있었다. 그들은 자신들의 작업을 제어하고 제품을 인도하게 해주는 방법을 필요로 했다. 시간이 지나면서 내 자신이 고객들과 동일한 일을 반복하고 있음을 깨달았다. 결국 이런 인식은 그 당시 함께 일하던 금융기업 팀과의 작업에 어떤 영향을 주었다. 내가 오기 전까지만 해도 그들은 단위테스트는 훌륭하다고 생각해 왔다. 하지만 그들이 가지고 있던 테스트 루틴은 데이터베이스에 여러 번 접근해 큰 덩어리의 코드를 돌리는 작업을 하면서 시나리오 전체를 실행하고 있었다. 테스트 루틴들은 작성하기 힘들었고 그 팀은 실행하는 데 너무 긴 시간이 걸린다고 생각해서 테스트 루틴을 자주 돌리지는 않고 있었다. 의존관계를 깨기 위해 그들과 같이 앉아 작은 코드 덩어리를 테스트 하에 두자 갑자기 데자뷰(déjà vu), 즉 기시감(旣視感)을 느끼게 되었다. 마치 이 같은 작업을 지금까지 만났던 모든 팀들과 해온 듯한 묘한 기분을 느꼈는데, 이는 그 어떤 사람도 원치 않는 그런 감정이었다. 그것은 코드를 제어해야 할 때 필요한 중노동에 가까운 작업이다. 그래서 나는 이러한 문제들을 어떻게 해결했는지 책으로 남겨 어려움에 처한 팀들이 코드를 더 쉽게 활용하도록 돕기로 결심했다.<br><br>이 책에 사용된 예제들은 자바, C++, C 등 다양한 프로그래밍 언어로 작성됐다. 먼저 자바는 가장 많이 사용되는 언어이다. C++ 는 레거시 환경에서 맞닥뜨릴 수 있는 여러 가지 도전과제들을 보여준다. 또한 C 언어는 절차형 레거시 코드에서 나타나는 여러 가지 문제를 강조하는 데 도움을 준다. 많은 언어 중 위에 언급한 언어들은 레거시 코드에서 발생할 수 있는 여러 가지 관심범위를 포함한다. 당신이 사용하는 언어가 예제에 사용되지 않았다고 해도 예제를 한번 보길 바란다. 예제에서 사용한 여러 가지 기법들은 델파이(Delphi), 비주얼 베이직(Visual Basic), 코볼(COBOL), 포트란(FORTRAN)과 같은 다른 언어들에도 활용할 수 있다.<br><br>이 책에 있는 기법들이 많은 도움이 되고 또한 당신이 프로그래밍에 재미를 느끼는 데 좋은 계기가 되길 바란다. 프로그래밍은 매우 보람 있고 즐거운 작업이다. 일상에서 아직까지 이런 기분을 느끼지 못했다면 부디 이 책에서 제공한 기법들에서 보람과 즐거움을 찾게 되길 바란다.<br><br>★ 옮긴이의 말 ★<br><br>최근에 코드 개선과 유지보수 편의를 위한 많은 혁신적인 프로그래밍 언어들과 개발 기법들이 새롭게 만들어져 소개되고 있습니다. 이런 훌륭한 도구들을 사용해 작업하는 데도 아직 많은 개발자들은 기존에 있던 레거시 코드를 변경하고 유지보수하는 일에 많은 시간과 비용을 쏟으며 개선하는 일이 “어렵다”고 호소하고 있습니다. 이 책에서도 집중적으로 다루는 내용이지만, 대부분 기존 소프트웨어는 레거시 코드에서 매우 중요한 개념인 감지(sensing), 분리(separation), 봉합(seams) 같은 개념들을 염두에 두지 않고 작성되었기 때문에 변경하고 유지보수하는 일이 큰 골칫덩어리로 남아 있습니다.<br><br>이 책은 조직 내 요구사항의 변화와 외부환경 변화에 부응하기 위해 새로운 특징을 추가하고 버그를 고치고 소프트웨어 설계를 개선하고 자원 이용률을 최적화할 목적으로, 소프트웨어를 잘게 나누고 다시 통합해서 테스트를 위한 코드를 추가하는 등 소프트웨어를 변경하는 데 관련된 내용을 광범위하게 다루고 있습니다. 특히 소프트웨어를 효과적으로 고치는 데 필요한 다양한 기법을 C++, 자바, 루비 코드 예제로 설명하고 있어서 독자가 관련 기법을 쉽게 익힐 수 있도록 도와주고 있습니다. 부디 이 책을 통해 독자 여러분들이 좀더 많이 배우며 생각함으로써 발전하고, 그로 인해 생산성이 높아져 우수한 소프트웨어를 개발할 수 있게 되기를 바랍니다.<br>[강컴닷컴 제공] <br><br><table style="MARGIN: 10px 0px 0px 9px" cellspacing="0" cellpadding="0" width="710"><tbody><tr valign="top"><td class="dm gray01 ls" height="34"><span class="p15 c b2">목차</span> <!--//<span class="gray08" style="margin:0 3px 0 2px">|</span> 아래 목차를 클릭하면, 본문 내용 일부를 미리 보실 수 있습니다.//--></td></tr><tr><td class="ln16 dm gray05"><p><b>1부. 워밍업: 코드 변경 원리를 이해하라</b><br><br>1장. 소프트웨어 변경<br>소프트웨어를 수정하는 네 가지 이유<br>위험한 변경<br><br>2장. 효과적인 피드백 활용<br>단위테스트란?<br>상위단계 테스트<br>테스트 덮개<br>레거시 코드 변경 알고리즘<br><br>3장. 감지와 분리<br>협력자 속이기<br><br>4장. 봉합 모델<br>엄청난 양의 테스트<br>봉합<br>봉합의 종류<br><br>5장. 레거시 코드를 위한 도구<br>자동화된 리팩토링 도구<br>모조 객체<br>단위테스트 하니스<br>일반적인 단위테스트 하니스 <br><br><br><b>2부. 본격적인 소프트웨어 변경: 코드 이렇게 고치자!</b><br><br>6장. 고칠 건 많고 시간은 없고...<br>발아 메소드<br>발아 클래스<br>포장 메소드<br>포장 클래스<br>요약<br><br>7장. 코드 하나 바꾸는 데 왜 이리 오래 걸리지?<br>상황 이해<br>시차<br>의존관계 깨기<br>요약<br><br>8장. 특징, 어떻게 추가할까?<br>테스트 주도 개발<br>비교를 통한 프로그래밍<br>요약 <br><br>9장. 뚝딱! 테스트 하니스에 클래스 제대로 넣기<br>성가신 매개변수의 경우<br>숨은 의존관계인 경우<br>생성 블랍인 경우<br>성가신 전역 의존관계인 경우<br>끔찍한 인클루드 의존관계인 경우<br>양파 매개변수인 경우<br>별칭 붙은 매개변수인 경우<br><br>10장. 테스트 하니스에서 실행할 수 없는 메소드<br>숨은 메소드인 경우<br>도움이 되는 언어 특징인 경우 <br>탐지 불가능한 부작용인 경우<br><br><br>11장. 코드 변경 과정에서 꼭 테스트해야 할 메소드<br>효과에 대한 추론<br>전방 추론<br>효과 전파<br>효과 추론을 위한 도구<br>효과 분석을 통한 학습<br>효과 스케치 단순화<br><br>12장. 클래스 의존관계, 반드시 없애야 할까?<br>차단 지점 기법<br>조임 지점을 이용한 설계 판단<br>조임 지점 함정<br><br>13장. 변경에 필요한 테스트는 뭐가 있을까?<br>특성화 테스트<br>클래스 특성화<br>목표 테스트<br>특성화 테스트 작성을 위한 휴리스틱<br><br>14장. 우릴 미치게 하는 라이브러리 의존관계<br><br>15장. 응용프로그램이 모두 API 호출로 이뤄졌다면?<br><br>16장. 코드를 잘 고치기엔 내가 모르는 2%<br>노트/스케치<br>표식 나열<br>스크래치 리팩토링<br>미사용 코드 삭제<br><br>17장. 뼈대가 약한 내 응용프로그램<br>시스템 스토리 말하기<br>벌거숭이 CRC<br>대화 심사<br><br>18장. 발목 잡는 테스트 코드<br>클래스 명명 관행<br>테스트 위치<br><br>19장. 객체지향이 아니라서 위험하다고? 그럼 이렇게 고쳐 봐!<br>쉬운 경우<br>어려운 경우<br>새로운 동작 추가<br>객체지향의 장점 이용<br>모두 객체지향적이다<br><br>20장. 내 프로젝트 군살 빼기<br><br>책임 찾기<br>다른 기법<br>더 나아가기<br>클래스 추출을 마친 후<br><br>21장. 동일 코드의 반복 수정, 그만할 수는 없을까?<br>첫 번째 단계<br><br>22장. '괴물 메소드'와의 혈투, 승부수는 적절한 테스트 루틴<br>여러 가지 괴물 메소드<br>자동화된 리팩토링 지원으로 괴물 메소드 공략<br>수동 리팩토링 도전<br>전략<br><br>23장. 위반사항을 점검하는 몇 가지 기법<br>하이퍼웨어 편집<br>단일 목적 편집<br>서명 보전<br>컴파일러 의존<br><br>24장. 무너진 코드의 하늘, 솟아날 구멍이 있을까? <br><br>3부. 반드시 넘어야 할 산: 코드 변경의 난맥, 의존관계를 극복하라!<br><br>25장. 의존관계를 깨는 기법<br>매개변수 적응<br>메소드 객체 탈출<br>정의 완료<br>전역 참조 캡슐화<br>정적 메소드 드러내기<br>호출 추출과 오버라이드<br>팩토리 메소드 추출과 오버라이드 <br>게터 추출과 오버라이드<br>구현체 추출<br>인터페이스 추출<br>인스턴스 위임자 도입<br>정적 세터 도입<br>연결 대체<br>생성자 매개변수화<br>메소드 매개변수화<br>매개변수 원시화<br>특징 끌어올리기<br>의존관계 밀어내리기<br>함수를 함수포인터로 대체<br>전역 참조를 게터로 대체<br>메소드 하위클래스화와 오버라이드<br>인스턴스 변수 대체<br>템플릿 재정의<br>텍스트 재정의<br><br>부록. 리팩토링<br>메소드 추출</p><p>[알라딘 제공] </p></td></tr></tbody></table></dt></dl>			 ]]> 
		</description>
		<category>┣느낌표</category>

		<comments>http://nolja.egloos.com/1872563#comments</comments>
		<pubDate>Tue, 17 Feb 2009 02:59:03 GMT</pubDate>
		<dc:creator>까망물꼬기</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 읽을만한 책들 ]]> </title>
		<link>http://nolja.egloos.com/1872558</link>
		<guid>http://nolja.egloos.com/1872558</guid>
		<description>
			<![CDATA[ 
  <dl class="book_info_area" style="OVERFLOW: hidden"><dt><span class="bimg"><a onclick="clickcr(this,'bil.image','98000001_000000000000000000460AE8','',event);" href="http://book.naver.com/bookdb/book_detail.php?bid=4590312"><img height="154" src="http://bookimg.naver.com/hash_coverimg/kangcom/l_pic/0/0/0/6/200805290006.jpg" width="104"></a></span> </dt><dd class="info"><span class="point gray05"><span class="gray05 ">평점</span> <img style="MARGIN: 0px 1px -1px" height="13" src="http://static.naver.com/book/detail/ico_star0.gif" width="74"> <span class="p16 o02 b0">0</span> <span class="p11 gray01">0 참여</span><span class="gray08" style="MARGIN: 0px 1px 0px 3px">|</span> <a class="gray03" onclick="clickcr(this,'bil.rrew','98000001_000000000000000000460AE8','',event);" href="http://book.naver.com/bookdb/book_detail.php?bid=4590312&amp;menu=nview">네티즌리뷰</a> <span class="p11 gray01">0건</span> <!-- span class="gray08" style="margin:0 1px 0 3px">|</span> <a href="/bookdb/book_detail.php?bid=4590312&menu=mview" class="gray03">미디어리뷰</a> <span class="p11 gray01">0건</span></span--><span class="place gray05">도서관 소장정보 : <a class="gray05" onclick="clickcr(this,'bil.nl','','',event);" href="http://www.nl.go.kr/search/web_search/search/detailNaver.php?control_no=KMO200854842&amp;mat_class=1" target="_blank">국립중앙도서관</a> </span><span class="money gray05">가격 <strike>28,000원</strike> <br><br><table style="MARGIN: 26px 0px 0px 9px" cellspacing="0" cellpadding="0" width="710"><tbody><tr valign="top"><td class="p15 dm c b2" height="31">책 소개</td></tr><tr><td class="ln16 dm gray05"><b>얼랭(Erlang)은 당신을 위한 언어다!</b><br><br>* 멀티코어 컴퓨터에서 실행할 때 훨씬 빠르게 실행되는 프로그램을 작성하고 싶다!<br>* 서비스 중단 없이도 변경할 수 있는 무정지(fault-tolerent) 애플리케이션을 만들고 싶다!<br>* ‘함수형 언어’에 관해 들어 보긴 했다. 그런데 그게 진짜로 작동하는지 궁금하다!<br>* 실제 대규모 산업용 제품에서 실전 테스트된, 방대한 라이브러리와 활발한 사용자 커뮤니티가 있는 언어를 사용하고 싶다!<br>* 나는 엄청난 분량의 코드를 타이핑하느라 손가락이 닳고 싶지 않다!<br><br>1980년대 등장한 얼랭은 함수형 언어 가운데 산업에서 쓰이는 유일한 언어이며, 분산적인 프로그래밍, 동시성, 병렬적인 처리가 가장 큰 특징이다. 최근 멀티 코어(multicore) 시스템의 확산으로 각광받고 있으며 기존 순차적 프로그래밍 언어가 맞닥뜨리는 속도와 과부하 문제를 탁월하게 해결한다. <br>얼랭 창시자이기도 한 저자 조 암스트롱은 『프로그래밍 얼랭』에서 얼랭 시스템 설치부터 셸 사용법, 파일 실행과 컴파일, 병행 프로그래밍, 분산 프로그래밍, OTP, Mnesia, 멀티코어 CPU 프로그래밍까지 얼랭에 대한 모든 것을 다루었다. <br>독자가 쉽게 이해할 수 있도록 활용 가능한 많은 예제 코드와 두 가지 완전한 애플리케이션의 소스코드를 수록했으며, 특히 색인 엔진의 경우 멀티코어 CPU에서 어떻게 하면 처리량을 극대화할 수 있는지를 시원하게 보여줄 것이다.<br><br>이 책에 담긴 얼랭 애플리케이션:<br>. 음악을 스트리밍하는 SOUTcast 서버<br>. 기가바이트급 데이터를 색인 처리할 수 있는 전문 색인과 검색 엔진 [강컴닷컴 제공] </td></tr></tbody></table><table style="MARGIN-TOP: 17px" cellspacing="0" cellpadding="0" width="735"><tbody><tr><td class="dm ls gray08" style="PADDING-RIGHT: 8px; PADDING-LEFT: 0px; PADDING-BOTTOM: 9px; PADDING-TOP: 0px" align="right"><img style="MARGIN: 0px 4px -2px 0px" height="12" alt="" src="http://static.naver.com/book/detail/ico_arw02.gif" width="12"><a class="gray04 u" onclick="clickcr(this,'sum.tser','','',event);" href="http://search.naver.com/search.naver?where=nexearch&amp;query=%C7%C1%B7%CE%B1%D7%B7%A1%B9%D6+%BE%F3%B7%A9%28Programming+Erlang%29&amp;sm=bok_bib" target="_blank">이 책의 통합검색 결과보기</a> </td></tr><tr><td style="BORDER-TOP: #f1f1f1 1px solid" align="right"><a href="http://book.naver.com/bookdb/book_detail.php?bid=4590312#top_tab"><img style="MARGIN: 6px 8px 0px 0px" height="13" alt="TOP" src="http://static.naver.com/book/detail/btn_top.gif" width="34"></a></td></tr></tbody></table><!-- //책소개 --><!-- 작가소개 --><a name="author_info"></a><table style="MARGIN: 10px 0px 0px 9px" cellspacing="0" cellpadding="0" width="710"><tbody><tr valign="top"><td class="p15 dm c b2" height="34">작가 소개</td></tr><tr valign="top"><td class="dm bl01" height="23"><span class="b">저자</span> <span class="gray08">|</span> <a class="bl01" onclick="clickcr(this,'ain.ser','','',event);" href="http://book.naver.com/search/book_search.php?squery=Joe+Armstrong&amp;sc=3">Joe Armstrong</a></td></tr><tr><td class="ln16 dm gray05">[지은이]<br><br><b>조 암스트롱</b> (Joe Armstrong)<br>조 암스트롱은 스웨던 왕립 기술연구소에서 컴퓨터 과학으로 박사학위를 취득하였고, 장애허용 시스템을 구축하는 일의 전문가다. 조는 얼랭 OTP 시스템을 만드는 프로젝트의 수석 소프트웨어 아키텍트로 활동하였으며, 현재 최초의 얼랭 스타트업 중 하나(Bluetail)에서 사업가로 활동하면서 30년간 산업과 연구 분야에 종사하고 있다.<br><br><br>[옮긴이] <br><br><b>김석준</b> (sjoonk@gmail.com)<br>웹2.0과 루비온레일스 기반의 소프트웨어 개발, 컨설팅을 하는 유스풀패러다임의 대표다. 한때 공직에 근무하다 어릴 적부터 해오던 프로그래밍의 맛을 잊을 수 없어 업종을 전환한 경력을 가지고 있으며, 항상 끊임없이 새로워지려고 노력 중이다. 번역한 책으로 『레일스 레시피』, 공역한 책으로 『레일스와 함께하는 애자일 웹 개발』이 있다. [강컴닷컴 제공] </td></tr></tbody></table></span></span></dd></dl><br><table style="MARGIN: 10px 0px 0px 9px" cellspacing="0" cellpadding="0" width="710"><tbody><tr valign="top"><td class="dm gray01 ls" height="34"><span class="p15 c b2">목차</span> <!--//<span class="gray08" style="margin:0 3px 0 2px">|</span> 아래 목차를 클릭하면, 본문 내용 일부를 미리 보실 수 있습니다.//--></td></tr><tr><td class="ln16 dm gray05">1장 출발<br>1.1 로드맵<br>1.2 다시 출발<br><br>2장 시작 <br>2.1 개관 <br>2.2 얼랭 설치하기 <br>2.3 이 책의 코드 <br>2.4 셸 시작하기 <br>2.5 간단한 정수 연산 <br>2.6 변수 <br>2.7 부동 소수점 수 <br>2.8 애텀 <br>2.9 튜플 <br>2.10 리스트 <br>2.11 문자열 <br>2.12 패턴 매칭 다시 한번 <br><br>3장 순차 프로그래밍 <br>3.1 모듈 <br>3.2 쇼핑으로 돌아가서 <br>3.3 이름은 같고 애리티가 다른 함수<br>3.4 펀 <br>3.5 간단한 리스트 처리 <br>3.6 리스트 해석 <br>3.7 산술 식 <br>3.8 가드 <br>3.9 레코드 <br>3.10 case와 if 식 <br>3.11 정상 순서로 리스트 구성하기<br>3.12 누산기 <br><br>4장·예외 <br>4.1 예외(Exceptions) <br>4.2 예외 발생시키기 <br>4.3 try...catch <br>4.4 catch <br>4.5 오류 메시지 개선하기 <br>4.6 try...catch 프로그래밍 스타일 <br>4.7 가능한 모든 예외를 잡기 <br>4.8 구식과 신식 예외 처리 스타일 <br>4.9 스택 추적 <br><br>5장 고급 순차 프로그래밍 <br>5.1 BIF <br>5.2 바이너리 <br>5.3 비트 구문 <br>5.4 나머지 짧은 주제들<br><br>6장 프로그램 컴파일하고 실행하기 <br>6.1 얼랭 셸 시작하고 중지하기 <br>6.2 개발 환경 수정하기 <br>6.3 프로그램을 실행하는 다른 방법들 <br>6.4 Makefile로 컴파일 자동화하기 <br>6.5 얼랭 셸에서 명령 편집하기 <br>6.6 고민거리 떨쳐버리기 <br>6.7 뭔가 잘못되었을 때 <br>6.8 도움 받기 <br>6.9 환경 개조하기 <br>6.10 크래시 덤프(Crash Dump) <br><br>7장 병행성(Concurrency) <br><br>8장 병행 프로그래밍 <br>8.1 병행성 프리미티브 <br>8.2 간단한 예제 <br>8.3 클라이언트-서버 개론 <br>8.4 프로세스를 생성하는 데 걸리는 시간은? <br>8.5 타임아웃이 있는 receive <br>8.6 선택적 수신(Selective Receive) <br>8.7 등록된 프로세스 <br>8.8 병행 프로그램을 작성하는 법 <br>8.9 꼬리 재귀에 관한 한마디 <br>8.10 MFA로 띄우기 <br>8.11 과제 <br><br>9장 병행 프로그램과 오류 <br>9.1 프로세스 연결하기 <br>9.2 on_exit 핸들러 <br>9.3 오류의 원격 처리 <br>9.4 오류 처리 상세 <br>9.5 오류 처리 기본명령 <br>9.6 연결된 프로세스 집합 <br>9.7 모니터 <br>9.8 계속 살아 있는 프로세스 <br><br>10장 분산 프로그래밍 <br>10.1 이름 서버 <br>10.2 분산 프리미티브 <br>10.3 분산 프로그래밍용 라이브러리 <br>10.4 쿠키 보호 시스템 <br>10.5 소켓-기반 분산 <br><br>11장 IRC Lite <br>11.1 메시지 시퀀스 다이어그램 <br>11.2 사용자 인터페이스 <br>11.3 클라이언트 측 소프트웨어 <br>11.4 서버 측 소프트웨어 <br>11.5 애플리케이션 실행하기 <br>11.6 채팅 프로그램 소스코드 <br>11.7 연습 <br><br>12장 인터페이스 기법 <br>12.1 포트 <br>12.2 외부 C 프로그램과 인터페이스하기 <br>12.3 open_port <br>12.4 링크인 드라이버 <br>12.5 노트 <br><br>13장 파일 프로그래밍 <br>13.1 라이브러리의 구성 <br>13.2 파일을 읽는 여러 방법 <br>13.3 파일에 쓰는 여러 방법 <br>13.4 디렉터리 조작 <br>13.5 파일에 관한 정보 찾기 <br>13.6 파일 복사하고 지우기 <br>13.7 잡동사니 <br>13.8 Find 유틸리티 <br><br>14장 소켓 프로그래밍 <br>14.1 TCP 사용하기 <br>14.2 제어 이슈 <br>14.3 그 접속은 어디서부터 왔는가? <br>14.4 소켓과 오류 처리 <br>14.5 UDP <br>14.6 여러 머신으로 동보하기 <br>14.7 SHOUTcast 서버 <br>14.8 더 깊이 들어가기<br><br>15장 ETS와 DETS: 대량 데이터 저장소 메커니즘 <br>15.1 테이블에 대한 기본 조작 <br>15.2 테이블의 유형 <br>15.3 ETS 테이블 효율성 고려 사항 <br>15.4 ETS 테이블 생성하기 <br>15.5 ETS 예제 프로그램 <br>15.6 DETS <br>15.7 아직도 못 다한 말? <br>15.8 코드 내역 <br><br>16장 OTP 개론 <br>16.1 제네릭 서버로 가는 길 <br>16.2 gen_server 시작하기 <br>16.3 gen_server의 콜백 구조 <br>16.4 코드와 템플릿 <br>16.5 더 들어가기 <br><br>17장 Mnesia: 얼랭 데이터베이스 <br>17.1 데이터베이스 질의 <br>17.2 데이터베이스에 데이터 추가하고 제거하기 <br>17.3 Mnesia 트랜잭션 <br>17.4 테이블에 복잡한 데이터 저장하기 <br>17.5 테이블의 유형과 위치 <br>17.6 초기 데이터베이스 생성하기 <br>17.7 테이블 뷰어 <br>17.8 더 들어가기 <br>17.9 코드 내역 <br><br>18장 OTP로 시스템 구축하기 <br>18.1 범용 이벤트 핸들링 <br>18.2 오류 로거 <br>18.3 알람 관리 <br>18.4 애플리케이션 서버 <br>18.5 슈퍼비전 트리 <br>18.6 시스템 시작하기 <br>18.7 애플리케이션 <br>18.8 파일 시스템 구성 <br>18.9 애플리케이션 모니터 <br>18.10 더 들어가기 <br>18.11 도대체 그 소수는 어떻게 만들었을까? <br><br>19장 멀티코어 서곡 <br><br>20장 멀티코어 CPU 프로그래밍 <br>20.1 멀티코어 CPU에서 효율적으로 실행되는 프로그램을 만들기 <br>20.2 순차 코드 병렬화시키기 <br>20.3 메시지는 작게, 계산은 크게 <br>20.4 mapreduce와 디스크 색인하기 <br>20.5 미래로 성장하기 <br><br>부록 A 프로그램 문서화(Documentation) <br>A.1 얼랭 형 표기법 <br>A.2 형을 사용하는 도구들<br><br>부록 B 마이크로소프트 윈도와 얼랭 <br>B.1 얼랭 <br>B.2 MinGW 내려 받아 설치 <br>B.3 MSYS 내려 받아 설치 <br>B.4 MSYS 개발자 툴킷 설치(선택) <br>B.5 이맥스(Emacs) <br><br>부록 C 자원(Resources) <br><br>부록 D 소켓 애플리케이션 <br><br>부록 E 나머지 잡다한 것들 <br><br>부록 F 모듈과 함수 레퍼런스 <p>[강컴닷컴 제공] </p></td></tr></tbody></table>			 ]]> 
		</description>
		<category>┣느낌표</category>

		<comments>http://nolja.egloos.com/1872558#comments</comments>
		<pubDate>Tue, 17 Feb 2009 02:43:26 GMT</pubDate>
		<dc:creator>까망물꼬기</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Struts, Tiles ]]> </title>
		<link>http://nolja.egloos.com/1856675</link>
		<guid>http://nolja.egloos.com/1856675</guid>
		<description>
			<![CDATA[ 
  Conceptual Model<br>- Struts<br>- Tiles- SiteMash<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - Struts-tiles<br>- JSF			 ]]> 
		</description>
		<category>┣느낌표</category>

		<comments>http://nolja.egloos.com/1856675#comments</comments>
		<pubDate>Mon, 05 Jan 2009 08:35:40 GMT</pubDate>
		<dc:creator>까망물꼬기</dc:creator>
	</item>
	<item>
		<title><![CDATA[ YopMail ]]> </title>
		<link>http://nolja.egloos.com/1846757</link>
		<guid>http://nolja.egloos.com/1846757</guid>
		<description>
			<![CDATA[ 
  <p>잠깐사용하고 말거라면 <a href="http://www.yopmail.com/en/">Yopmail</a>을 사용하는게 좋겠군요<br>YopMail<br><br>웹서핑을 하다가 이메일을 입력해야 할 경우 사용하면 좋을 듯 합니다.<br></p>			 ]]> 
		</description>
		<category>┣따옴표</category>

		<comments>http://nolja.egloos.com/1846757#comments</comments>
		<pubDate>Wed, 10 Dec 2008 23:44:28 GMT</pubDate>
		<dc:creator>까망물꼬기</dc:creator>
	</item>
	<item>
		<title><![CDATA[ JSF Controller ]]> </title>
		<link>http://nolja.egloos.com/1845518</link>
		<guid>http://nolja.egloos.com/1845518</guid>
		<description>
			<![CDATA[ 
  &lt;!-- Faces Servlet --&gt; <br>&lt;servlet&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;javax.faces.webapp.FacesServlet &lt;/servlet-class&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; <br>&lt;/servlet&gt; <br>&lt;servlet-mapping&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Faces Servlet&lt;/servlet-name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.jsf&lt;/url-pattern&gt; <br>&lt;/servlet-mapping&gt;<br><br><strong><span style="FONT-SIZE: 130%">View<br></span></strong><br>&lt;%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %&gt;<br>&lt;%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %&gt;<br><br><strong><span style="FONT-SIZE: 130%">faces-config.xml</span></strong><br>&lt;?xml version="1.0"?&gt;<br>&nbsp;&nbsp; &lt;!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd"&gt; <br>&lt;faces-config&gt; <br>&nbsp;&nbsp; &lt;managed-bean&gt; &lt;/managed-bean&gt; <br>&nbsp;&nbsp; &lt;navigation-rule&gt; &lt;/navigation-rule&gt; <br>&nbsp;&nbsp; &lt;application&gt; &lt;/application&gt;<br>&nbsp;&nbsp; ... Etc ... <br>&lt;/faces-config&gt;<br><br><strong><blockquote><strong>1) navigation-rule 설정</strong></blockquote></strong><br>&lt;navigation-rule&gt; <br>&nbsp;&nbsp; &lt;from-view-id&gt;/pages/ex_set_no_cache.jsp&lt;/from-view-id&gt; <br>&nbsp;&nbsp; &lt;navigation-case&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;from-outcome&gt;ex_cache_result&lt;/from-outcome&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;to-view-id&gt;/pages/ex_cache_result.jsp&lt;/to-view-id&gt; <br>&nbsp;&nbsp; &lt;/navigation-case&gt; <br>&lt;/navigation-rule&gt;<br><br><strong>2) managed-bean 설정</strong><br>&lt;managed-bean&gt; <br>&nbsp;&nbsp; &lt;managed-bean-name&gt;orderMgmtBean&lt;/managed-bean-name&gt; <br>&nbsp;&nbsp; &lt;managed-bean-class&gt;com.skcc.pilot.order.bean.OrderMgmtBean&lt;/managed-bean-class&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;managed-property&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property-name&gt;productMgmtBean&lt;/property-name&gt;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;#{productMgmtBean}&lt;/value&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/managed-property&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-property&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property-name&gt;serviceMgmtBean&lt;/property-name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;#{serviceMgmtBean}&lt;/value&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/managed-property&gt; <br>&nbsp;&nbsp;&nbsp; &lt;/managed-bean&gt; <br>&nbsp;&nbsp;&nbsp; &lt;managed-bean&gt;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;managed-bean-name&gt;productMgmtBean&lt;/managed-bean-name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-class&gt;com.skcc.pilot.order.bean.ProductMgmtBean&lt;/managed-bean-class&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp; &lt;/managed-bean&gt;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;managed-bean&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-name&gt;serviceMgmtBean&lt;/managed-bean-name&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-class&gt;com.skcc.pilot.order.bean.ServiceMgmtBean&lt;/managed-bean-class&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/managed-bean&gt;			 ]]> 
		</description>
		<category>┣지식정리</category>

		<comments>http://nolja.egloos.com/1845518#comments</comments>
		<pubDate>Mon, 08 Dec 2008 05:22:43 GMT</pubDate>
		<dc:creator>까망물꼬기</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 아이의 찡그린 얼굴도 찍어보자 ]]> </title>
		<link>http://nolja.egloos.com/793576</link>
		<guid>http://nolja.egloos.com/793576</guid>
		<description>
			<![CDATA[ 
  <p><strong>웃는 얼굴만 예쁜가요 ? </strong></p><br><p>아이의 사진이라고 꼭 웃는 얼굴만 찍으란 법은 없습니다 . 찡그린 얼굴 , 화난 얼굴 , 놀란 얼굴 등등 모두모두 멋진 사진이 될 수 있습니다 . 다양한 포즈로 찍는 것도 좋지만 , 똑같은 방향에서 비슷한 크기로 찍은 사진도 좋습니다 . </p><br><p></p><br><p><strong>아이의 얼굴은 한쪽으로 치우치게 찍자 ! </strong></p><br><p>사진 가운데에 아이의 얼굴을 두면 , 촌스러운 사진이 되기 쉽습니다 . 그러므로 아이의 얼굴을 왼쪽이나 오른쪽으로 치우치게 촬영하는 것이 좋습니다 . 예를 들어 , 아이가 오른쪽을 보고 있다면 , 오른쪽 공간에 여백을 두고 찍는 것이 좋답니다 . </p><br><p>&nbsp;</p><p><strong>&lt;Zoom In&gt; 경제적인 우리 아이 앨범 제작법 </strong></p><br><p>디지털 카메라의 메모리야 닳아서 없어지는 것이 아니므로 상관없습니다 . 하지만 이렇게 무작정 사진을 찍다 보면 , 어떤 사진을 인화해야 할지 막막해집니다 . 한꺼번에 수십 장 인화하려니 돈이 많이 들 것 같고 , 뽑지 않고 그냥 저장해 두자니 서운하죠 . 사진 크기에 상관없이 예쁜 아이의 모습을 인화하는 것이 목적이라면 , 다음과 같이 해 보세요 . </p><p><strong>여러 장의 사진을 붙여서 인화하자 </strong></p><br><p>인화 전문 사이트에서 3 × 5 사이즈 이하로 인화가 안 된다면 , 그래픽 프로그램을 이용하여 원하는 크기의 작업 화면에 여러 장의 사진을 붙여 보세요 . 이 때 사진의 화질을 위해 이미지 크기는 줄이지 않도록 합니다 . 포토샵을 이용해 여러 장의 사진을 하나의 용지에 붙이는 방법은 ##쪽을 참조하세요 . </p><br><p></p><br><p><strong>명함 크기로 인화하자 </strong></p><p>아이의 사진을 명함 크기로 인화하여 명함첩을 앨범으로 사용해 보세요 . 비용도 아끼고 , 앨범도 보기 편해 일석이조의 효과를 볼 수 있습니다 . </p><p><br>&nbsp;</p><p><strong>스튜디오 사진 필요 없어 ! </strong></p><br><p>&nbsp;요즘은 아이들 전문 스튜디오가 많이 생겨나고 있습니다 . 아이들의 모습을 담은 예쁜 앨범을 만들어 주고 싶은 마음에서 이용하는 젊은 부모가 늘어나기 때문이죠 . 하지만 항상 스튜디오를 이용할 수는 없습니다 . 자 ! 이제 큰 맘 먹고 구입한 카메라를 제대로 활용해 봅시다 . 집안을 스튜디오로 꾸미고 아이의 모습을 찍어 보세요 . </p><br><p></p><br><p><strong>아이의 주위에 소품을 추가하자 </strong></p><br><p>아이의 주위에 소품을 추가하면 , 아기자기한 사진을 만들 수 있습니다 . 쿠션 , 인형 , 풍선 등을 이용하면 , 분위기도 살아나고 아이도 즐거워합니다 . 소품을 추가하고 배경만 조금 신경 쓴다면 , 굳이 스튜디오를 찾지 않아도 됩니다 . <br></p><p><strong>배경은 단색 계열로 ! </strong></p><br><p>아이 사진의 배경은 가능한 단색 계열이 좋습니다 . 기왕이면 아이의 천진함과 받쳐줄 수 있는 화사한 원색 계열이 좋겠지요 . 배경이 될만한 것이 없다면 , 이불이나 보자기 등을 벽면에 고정시키고 촬영해도 됩니다 . 공간이 넓을수록 다양하게 연출할 수 있지만 , 상황에 맞게 찍으면 됩니다 . 이 때 플래시를 터뜨리면 , 배경에 그림자가 생기므로 최대한 자연광을 이용하세요 . 경제적인 여유가 있어 반사판을 사용한다면 , 얼굴에 그늘이 없는 밝고 선명한 사진을 얻을 수 있습니다 . </p><br><p>&nbsp;</p><br><p><strong>&lt;주의&gt; 아기에게 플래시 사용은 절대 금물 ! </strong></p><br><p>갓 태어난 아기의 사진을 찍을 때 플래시를 터뜨리지 마세요 . 아기의 눈은 아주 약하기 때문에 플래시 불빛이 눈에 닿으면 , 시력이 나빠질 수도 있습니다 . 플래시를 사용하더라도 바운스 촬영을 하거나 플래시 상태를 아주 약하게 설정해서 촬영해야 합니다 . 촬영 전에 플래시 발광이 금지된 상태인지 꼭 확인하세요 . </p><br><br>			 ]]> 
		</description>
		<category>┣느낌표</category>

		<comments>http://nolja.egloos.com/793576#comments</comments>
		<pubDate>Thu, 04 Dec 2008 07:46:00 GMT</pubDate>
		<dc:creator>까망물꼬기</dc:creator>
	</item>
	<item>
		<title><![CDATA[ N/W 부하 ]]> </title>
		<link>http://nolja.egloos.com/1844132</link>
		<guid>http://nolja.egloos.com/1844132</guid>
		<description>
			<![CDATA[ 
  <strong>용어</strong><br>* N/W bandwidth<br><br><strong>산술적계산<br></strong>* 10 Mbps N/W의 경우 실제 전송속도는 대략 6Mbps 가 나오며<br>* 6Mbps = 6*1024(Kbps) = 6*1024/8 (KB/sec) = 768(KB/sec)이고<br>* 10KB 를 보낼 때, <br>768(KB/sec) / 10(KB) = 76.8, 즉 1초당전송건수인 TPS(Transaction Per Second)는 77 이상을 낼 수 없습니다. <br>* N/W 라인이 100Mbps 의 경우 실제 전송속도는 60 Mbps 정도가 나오는 것이 일반적이며<br>앞서 10 Mbps 의 10배 정도의 TPS 향상이 있게 됩니다.(같은 100Mbps급 허브도 종류에<br>따라 기껏 20Mbps밖에 나오지 않는 경우도 있습니다)<br>(NOTE: T1:1.544Mbps,E1:2.048Mbps,T3:43.7361Mbps,OC3:155.2Mbps)<br><br>[출처] <a href="http://www.javaservice.net/~java/bbs/read.cgi?m=resource&amp;b=consult&amp;c=r_p&amp;n=1008701211">http://www.javaservice.net/</a><br /><br /><span style="BACKGROUND-COLOR: #dcdcdc">java.util.Vector v = ......<br>java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();<br>java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(bos);<br>oos.writeObject(v);<br>oos.flush();<br>bos.close();<br>byte[] bytes = bos.toByteArray();<br>System.out.println("byte[] size of v : " + bytes.length);<br></span><br>Vector 와 같은 Object 를 직접 넘기는 경우는 실제 데이타 부분 이외에 추가적인 binary 데이타가 전송되기 때문에 다소 더 오래 걸리는 듯 하나, 이를 StringBuffer 로 보내고 다시 쪼개는 방법의 번거로움에 비하면 그 차이는 크기 않습니다.<br>Object[] 로 넘기나, Vector 로 넘기나, StringBuffer 로 넘기나, 혹은 byte[]로 넘기나 대량 데이타의 경우는 약간의 차이밖에 나지 않습니다.<br>즉, Vector 를 넘길 때, 기본적으로 Serializable Object 이기 때문에 넘어가야할 일정한 추가적인 binary 데이타가 붙게 되는데, 만약, 실제 데이타의 크기가 작다면 이는 performance 에 큰 차이를 보이지만, 반면 실제 데이타의 사이즈가 무지 크다면, 추가적으로 달라 붙는 데이타는 그에 비해 새발의 피인 것이지요.<br><br>어플리케이션 관점에서 주의할 사항은 예를 들어 10MB 의 크기의 데이타를 전송할 때, 특정 Tier 에서 10MB의 데이타를 전부 메모리에 일시적으로 올려두는 우를 범하면 안된다는 것이지요. 동시사용자에 비례해서 순간적으로 그만큼의 메모리 점유가 일어나기 때문입니다. 이 경우는 4k 씩 혹은 일정량씩 주고받고/주고받는 방법을 택해야만이 효율적인 메모리관리가 됩니다.<br>예를 들면, SmartUpload 의 경우처럼, upload 하는 파일의 크기만큼을 몽땅 메모리에 일시적으로 저장하는 경우가 그러하고, FTP 와 유사한 프로그램을 작성할 때, 파일을 몽땅 읽어들인 후에 전송하려는 경우가 그러합니다.<br><br>JDBC 프로그램의 경우에도, Entity 클래스나 DBWrapper(혹은 Data Access Object)를 통해 데이타베이스에서 수백건의 데이타를 rs.next()를 돌면서 Vector 에 모두 저장한 후 이를 return 하는 구조가 일반적으로 사용되고 있는데, 이는 소량 데이타의 경우에 적절한 방법일 뿐이며 대량 데이타 조회시에는 적절치 않습니다.<br>(인터넷기반시스템에서는 이런 경우가 잘 없겠지만) 수백 수천건의 데이타를 JDBC로 조회하여 Servlet 이나 JSP로 웹브라우져에 보여주는 경우, 만약 이를 DBWrapper(혹은 DAO)에서 while(rs.next()) 를 통해 전체를 Entity 클래스의 Vector 에 모두 담은 후<br>이를 Servlet 이나 JSP로 return 하고, 이를 다시 Enumeration&nbsp; hasMoreElements()를 통해 건건이 화면으로 보여준다고 생각해 보면, 순간적으로 많은 량의 메모리가 필요하게 되며, 동시사용자가 증가할 때 비효율적인 메모리 bottleneck 으로 이어지게<br>됩니다. 이처럼 대량 데이타의 경우는 오히려, JSP에서 곧바로 while(rs.next()) 를 돌면서 건건이 화면으로 출력되도록 하여 필요 메모리 량을 줄이는 것이 더욱 효과적입니다. (물론 필요로 하는 Database 연결 개수의 증가를 야기하게 되니 별도의 조치가<br>필요합니다)<br><br>C/S 시스템 튜닝을 여러번 해 보신 분들은, 대량 데이타 조회시 건건이 조회하지 않고 Buffer 를 이용하여 대량 데이타를 한번에 조회하여 한번에 File을 경유하거나 혹은 N/W으로 보냄으로써 단일 요청에 따른 응답시간 개선 효과를 경험하신 분들이 많으실<br>겁니다. 그러나, 한가지 간과하면 안될 사항이, 그 업무가 Batch성이냐 On-Line성이냐에 따라 상황이 달라 질 수 있다는 것입니다. On-Line 성의 경우, 단위 응답<br>시간도 중요한 부분이지만, 동시사용자 증가에 따른 TPS(Transaction Per Second, 초당처리건수)의 향상이 더욱 중요하다는 사실입니다. 단일 응답속도가 10초 걸리던 것을<br>Buffering 을 통해 5초로 단축시켰더라도, 동시에 10명,50명,100명이 접속했을 때, 응답속도가 10초,20초,30초,... 로 급격하게 느려질 수 있다는 것이지요. 반면 단일 응답속도가 여전히 10초가 걸리더라도 동시사용자가 10명,50명,100명이 접속하여도<br>여전히 10초,11초,12초 가 걸린다면 이 경우가 더욱 On-Line 성의 업무에 적합하며 성능이 높다할 것입니다.<br><br>(어쩌면 누군가는, "그러면 어느정도의 크키가 '대량데이타'인가요?" 라고 질문을 할지도 모르겠습니다. 정답은 없습니다. 너무나 다양한 경우의 수가 있기 때문에, 결국 해당 시점에서 CPU/MEM/NW 및 어플리케이션 특성을 고려하여 여러가지 테스트를 통해<br>스스로 판단하셔야 합니다. 50KB 라면 On-Line 시스템에서 '대량데이타'가 아닐까요??)<br><br>또, 어플리케이션서버 파라메터 관점에서는 어떤 특정 어플리케이션의 응답속도가 상대적으로 느리면서 특별히 CPU나 MEM를 점유하지 않는 특성을 가질 경우, 동시에 최대로 처리할 수 있는 수치를 상대적으로 높여 주어야 합니다.<br><br>EJB컨테이너를 이용하여 대량 데이타 전송이 결부된 어플리케이션이라면 충분한 N/W bandwidth 상태에서, "최대 EJB Object Pool크기"를 상대적으로 높여주어야 만이 동시에 여러개의 요청을 처리할 수 있게 되고, 그렇게 함으로써, 1초당 처리건수인<br>TPS 를 상대적으로 높일 수 있습니다.(물론 N/W bottlenect으로 나타나기 전 까지만 효과를 볼 수 있습니다.) <br>TPS 가 높다는 것은 단일 요청에 대한 응답시간이 빨라진다는 뜻이 아닙니다.<br>예를 들어 단일 요청시에 5초가 걸리는 서비스가 있다면, 동시에 대량 호출이 발생할 때 TPS가 낮다는 것은 응답시간이 10초,20초,30초 등과 같이 산술급수적으로 증가하는 현상으로 이어지는 반면, TPS가 높다는 것은 일정정도까지는 응답시간의 변화가 크지않고 유지되는 현상으로 나타납니다. 이러한 응답속도 및 TPS에 관련한 부분은 아래 글을 참고하십시요<br><br>[강좌]웹기반시스템하에서의 성능에 대한 이론적 고찰<br><a href="http://www.javaservice.net/~java/bbs/read.cgi?m=resource&amp;b=consult&amp;c=r_p&amp;n=1008701211">http://www.javaservice.net/~java/bbs/read.cgi?m=resource&amp;b=consult&amp;c=r_p&amp;n=1008701211</a><br><br>Performance Tuning QuickGuide for BenchmarkTest<br><a href="http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&amp;b=was&amp;c=r_p&amp;n=985764595">http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&amp;b=was&amp;c=r_p&amp;n=985764595</a><br><br>WebSphere BMT 최적 파라메터 셋팅 방법론<br><a href="http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&amp;b=was&amp;c=r_p&amp;n=989760940">http://www.javaservice.net/~java/bbs/read.cgi?m=appserver&amp;b=was&amp;c=r_p&amp;n=989760940</a><br>			 ]]> 
		</description>
		<category>┣물음표</category>

		<comments>http://nolja.egloos.com/1844132#comments</comments>
		<pubDate>Thu, 04 Dec 2008 06:18:45 GMT</pubDate>
		<dc:creator>까망물꼬기</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 중복체크 ]]> </title>
		<link>http://nolja.egloos.com/1784944</link>
		<guid>http://nolja.egloos.com/1784944</guid>
		<description>
			<![CDATA[ 
  <strong><span style="FONT-SIZE: 130%">ID 중복체크 프로시져</span></strong><br>- exists 로 존재여부 판단<br>&nbsp; * 아이디를 찾아서 넘겨줄 필요 없이 DB에서 존재여부만 판단<br><blockquote></blockquote>create proc prc_uidChk<br>&nbsp;@uid varchar(20)<br>as <br>&nbsp; if exists(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 존재여부를 판단<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select uid<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from tb_member<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where uid = @uid)<br>&nbsp;&nbsp;&nbsp;&nbsp;select 'X' as uid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 존재하면 X를 반환, as uid는 결과값의 컬럼명을 지정<br>&nbsp; else <br>&nbsp;&nbsp;&nbsp; select 'O' as uid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 존재하지 않으면 O를 반환<br><br>-- 실행문<br>exec prc_uidChk 'uid'<br><br><br><strong><span style="FONT-SIZE: 130%">로그인 체크 프로시져</span></strong><br>- exists로 존재여부 판단<br><blockquote>* 아이디와 비번을 DB에서 판단 존재여부 체크<br>* 보통 실행문<br><blockquote>select uid, upw<br>&nbsp;&nbsp;&nbsp;from tb_member<br>&nbsp; where uid = 'user01' and upw='1111'<br></blockquote><br>*&nbsp;프로시저</blockquote><blockquote><blockquote>create proc prc_MemberLoginChk<br>@uid varchar(20),<br>@upw varchar(20)<br>as<br>if exists(<br>&nbsp; select uid <br>&nbsp;&nbsp;&nbsp; from tb_member<br>&nbsp;&nbsp;where uid = @uid<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and upw = @upw )<br>&nbsp;&nbsp; select&nbsp; 'O'<br>else ( select 'X' )<br><br>-- 실행문<br>exec prc_MemberLoginChk 'user01', '1111'<br></blockquote></blockquote><p><br><br><strong><span style="FONT-SIZE: 130%">방명록 검색</span></strong><br>- 테이블명, 컬럼명 같은 객체형은 프로시저의 매개변수로 사용불가.<br>- declare 이용문장을 변수로 담는다.<br><br>create proc prc_GuestSrch<br>@field varchar(50),<br>@word varchar(50)<br>as <br>&nbsp; select *<br>&nbsp;&nbsp;&nbsp;&nbsp; from tb_guest<br>&nbsp;&nbsp; where @field like '%'+@word+'%'<br>go <br>&nbsp; Exec prc_GuestSrch 'gsubject', '오랜만'&nbsp;&nbsp;&nbsp; -- 실행오류발생<br><br>go <br>&nbsp; select *<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from tb_guest<br>go&nbsp;<br>&nbsp; drop proc prc_GuestSrch<br><br>- 해결방안<br>create proc prc_GuestSrch<br>@field varchar(50),<br>@word varchar(50)<br>as<br>declare @str varchar(255)<br>set @str = 'select * from tb_guest'<br>set @str = @str + 'where <a href="mailto:'+@field+'">'+@field+'</a> like ''%'+@word+'%'''<br>set @str = @str + 'order by reg_dt desc'<br><br>exec(@str)<br>go <br>Exec prc_GuestSrch 'gsubject', '오랜만'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 정상실행<br><br><strong><span style="FONT-SIZE: 130%"><br>공지사항 검색구현<br></span></strong>create proc prc_NoticeSrch<br>@field varchar(50)&nbsp;,@word varchar(50)<br>as</p><p>declare @str varchar(255)</p><p>&nbsp; set @str='select * from tb_notice '</p><p>&nbsp; set @str=@str + 'where <a href="mailto:'+@field+'">'+@field+'</a> like <a href="mailto:''%'+@word+'%'''">''%'+@word+'%'''</a></p><p>&nbsp; set @str=@str + 'order by reg_dt desc'</p><p>exec(@str)<br>go<br>&nbsp; Exec prc_NoticeSrch 'nsubject', '테'&nbsp;&nbsp; --정상실행<br><br><strong><span style="FONT-SIZE: 130%">공지사항 다중검색 구현 (글제목 + 글내용)</span></strong><br>--다중검색(or)</p><p>create proc prc_NoticeSrch2</p><p>&nbsp;@s_field varchar(50)</p><p>&nbsp;,@c_field varchar(50)</p><p>&nbsp;,@word varchar(50)</p><p>as</p><p>&nbsp;declare @str varchar(255)</p><p>&nbsp;set @str='select * from tb_notice '</p><p>&nbsp;set @str=@str + 'where <a href="mailto:'+@s_field+'">'+@s_field+'</a> like <a href="mailto:''%'+@word+'%''">''%'+@word+'%''</a> '</p><p>&nbsp;set @str=@str + 'or ' <a href="mailto:+@c_field+'">+@c_field+'</a> like <a href="mailto:''%'+@word+'%''">''%'+@word+'%''</a> '</p><p>&nbsp;set @str=@str + 'order by nregdt desc'</p><p>&nbsp;exec(@str)</p><p>go</p><p>Exec sp_NoticeSrch2 'nsubject','ncontent','ㅎ'&nbsp; --정상실행<br><br><br><strong><span style="FONT-SIZE: 130%">공지사항 단일검색 + 다중검색 구현 (글제목, 글내용, 글제목+글내용)</span></strong></p><p>-- if 문으로 조건</p><p>create proc sp_NoticeSrch<br>@field varchar(50) </p><p>, @word varchar(50) </p><p>as </p><p>declare @str varchar(255)</p><p>if @field = 'nsubject'</p><p>&nbsp;&nbsp; set @str ='쿼리문'</p><p>else if @field = 'ncontent'</p><p>&nbsp;&nbsp; set @str ='쿼리문'&nbsp; </p><p>else </p><p>&nbsp;&nbsp; set @str ='쿼리문' <br><br><strong><span style="FONT-SIZE: 130%">Stored Procedure 저장프로시저</span></strong><br></p><p>프로시저 = 메서드 = 인스턴스 = 함수 = function 같은개념<br>1, 방명록 리스트</p><p>create proc sp_GuestSelect</p><p>as</p><p>&nbsp;select *</p><p>&nbsp;from tb_guest</p><p>&nbsp;order by gregdt desc</p><p>go</p><p>exec sp_GuestSelect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 프로시져실행 : exec 생략가능<br><br>2, 공지사항 리스트<br>create proc sp_NoticeSelect</p><p>as</p><p>&nbsp;select *</p><p>&nbsp;from tb_notice</p><p>&nbsp;order by nregdt desc<br>go</p><p>exec sp_NoticeSelect&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 프로시져실행<br><br><strong><span style="FONT-SIZE: 130%">글쓰기 구현</span></strong></p><p>매개변수를 이용한 저장프로시져<br>1,방명록 글쓰기<br>insert into tb_guest(gsubject) value('매개변수')</p><p>go </p><p>create proc sp_GuestWrite</p><p>&nbsp;@str varchar(255)</p><p>as</p><p>&nbsp;insert into tb_guest(gsubject)</p><p>&nbsp; values(@str)<br>&nbsp; go</p><p>exec sp_GuestWrite '대한민국'&nbsp;&nbsp;&nbsp;&nbsp; -- 프로시져실행<br><br><strong><span style="FONT-SIZE: 130%">1,방명록 글쓰기</span></strong><br>insert into tb_guest(gsubject) value('매개변수')</p><p>go <br>create proc sp_GuestWrite</p><p>&nbsp;@str varchar(255)</p><p>as</p><p>&nbsp;insert into tb_guest(gsubject)</p><p>&nbsp;values(@str)<br>go</p><p>exec sp_GuestWrite '대한민국' --프로시져실행<br><br>2,공지사항 글쓰기<br>create proc sp_NoticeWrite</p><p>&nbsp;@str varchar(255),</p><p>&nbsp;@str1 text</p><p>as</p><p>&nbsp;insert into tb_notice(nsubject,ncontent)</p><p>&nbsp;values(@str,@str1)<br>go</p><p>exec sp_NoticeWrite '글제목','글내용' --프로시져실행</p><p>&nbsp;</p><p><span style="FONT-SIZE: 130%"><strong>3,회원가입</strong></span></p><p>sp_help tb_member</p><p>go</p><p>insert into tb_member(uid,upw,uname,jumin1,jumin2,zipcode,addr,phone,email) values('uid','upw','uname','jumin1','jumin2','zipcode','addr','phone','email')</p><p>go</p><p>create proc sp_MemberJoin</p><p>&nbsp;@uid&nbsp;&nbsp; varchar(20)</p><p>&nbsp;,@upw&nbsp;&nbsp; varchar(20)</p><p>&nbsp;,@uname varchar(10)</p><p>&nbsp;,@jumin1 char(6)</p><p>&nbsp;,@jumin2 char(7)</p><p>&nbsp;,@zipcode char(7)</p><p>&nbsp;,@addr&nbsp; varchar(255)</p><p>&nbsp;,@phone varchar(30)</p><p>&nbsp;,@email&nbsp; varchar(50)</p><p>as</p><p>&nbsp;insert into tb_member(uid,upw,uname,jumin1,jumin2,zipcode,addr,phone,email)</p><p>&nbsp;values(@uid,@upw,@uname,@jumin1,@jumin2,@zipcode,@addr,@phone,@email)<br>go</p><p>exec sp_MemberJoin 'uid','upw','uname','jumin1','jumin2','zipcode','addr','phone','email' --프로시져실행</p><p>go</p><p>select * from tb_member</p><p>&nbsp;</p><p>&nbsp;</p><p><strong><span style="FONT-SIZE: 130%">글보기 구현</span></strong></p><p>&nbsp;</p><p>1,공지사항 글보기</p><p>sp_help tb_notice</p><p>go</p><p>select * from tb_notice where notice_idx='idx'</p><p>go</p><p>create proc sp_NoticeView</p><p>&nbsp;@str varchar(255)</p><p>as</p><p>&nbsp;select * from tb_notice </p><p>&nbsp;where notice_idx = @str</p><p><br>&nbsp;go</p><p>exec sp_NoticeView 3 --프로시져실행<br><br></p>			 ]]> 
		</description>
		<category>┣물음표</category>

		<comments>http://nolja.egloos.com/1784944#comments</comments>
		<pubDate>Fri, 18 Jul 2008 05:09:53 GMT</pubDate>
		<dc:creator>까망물꼬기</dc:creator>
	</item>
</channel>
</rss>
