<?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://dagui.egloos.com</link>
	<description>기능 테스트 중인 이글루입니다. 내용은 아직 없습니다.</description>
	<language>ko</language>
	<pubDate>Tue, 20 Dec 2005 07:45:03 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>이디군만세이글루</title>
		<url>http://pds.egloos.com/logo/1/200410/03/89/b0036889.gif</url>
		<link>http://dagui.egloos.com</link>
		<width>80</width>
		<height>80</height>
		<description>기능 테스트 중인 이글루입니다. 내용은 아직 없습니다.</description>
	</image>
  	<item>
		<title><![CDATA[ 트랙백 테슷흐 ]]> </title>
		<link>http://dagui.egloos.com/2040786</link>
		<guid>http://dagui.egloos.com/2040786</guid>
		<description>
			<![CDATA[ 
  <p>바로 이것이 진정한 테스트!!</p><br /><br />			 ]]> 
		</description>
		<category>+귀차니스트 이디군</category>

		<comments>http://dagui.egloos.com/2040786#comments</comments>
		<pubDate>Tue, 20 Dec 2005 07:45:03 GMT</pubDate>
		<dc:creator>이디군</dc:creator>
	</item>
	<item>
		<title><![CDATA[ [TIP/PHP] 나만의 규칙: include(), require(), include_once(), require_once() ]]> </title>
		<link>http://dagui.egloos.com/388166</link>
		<guid>http://dagui.egloos.com/388166</guid>
		<description>
			<![CDATA[ 
  http://www.phpschool.com/bbs2/inc_view.html?id=11156&code=tnt2<br />
<br />
========================================<br />
<br />
밑에서 include(), require(), include_once(), require_once() 등에 대한 논의가 <br />
활발하게 벌어지고 있더군요..<br />
<br />
제가 몇년간 php로 작업하면서 세운 나름대로의 규칙을 이야기하려고 합니다.<br />
혹 괜찮은 아이디라고 생각하시면 참고하시고, 아니라고 생각하시면 사정없이 까주십쇼.<br />
<br />
1. 'include 되는 파일' 의 구분<br />
<br />
include 되는 파일은 기본적으로 2가지로 구분할 수 있습니다.<br />
<br />
include&nbsp;&nbsp;파일 자체를 하나의 함수처럼 만들어서 사용하는 경우가 있는데..<br />
그다지 좋지 않은 방법입니다. include 파일 자체도 독자적으로 실행될 가능성이 얼마든지 존재하기 때문입니다. 그래서 HTML 출력용 include 와 로직 정의용 include를 분리하는거죠..<br />
<br />
1) UI 컴포넌트<br />
<br />
UI 출력을 단순화하거나 쉽게 관리하기 위한 것입니다.<br />
기본적으로 HTML 코드의 구조화 또는 재활용을 위한 것입니다.<br />
<br />
UI를 출력하는 과정에서 (a)전체 페이지의 HTML 코드가 너무 길어진다던가(관리하기 힘들어질정도로) (b)여러 페이지에서 사용되는경우, (c)하나의 위치에 경우에 따라 다양한 컴포넌트가 배치되어야 할 경우<br />
<br />
(a)의 경우는 별도로 말 안해도 이해하실 거구요<br />
(b)의 경우는 네비게이션 메뉴라던가 달력이라던가 등등<br />
(c)의 경우는 예를 들면 탐색기의 큰 아이콘, 간단히, 자세히 보기 같은 경우죠<br />
<br />
- 규칙1: HTML 출력에 관련된 코드만을 담는다.<br />
<br />
DB 접근이나 프로그램 로직에 관련된 코드는 절대 담아서는 안됩니다.<br />
변수의 출력 형태를 변환한다거나 (날자-시간 출력형식, 소수점 출력 형식 등등)<br />
if - else 에 의해 출력을 조절하는 정도 이상의 코드가 들어가지 않도록 합니다.<br />
<br />
- 규칙2: include()를 호출하는 페이지와 같은 디렉토리에 위치 시키거나, 호출하는 페이지를 기준으로 최대한 가깝게 저장될 위치를 설계한다.<br />
<br />
보통 UI 컴포넌트에 해당되는 파일은 전체 사이트의 아주 일부분의 <br />
응용프로그램에서만 사용되는 경우가 많습니다.<br />
또한 이런 경우 대부분 디렉토리가 나름대로의 체계에 따라 구분되어있을 것입니다.<br />
그 체계에 따라 위치를 정하는 것이 여러모로 좋습니다.<br />
(미리 말씀드리자면 이 규칙은 상대경로로 접근을 쉽게하기 위해서 입니다.)<br />
<br />
2) 라이브러리 or 응용프로그램 모듈<br />
<br />
자주 사용되는 유틸리티 함수들이나 시스템 전반의 변수, 상수 설정 등등.. <br />
<br />
저는 '라이브러리' 또는 '응용프로그램 모듈' 등으로 부릅니다. (이름이 좀 궁색합니다.)<br />
라이브러리는 자주 사용되는 기능을 표준화 하여 정의해 놓은 함수/클래스의 집합이구요<br />
응용프로그램 모듈은 특정 응용프로그램에서 UI 출력을 제외하고 처리로직만 분리해 놓은 것입니다.<br />
<br />
- 규칙1: 전역 변수 선언 및 값 지정(상수같이 사용하는 전역변수들..), 함수/클래스 정의 이외의 코드는 포함하지 않는다.<br />
<br />
이것은 어떤 악의적인 사용자가 라이브러리 파일의 이름을 알아내고 브라우저로 호출할 경우에도 아무동작도 수행되지 않게 하기 위한 것입니다. 그냥 변수좀 설정되고 함수좀 정의되고나서 페이지 처리가 끝나겠죠.<br />
<br />
실제로 코드가 실행되기 위해서는 사용자 페이지에서 해당 함수를 호출해 줘야 합니다.<br />
물론 호출되기 전에 전달인자등의 적합성을 검사하게 되겠죠.<br />
<br />
- 규칙2: HTML 출력에 관련된 코드는 절대 포함하지 않는다.<br />
<br />
모든 함수는 특정 자료구조를 입력으로 받아 특정 자료구조를 리턴하는 형태로 되어야 합니다.<br />
리턴된 자료구조를 HTML 등의 형태로 변환하여 출력하는 것은 include 를 호출한 해당 페이지가 알아서 하도록 하는 것입니다.<br />
<br />
이것은 프리젠테이션 과 비즈니스로직을 분리한다는 개념으로 받아들이시면 될거 같습니다.<br />
<br />
응용프로그램 모듈을 이런식으로 출력과 아무 상관없도록 만들어 놓으면 cron 에 등록할 배치작업 등등에서도 손쉽게 불러다가 사용할 수 있습니다.<br />
<br />
- 규칙3: 한군데다가 다 몰아서 저장한다.<br />
<br />
라이브러리 파일이 저장될 위치를 한군데로 통일하고, 디렉토리 구분이 필요하면 그 밑에 디렉토리를 만들어 구분합니다.<br />
<br />
저는 편의상 이런 디렉토리를 lib 라고 짓습니다. 대충 다음과 같은 형태가 됩니다.<br />
<br />
<div class="code">/home/somesite.com<br />
+&nbsp;&nbsp;&nbsp;&nbsp; bin/&nbsp;&nbsp;&nbsp;&nbsp;-- 각종 실행파일 (배치처리용 스크립트등)<br />
+&nbsp;&nbsp;&nbsp;&nbsp; conf/&nbsp;&nbsp;-- 각종 설정파일(apache vhost 설정 등)<br />
+&nbsp;&nbsp;&nbsp;&nbsp; log/&nbsp;&nbsp;&nbsp;&nbsp; -- 각종 로그파일<br />
+&nbsp;&nbsp;&nbsp;&nbsp; lib/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 라이브러리 파일<br />
+&nbsp;&nbsp;&nbsp;&nbsp; public_html/&nbsp;&nbsp;-- 웹서버 (가상호스트) ROOT<br />
</div><br />
<br />
(미리 말씀드리자면 이 규칙은 include_path를 쉽게 사용하기 위해서 입니다.)<br />
<br />
include 되는 파일의 구분은 이렇게 딱 두가지 입니다.<br />
간단하죠? 더 복잡하게 구분해 봤자 별 이득이 없었습니다.<br />
<br />
2. 파일 작성 규칙<br />
<br />
1) 모든 include 되는 파일은 '_' 로 시작하고 '.php' 로 끝난다.<br />
<br />
'_' 로 시작하는 파일은 독자적으로 동작하는 것이 아니라 다른 파일에 의해서 사용되는 파일이란 의미입니다. (제가 나름대로 붙인 의미입니다.)<br />
<br />
여기서 독자적으로 동작한다는 것은 웹브라우저에 의해 호출된다는 의미입니다.<br />
javascript&nbsp;&nbsp;파일등 HTML에 의존적이지만 이것들은 브라우저에 의해 호출되어져야 합니다.<br />
따라서 javascript 파일은 '_'로 시작되어서는 안됩니다.<br />
<br />
웹서버 설정에서 '_'로 시작하는 파일은 요청할수 없도록 규칙을 설정해 버릴수도 있습니다.<br />
앞서 이야기한 악의적인 사용자들의 장난을 무력화하기 위해서죠. (그렇게 까지 안해도 상관없기는 합니다만..)<br />
<br />
2) 라이브러리에서 정의되는 함수는 해당라이브러리 이름을 prefix로 붙인다.<br />
<br />
예를들어 GetCommentList() 라는 함수가 _MediaComment.php 라는 라이브러리에 있다면<br />
실제 함수의 이름은 MediaComment_GetCommentList() 가 되어야합니다.<br />
이렇게 규칙을 지켜주면 require_once()와 함께 사용할 경우 함수명 중복의 문제를 피해 갈 수 있습니다.<br />
<br />
3) 라이브러리에서 전역변수를 설정할 경우 반드시 global 선언을 한다.<br />
<br />
이것은 함수에서 라이브러리를 로드할 경우에도 정확하게 동작하도록 하기 위한 것입니다.<br />
<br />
<div class="code">&lt;?<br />
// _Some.php<br />
global $SOME_ROOT;<br />
$SOME_ROOT = '/some/root&quot;;<br />
<br />
function Some_DoSome() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;global $SOME_ROOT;<br />
&nbsp;&nbsp;&nbsp;&nbsp;print $SOME_ROOT;<br />
}<br />
?&gt;<br />
<br />
&lt;?<br />
// _UseSome.php<br />
function UseSome_DoSome()<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;require_once &quot;_Some.php&quot;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Some_DoSome();<br />
}<br />
?&gt;<br />
</div><br />
<br />
_Some.php 에서 $SOME_ROOT 전역변수를 global 선언을 안할경우 <br />
_Some.php 가 함수내에서 호출된 경우 $SOME_ROOT 는 호출한 함수의 지역변수가 되어버립니다.<br />
<br />
3. 호출 규칙<br />
<br />
1) UI 컴포넌트<br />
<br />
- 규칙1: 반드시 include()를 사용하며 상대경로를 사용한다.<br />
<br />
<div class="code">if ($view_mode == VMODE_DETAIL) { include &quot;_inc_view_detail.php&quot;; }<br />
elseif ($view_mode == VMODE_SIMPLE) { include &quot;_inc_view_simple.php&quot;; }<br />
</div><br />
<br />
또는<br />
<br />
<div class="code">if ($media_type == MTYPE_WMT) { include &quot;player/_inc_player_wmt.php&quot;; }<br />
elseif ($media_type == MTYPE_REAL) { include &quot;player/_include_player_real.php&quot;; }<br />
</div><br />
<br />
아마 _inc_player_wmt.php 를 호출하는 파일은 십중팔구 player.php 아니면 player_main.php 따위의 파일일겁니다. player_main.php 는 _inc_player_wmt.php를 불러 사용하지만 역으로 의존적이라고 할수도 있습니다.<br />
player_main.php 의 위치가 옮겨지면 반드시 _inc_player_wmt.php 도 같이 옮겨져야 제대로 동작하는 거죠.<br />
그러니까 두 파일을 최대한 가까이 위치시켜서 관리에 편하게 하자는 겁니다.<br />
<br />
include()를 사용하는 이유는 치명적 오류를 발생시키지 않기 때문입니다.<br />
UI 출력상의 문제가 치명적 오류이어야 할 경우도 있을수도 있겠습니다만..<br />
극히 드물기 때문이죠..<br />
<br />
2) 라이브러리<br />
<br />
- 규칙1: 라이브러리 root 는 include_path 에 등록되어져야 한다. 그리고 라이브러리 root 에 대한 상대경로로 라이브러러 파일을 지정한다.<br />
<br />
이렇게 하는 이유는 /a.php 와 /path/to/a.php 에서 동일한 코드로 사용하게 하기 위해서입니다.<br />
<br />
어떤분이 반드시 상대경로로 써야한다고 했는데..<br />
상대경로에만 의지할 경우 <br />
a.php 에서는 require_once(&quot;lib/_Some.php&quot;) 가 될 것이고<br />
/path/to/a.php 에서는 require_once(&quot;../../lib/_Some.php&quot;) 가 될 것입니다.<br />
이렇게 되면 관리가 불가능한것은 아니지만 매우 성가시게 됩니다.<br />
<br />
만약 웹서버 설정에 권한이 없는 호스팅 환경이라면 다른 방법을 생각해야겠죠..<br />
<br />
- 규칙2: 라이브러리 root는 웹서버 root 의 바깥에 위치해야한다.<br />
<br />
include 되는 파일은 웹서버 root 바깥에 있어도 아무 상관없습니다.<br />
오히려 보안성이 높아지는 결과가...<br />
<br />
- 규칙3: 반드시 require_once()를 사용하며 다른 코드가 실행되기 전에 모두 위치시켜야한다.<br />
<br />
<div class="code">&lt;?<br />
require_once &quot;_BoardUtil.php&quot;;<br />
require_once &quot;DBLib/_DBLib.php&quot;;<br />
...<br />
?&gt;<br />
</div><br />
<br />
require_once()를 사용하는 이유는 해당 라이브러리를 사용할수 없을때 치명적 오류를 발생시키기 위해서입니다.<br />
라이브러리중 하나라도 제대로 로드되지 않은 상태에서 처리가 진행될 경우 전체 데이터의 무결성에 문제가 생길수도 있기 때문이죠.<br />
<br />
라이브러리 파일들은 HTML을 출력하거나 기타 처리코드를 포함하지 않기 때문에 페이지 최상단에서 require_once()되어도 다른 처리에 영향을 주지 않습니다.<br />
<br />
4. 아직 확실하게 정리되지 않은 문제<br />
<br />
라이브러리 간의 의존관계가 있는 경우,<br />
예를 들어 _A.php 가 _B.php 의 실행에 반드시 필요한 경우<br />
<br />
_B.php의 상단에 require_once &quot;_A.php&quot; 를 넣어줘야하느냐의 문제입니다.<br />
<br />
넣어줄 경우 최종 처리 페이지에서 _B.php 만 require_once()해도 문제없이 실행됩니다.<br />
그러나 전체적인 구조를 파악하는데 있어서 _A.php의 존재를 모르고 지나칠수도 있기 때문에 최종 페이지에는 require_once &quot;_A.php&quot; 도 같이 넣어주는 것이 바람직한것 같습니다.<br />
<br />
아직 저는 이 문제를 확실하게 결정하지 못했는데. 일단은 라이브러리에도 넣고 최종 페이지에도 넣고 있는중입니다. (좋은 의견 있으면 말씀들 해주십쇼.)<br />
<br />
이상입니다.<br />
<br /><br />			 ]]> 
		</description>
		<category>+웹프로그래머 이디군</category>

		<comments>http://dagui.egloos.com/388166#comments</comments>
		<pubDate>Sun, 03 Oct 2004 15:19:49 GMT</pubDate>
		<dc:creator>이디군</dc:creator>
	</item>
	<item>
		<title><![CDATA[ [TIP/PHP] 초간단암호화 tbase64 ]]> </title>
		<link>http://dagui.egloos.com/388084</link>
		<guid>http://dagui.egloos.com/388084</guid>
		<description>
			<![CDATA[ 
  역시 1년쯤 전에 PHP스쿨에 올려서 히트쳤던 TIP<br />
<br />
그간 한 짓들중 괜찮은 것들은 내용은 한곳에 다 모아놓으려고 합니다.<br />
<br />
http://www.phpschool.com/bbs2/inc_view.html?id=9939&code=tnt2<br />
<br />
=================================<br />
<br />
질문답변 게시판에 누가 원하시는것 같아 올립니다.<br />
<br />
간단하게 암호화(?) 하고 싶을 때 제가 쓰는 방법입니다.<br />
<br />
안전하다고 생각하고 믿고 쓰시면 안될것 같고.. <br />
사용자한테 모든 정보가 휭하니 보이는 것을 피하는 정도로만 쓰는 편이 좋을듯 합니다.<br />
<br />
2차대전당시 이니그마머신이라고 꽤 유명한 암호화 기계가 있었죠..<br />
영화 U-571에도 나오고 게임 코만도스2에도 나오는..<br />
<br />
그것은 타자기와 문자치환기가 결합된 형태였는데..<br />
ABCD 라고 치면 CGZE 같은 식으로 자동으로 변환되는 것이었습니다.<br />
<br />
A => C<br />
B => G<br />
<br />
같은 식으로 매핑시켜주는 톱니바퀴가 여러겹으로 있는 것이었습니다.<br />
<br />
A => C => Z => F => Q<br />
<br />
스물몇개였다고 하던가.. 암튼간에 톱니바퀴의 조합 순서를 바꿔주면 <br />
간단하게 암호화 키가 바뀌는 대충 그런 원리입니다.<br />
<br />
이것을 제대로 풀려면 원래 타이핑 할 때 쓴 톱니바퀴들의 순열을 알거나 <br />
꺼꾸로 모든 순열로 짜맞춰봐야 했는데..<br />
<br />
그당시의 기술로는 거의 불가능에 가까웠던 거죠.. <br />
아마도 지금은 컴퓨터가 많이 발전했으니.. 우스운 수준일겁니다.<br />
<br />
그 원리량 약간 비슷한 것입니다. 일단 모든 글자를 영문자로 바꾸기 위해서<br />
(영문자가 취급하기 쉽기 때문입니다. 별 의미는 없음) base64 인코딩을 합니다.<br />
<br />
그리고 base64의 64개의 문자를 섞어서 평문 글자셋과 암호문 글자셋의 <br />
1:1 매핑을 만들죠.. 이 매핑이 다르면 제대로 해독되지 않습니다.<br />
<br />
평문 문자셋은 고정시켜도 되니가 그냥 코드에 넣고..<br />
암호 문자셋은 생성시켜서 세션에 넣습니다. <br />
한 세션에서는 같은 키를 사용하도록 하는 거죠..<br />
<br />
평문 문자셋과 암호 문자셋은 각각의 문자열로 만들고 치환하는데는 strtr()함수를 씁니다.<br />
(strtr()함수가 없으면 참 짜증나는 작업이 되었을 걸로 생각됨.. 그래서 strtr()의 원조인<br />
tr 명령어를 기리기 위해서 tbase64라고 이름을 지었습니다.)<br />
<br />
평문 문자셋에서 원래 '+'와 '/'는 암호 문자셋에서 URL에서 특수한 의미를 가지기 때문에<br />
GET 방식으로 전달될 때를 생각해서 각각 '_' 와 '$' 로 교체했습니다.<br />
<br />
그리고 base64는 자리수가 안맞을 때 맨 끝에 패딩문자로 '=' 를 쓰는데.. 이것도<br />
URL을 고려해 '*'로 바꾸었습니다.<br />
<br />
반드시 세션이 필수입니다. 암호키를 쿠키에 저장할 수는 없는 노릇이니..<br />
아니면 고정값을 쓰던가..<br />
<br />
<div class="code">session_start();<br />
<br />
$BASE64_CHARS = '+/0123456789=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';<br />
function tbase64_getkey()<br />
{<br />
&nbsp; &nbsp; &nbsp; &nbsp;if ($_SESSION['TBASE64_KEY'] == '')<br />
&nbsp; &nbsp; &nbsp; &nbsp;{<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$array = array(<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;'_', '$', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '*',<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;);<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;shuffle($array);<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp;$_SESSION['TBASE64_KEY'] = join('', $array);<br />
&nbsp; &nbsp; &nbsp; &nbsp;}<br />
&nbsp; &nbsp; &nbsp; &nbsp;return $_SESSION['TBASE64_KEY'];<br />
}<br />
<br />
function tbase64_encode($str)<br />
{<br />
&nbsp; &nbsp; &nbsp; &nbsp;global $BASE64_CHARS;<br />
&nbsp; &nbsp; &nbsp; &nbsp;$key = tbase64_getkey();<br />
&nbsp; &nbsp; &nbsp; &nbsp;return strtr(base64_encode($str), $BASE64_CHARS, $key);<br />
}<br />
<br />
function tbase64_decode($encoded)<br />
{<br />
&nbsp; &nbsp; &nbsp; &nbsp;global $BASE64_CHARS;<br />
&nbsp; &nbsp; &nbsp; &nbsp;$key = tbase64_getkey();<br />
&nbsp; &nbsp; &nbsp; &nbsp;return base64_decode(strtr($encoded, $key, $BASE64_CHARS));<br />
}<br />
<br />
$original = &quot;name=메롱&amp;jumin=1111111111118&amp;sex=M&quot;;<br />
$tbae64_key = tbase64_getkey();<br />
print &quot;original: $original&lt;br&gt;
&quot;;<br />
print &quot;tbae64_key: $tbae64_key&lt;br&gt;
&quot;;<br />
<br />
$base64_encoded = base64_encode($original);<br />
print &quot;base64_encoded: $base64_encoded&lt;br&gt;
&quot;;<br />
$encoded = tbase64_encode($original);<br />
print &quot;encoded: $encoded&lt;br&gt;
&quot;;<br />
<br />
$decoded = tbase64_decode($encoded);<br />
print &quot;decoded: $decoded&lt;br&gt;
&quot;;<br />
</div><br />
<br /><br />			 ]]> 
		</description>
		<category>+웹프로그래머 이디군</category>

		<comments>http://dagui.egloos.com/388084#comments</comments>
		<pubDate>Sun, 03 Oct 2004 15:04:44 GMT</pubDate>
		<dc:creator>이디군</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 웹프로그래머가 주변사람들에게 폐끼치지 않고 살기 위해 갖추어야 할 능력 ]]> </title>
		<link>http://dagui.egloos.com/388051</link>
		<guid>http://dagui.egloos.com/388051</guid>
		<description>
			<![CDATA[ 
  1년 전에 PHP스쿨에 올려서 히트쳤던 글<br />
<br />
가끔 스스로 읽어보면서 각오를 다시 다시기도 한답니다.<br />
1년이 지난 지금 별로 한게 없군요.<br />
<br />
<a href="http://www.phpschool.com/bbs2/inc_view.html?id=17510&code=phorum2" target="_blank">http://www.phpschool.com/bbs2/inc_view.html?id=17510&code=phorum2</a><br />
<br />
<hr width="50%"><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 />
말만할 수는 없는 겁니다.<br />
<br />
<br />
1. 이론<br />
<br />
- 인터넷 규약<br />
TCP/IP, Socket 통신, HTTP, SMTP, DNS<br />
공개키 암호화 개념, SSL<br />
<br />
인터넷 규약은 어렵지는 않지만 너무 많다는것이 문제<br />
<br />
모든 규약을 줄줄 외울 필요는 없겠지만<br />
어떻게 돌아간다는 기본 개념 정도는 알아두어야<br />
<br />
HTTP, STMP 정도는 주요 명령어와 문법정도는 알아야<br />
<br />
- DBMS<br />
기본 개념(정규화 등 논리설계 관련)<br />
기본 설계 요령(인덱스 등 물리설계 관련)<br />
<br />
아무리 파도 끝이 없는 샘물과도 같은 주제<br />
하지만 아무리 많이 배워도 지나침이 없는 주제<br />
<br />
그렇다고 DB만 파고 있을 수는 없는 노릇이지만<br />
기본은 갖출 필요가 있음<br />
<br />
- 보안<br />
공격 유형<br />
보안 헛점의 유형<br />
웹서버 SSL 구성방법 등<br />
<br />
최근들어 급격히 필수 소양으로 자리잡아가는 추세<br />
<br />
웹서버 구성방법은 이론적 지식이라고 할 수는 없지만<br />
분류를 하다보니 그만...<br />
<br />
<br />
2. 플랫폼<br />
<br />
- Unix 플랫폼<br />
기본 명령어(ls 부터 find, grep 등 까지)<br />
개발도구([g]cc, make 등)<br />
쉘스크립팅<br />
C 언어 기초<br />
<br />
C언어 개발도구가 들어있는 이유는 C로 개발을 하지 않더라도<br />
소프트웨어를 설치하고 구성하는데 있어서 필요함<br />
<br />
그리고 C언어 지식은 Unix 시스템을 이해하는데 있어서<br />
매우 중요한 역할을 함<br />
<br />
유닉스는 알면 알수록 사용하기 편해지는 운영체제<br />
<br />
- Windows 플랫폼<br />
Unix 지식<br />
시스템 관리도구(mmc 등)<br />
COM/ActiveX<br />
Visual Basic<br />
<br />
Unix 지식을 넣어놓은 이유는 Windows의 관리도구들은<br />
Unix의 개념에 UI를 씌워놓은 것처럼 느껴질때가 많기 때문<br />
특히 네트워크 서비스 관련된 부분은 더욱.<br />
<br />
단 사용자 계정/권한 부분이나 디스크관리 등<br />
보다 더 로우레벨 부분은 그렇지 않음<br />
<br />
- Java 플랫폼<br />
Native 플랫폼(Windows or Unix)<br />
객체지향 개념(철저)<br />
<br />
Java는 Native 플랫폼 위에 구축된 거의 독자적인 플랫폼이지만<br />
Native 플랫폼 지식은 당연히 알아야함,<br />
Java 서버를 돌리더라도 결국 운영체제의 영향을 받기 마련<br />
운영체제의 문제를 해결하지 못하면 Java도 별 수없음<br />
<br />
그와 더불어 Java 플랫폼만의 특수한 지식도 폭넓게 알아야 함.<br />
Java 플랫폼에서는 일단 문제가 발생하면 해결이 쉽지 않다는 특징이...<br />
<br />
- DB 플랫폼(Oracle, MySQL 등)<br />
기본적인 관리(백업,복제 등)<br />
SQL 특성<br />
데이터 저장 구조<br />
<br />
사실 DB 플랫폼이란 말은 없다. 그러나 DB는 다른 영역에 비해<br />
중요도가 너무 높고 또 제품에 따라 특성이 너무 다르다.<br />
<br />
그래서 DBMS 제품 하나가 거의 플랫폼이라고 할만큼의 지식을 필요로 한다.<br />
<br />
MySQL이 비교적 단순하고 쉽지만 역시 전문적으로 운영하려면<br />
만만치 않다.<br />
<br />
앞서 이야기한 이론적인 DB 지식과 함께 DBMS의 특성에 대한<br />
이러한 지식들이 있어야 문제가 되는 설계를 피할 수 있고 튜닝도 가능하다.<br />
<br />
DBA라는 직업이 따로있는 이유는 이 모든 것을<br />
프로그래머 혼자 다 할 수 없기 때문이겠지만<br />
그렇다고 프로그래머가 이런 것들을 하나도 모른다면 프로그래머가 아니라 바보다.<br />
<br />
3. 언어<br />
<br />
- 웹스크립트언어(택2 이상 권장)<br />
PHP, ASP, JSP 등<br />
<br />
처음에는 힘들게 생각될 수 있겠지만<br />
하나에 숙달되고나면 새로 배우는 것도 별로 어렵지 않음.<br />
<br />
처음에 힘들게 생각되는 것은 앞서 이야기한 이론적 지식과<br />
플랫폼 지식을 함께 배우기 때문임.<br />
<br />
그렇다고 이것저것 수박겉핧기는 곤란.<br />
하나를 마스터하고나면 나머지는 거의 거져 알게된다고 생각하고<br />
임하기 바람.<br />
<br />
다시한번 강조하지만 언어는 별로 어렵지 않음<br />
플랫폼 지식이 가장 어려움(양이 많기 때문)<br />
<br />
- 시스템 언어(최소한 택1)<br />
Perl, Java, Python 등<br />
<br />
시스템이 웹베이스만으로는 돌아갈 수 없다.<br />
<br />
사이트를 만들고 운영하다보면<br />
주기적으로 처리해 줘야할 작업이나 서비스 연동을 위한<br />
간단한 데몬을 만들 필요가 발생<br />
<br />
이때 사용할 수 있는 부전공 언어를 배워 놓는 것이 좋음<br />
<br />
MS 플랫폼의 경우 VBScript 나 JScript도 가능한 선택이지만<br />
언어가 제공하는 기능이 너무 부족하고 <br />
플랫폼에 종속된 기술이기 때문에(Unix 에서는 없음) 그렇게 권장하지 않음<br />
<br />
PHP도 시스템 스크립트로 사용할 수 있으나<br />
외부 모듈을 사용하기가 여의치 않다는 치명적인 단점이 있다.<br />
웹에서는 필요로하는 거의 모든 것이 갖추어져 있지만<br />
웹이 아닌곳에서는 항상 가려운곳이 생기기 마련<br />
<br />
Java는 JSP로 웹도 커버하고 비웹 스크립트도 만들수 있으니<br />
하나만 배워도 될거라고 생각할수 있지만 이것은 오산<br />
Java는 기본적으로 덩치가 커서 JVM 로드하고 하려면 느리다<br />
백그라운드 작업을 하는 데몬을 만들기는 좋지만 <br />
코드 몇줄 짜리 정말 간단한 작업을 위해 쓰기에는 너무 거창하다.<br />
<br />
- 기타 필수 언어<br />
Javascript, SQL<br />
<br />
- 기타 프로그램 언어는 아니지만 필수<br />
XML, CSS<br />
<br /><br />			 ]]> 
		</description>
		<category>+웹프로그래머 이디군</category>

		<comments>http://dagui.egloos.com/388051#comments</comments>
		<pubDate>Sun, 03 Oct 2004 14:57:48 GMT</pubDate>
		<dc:creator>이디군</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 이 카테고리는 비공개 카테고리입니다. ]]> </title>
		<link>http://dagui.egloos.com/387505</link>
		<guid>http://dagui.egloos.com/387505</guid>
		<description>
			<![CDATA[ 
  개인적인 용도로 사용하는 곳입니다.<br />
<br />
무슨 개인적인 용도인지 궁금하신가요. <a href="#" onclick="document.all.tackle.style.display = 'block'; return false">▶ 클릭</a><br />
<br />
<div id="tackle" style="display: none"><IMG SRC="http://cbingoimage.naver.com/data3/bingo_48/imgbingo_96/gohansuk1234/29441/gohansuk1234_23.jpg " CLASS=IMAGE_MID WIDTH=302 HEIGHT=270 BORDER=0></div><br />
<br />
<br />
<br />
<br />
<br /><br />			 ]]> 
		</description>
		<category>-휴일근무매니아 이디군</category>

		<comments>http://dagui.egloos.com/387505#comments</comments>
		<pubDate>Sun, 03 Oct 2004 13:07:55 GMT</pubDate>
		<dc:creator>이디군</dc:creator>
	</item>
	<item>
		<title><![CDATA[ [독후감] 정규 표현식 완전 해부와 실습 ]]> </title>
		<link>http://dagui.egloos.com/387279</link>
		<guid>http://dagui.egloos.com/387279</guid>
		<description>
			<![CDATA[ 
  평소에 정규식에 대해서 나름대로 자신감을 가지고 있었다.<br />
PC통신 시절에는 5부작 정도의 기획 강좌를 하려고 시도한적도 있었다.<br />
<br />
이 책을 읽고 나서 철없던 그때 생각이 나서 혼자서 어찌나 민망했던지..<br />
<br />
정규식에 관한 거의 모든것을 다루고 있는데 알기쉽게 자세하게 설명되어 있다.<br />
저자의 구성과 집필이 정말 뛰어난 것이 고급 사용자는 고급 사용자 대로 유익하고,<br />
초보자는 초보자 대로 유익하다.<br />
<br />
그리고 번역도 훌륭하다. 머리에 쏙쏙 들어온다.<br />
<br />
단 하나의 단점은 예제를 찾아볼수 있는 인덱스 같은것이 없어서 <br />
나중에 참고하려면 장황항 설명 페이지들을 넘겨가며 찾아야 한다.<br />
<br />
<br />
정말 강추!<br />
<br />
<br />
<A HREF=http://www.aladdin.co.kr/catalog/book.asp?isbn=8979142269&partner=egloos TARGET=_NEW><IMG SRC=http://www.aladdin.co.kr/coveroff/8979142269_1.gif BORDER=0 ALIGN=LEFT>정규 표현식 완전 해부와 실습</A><br />
제프리 프리들 지음, 서환수 옮김 / 한빛미디어<br />
나의 점수 : ★★★★★<br />
<br />
내용도 좋고 번역도 괘안타.<BR><BR>한마디로 죽인다!<br />
<br />
<br /><br />			 ]]> 
		</description>
		<category>+웹프로그래머 이디군</category>

		<comments>http://dagui.egloos.com/387279#comments</comments>
		<pubDate>Sun, 03 Oct 2004 11:59:04 GMT</pubDate>
		<dc:creator>이디군</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 간단함.. 바로 이것! 하드코어텍스트 스킨 ]]> </title>
		<link>http://dagui.egloos.com/387221</link>
		<guid>http://dagui.egloos.com/387221</guid>
		<description>
			<![CDATA[ 
  음.. 이글루 만든 기념으로 스킨을 만들어 봤습니다.<br />
<br />
귀차니즘이란 바로 이런겁니다.<br />
<br />
<br /><br />			 ]]> 
		</description>
		<category>+귀차니스트 이디군</category>

		<comments>http://dagui.egloos.com/387221#comments</comments>
		<pubDate>Sun, 03 Oct 2004 11:42:16 GMT</pubDate>
		<dc:creator>이디군</dc:creator>
	</item>
</channel>
</rss>
