[Delphi] 웹프로그래밍 #4 - 게시판 만들기

 

웹프로그래밍 04 - 게시판 만들기

새로운 프로젝트를 생성합니다.
ISAPI 프로젝트를 만들고 저장을 DelphiBoard 로 합니다.


이번엔 게시판은 DB 연결을 해야 하니 MSSQL 을 사용하기 위해 ADOConn, ADOQuery1 컴포넌트도 올려줌니다.


이번에 사용할 액션은 우선 3개 List(기본), Read(읽기), Write(쓰기) 입니다.

​HEAD 와 FOOT 만들기

웹의 HEAD 부분을 코딩합니다.

function TWebModule1.Head: String;
var
    view_html : String;
begin
    view_html := '<html>'+ sLineBreak;
    view_html := view_html + '<head>'+ sLineBreak;
    view_html := view_html + '<title>Delphi board</title>'+ sLineBreak;

    view_html := view_html + '<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">'+ sLineBreak;
    view_html := view_html + '</head>'+ sLineBreak;
    view_html := view_html + '<body>'+ sLineBreak;
    view_html := view_html + '<div class="container">'+ sLineBreak;
    view_html := view_html + '<h2>Delphi Board</h2>'+ sLineBreak;

    Result := view_html;
end;

웹의 FOOT 부분을 코딩합니다.

function TWebModule1.Foot: String;
var
    view_html : String;
begin
    view_html := '</div>'+ sLineBreak;
    view_html := view_html + '</body>'+ sLineBreak;
    view_html := view_html + '</html>'
end;

리스트(List) 액션

procedure TWebModule1.WebModule1ListAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
    Curpage : Integer;
begin
    // 게시판 리스트Action
    Curpage := Request.QueryFields.Values['PAGE'];

    // HTML 출력
    Response.Content := Head + List(Curpage) + Foot;
end;

실제 DB를 처리하는 함수는 List

function TWebModule1.List(Page: Integer): String;
var
    list_html : String;
begin
    // DB Open
    ADOConn.ConnectionString := 'DB접속 문자열';
    ADOConn.Open;

    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Text := 'SELECT * FROM BOARD'; // 나중에 PAGE 쿼리로 변경 예정
    ADOQuery1.Open;

    list_html := '<table class="table">' + sLineBreak;
    list_html := list_html + '<tr><td>번호</td>' + sLineBreak;
    list_html := list_html + '<td>제목</td>' + sLineBreak;
    list_html := list_html + '<td>작성자</td>' + sLineBreak;
    list_html := list_html + '<td>작성일</td></tr>' + sLineBreak;

    // 쿼리된 정보 뿌리기
    while not ADOQuery1.Eof do begin

        list_html := list_html + '<tr><td>' + ADOQuery1.fieldbyname('SEQ').AsString + '</td>' + sLineBreak;
        list_html := list_html + '<td><a href="DelphiBoard.dll/read?SEQ=' + ADOQuery1.fieldbyname('SEQ').AsString + '">';
        list_html := list_html + ADOQuery1.fieldbyname('TITLE').AsString + '</a></td>' + sLineBreak;
        list_html := list_html + '<td>' + ADOQuery1.fieldbyname('WRITER').AsString + '</td>' + sLineBreak;
        list_html := list_html + '<td>' + ADOQuery1.fieldbyname('REGDATE').AsString + '</td></tr>' + sLineBreak;

        ADOQuery1.Next;
    end;
    list_html := list_html + '</table>' + sLineBreak;

    ADOConn.Close;

    Result := list_html;
end;

읽기(Read) 액션

​기본 구조는 List 와 같은데 SEQ 게시물 번호를 받습니다.

procedure TWebModule1.WebModule1ReadAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
    Curpage : Integer;
    SEQ : String;
begin
    // 게시판 읽기 Action
    SEQ := Request.QueryFields.Values['SEQ'];

    // HTML 출력
    Response.Content := Head + Read(SEQ, Curpage) + Foot;
end;

실제 DB를 처리하는 함수는 Read

function TWebModule1.Read(SEQ : String; Page: Integer): String;
var
    view_html : String;
begin
    // DB Open
    ADOConn.ConnectionString := 'Provider=SQLNCLI11.1;Persist Security Info=False;User ID=sa;Initial Catalog=TEST_DB;Data Source=localhost;Password=1234';
    ADOConn.Open;

    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Text := 'SELECT * FROM BOARD WHERE SEQ = ''' + SEQ + '''';
    ADOQuery1.Open;

    view_html := '<table class="table">' + sLineBreak;
    view_html := view_html + '<tr><td>TITLE</td>' + sLineBreak;
    view_html := view_html + '<td colspan="3">' + ADOQuery1.fieldbyname('TITLE').AsString + '</td></tr>' + sLineBreak;
    view_html := view_html + '<tr><td>WRITE</td>' + sLineBreak;
    view_html := view_html + '<td>' + ADOQuery1.fieldbyname('TITLE').AsString + '</td></tr>' + sLineBreak;
    view_html := view_html + '<td>REGDATE</td>' + sLineBreak;
    view_html := view_html + '<td>' + ADOQuery1.fieldbyname('REGDATE').AsString + '</td></tr>' + sLineBreak;
    view_html := view_html + '<tr><td>CONTENT</td>' + sLineBreak;
    view_html := view_html + '<td colspan="3">' + ADOQuery1.fieldbyname('CONTENTS').AsString + '</td></tr>' + sLineBreak;
    view_html := view_html + '</table>' + sLineBreak;

    ADOConn.Close;

    Result := view_html;
end;

스크린샷


제목 링크를 클릭하면 Read 로 이동


만들다 보니 좀 코딩이 깔끔하지 않네요
시간을 내서 좀더 다듬어서 Github 에 올리겠습니다.

댓글

이 블로그의 인기 게시물

2025년 7월 다이어리

1. 대학교 축제 전시 프로젝트