본격적으로 게시판을 만들 것이다.
먼저 논리의 흐름대로 만들 것이다.
먼저 데이터베이스에 들어있는 자료를 뽑아오는 조회 클래스를 만들도록 하자.
private BoardService boardService;
public BoardMainServlet() {
super();
boardService = BoardServiceImple.getInstance();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("BoardMainServlet::doGet() 호출");
// 게시글 전체 검색
List<Board> list = boardService.select();
서블릿 맵핑은 여기서는 다루지 않겠다.
주요 기능에 들어가기 이전 서비스에 접근하는 BoardService 매개변수를 미리 만들어놓도록 하자
(BoardService는 인터페이스, BoardServiceImple은 그의 기능을 구현한 형태로 만들어져 있다.)
이전 글에서도 다루었지만 Service는 게시판, 회원정보, 댓글 등과 같이 각기 다른 형태의 서비스를 제공하는 기능들을 특정 구역에 묶어두기 위한 클래스이다.
만들어주는 건 조금 수고스러울지 몰라도 유지/보수 때 큰 힘을 발휘하니 구분해놓도록 하자
(잘 이해가 안된다면 1/4의 그림을 확인하도록 하자)
지금의 BoardService는 이런 형태로 구성해 놓았다.
public interface BoardService {
public abstract int insert(Board board);
public abstract List<Board> select();
public abstract Board select(int bno);
public abstract int update(Board board);
public abstract int delete(int bno);
public abstract List<Board> select(int category, String keyword);
}
ServiceBoardImple 클래스는 이 인터페이스를 그대로 구현한 형태다
다시 doGet으로 돌아와서 BoardService의 select 메소드로 모든 게시글을 가져오도록 만들어 놓았다.
BoardService의 select 메소드를 찾아가보도록 하자
@Override
public List<Board> select() {
return boardDao.read();
} // end select()
아주 간단하다. 게시판의 기능을 서비스에 묶어놓기만 하기 위해 만든 클래스이기 때문이다.
그럼 boardDao의 read메소드로 가보도록 하자
@Override
public List<Board> read() {
ArrayList<Board> list = new ArrayList<>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// 커넥션 풀(DataSource)에서 connection을 빌려옴
conn = ds.getConnection();
// PreparedStatement(SQL 문장)을 준비
pstmt = conn.prepareStatement(SQL_SELECT_ALL);
// SQL 실행
rs = pstmt.executeQuery();
// 결과 처리
while (rs.next()) {
int bno = rs.getInt(1);
String title = rs.getString(2);
String content = rs.getString(3);
String userid = rs.getString(4);
Date regdate = rs.getTimestamp(5);
Board b = new Board(bno, title, content, userid, regdate);
list.add(b);
} // end while ()
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rs.close();
pstmt.close();
// connection을 커넥션 풀에 반환
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return list;
} // end read()
여기서 먼저 게시글의 데이터베이스 형식이다.
게시판 데이터베이스 형태는 이런 형태로 생겼기에
이 형식에 따라 conn, pstmt, rs를 이용하였다.
이 외에는 주석에 설명을 붙여놓았다.
SQL문은 Dao 인터페이스에 만들어놓은 문자열인데
public static final String SQL_SELECT_ALL =
"select * from test_board order by bno desc";
이런 형태로 생겼다.
게시판은 모통 순서대로가 아닌 내림차순으로 진행되기에 desc 형태로 넣었다.
이렇게 해서 만들어진 리턴값은 서비스 클래스를 거져
서블릿으로 데이터가 들어가게 된다.
// board-main.jsp에게 ArrayList를 전달하기 위해서
request.setAttribute("boardList", list);
// board-main.jsp 페이지로 포워드
RequestDispatcher dispatcher =
request.getRequestDispatcher("/WEB-INF/board/board-main.jsp");
dispatcher.forward(request, response);
}
이렇게 해서 리턴받은 list을 다음 jsp에 넘기기 위해
setAttribute 메소드를 이용하여 request에 붙여주도록 한다.
그다음 디스패치를 만들고 미리 만들어둔 board-main.jsp로 넘기자.
baord-main.jsp 는 매우 길다.
때문에 이 리턴값을 받는 테이블만 붙이도록 하겠다.
<table class="table table-striped">
<thead>
<tr>
<th>글번호</th>
<th>글제목</th>
<th>작성자</th>
<th>시간</th>
</tr>
</thead>
<tbody>
<c:forEach var="board" items="${boardList}">
<tr>
<td>${board.bno}</td>
<td><a href="board-detail?bno=${board.bno}">${board.title}</a></td>
<td>${board.userid}</td>
<td><fmt:formatDate value="${board.regdate}" pattern="yyyy/MM/dd HH:mm" /></td>
</tr>
</c:forEach>
</tbody>
</table>
class는 부트스트랩이니 무시하고
<thead>를 이용하여 테이블을 만든다
그후 JSTL문과 el문을 이용하여 리턴받은 list를 표현해주도록 하자.
데이터베이스에 기록되어있던 게시글이
테이블이 되어 잘 나오는 것을 확인할 수 있을것이다.
수정, 삭제 기능은 다음 페이지에서 다루도록 하겠다.
'프로그래밍 > Web' 카테고리의 다른 글
MVC Model2 패턴 / 간이 게시판 제작 기록 (3/4) (0) | 2017.11.11 |
---|---|
MVC Model2 패턴 / 간이 게시판 제작 기록 (1/4) (0) | 2017.11.11 |
MVC Model1 패턴을 적용한 JDBC 접근 방법 정리 (0) | 2017.11.11 |