주간 베스트 월간 베스트 3개월 베스트 베스트 게시물
꽃배달 한국, 중국 전지역배송

자신만의 카운터를 가져보자 - 최종 2/2

광수 | 2001.10.17 00:33:39 댓글: 0 조회: 591 추천: 10
분류웹 프로그래밍 https://life.moyiza.kr/itstudy/1758815
▶ 자신만의 카운터를 가져보자 - 최종 2/2

파일 카운터의 마지막 시간입니다... ^^; 내용이 다소 길더라도 차근차근 살펴보세요.
이해 안되는 부분이 있다면 언제든 강의와 관련된 질문과 답변 게시판에 해주세요.


바로 전편에 파일을 이용한 카운터 프로그래밍을 위한 요소에 대해서 순서나 필요한
코드들을 살펴보았고, 이제 이들을 결합한 완전한 하나의 프로그램을 살펴보도록
하겠습니다.

먼저 다음은 완성된 형태의 소스 코드입니다.


[counter.php]
--------------------------------------------------------------------------------
<?
// 기본 변수
$절대경로 = "/public_html/count"; // counter.php 파일이 있는 절대 경로 지정
list($yy,$mm,$dd,$hh,$yo) = explode("-",date("Y-m-d-H-w"));                         // 현재 년,월,일,시간별,요일별 구함
list($oyy,$omm,$odd)      = explode("-",date("Y-m-d",mktime(0,0,0,$mm,$dd-1,$yy))); // 어제 년,월,일 구함
$아이피 = $HTTP_SERVER_VARS["REMOTE_ADDR"]; // 방문자 IP

// 파일명 설정
$파일[기본] = $절대경로."/counter.cgi";       // 기본 파일
$파일[오늘] = $절대경로."/".$mm.$dd.".cgi";   // 오늘 파일
$파일[어제] = $절대경로."/".$omm.$odd.".cgi"; // 어제 파일

// 위치 지정 ($파일[기본]에서의 각각의 값 저장 위치 - 전체,오늘[,어제,최고],시간별,요일별)
$위치[방문객]   = array(0,   10,     /*20,     30,*/     ($hh+4)*10,     ($yo+28)*10);
$위치[페이지뷰] = array(351, 351+10, /*351+20, 351+30,*/ 351+($hh+4)*10, 351+($yo+28)*10);

// 사용자 정의 함수
function 생성 ($파일명, $값) {
  $임시파일핸들 = fopen($파일명,"w"); // 쓰기 모드로 오픈
  fwrite($임시파일핸들,$값); // 값 기록
  fclose($임시파일핸들); // 파일 닫기
  chmod($파일명,0777); // 권한 변경
}
function 읽기 ($파일핸들,$크기) {
  $임시변수 = fread($파일핸들,$크기); // 파일의 크기만큼 읽음
  return $임시변수; // 값 반환
}
function 추가 ($파일핸들, $값) {
  $값.="n"; // 다음줄 추가 ($값=$값."n";)
  fwrite($파일핸들,$값); // 값 기록
}

function 업뎃 ($파일핸들, $위치값) {
  $배열크기 = sizeof($위치값); // $위치값 변수의 배열 크기를 구함
  for($i=0;$i<$배열크기;$i++) { // 배열의 크기만큼 반복
    $임시변수 = 0; // 임시 변수의 값 초기화
    fseek($파일핸들,$위치값[$i]); // 해당 위치로 이동
    $임시변수 = fread($파일핸들,10)+1; // 10바이트 읽은 값에 1 더함
    if ($i==1) { // 만약 2번째라면 (0부터 시작하니까 1은 두번째 - 오늘위치)
      $오늘 = $임시변수; // $오늘 변수에 현재 읽은 값 저장
      fseek($파일핸들,$위치값[$i]+20); // 현재 위치로부터 20바이트 뒤로 이동 (최고위치)
      $최고 = fread($파일핸들,10); // 10바이트 읽음
      if ($오늘>$최고) { // 만약 $오늘 변수의 값이 $최고 변수의 값보다 클 경우
        fseek($파일핸들,$위치값[$i]+20); // 최고 위치로 이동
        fwrite($파일핸들,sprintf("%10d",$오늘)); // $오늘 변수의 값 기록
      }
    }
    fseek($파일핸들,$위치값[$i]); // 해당 위치로 이동
    fwrite($파일핸들,sprintf("%10d",$임시변수),10); // 새로운 값 기록
  }
}

// 프로그램 시작
if (file_exists($파일[어제]))  unlink($파일[어제]); // 만약 (어제 파일 있다면) 어제파일 삭제;
if (!file_exists($파일[오늘])) 생성($파일[오늘],"n"); // 만약 (오늘 파일 없다면) 오늘파일 생성;
if (!file_exists($파일[기본])) {
  for($i=0;$i<35;$i++) $초기값.="         0"; // 기본 파일에 저장될 초기값 구함
  $초기값 = $초기값."n".$초기값; // (4+24+7) * 2 = 방문객+페이지뷰
  생성($파일[기본],$초기값); // 해당 값으로 파일 생성
}

// 파일 열어둠
$방문파일핸들 = fopen($파일[오늘],"r+"); // 오늘 파일 읽기/쓰기 모드로 오픈
$기본파일핸들 = fopen($파일[기본],"r+"); // 기본 파일 읽기/쓰기 모드로 오픈

$방문자 = 읽기($방문파일핸들,filesize($파일[오늘])); // 오늘 파일 크기만큼 읽어옴

if (!strpos($방문자,$아이피)) { // 아이피가 없으면
  추가($방문파일핸들,$아이피); // 아이피 추가
  업뎃($기본파일핸들,$위치[방문객]); // 방문객 증가
}
업뎃($기본파일핸들,$위치[페이지뷰]); // 페이지뷰 증가

fclose($방문파일핸들); // 파일 닫기
fclose($기본파일핸들); // 파일 닫기

?>
--------------------------------------------------------------------------------


저번 순서에 맞게 프로그램을 작성 후 보다 쉽게 알아볼 수 있도록 변수와 함수명을
한글로 하였으며, 주석을 꼬박꼬박 달아놓았습니다. 또한 빈번한 파일 입출력을 조금
줄였으며, 안정적인 동작을 위해 절대 경로를 지정하였습니다.

그럼 한부분 한부분 자세하게 알아보도록 할까요?


▷ 절대 경로를 지정하자...

첫 줄에 보면 다음과 같은 코드가 있습니다.

$절대경로 = "/public_html/count";

변수명 그대로 절대 경로를 지정한 것입니다. 절대 경로는 변하지 않습니다. 해당
디렉토리나 파일의 위치를 위와 같은 식으로 직접 접근할 수 있는 주소로 표기한 것을
절대 경로라 합니다.

$상대경로 = "./count";

이것은 현재 자신의 위치를 기준으로 하여 해당 디렉토리나 파일이 위치한 곳을
나타내는 상대 경로 방식입니다. public_html 위치에서 상대경로를 위와같이
지정했다면 public_html/count 위치를 나타내며, public_html/test 위치에서
위와같이 지정했다면 public_html/test/count 위치를 나타내는 것입니다. 프로그램을
수행하는 위치에 따라 경로명이 달라지게 되죠.

절대경로로 지정하면 다른 디렉토리에서 counter.php 파일을 include 시켜도 생성되는
파일의 위치가 동일해집니다. 말 그대로 절대경로니까요. ^^; 나중에 계정이 바뀐다
하더라도 $절대경로 변수의 값 하나만 변경하면 되니 참 편리하겠죠? ^_____^

절대 경로는 어떻게 구할 수 있느냐... 윈도 계열의 경우 도스(명령 프롬프트)
모드에서 "cd"란 명령으로 쉽게 알 수 있으며, 리눅스 계열인 경우 "pwd"란 명령으로
절대 경로를 알 수 있습니다.

이는 PHP로도 쉽게 절대 경로를 알아볼 수 있습니다.


[path.php]
--------------------------------------------------------------------------------
<?
$path = dirname($SCRIPT_FILENAME);
echo "counter.php 파일의 처음 부분에 있는 $절대경로 = ""; 부분에 아래의 주소를 넣어주세요.<br><br>n";
echo "$절대경로 = "<font color=red>$path</font>";n";
?>
--------------------------------------------------------------------------------

원래 echo dirname($SCRIPT_FILENAME); 이란 명령 한줄로도 절대 경로를 구할 수
있지만, 이번 카운터와 함께 사용할 수 있도록 다른 메시지를 더 추가하여 조금
길어졌습니다.

위 프로그램을 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.

--------------------------------------------------------------------------------
counter.php 파일의 처음 부분에 있는 $절대경로 = ""; 부분에 아래의 주소를 넣어주세요.

$절대경로 = "/public_html/count";
--------------------------------------------------------------------------------

이렇게 구해진 주소값을 counter.php 파일의 $절대경로 부분에 복사해두면 되겠죠? ^^


▷ 오늘 날짜, 어제 날짜 등 구하기...

최종회 1/2 편에서 어제 날짜 등을 구할때 참 복잡한 과정을 거쳤습니다. 그때 그보다
훨씬 간단한 형태를 다루겠다 약속했었죠? 다음이 그 코드입니다.

list($yy,$mm,$dd,$hh,$yo) = explode("-",date("Y-m-d-H-w"));
list($oyy,$omm,$odd) = explode("-",date("Y-m-d",mktime(0,0,0,$mm,$dd-1,$yy)));

첫줄을 풀어쓰면 다음과 같습니다.

$temp = date("Y-m-d-H-w");
$temp2 = explode("-",$temp);
$yy = $temp2[0];
$mm = $temp2[1];
$dd = $temp2[2];
$hh = $temp2[3];
$yo = $temp2[4];

먼저 배우는 입장에서는 하나하나 직접 명령을 작성함으로써 이해를 높이는데 중점을
두는게 좋고, 실제 프로그램 작성시에는 불필요한 부분을 제거함으로써 보기 편하고
변수의 낭비도 막는 등 list($yy,...,$yo) = explode("-",date("...")); 처럼 간단히
표현하는 것이 좋습니다.

위 풀어쓴 예제를 볼까요? 처음 년-월-일-시-요일 을 구한 다음 이 값에서 하이픈(-)
기준으로 값을 분리했습니다. 그리고 각각의 변수에 배열값을 넣어줬는데 list 함수를
사용하면 보다 간단해집니다. 하이픈(-) 기준으로 분리하였을때 값이 총 5개였죠?
이를 list($변수명1,$변수명2,$변수명3,$변수명4,$변수명5)란 명령으로 한번에 아주
편하게 대입하였습니다. [앞으로도 list() 함수를 쓴 예제를 많이 접할 수 있을
것입니다. ^^)

mktime() 함수와 date() 함수에 대해서는 전편에 자세히 소개를 하였기 때문에 따로
설명하지 않겠습니다.


▷ 현재 접속한 사람의 IP 구하기...

$아이피 = $HTTP_SERVER_VARS["REMOTE_ADDR"];

CGI 환경변수를 이용해 현재 접속한 사람의 IP를 지정하는 코드입니다. CGI 환경
변수는 많습니다. 예를 들면 $HTTP_SERVER_VARS["SERVER_NAME"] 변수에는 서버의
이름이 저장되어 있습니다. $HTTP_SERVER_VARS["HTTP_USER_AGENT"] 변수에는
현재 접속한 사람의 브라우저 종료와 버전 등이 저장되어 있습니다. 이를 이용해
간단한 프로그램을 만들어 볼까요?

[info.php]
--------------------------------------------------------------------------------
<?
echo "현재 접속자 정보<br><br>
서버명 : $HTTP_SERVER_VARS[SERVER_NAME]<br>
아이피 : $HTTP_SERVER_VARS[REMOTE_ADDR]<br>
브라우저 : $HTTP_SERVER_VARS[HTTP_USER_AGENT]";
?>
--------------------------------------------------------------------------------

실행하면 다음과 같이 정보가 출력됩니다. [게임 때문에 주로 윈98을... ^^]

--------------------------------------------------------------------------------
현재 접속자 정보

서버명 : www.dreamphp.com
아이피 : 123.123.123.123
브라우저 : Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)
--------------------------------------------------------------------------------


▷ 파일명을 지정하자...

$파일[기본] = $절대경로."/counter.cgi";
$파일[오늘] = $절대경로."/".$mm.$dd.".cgi";
$파일[어제] = $절대경로."/".$omm.$odd.".cgi";

$파일 변수에 기본 카운터 값이 기록될 파일과, IP가 기록될 파일명을 지정하는 코드.
제일 처음 구한 날짜 관련 값들과 그 다음 구한 절대경로명 등을 이용해 카운터
프로그램에서 사용하는 파일명들을 지정해두었습니다.


▷ 위치를 지정하자...

$위치[방문객]   = array(0,   10,     ($hh+4)*10,     ($yo+28)*10);
$위치[페이지뷰] = array(351, 351+10, 351+($hh+4)*10, 351+($yo+28)*10);

주석을 제거한 코드입니다. array() 함수는 이미 PHP 입문 편에서 다뤘습니다.
배열값들을 쉽게 지정할 수 있죠. 위에서 쓰인 각 값들은 파일 내의 위치값입니다.
일단 counter.cgi 파일에는 다음과 같은 형태로 카운트 값이 기록됩니다.

--------------------------------------------------------------------------------
전체접속자 오늘접속자 어제접속자 최고접속자 시간별접속자 요일별접속자
전체페이지 오늘페이지 어제페이지 최고페이지 시간별페이지 요일별페이지
--------------------------------------------------------------------------------

$string = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 이런 값이 있을 경우 0번
위치에서 1 바이트값은 "1", 10번 위치에서 1바이트 값은 "A"입니다. 이런 식으로
위치값을 지정한 것입니다.

$hh에는 현재 시간을 24시간제로 나타냈을때의 값이 지정되며, $yo에는 현재 요일을
0~6의 숫자로 나타냈을때의 값이 지정됩니다. 이미 앞에서 4개까지의 값은 전체,
오늘,어제,최고 값이 기록되며, 이 다음부터 24개 값은 각각의 시간별 카운트값이
기록되고, 그 다음 7개 값은 각각의 요일별 카운트값이 기록되게 되는 것입니다.

첫줄은 그래서 총 4*10 + 24*10 + 7*10 = 40 + 240 + 70 = 350 바이트 값을 갖습니다.
이 길이와 동일하게 페이지뷰값이 다음줄에 기록되죠. 이 값들의 위치 역시 윗줄과
동일한 형태기 때문에 윗줄 전체 길이(350) + 다음줄(n=1)을 더해 351만 더한 거죠.
간단하죠? 나중에 실제 저장되는 데이터 파일을 열어보세요. 그럼 이해가 팍~~~ ^^;


▷ 프로그램의 시작과 사용자 정의 함수들 처음...

기본적인 설정이 끝난 다음 실제 카운터 처리를 위해 실행되는 코드입니다. 하나씩
살펴보겠습니다.

if (file_exists($파일[어제]))  unlink($파일[어제]);

file_exists() 함수는 파일이 존재하는지의 유무를 알려줍니다. 파일이 존재하면 1,
없으면 0을 반환합니다. if()문 안에 쓰였기 때문에 조건이 참일 경우 (반환값이 1일
경우) 뒤의 명령을 수행하겠죠? unlink() 함수는 지정한 파일명을 삭제합니다.

if (!file_exists($파일[오늘])) 생성($파일[오늘],"n");

최초 실행시 "파일이 존재하느냐(file_exists)"란 조건에 대해 파일이 없기 때문에
0이 반환됩니다. 이 앞에 느낌표(!)가 붙었기 때문에 반대(NOT)가 되어 1값이 되고,
결국 if()문의 조건이 참이 되어 뒤의 명령을 수행하게 되는 것이죠.

function 생성 ($파일명, $값) {
  $임시파일핸들 = fopen($파일명,"w");
  fwrite($임시파일핸들,$값);
  fclose($임시파일핸들);
  chmod($파일명,0777);
}

파일명과 기록될 값을 인자로 받습니다. 해당 파일을 쓰기 모드로 열어 인자로 받은
다음줄(n)값을 기록한 뒤 닫습니다. 그 다음 파일의 권한을 모두가 읽고 쓰기 등이
가능하도록 777로 변경하였습니다. [읽고 쓰기만 가능하면 되니 권한은 666으로도
충분합니다.]

if (!file_exists($파일[기본])) {
  for($i=0;$i<35;$i++) $초기값.="         0";
  $초기값 = $초기값."n".$초기값;
  생성($파일[기본],$초기값);
}

최초 실행시 역시 기본 파일이 없기 때문에 if 문의 조건이 참이 되어 블록({,} 안)의
명령들이 수행됩니다. 먼저 for()문을 이용해 0부터 34까지 1씩 증가하며 10바이트
"          0" 문자열을 계속 $초기값 변수에 더하게 됩니다. 0부터 34까지 35번
반복하는 이유는 이미 아시겠죠? 전체,오늘,어제,최고(=4),시간별(24),요일별(7) = 35

$a = $a + 5; 이 명령은 $a+=5;처럼 간단히 표현할 수 있다고 PHP 입문 편에서 다룬바
있습니다. 그것처럼 $초기값 = $초기값 . "          0"; => $초기값.="          0';
이렇게 간단히 표현한 것입니다.

그 다음 이렇게 구해진 값을 다시 한번 더한 이유는 방문자와 관련된 카운트값을
저장하는 구조와, 페이지뷰값을 저장하는 구조가 같기 때문입니다. 다만 이들을
다른줄로 구분하기 위해 ESC 코드(n)로 결합한 것이죠. 이해되었죠? ^-^
[이해가 안된다면 제 설명이 미흡합 것이니, 부디 질문과 답변 게시판에 어떤 부분에
대해 자세한 설명을 해달라고 써주셨으면 합니다.]


▷ 프로그램의 시작과 사용자 정의 함수들 마지막...

$방문파일핸들 = fopen($파일[오늘],"r+");
$기본파일핸들 = fopen($파일[기본],"r+");

그 다음 본격적인 처리를 위해 위의 두 파일을 읽기/쓰기 모드로 오픈합니다.
읽기/쓰기 모드로 오픈한 이유는 파일 내의 특정 위치로 이동해 원하는 값을 기록할
수 있기 때문입니다. 일반 쓰기 또는 추가 모드로 오픈했을 경우 전체 내용을 다시
기록하거나, 파일의 길이가 늘어나는 등 원치 않는 결과를 초래할 수 있기 때문에
읽기/쓰기 모드로 오픈한 것입니다. ^^

$방문자 = 읽기($방문파일핸들,filesize($파일[오늘]));

파일핸들과 파일의 크기를 인자로 주어 읽기() 함수를 호출합니다.

function 읽기 ($파일핸들,$크기) {
  $임시변수 = fread($파일핸들,$크기);
  return $임시변수;
}

이미 파일이 열려진 상태라 해당 파일 핸들만 (파일을 다루기 위한 변수, 처음 fopen
명령으로 파일을 열 경우 지정해 이후 파일 관련 명령을 사용할 때 꼭 사용합니다)
넘겨받아도 처리가 가능한 것입니다. 인자로 받은 파일의 크기만큼 내용을 읽어
return문에 의해 그 값을 반환해주는 것이죠. 결국 $방문자 변수에 오늘파일의 내용이
저장되는 것입니다.

if (!strpos($방문자,$아이피)) { // 아이피가 없으면
  추가($방문파일핸들,$아이피); // 아이피 추가
  업뎃($기본파일핸들,$위치[방문객]); // 방문객 증가
}
업뎃($기본파일핸들,$위치[페이지뷰]); // 페이지뷰 증가

먼저 strpos() 함수에 대해 알아야겠죠? 아래 예제를 통해 간단히 알 수 있을거에요.

$string = "abcdefg"; // 기본 문자열 지정
echo strpos($string,"e"); // "e"의 위치값 출력 - 4 (0부터 시작하니까)

strpos($방문자,$아이피) 이 명령의 경우 $방문자 변수 내용 중 현재 접속한 사람의
IP값을 찾아 그 위치를 반환해주는데 만약 일치하는 값이 없을 경우엔 0값이
반환됩니다. 그리고 이 앞에 느낌표(!)가 붙어 있기 때문에 결국 if()문의 조건이
참이 되어 블록 안의 명령을 수행하는 것이죠.

다른 말로 풀이하자면! 오늘 파일을 열어 그 내용을 모두 읽어들였죠? 그 값에서 현재
접속한 사람의 IP가 발견되지 않았다는 것은 오늘 처음 방문자란 말과 같겠죠? 그래서
이 경우 방문자의 아이피값을 파일에 추가하게 되는 것입니다.

function 추가 ($파일핸들, $값) {
  $값.="n";
  fwrite($파일핸들,$값);
}

파일은 이미 오픈되어 있는 상태며, 여기에 넘겨받은 값 즉 현재 접속한 사람의 IP
값에 다음줄(n)을 붙여 파일에 추가하는 것입니다.

그 다음으로 업뎃() 함수를 호출했습니다. 오늘 처음 방문자이기 때문에 전체방문자
1 증가, 오늘 방문자 1 증가, 그리고 현재 시간대 1 증가, 요일대 1 증가를 수행하는
거죠. 그 다음으로 오늘 카운트 값과 최고 카운트 값을 비교해 큰 값을 다시 기록하는
것이구요. 이 함수가 업뎃() 함수입니다.

function 업뎃 ($파일핸들, $위치값) {
  $배열크기 = sizeof($위치값);
  for($i=0;$i<$배열크기;$i++) {
    $임시변수 = 0;
    fseek($파일핸들,$위치값[$i]);
    $임시변수 = fread($파일핸들,10)+1;
    if ($i==1) {
      $오늘 = $임시변수;
      fseek($파일핸들,$위치값[$i]+20);
      $최고 = fread($파일핸들,10);
      if ($오늘>$최고) {
        fseek($파일핸들,$위치값[$i]+20);
        fwrite($파일핸들,sprintf("%10d",$오늘));
      }
    }
    fseek($파일핸들,$위치값[$i]);
    fwrite($파일핸들,sprintf("%10d",$임시변수),10);
  }
}

위치값은 "전체,오늘,시간대,요일대"입니다. 이 갯수만큼(sizeof) for()문을 이용한
반복을 하게 되는 것이죠. fseek() 함수를 이용해 지정된 위치로 이동해 fread()
함수를 이용해 일정 값을 읽어 이 값에 1을 더해 fwrite() 함수로 파일에 재기록을
하는 것입니다. 여기서 눈여겨볼 부분은 $i의 값이 1일때의 처리 부분입니다.

$i의 값이 1인 경우는 "오늘" 위치값을 처리할때이군요. 그때 $오늘 변수에 읽은 값을
넣고, 현재 위치로부터 20바이트 뒤의 값을 읽습니다. 그 위치가 바로 최고 카운트가
기록되는 곳입니다. (10바이트 뒤였다면 어제 카운트가 기록되는 곳이었겠죠?)

해당 값을 읽어온 다음 오늘 값과 비교하여 오늘 값이 큰 경우 최고위치에 오늘 값을
기록하는 것입니다. (최고 방문객은 이렇게 해서 탄생하는 것입니다. ^^)


▷ 대망의 카운터 프로그램의 끝...

fclose($방문파일핸들); // 파일 닫기
fclose($기본파일핸들); // 파일 닫기

PHP 프로그램이 종료되면 열려있던 파일이 알아서 닫힌다지만, 올바른 프로그래밍
습관상 사용이 종료된 파일에 대해서는 이렇게 꼭 닫아주는 것이 좋겠죠?


▶ 지금 프로그램은 카운트값을 기록하는 기능밖에 없습니다. 내용이 길어져 다음회에
실제 이 카운터를 이용하는 방법과 함께 간단히 볼 수 있는 통계 프로그램을 다루며
정말 끝맺음을 하도록 하겠습니다. 죄송합니다. ㅠ_ㅠ [내용 조절 실패]


▷ 미리보기 : http://dreamphp.com/study2/count4-2/counter.php
▷ 소스보기 : http://dreamphp.com/study2/count4-2/counter.phps

▷ 미리보기 : http://dreamphp.com/study2/count4-2/path.php
▷ 소스보기 : http://dreamphp.com/study2/count4-2/path.phps

▷ 미리보기 : http://dreamphp.com/study2/count4-2/info.php
▷ 소스보기 : http://dreamphp.com/study2/count4-2/info.phps

* 전설님에 의해서 게시물 이동되었습니다 (2004-05-30 17:07)
* 이동한 이유 :
* 원래의 위치 : 웹 공부 >> 웹 프로그래밍
* 이동후 위치 : 웹 공부 >>

* 전설님에 의해서 게시물 이동되었습니다 (2004-05-30 17:12)
* 이동한 이유 :
* 원래의 위치 : 웹 공부 >>
* 이동후 위치 : 웹 공부 >> 웹 프로그래밍
추천 (10) 선물 (0명)
IP: ♡.149.♡.65
3,006 개의 글이 있습니다.
제목 글쓴이 날짜 조회
관리자
2003-09-20
11844
관리자
2003-09-20
11394
관리자
2003-09-20
20521
지구인
2010-08-27
19325
지구인
2009-09-07
13647
SOLIDH
2010-01-29
15599
엔죠라이프
2004-10-07
16701
광수
2001-10-17
424
광수
2001-10-17
575
광수
2001-10-17
718
광수
2001-10-17
371
광수
2001-10-17
445
광수
2001-10-17
709
광수
2001-10-17
591
광수
2001-10-17
564
광수
2001-10-17
596
광수
2001-10-17
502
광수
2001-10-17
622
광수
2001-10-17
832
광수
2001-10-17
792
광수
2001-10-17
627
광수
2001-10-17
785
광수
2001-10-17
449
광수
2001-10-17
508
광수
2001-10-17
445
광수
2001-10-17
656
광수
2001-10-17
508
광수
2001-10-17
732
모이자 모바일