먼저 자신의 주소창에 http://localhost/abc.php 라고 치는 것으로 시작합니다.
자, 생각하던 결과입니까? 물론, abc.php를 만든 적이 없고, 파일이 없으니, "이 서버에는 /abc.php 따위는 못찾겠다."라고 친절하게 가르쳐 주는 것이 쓸만해 보이기는 합니다. 물론,
"요즘 월드 와이드한 세상에 저 정도 못 읽는 사람이 있겠어?"
라는 주장도 설득력이 있기도 합니다.
그렇다면 http://localhost/index.html 혹은, http://localhost 로 들어가서 이름을 쓰고 프로그램을 확인 해 봅시다. 왠지 모양은 같은데, 프로그램이 동작하지 않는가요?
만약 이런 식으로 오작동 하거나, Not Found가 기분 나쁘거나 하시다면, 편집기를 열고,
RewriteEngine On
RewriteRule !\.(js|jpg|png|gif|css|swf)$ index.php
라고 쓴 후에 .htaccess라는 이름으로 저장합니다. 탐색기 상에서는 파일명을 변경할 수 없으므로, 반드시 편집기에서 save as 등으로 저장해야 합니다.
자, 위에 있는 주소들을 들어가 보면, 이제 Not Found나 잘못된 곳으로 향하지 않고, 항상 index.php파일 내용을 볼 수 있습니다. 끝~.
"이런, 이미 다른 파일들을 만들어서 홈페이지를 구축했는데, 이런 삐리리한 경우가."
"다른 파일은 만들지 말고, 한페이지만 만드는 것이었군요."
...
아, 성급했군요.
저 .htaccess를 만들고 나면, 모든 파일들이 index.php로 오기 때문에, 이미 만든 프로그램을 적절한 곳에 놓는 편이 좋습니다.
우선 controllers, views 라는 두개의 디렉터리(폴더)를 만드시고, index.php와 index.html을 각각의 디렉터리에 이름을 helloWorld로 바꾸어 넣기로 하죠.
controllers/helloWorld.php와 views/helloWorld.html로 말입니다.
파일이 많아지면, 이와같이 프로그램의 이름이 명확하면 찾기 편해 집니다.
그리고 index.php를 새로 만드는 거죠.
<?
$target = "controllers" . $_SERVER['REQUEST_URI'];
if ( is_file( $target ) ) {
include $target;
} else {
print "<h1>잘못된 접근이신 듯... 아래 링크로 가세요.</h1>";
print "<a href='helloWorld.php'>Hello World Program.</a>";
}
그러면 http://localhost/abc.php로 들어가 보면,
이와 같이 나옵니다. 이처럼 모든 요청을 처리하는 파일을 front controller 즉, '전면 관리자'라고 부릅니다.
$_SERVER['REQUEST_URI']는 웹서버가 php를 통해 제공하는 변수인데, 위와 같은 경우 '/abc.php' 값이죠. 말 그대로, 서버의['요청받은_주소']입니다.
$target은 'controllers/abc.php'가 되는 것이죠.
is_file은 파일이 존재하는지 확인하는 함수입니다.
결국 if문으로 둘러쌓인 부분은,
"만약, controllers/abc.php가 있으면 불러오고, 아니면 print를 해라."가 되겠죠.
이제, 링크를 클릭하면,
이런 에러가 뜨는군요. 이런, 프로그램이 망가진 듯 하죠? 찬찬히 읽어보면, index.html을 찾아 보았는데, include_path가 이러이러한데 찾아봐도 없더라. 하고 말하고 있습니다.
당연하죠. index.html은 views/helloWorld.html디렉터리로 옮겨 놓았는 걸. 그렇다면 controllers/helloWorld.php파일을 열고,
include 'index.html';
을
include 'views/helloWorld.html';
로 고쳐 줍니다.
이제, 잘 동작하나요? 앞으로는 controllers라는 디렉터리에 php파일을 만들면 내용이 읽힐 것입니다.
말이 나온 김에, 루트 디렉토리(index.php와 controllers, views폴더가 있는 곳을 말합니다)의 index.php파일을 보기 좋게 정리를 해 볼까요?
단계 1 : index.php
<?
$target = "controllers" . $_SERVER['REQUEST_URI'];
if ( is_file( $target ) ) {
include $target;
} else {
include 'controllers/notFound.php';
}
이렇게 html부분을 잘라내고, controllers에 파일이 없을 때 처리할 파일을 지정합니다.
단계 2 : controllers/notFound.php
<?
include 'views/notFound.html';
이렇게 해당 파일을 만듭니다.
단계 3 : views/notFound.html
<h1>잘못된 접근이신 듯... 아래 링크로 가세요.</h1>
<a href='helloWorld.php'>Hello World Program.</a>
오오~. print가 사라지고, 깔끔한 html파일이 되었군요.
자, 전체적인 그림을 설명하면,
index.php파일은 front controller(전면 관리자)가 되고,
이 전면 관리자는 controllers에 요청한 이름과 같은 파일이 있는지 확인합니다.
있으면, 그것을 가져오고, 없으면, controllers/notFound.php를 가져옵니다.
자, 이제는 controllers에 새로운 php파일들을 만들고, views에 html을 넣어서, 자신이 원하는 프로그램들을 계속 만들어 가면 되겠습니다.
=========== FAQ =============
Q : 그런데, 왜 디렉터리 명이 phps와 htmls이 아니라, 더 길고 복잡한 controllers와 views 인가요?
A : 프로그램 쪽에서 무언가 관리를 하는 쪽을 controller(관리자)라고 부르고, 보이는 것을 담당하는 쪽을 view라고 불러 왔습니다. 관습인 거죠. 다양한 프로그래밍에서 이와 같이 사용을 하면, 다른 언어의 다른 프로그램에서도 어떤 역할을 하는지 알기 쉽습니다. 물론, 관습이므로, 반드시 따를 필요는 없습니다. 참고로 index.php파일과 같이 controller들을 관리하는 쪽은 front controller라고 불리죠.





