강좌
클라우드/리눅스에 관한 강좌입니다.
프로그램 분류

미. 답신 글 달기 -2 답신 글 기능으로 인해 서버는 피곤하다

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

[강좌] php+mysql 게시판 만들기 #미-2

안녕하세요. 디망쉬입니다.

이제 우리는 게시판을 사실상 다 만들었습니다.
바로 '미-1'편을 통해서요. 물론 '소'편에서 자료실 기능과 메일 보내기 기능을 덧붙여보겠지만,
게시판으로서의 기능과 모습은 이미 다 만들었습니다.
그런 의미에서 여기까지 오신 분들께 박수~ 짝짝~ :]

이번 편은 개발에서 한발짝 물러나 답신 글 기능에 대해 씹어보려 합니다. 이번 편을 어떻게 받아
들이시냐에 따라 여러분은 제가 강좌로 풀어낸 답신 글 기능을 버리고 새로운 방식을 생각할수도,
아니면 그냥 이정도에서 머물 수도 있을 거라 생각됩니다. :]

자아. 그럼 한 번 씹어볼까요?



미. 답신 글 달기


b. 답신 글 기능으로 인해 서버는 피곤하다.
웹 게시판은 서버를 크게 두 가지 방법으로 괴롭힙니다. 첫 번째는 자료 검색이고
두 번째는 답신 글 기능이지요. 그외에는 웹 게시판이 서버를 괴롭힐만한 일은 하지 못합니다.
(매우 단편적인 일이기 때문이죠)

이 둘 다 DB 로 쿼리를 어떻게 날려주고 처리하느냐에 따라 속도의 차이가 생기겠지만 기본적으로 이 둘은 서버에 부하를 줍니다.

여기서 우리가 씹을 녀석은 관련글 기능이기에 검색에 대해서는 일단 제끼겠습니다.

관련글은 출력상으로 두 가지 형식 정도로 볼 수 있습니다. 용어를 잘 모르기 때문에 직접 모습으로 보도록 하죠. --;

1. 걍..리스트 방식
-----------------------------

5 re 3: 어서오세요.
4 움냐아. 피곤하다
3 안녕하세요!!!
2 쩝.. 졸리다.
1 오오 게시판이다.

2. 쓰레드 방식
-----------------------------

4 움냐아. 피곤하다
3 안녕하세요!!!
re 3: 어서오세요.
2 쩝.. 졸리다.
1 오오 게시판이다.

보통 웹 게시판은 2번 방식이 많고 PC 통신망(나우누리 등)은 1번 방식을 쓰는 편입니다.
왜 그럴까요? 왜 PC 통신망 같은 곳은 좀 더 보기좋은 2번 방식을 쓰지 않고 1번 방식을 쓸까요?

간단하죠. 서버에 과부화를 적게 주니까.
PC통신망은 한 번에 접속하는 사람 수도 많고 사용자도 많습니다.
때문에 최대한 서버에 과부하를 주지 않고 일을 처리해야 하죠.
1번 방식의 경우 번호 관련된 컬럼은 단지 두 개면 충분합니다.
화면에 출력되는 역할과 글을 구분하는 역할의 글 번호와 연결된 글 번호.

하지만 2번의 경우 이보다 더 많은 컬럼이 필요합니다.
제가 이 강좌를 통해 구현한 답신 글에서 사용되는 글 번호 관련 컬럼은 무려 7개나 됩니다.

1번 방식은 관련글을 써도 단지 한 두번의 작업만 하면 끝나지만, 2번의 경우 7개의 부분이 수정이 이뤄집니다. 그만큼 DB에 쓰잘데기 없는 짓을 시키는거죠.

하지만 웹(정확히 말하면 http)이라는게 보여주기 위하는 성격이 강합니다. 배포되는 공개 웹 게시판만 보더라도 이쁜 것이 일단 더 많이 배포되는 모습을 보면 알 수 있습니다.
예로 개발자분께는 죄송하지만 어떤 게시판은 기능이나 편리함이 매우 미흡하지만 디자인이 이뻐서 다른 게시판보다 더 많이 사용되기도 하더군요. 디자인을 지향하는 것이 잘못은 아니지만요. :]

이런 의미에서 웹 게시판에게 2번 방식의 답신글 출력이 아니면 더이상 경쟁의 힘을 잃어버립니다.

자. 이제 하지 않을 수 없게됨을 알게 되었습니다. 그럼 어떻게 해줘야 좋을까요.
어떻게 짜야만 빠르고 가볍게 구현이 될까요?

그것을 이야기 하기에 앞서 우리는 어떻게 짜야 좋은 코딩인지 알 필요가 있습니다.

아래는 제가 생각하는 좋은 코딩입니다.

1. DB 에 일을 최소화 시키자.

2. 일을 시킬 경우 한 번 시킬 때 모든 일을 다 처리시키자.

3. 변수를 많이 만들자 말자.

4. 제어문/반복문을 최소화하자.

누구나 아실만한, 혹은 공감하실 만한 내용입니다. ^^; 하지만 아는 것과 실천하는 것은 다르지요.
또 문장은 알아도 그 내용을 이해 못하는 것도 다릅니다.

DB 에 일을 최소화 시키자. 이건 정말 매우 중요한 것입니다. 예를 하나 들죠.
제가 잘 모를 때 저지르던 실수입니다.
어떠한 테이블(db)에서 정보를 가져옵니다.
그런데 저는 서버 메모리 절약한답시고 특정 컬럼 정보만 가져오게 했습니다.

SELECT no, id from userstatus;

이렇게요. 그런데 이건 좋지 못한 방법입니다.
이렇게 하면 문제시 될 수 있는 게 두 가지죠.

첫번째는 특정 컬럼만을 읽어와야하기 때문에 DB 서버가 좀 더 귀찮게 처리한다.

두번째는 위와 같이 정보 가져온 후 필요에 의해 한 번 더 정보를 가져와야할 수도 있다.

위와 같이 했는데 name 이라는 컬럼의 정보를 가져와야한다면

SELECT no, id from userstatus;

한 후에

SELECT name from userstatus;

식으로 해줘야 합니다. (물론 극단적인 예입니다. 누가 저렇게 하나요. --; 그냥

SELECT no, id, name from userstatus;

이라고 하고 말지. --;)

우리는 이것을

SELECT * from userstatus;

로 고침으로서 좀 더 빠르고 효율적인 관리가 가능해집니다. 실제로 테스트 해본 기억으로는

SELECT no, id from userstatus;

식으로 한 것이 0.3초 정도 걸리던 것이

SELECT * from userstatus;

라고 하자 0.05 초 정도가 소요되더군요.

물론 이렇게 하면 서버 메모리 소비가 조금 심해집니다. 때문에 우리는 특정 범위에서만 읽어올 필요가 있죠.
예를 들면

SELECT no, id from userstatus limit 5;

형식으로요. (5개만 읽어온다는 의미)


일을 시킬 때 한 번에 시키는 것이 좋습니다.
이건 컴퓨터 뿐 아니라 사람에게도 마찬가지겠죠. ^^; 이것은 위와 비슷한 예로 설명이 될 것 같군요.

변수를 많이 만들지 말자는 메모리 소비를 줄이자는 의미이기도 합니다.
변수 하나 늘때마다 메모리를 차지하는 공간은 늘어납니다.
하나의 변수로 가능하다면 굳이 두 개 만들지 말고 한 개로 처리하는 것이 좋습니다.
그 차이는 미비하지만 미비한 차이가 많이 발생되면 점점 차이가 커집니다.
무슨 말인고하면 변수 100개 쓴 웹 게시판과 변수 150개 쓴 웹 게시판을 10명이 사용한다면야 서버의 메모리 소비 차이는 미비하지만 1000명이 사용한다면 둘의 차이는 상당히 나게 됩니다.

예를 들겠습니다.

for ($i=1; $i<=10; $i++) {
echo "$i<br>";
}

for ($j=11; $j<=15; $j++) {
echo "$j-";
}

위는 1부터 10까지 한 줄 단위로 출력한 뒤, 11부터 15까지는 - 문자로 뒤에 이어붙이며 출력하는
소스입니다. 여기서 보면 변수를 $i 와 $j 두 개를 사용했죠. 이건

for ($i=1; $i<=10; $i++) {
echo "$i<br>";
}

for ($i=11; $i<=15; $i++) {
echo "$i-";
}

라고 해줘도 됩니다. 변수를 $i 한 개로 줄인거죠. 물론 위와 같은 사항이 항상 적용되는 것은 아닙니다. 하지만 변수 한 개로 해도 될 것을 두 개로 할 필요가 없다면 한 개로 처리하는게 좋습니다.
차라리 근처에 주석을 달아서 어떤 용도로 썼는지 표기하는 한이 있더라도요.

서버는 반복문을 싫어합니다. 반복문 못지 않게 제어문(if..else 같은거)도 싫어합니다. (사실 좀 더 컴퓨터 입장에서 보면 제어문을 더 싫어합니다. --;)

반복문이라는 것은 계속 반복시키다가 유저가 설정한 조건에 만족되면 반복을 강제로 중단시킵니다.

제어문은 제어문이 해결되기 직전까지 컴퓨터가 멈추게 됩니다. (그 딜레이는 매우 짧지만 어쨌건 컴퓨터가 일을 처리하다 말고 순간적으로 다른 일을 (조건문 처리) 하게 되므로 멈추게 되는 셈입니다)

그래서 제어문과 반복문이 많을수록 게시판은 느려지게 됩니다.
여러분이 제 강좌대로 만든 게시판은 매우 빠릅니다.
하지만 여러분이 입맛에 맞게 디자인도 바꾸고 여러 기능을 넣다보면 느려지게 됩니다. 여러 이유 중 하나가 제어문의 증가지요(if 문들).

물론 제어문과 반복문을 줄이기는 사실상 매우 힘듭니다.
때문에 한 번 제어문이 일어나거나 반복문이 일어날 때 여러 일을 다 처리시켜주는 편이 낫습니다.

속도에 민감한 저는 제어문을 짤 때 많이 사용될만한,
즉 사용 빈도의 우선 순위가 높은 것을 위에다 배치시키는 짓까지 하곤 합니다.
무슨 말인고하면

if ($i == 1) {
echo "디망쉬는 미중년";
}
elseif ($i == 2) {
echo "디망쉬는 미소년";
}
else ($i == 3) {
echo "디망쉬는 소녀?";
}

라는 조건문이 있다고 하죠. 그런데 프로그램을 운영하다보니 $i 가 2인 경우가 월등하게 많습니다.
그렇다면 저는 과감히(?)

if ($i == 2) {
echo "디망쉬는 미소년";
}
elseif ($i == 1) {
echo "디망쉬는 미중년";
}
else ($i == 3) {
echo "디망쉬는 소녀?";
}

라고 바꿔버립니다. 물론 이런 짓은 어리석다면 어리석고 지나치다면 지나칠 수 있습니다.
하지만 중요한 것은 습관과 인식이겠죠. :]
(제가 예전에 C 로 유틸리티 짤 때 메모리 소비를 심하고 속도도 다른이의 것보다 느려서 다시 코딩하던 기억이
있습니다. 도스 시절이죠. 그런 탓에 좀 유별납니다 --;)


그런 의미에서 답신글은 위의 4가지 모두를 위배할 수 있는 요소를 갖추고 있습니다.
제가 강좌에서 제시한 소스에서의 답신글 관련 루틴도 최적화 하지 않아서 지저분한 편이죠.

물론 이것을 좀 더 깔끔하게 최적화한다면 더 나아질 것입니다.
하지만 답신글이라는 것은 결국 서버에 적든 크든 부하를 주는 편입니다.

비록 그 정도는 크지 않으나 최적화하면 충분히 효과를 볼 수 있는 부분은 반드시 최적화한다면 게시판은 점 점 빨라질 것입니다.

그런 의미에서 답신글 기능은 머리를 많이 굴리고 손을 많이 쓸 수록 빨라지고 좀 더 효율적으로 변합니다.

제가 이번 편에서 의도하고 싶은 것은 바로 이점입니다. :]

에헤헤. 가벼운 내용을 무게잡으며 쓰려한 만행의 최후인지, 글이 매우 들떠있군요. ^^;

허접한 이번 회는 이렇게 끝나고 말았습니다.
요즘 제 일의 양이 2000년 1월부터 지금까지 중 가장 절정을 이루고 있는 터라 강좌를 쓰고 다듬지를 않아서 매우 지저분합니다.
이점 심각하게 반성을 하고 있지만 좀처럼 나아지진 않는군요. ^^;

이제 게시판 제작의 고지는 사실상 끝을 향해있습니다.
7월 20일에 나머지 '소'와 '년'편을 한 번에 올리겠습니다. :]

----------------------------
함께하면 즐거운 사이트들 (-_-; 광고임 -_-;)
http://game.creple.com/delthia
http://creple.com
http://coco.st
----------------------------


- ?! 디망쉬

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,041 명
  • 현재 강좌수 :  35,855 개
  • 현재 접속자 :  109 명