게시판 리스트는 게시판 테이블(TBL_BOARD)의 내용을 가져와 보여주는 페이지로,
SQL문의 SELECT를 실행하여 반환 받은 데이터 집합(Record Set, Result Set, List)을 화면에 출력한다.
리스트의 MVC 개념은 게시판 첫 글에서 설명하니 다시 확인하면 좋을 것이다.
먼저, 컨트롤 파일인 board1Ctr.java 파일에 다음 내용을 입력한다.
@Controller
public class board1Ctr {
@Autowired
private board1Svc boardSvc;
@RequestMapping(value = "/board1List")
public String boardList(ModelMap modelMap) throws Exception {
List<?> listview = boardSvc.selectBoardList();
modelMap.addAttribute("listview", listview);
return "board1/boardList";
}
}
board1Ctr.java
사용자가 게시판 리스트를 선택하면 board1List 컨트롤이 호출되고,
컨트롤은 서비스인 boardSvc클래스의 selectBoardList 메소드(함수)를 호출한다.
selectBoardList는 SELECT문을 실행하여
데이터 집합(Record Set)을 동적 집합인 List 클래스로
반환한다.
반환되는 데이터의 개수(행)가 5개면 List의 크기도 5개가 되며, 각 행은
boardVO 형태로 구성된다.
따라서 실제로는 다음 코드에서 List<?> 대신 List<boardVO> 로 사용하는 것이 맞지만
개인적인 편의성 때문에 이렇게 사용하고 있다.
반환 받은 리스트(listview)는 ModelMap을 이용하여 JSP로 전달된다.
즉, 리스트는 listview 변수에 담기게 되고 listview라는 이름으로 넘어가게 된다.
마지막으로 화면을 구성할 HTML이 있는 boardList.jsp 파일의 위치와 이름을 반환하게 된다.
주의] 실제 명명규칙에서는 컨트롤명(board1List), 컨트롤의 함수명(boardList),
JSP 파일명(boardList.jsp)이 일치하는
것이 좋지만,
다양한 게시판을 하나에서 처리하려다 보니 조금 다르게 부여 되었으니 혼동하지 말길….
☆ 어노테이션(Annotation)
자바(스프링)에서 클래스 사용을 쉽게 하기 위해 제공하는 방법으로 다음 4가지가 빈번하게 사용된다.
@Controller: 해당 파일이 컨트롤 파일이라고 명시
@Service: 해당 파일이 서비스 파일이라고 명시
@Autowired: 자동으로 매핑 시켜주는 것으로 컨트롤에서 서비스를 찾을 때 등에 사용
@RequestMapping: 실제 액션(URL)을 의미
상세한 내용은 Spring MVC를 찾아서 익혀두길 바란다.
다음으로 컨트롤에서 호출되는 서비스는
board1Svc.java 파일에 board1Svc 클래스 메소드(selectBoardList)로 내용은 다음과 같다.
SQL문을 호출하여 처리한 후 반환하는 역할을 하는 것으로
selectBoard1List 이름(ID)을 가진 SQL 문을 찾아서 실행하게 된다.
sqlSession은 Spring 설정(webapp/WEB-INF/applicationContext.xml)에서
지정된 SqlSessionTemplate을 사용하기 위한 변수(인스턴스)로
반환 데이터가 하나일 때는 selectOne을,
2개 이상의 집합(Result Set, List)일 때는 selectList메소드를 사용한다.
@Service
public class board1Svc {
@Autowired
private SqlSessionTemplate sqlSession;
public List<?> selectBoardList() throws Exception {
return sqlSession.selectList("selectBoard1List");
}
}
board1Svc.java
applicationContext.xml에 데이터 베이스에 대한 설정과
SQL문이 입력된 XML 파일 정보 등이 SqlSessionTemplate에 지정되어 있다.
서비스에서 호출되는 selectBoard1List는 SQL의 ID를 의미하고
board1.xml파일에 있으며 다음과 같다.
resultType이 boardVO로 되어 있다. boardVO는 반환 되는 데이터의 열(column)에 대한 정보를 의미한다.
<mapper namespace="baord1">
<select id="selectBoard1List" resultType="gu.board1.boardVO" >
SELECT BRDNO, BRDTITLE, BRDWRITER, DATE_FORMAT(BRDDATE,'%Y-%m-%d') BRDDATE
FROM TBL_BOARD
ORDER BY BRDNO DESC
</select>
</mapper>
board1.xml
이상에서 사용된 SELECT 문은 게시판 테이블(TBL_BOARD)의 모든 내용을 별다른 조건 없이 가져오고 있다.
필요한 데이터만 추출하는 것은 차차 진행할 것이다.
다만 글 번호를 큰 값 순으로 정렬(DESC)한 것은
최신 글(마지막에 작성한 글)이 리스트에서 가장 먼저 보이게 하기 위한 것이다.
[주의] 개인적인 명명 규칙으로 SQL문을 호출하는 서비스의 함수명(selectBoard1List)과
SQL의 명칭(selectBoardList)은 가급적 동일하게 부여 한다.
다만, 예제 구성상 SQL 명칭에 "1"자가 없이 작성되었다.
클래스 명들도 유사하게 명명되었는데,
앞으로 진행할 단계(board1, board2, board3 … )별로 차이가 있지만
기본적으로 같은 기능을 한다는 걸 표시하기 위한 것이다.
Mybatis의 Select 테그(<select>)는 SQL SELECT 실행을 위한 것으로
SQL의 INSERT문은 <insert> 테그를 사용해야 한다.
UPDATE와 DELETE도 동일하나
실제로는 INSERT, UPDATE, DELETE는 아무 테그나 사용해도 결과가 같다.
즉, 반환 값이 있는 것은 <select> 테그를,
없으면 <insert> 테그 등 아무 것이나 사용해도 된다.
resultType은 반환되는 클래스 타입을 나타내는 것이고
여기서 사용되지 않았지만 많이 사용되는 parameterType은
SQL문을 생성하기 위해 파라메터로 넘겨주는 클래스를 의미한다.
이외에도 많은 개념이 있지만 이 정도만 기억해 두면 될 것 같다.
SQL ID(selectBoard1List)는 프로젝트 전체에서 사용하는 고유한 이름으로
서비스에서 이 ID를 호출하여 SQL문을 실행한다.
반환되는 데이터의 구조는 boardVO.java 파일에 있으며
데이터가 저장되는 테이블(TBL_BOARD)과 유사한 구조로 되어 있다.
글번호(brdno)가 테이블에서는 숫자형이지만 boardVO에서는 문자열(String)이라는 차이가 있는데,
숫자형으로 일치시켜도 되고, 글 번호를 이용한 별도의 연산이 없어 편의를 위해 문자열로 사용하였다.
마지막으로 이렇게 추출된 데이터를
사용자에게 적절한 디자인으로 만들어 보여주는 JSP(HTML) 파일이 있다.
테그 라이브러리(taglib)인 forEach문은 주어진 데이터의 개수만큼 반복해서 실행하는 명령어로
컨트롤에서 보내온 데이터(listview)의 개수만큼 반복하여 실행한다.
즉, HTML 테이블(table) 테그의 TR을 데이터 행 개수만큼 생성하게 되고,
각 행의 열은 boardVO의 변수(brdno, brdtitle등)들을 호출하여 값을 출력(c:out)한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/JSP/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>board1</title>
</head>
<body>
<a href="board1Form">글쓰기</a>
<table border="1" style="width:600px">
<caption>게시판</caption>
<colgroup>
<col width='8%' />
<col width='*%' />
<col width='15%' />
<col width='15%' />
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>등록자</th>
<th>등록일</th>
</tr>
</thead>
<tbody>
<c:forEach var="listview" items="${listview}" varStatus="status">
<c:url var="link" value="board1Read">
<c:param name="brdno" value="${listview.brdno}" />
</c:url>
<tr>
<td><c:out value="${listview.brdno}"/></td>
<td><a href="${link}"><c:out value="${listview.brdtitle}"/></a></td>
<td><c:out value="${listview.brdwriter}"/></td>
<td><c:out value="${listview.brddate}"/></td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
boardList.jsp
테그 라이브러리인 c:url은 글읽기 컨트롤(board1Read)의 주소와 글을 읽어오는데
필요한 글번호를 파라메터로하여 링크를 생성하고,
글 제목을 클릭하면 이동하도록 링크를 추가하였다.
테그 라이브러리에서 제공되는 명령어는 많지만 본 예제에서는 다음과 같이 몇 가지만 주로 사용한다.
명령어 |
기능 |
forEach |
주어진 데이터 개수 만큼 반복 |
set |
변수를 선언하고 값 할당 |
out |
변수 값을 화면에 출력 |
if |
조건절 |
url |
URL 주소 생성 |
이상의 코드가 실행되면 HTML 생성되고 사용자에게 보여지게 된다.
웹 브라우저에서 http://localhost:8080/board/board1List를 입력하여 실행 결과를 확인하자.
웹 브라우저에서 디버그 모드(F12키 실행)로 확인하면
그림과 같이 forEach 문이 있던 자리에 HTML이 생성된 것을 확인할 수 있다.
'Java > 게시판 1' 카테고리의 다른 글
1. 기본게시판 - 준비 & 시작 (5) | 2016.03.28 |
---|---|
3. 기본게시판 - 글 쓰기 (4) | 2016.03.28 |
4. 기본게시판 - 글 읽기 (0) | 2016.03.28 |
5. 기본게시판 - 글 수정 (2) | 2016.03.28 |
6. 기본게시판 - 글 삭제 (0) | 2016.03.28 |