Microsoft MVP성태의 닷넷 이야기
성태의 게시판 구현이론: SysnetBoard [링크 복사], [링크+제목 복사]
조회: 3493
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

성태의 게시판 구현 이론: SysnetBoard
제목 게시판 설계 이론
라이선스 Free
구현예 SYS.NET 에 있는 모든 게시판
비교 모델 데브피아 게시판
비교 모델 문제점

게시판을 만들어야 할 일이 있었는데. 쉽게 안되어서 기존 게시판 구현을 참고를 해보았습니다. 제가 본 것 중에 UI적으로 가장 잘 되어 있는 "데브피아"를 그 모델로 했는데요. 공개된 소스를 보고 좀 당혹스러웠습니다. 크게 2가지 문제가 있더군요.

** 첫 번째 문제 **
페이지 기능을 구현하는 부분에서.
예를 들어 첫 번째 페이지에 해당하는 10개의 게시물을 보여주기 위해서
SELECT TOP 10 * FROM Board1 WHERE ...
이라고 하고, 두 번째 페이지에 해당하는 10개 게시물을 보여주기 위해서,
SELECT TOP 20 * FROM Board1 WHERE ...

그렇다면. 10번째 페이지에 해당하는 10개 게시물을 보여주기 위해서,
SELECT TOP 100 * FROM Board1 WHERE ...
이라고 해야 되는 것입니다.

상당히 비효율적이죠. 보통 DB Server와 Web Server가 분리되어 있음을 생각해 볼 때, 필요 이상의 데이터가 LAN을 타고 흐르니 수많은 사용자가 쓰는 게시판에서는 해답이 아닐 것 같습니다.

** 두 번째 문제 **
게시판은 일반 업무용 리스트와는 성격이 좀 다릅니다. 예를 들어, 사원 관리 리스트라면, 입사한 순서대로 해서 쌓이는 형태이기 때문에, SELECT TOP 20으로 해서 마지막 10번째는 입사 순으로 마지막에서 10~20번째의 사원일 수 있습니다. 하지만, 답변 글이 있는 게시판에서는 상황이 완전히 다릅니다. 글을 쓴 순서대로 "루트" 글들이 쌓이지만, 시간이 지나서 글의 도중에 답변 글이 달리게 되면 "IDENTITY" 순으로 글을 보여주면 안되고 답변 글이 도중에 달린 형태로 재정렬해서 보여주어야 합니다. 더군다나 답변 글의 깊이에 따라서 "들여쓰기"도 해주어야죠.

데브피아 게시판 소스를 보면서, 그런 "트리" 유형의 게시판 리스트를 한 번의 SELECT 구문으로 처리하는 것에 대해서 의구심이 생겼습니다. re_level, ref, step만으로는 불가능한 것이죠. 이것에 대해서는 데브피아에 제가 관련글을 올려두었습니다. http://www.devpia.com/Forum/BoardView.aspx?no=2189&page=5&Tpage=77&forumname=bug_report&iddlpage=30&stype=&answer=&cttype=

여기서 잠깐 소개를 하면, 다음과 같은 순서로 하나의 스레드에 대해서 답변 글을 달아가면 데브피아의 SELECT 방식으로는 순서가 맞지 않게 됩니다.

0
     1
           8
                  13
                          16 --- 오류 쓰레드 
          15
     2
           6 
                  10 
                          11 
          14 
     4

위와 같은 순으로 글을 쓰면, SELECT해서 나온 페이지 리스트 구성은 다음과 같이 됩니다.

    0
            1
                    8
                             13
                    
                   15
                              16   -- 오류 스레드
           2
                   6
                             10
                                       11
                 14
          4

16번의 글이 13번의 답변 글로 오는 것이 아니라, 15번 글의 답변 글로 오는 것입니다.


문제점이 해결된 게시판 구현 시간이 없어서, 저도 일단 그렇게 구현을 했습니다. 그래도 어쨌든 생각할수록 답이 아니라는 느낌이 들더군요. 그래서 좀 더 개선을 해보기로 했습니다.

우선 목표는 딱 2가지였습니다.

1. 단 한 번의 SELECT 문으로 게시물의 리스트를 정확히 받아올 것.
2. 페이지 크기만큼의 데이터만 받아올 것.

분석을 하면서...
트리 유형의 게시판을 한 번의 SELECT로 보여주기 위해서는 데브피아처럼 3개의 필드만으로는 불가능하다는 결론에 도달했습니다. 제 분석으로는 다음과 같은 필드 4개가 필요했습니다.

ㄱ. 스레드의 가장 첫 번째 글을 표현하는 필드: rootwid
ㄴ. 스레드의 부모글을 표현하는 필드: parentwid
ㄷ. 스레드상에서의  글의 들여쓰기: threadlevel
ㄹ. 스레드상에서의 글의 화면 표시 순서: threadno

자, 이제 위의 필드를 가지고 다음과 같은 순서로 글이 씌여진 경우를 표현해 보겠습니다.

3
      5
             7
0
       1
              8
                       13
                                16
             15
                       17
             18
       2
              6
                        10
                                11
             14
       4

내용이 좀 길게 되겠지만, 이해를 돕기 위해서 하나씩 추적해 보겠습니다.


0번글 삽입
 
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
 
1번글 삽입(0번 글의 답변)
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           (부모 parentwid 글의 threadno + 1)
                                                                                     (threadlevel은 부모 threadlevel + 1)
(0 -> 1번 글 순서로 화면에 표시)
2번 글 삽입(0번 글의 답변)
 
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    2          (부모도 같고, 같은 레벨의 글의 threadno + 1)
 
(0 -> 1-> 2번 글 화면표시)
 
3번 글 삽입(새로운 루트)
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    2  
    3               3                0          0                    0

 
4번 글 삽입

                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    2  
    3               3                0          0                    0
    4               0                0          1                    3  (부모도 같고, 같은 레벨의 글의 threadno + 1)

 
5번 글 삽입

                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    2  
    3               3                0          0                    0
    4               0                0          1                    3  
    5               3                3          1                    1  (부모 parentwid 글의 threadno + 1)
 
 
6번 글 삽입
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    2  
    3               3                0          0                    0
    4               0                0          1                    4  ( 3, 3 이상의 레코드들의 threadno ++ 시킵니다. )
    5               3                3          1                    1  
    6               0                2          2                    3 (부모도 같고, 같은 레벨의 글 : 없음)
                                                                       ( 자신에게 할당될 threadno 구하기 : 부모의 threadno + 1 = 3)
                                                                           (3 이상의 레코드들의 threadno ++ 시킵니다.)
                                                                           (자신의 threadno = 3 할당)
              
 

7번 글 삽입

                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    2  
    3               3                0          0                    0
    4               0                0          1                    4  
    5               3                3          1                    1  
    6               0                2          2                    3
    7               3                5          2                    2  (부모도 같고, 같은 레벨의 글 : 없음)
                                                                       ( 자신에게 할당될 threadno 구하기 : 부모의 threadno + 1 = 2)
                                                                            ( 자신의 threadno = 2 할당)
 

8번 글 삽입
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    3  ( 2, 2 이상의 레코드들의 threadno ++ 시킵니다.) 
    3               3                0          0                    0
    4               0                0          1                    5  (4, 2 이상의 레코드들의 threadno ++ 시킵니다.) 
    5               3                3          1                    1  
    6               0                2          2                    4  (3, 2 이상의 레코드들의 threadno ++ 시킵니다.) 
    7               3                5          2                    2
    8               0                1          2                    2 (부모도 같고, 같은 레벨의 글 : 없음)
                                                                        (자신에게 할당될 threadno 구하기 : 부모의 threadno + 1 = 2)
                                                                        ( 2 이상의 레코드들의 threadno ++ 시킵니다.)
                                                                        (자신의 threadno = 2 할당)
               
10번 글 삽입
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    3  
    3               3                0          0                    0
    4               0                0          1                    6  (5, 5 이상의 레코드들의 threadno ++ 시킵니다) 
    5               3                3          1                    1  
    6               0                2          2                    4  
    7               3                5          2                    2
    8               0                1          2                    2 
  10               0                6          3                    5  (부모도 같고, 같은 레벨의 글 : 없음)
                                                                        ( 자신에게 할당될 threadno 구하기 : 부모의 threadno + 1 = 5)
                                                                        (5 이상의 레코드들의 threadno ++ 시킵니다.)
                                                                        ( 자신의 threadno = 5 할당)
 
11번 글 삽입
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    3  
    3               3                0          0                    0
    4               0                0          1                    7 ( 6, 6 이상의 레코드들의 threadno ++ 시킵니다)
    5               3                3          1                    1  
    6               0                2          2                    4  
    7               3                5          2                    2
    8               0                1          2                    2 
  10               0                6          3                    5
  11               0               10         4                    6 ( 부모도 같고, 같은 레벨의 글 : 없음)
                                                                        ( 자신에게 할당될 threadno 구하기 : 부모의 threadno + 1 = 6)
                                                                        ( 6 이상의 레코드들의 threadno ++ 시킵니다.)
                                                                        ( 자신의 threadno = 6 할당)
 

13번 글 삽입
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    4 (3, 3 이상의 레코드들의 threadno ++ 시킵니다)   
    3               3                0          0                    0
    4               0                0          1                    8 ( 7, 3 이상의 레코드들의 threadno ++ 시킵니다)
    5               3                3          1                    1  
    6               0                2          2                    5 ( 4, 3 이상의 레코드들의 threadno ++ 시킵니다)   
    7               3                5          2                    2
    8               0                1          2                    2 
  10               0                6          3                    6 (5, 3 이상의 레코드들의 threadno ++ 시킵니다)
  11               0               10         4                    7 (6, 3 이상의 레코드들의 threadno ++ 시킵니다)
  13               0                 8         3                    3
                                                                          ( 부모도 같고, 같은 레벨의 글 : 없음)
                                                                       ( 자신에게 할당될 threadno 구하기 : 부모의 threadno + 1 = 3)
                                                                          ( 3 이상의 레코드들의 threadno ++ 시킵니다.)
                                                                          ( 자신의 threadno = 3 할당)
              
 
14번 글 삽입
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    4   
    3               3                0          0                    0
    4               0                0          1                    9  (8, 8 이상의 레코드들의 threadno ++ 시킵니다)
    5               3                3          1                    1  
    6               0                2          2                    5 
    7               3                5          2                    2
    8               0                1          2                    2 
  10               0                6          3                    6 
  11               0               10         4                    7 
  13               0                 8         3                    3
  14               0                 2         2                    8
                                                                    ( 부모도 같고, 같은 레벨의 글 : 6번 글)
                                                                    ( 6번 글의 (재귀) 차일드 중 가장 threadno 가 큰 것: 11번 글의 7
                                                                    ( 자신에게 할당될 threadno 구하기 : 7 + 1 = 8)
                                                                    ( 8 이상의 레코드들의 threadno ++ 시킵니다.)
                                                                    ( 자신의 threadno = 8 할당 )              
 
 
 
15번 글 삽입
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    5 ( 4,  4 이상의 레코드들의 threadno ++ 시킵니다)  
    3               3                0          0                    0
    4               0                0          1                   10  (9,  4 이상의 레코드들의 threadno ++ 시킵니다)
    5               3                3          1                    1  
    6               0                2          2                    6  (5,  4 이상의 레코드들의 threadno ++ 시킵니다)    
    7               3                5          2                    2
    8               0                1          2                    2 
  10               0                6          3                    7 ( 6,  4 이상의 레코드들의 threadno ++ 시킵니다)
  11               0               10         4                    8 ( 7,  4 이상의 레코드들의 threadno ++ 시킵니다) 
  13               0                 8         3                    3
  14               0                 2         2                    9 (8,  4 이상의 레코드들의 threadno ++ 시킵니다)
  15               0                 1         2                    4
                                                                     ( 부모도 같고, 같은 레벨의 글 : 8번 글)
                                                                     ( 8번 글의 (재귀) 차일드 중 가장 threadno가 큰 것: 13번 글의 3
                                                                     ( 자신에게 할당될 threadno 구하기 : 3 + 1 = 4)
                                                                     (4 이상의 레코드들의 threadno ++ 시킵니다.)
                                                                     (자신의 threadno = 4 할당)              
              
 

16번 글 삽입
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    6 (5,  4 이상의 레코드들의 threadno ++ 시킵니다)
    3               3                0          0                    0
    4               0                0          1                   11 (10,  4 이상의 레코드들의 threadno ++ 시킵니다) 
    5               3                3          1                    1  
    6               0                2          2                    7 (6,  4 이상의 레코드들의 threadno ++ 시킵니다)  
    7               3                5          2                    2
    8               0                1          2                    2 
  10               0                6          3                    8  (7,  4 이상의 레코드들의 threadno ++ 시킵니다)  
  11               0               10         4                    9  (8,  4 이상의 레코드들의 threadno ++ 시킵니다) 
  13               0                 8         3                    3
  14               0                 2         2                   10  (9,  4 이상의 레코드들의 threadno ++ 시킵니다) 
  15               0                 1         2                    5 (4,  4 이상의 레코드들의 threadno ++ 시킵니다)
  16               0               13         4                    4
                                                                        ( 부모도 같고, 같은 레벨의 글 : 없음)
                                                                       ( 자신에게 할당될 threadno 구하기 : 부모의 threadno + 1 = 4)
                                                                         ( 4 이상의 레코드들의 threadno ++ 시킵니다.)
                                                                         ( 자신의 threadno = 4 할당)
              
 
17번 글 삽입
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    7 ( 6,  6 이상의 레코드들의 threadno ++ 시킵니다)
    3               3                0          0                    0
    4               0                0          1                   12 (11,  6 이상의 레코드들의 threadno ++ 시킵니다)
    5               3                3          1                    1  
    6               0                2          2                    8 ( 7,  6 이상의 레코드들의 threadno ++ 시킵니다)
    7               3                5          2                    2
    8               0                1          2                    2 
  10               0                6          3                    9 (8,  6 이상의 레코드들의 threadno ++ 시킵니다) 
  11               0               10         4                   10  (9,  6 이상의 레코드들의 threadno ++ 시킵니다)  
  13               0                 8         3                    3
  14               0                 2         2                   11 (10,  6 이상의 레코드들의 threadno ++ 시킵니다)
  15               0                 1         2                    5 
  16               0               13         4                    4
  17               0               15         3                    6
                                                                         ( 부모도 같고, 같은 레벨의 글 : 없음)
                                                                   ( 자신에게 할당될 threadno 구하기 : 부모의 threadno + 1 = 6)
                                                                         ( 6 이상의 레코드들의 threadno ++ 시킵니다.)
                                                                         ( 자신의 threadno = 6 할당)
                    
 
18번 글 삽입
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    8 ( 7,  7 이상의 레코드들의 threadno ++ 시킵니다)   
    3               3                0          0                    0
    4               0                0          1                   13 (12,  7 이상의 레코드들의 threadno ++ 시킵니다)
    5               3                3          1                    1  
    6               0                2          2                    9 (8 ,  7 이상의 레코드들의 threadno ++ 시킵니다) 
    7               3                5          2                    2
    8               0                1          2                    2 
  10               0                6          3                   10 (9,  7 이상의 레코드들의 threadno ++ 시킵니다) 
  11               0               10         4                   11 (10 ,  7 이상의 레코드들의 threadno ++ 시킵니다) 
  13               0                 8         3                    3
  14               0                 2         2                   12 (11,  7 이상의 레코드들의 threadno ++ 시킵니다)  
  15               0                 1         2                    5 
  16               0               13         4                    4
  17               0               15         3                    6
  18               0                1          2                    7
                                                                        ( 부모도 같고, 같은 레벨의 글 : max( 8, 15 )번 글)
                                                                        ( 15번 글의 (재귀) 차일드 중 가장 threadno가 큰 것:17번 글의 6
                                                                        ( 자신에게 할당될 threadno 구하기 : 6 + 1 = 7)
                                                                        ( 7 이상의 레코드들의 threadno ++ 시킵니다.)
                                                                        ( 자신의 threadno = 7 할당 )              

자. 이제 되었습니다. 0번에서 18번까지의 순으로 해서 글을 삽입할 때마다 4가지 변수 값들이 어떻게 변했는 지를 보았습니다. 이제 위와 같이 구성된 것을 어떻게 단 한 번의 SELECT 구문으로 글을 나열할 수 있는지를 보이겠습니다.
 

------------- 최종 DB 결과 -------------------------------
                 rootwid parentwid  threadlevel   threadno
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    8 
    3               3                0          0                    0
    4               0                0          1                   13
    5               3                3          1                    1  
    6               0                2          2                    9 
    7               3                5          2                    2
    8               0                1          2                    2 
  10               0                6          3                   10 
  11               0               10         4                   11 
  13               0                 8         3                    3
  14               0                 2         2                   12 
  15               0                 1         2                    5 
  16               0               13         4                    4
  17               0               15         3                    6
  18               0                1          2                    7
--------  SELECT 시에  ORDER BY rootwid DESC 적용하게 되면 다음과 같이 정렬                    

                 rootwid parentwid  threadlevel   threadno
    3               3                0          0                    0 
    5               3                3          1                    1  
    7               3                5          2                    2 
    0               0                0          0                    0
    1               0                0          1                    1           
    2               0                0          1                    8 
    4               0                0          1                   13
    6               0                2          2                    9 
    8               0                1          2                    2 
  10               0                6          3                   10 
  11               0               10         4                   11 
  13               0                 8         3                    3
  14               0                 2         2                   12 
  15               0                 1         2                    5 
  16               0               13         4                    4
  17               0               15         3                    6
  18               0                1          2                    7

-------- 위의 정렬 옵션에 더해서 ORDER BY threadno를 적용하게 되면.
                 rootwid parentwid  threadlevel   threadno
    3               3                0          0                    0 
    5               3                3          1                    1  
    7               3                5          2                    2 
    0               0                0          0                    0
    1               0                0          1                    1           
    8               0                1          2                    2 
  13               0                 8         3                    3
  16               0               13         4                    4
  15               0                 1         2                    5 
  17               0               15         3                    6
  18               0                1          2                    7
    2               0                0          1                    8 
    6               0                2          2                    9 
  10               0                6          3                   10 
  11               0               10         4                   11 
  14               0                 2         2                   12 
    4               0                0          1                   13
------- 단 한 번의 SELECT  ORDER BY rootwid DESC, threadno
           으로 리스트를 구해오고, 화면에 출력 시에는 threadlevel로 들여쓰기를 하게 되면
            최종적으로 다음과 같이 출력이 됩니다.
                      
     
3
      5
             7
0
       1
              8
                       13
                                16
             15
                       17
             18
       2
              6
                        10
                                11
             14
       4


자, 위와 같이 가져오게 되었습니다. 이걸로, 정확한 스레드 순서를 보장하게 되었습니다. 이제 "2번째 문제"를 해결해 보겠습니다.

위와 같이 SELECT로 가져올 수 있게 되면, 다음과 같은 SELECT를 통해서 DB에서 한 페이지 분량만큼의 데이터만 가져올 수 있습니다.

    SELECT TOP 10 *
    FROM ( SELECT TOP 100 * FROM TestBoard ORDER BY rootwid DESC, threadno ) 
           FIRSTTABLE

    ORDER BY rootwid, threadno DESC;

우선, 100개의 게시물을 역순으로 선택한 다음, 최상위 10개를 선택해 옵니다. Devpia 식의 경우에는 내부의 SELECT TOP 100을 해서 모든 데이터를 가져오게 되는데, 위의 쿼리에서는 DB 내부에서 첫 번째 결과 ResultSet에서 또다시 최상위 게시물 10개만을 선택하여 반환하게 되는 것입니다.

즉, 단 10개의 게시물 데이터만이 DB 서버에서 웹 서버로 반환되는 것이죠. 이로써, "2번째 문제" 도 해결되었습니다.
결론 [장점]
1. 정확한 스레드 순서를 보장.
2. 단 한 번의 SELECT로 리스트를 구성
3. 네트워크 트래픽 감소

[단점]
1. INSERT 과정이 복잡해짐.
2. DELETE 과정이 복잡해짐.


INSERT와 DELETE의 횟수가 SELECT의 횟수보다 적음을 감안하면 위와 같은 방법은 충분한 효율을 제공합니다.
 
그 외 알림 사항  구현 소스까지는 제공하지 못해서 죄송합니다. 소스까지 공개하면 그다지 공부가 될 것 같지 않다는 판단에서였습니다. 하지만, 여유가 생기면 테스트 페이지로 만들어 공개를 하도록 하겠습니다. 물론, 딱히 언제라고 약속드릴 수는 없습니다. ^^;

그리고, 여러분의 의견을 기다립니다. 위의 구현 방법에서 좀 더 효율을 높일 수 있다거나 개선 사항, 버그를
 아신다면 알려주셨으면 합니다.







[최초 등록일: ]
[최종 수정일: 7/10/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




[1]  2 
NoWriterDateCnt.TitleFile(s)
37정성태6/7/2016729MSBuild Structured Log: record and visualize your builds
36정성태10/20/20062998SmallTool ver 1.0.1.2 - 변경된 점
34정성태7/27/20062388SmallTool ver 1.0.1.1 - 변경된 점
35정성태7/27/20062297    답변글 SourceGDN].0.060717.001 - 변경된 소스파일 다운로드1
33정성태7/24/20062377SmallTool ver 1.0.1.0 - 변경된 점.
32정성태6/30/20062400사용 사례 : 7. 스키마 상속 처리 (3)
30정성태6/27/20063148사용 사례 : 6. 스미카 상속 처리 (2)
29정성태6/27/20062183사용 사례 : 5. ConsoleBat.exe - Path가 설정되어 있는 Command 창 이용하기
28정성태6/27/20062612사용 사례 : 4. 스미카 상속 처리 (1)파일 다운로드1
27정성태6/27/20062481사용 사례 : 3. XSDObjectGen - partial class 생성파일 다운로드1
26정성태6/29/20062325사용 사례 : 2. XSDObjectGen - Enum 처리에 대한 기능 향상파일 다운로드1
31정성태6/29/20062467    답변글 사용 사례 : 2.1 XSDObjectGen - Enum 처리 방식 변경
25정성태6/23/20062847사용 사례 : 1. VS.NET 통합 환경에서 XSDObjectGen 실행
24정성태6/23/20062344자동 로그인 ver 1.53파일 다운로드1
22정성태6/18/20062431ST : XSDObjectGen 1.4.2.1 포함
23정성태6/18/20062414    답변글 XSDObjectGen 1.4.2.1 - 커스터마이징파일 다운로드1
20정성태1/4/20073572ST: NDoc 2.0 한글 지원 버전
21정성태5/26/20062822    답변글 [답변]: ST: NDoc 2.0 한글 지원 버전 (업데이트)
19정성태5/18/20064123ST: ROBOCOPY.exe
18정성태4/20/20062562자동 로그인 ver 1.52 [2]파일 다운로드1
11정성태2/14/20047146폴더 백업( 동기화 ) 프로그램 [5]파일 다운로드1
7정성태7/24/20033041IExtender : Internet Explorer 확장툴 [2]
8정성태8/4/20032447    답변글 제거방법
6정성태7/23/20035344성태의 사이트 로그인 보안 구현: SysnetLogin
5정성태12/24/20043493성태의 게시판 구현이론: SysnetBoard
[1]  2