지금까지 Spring 환경 설정 및 개념들을 토대로 아주아주 간단한 게시판을 하나 만들어 보고자 한다.
최종 구조는 다음과 같이 될 것이다.
<<구조>>
간단하다. 앞서 한 것처럼 Controller > Service > Dao > XML > JSP 이렇게만 있으면 된다.
Spring 설정 및 구조에 대해 알지 못하거나, 이해하지 못하신 분들은 앞선 포스팅을 참조해주시길 바랍니다.~~~
(1) DB TABLE 생성
필자는 DB ORACLE 을 사용. version은 아래 사진 참고.
db version 확인은 select * from v$version; 으로 확인하면 된다.
CREATE TABLE "DEV_PORTLET"."BOARD_MAIN_TEST"
( "BRD_TYPE" VARCHAR2(20 BYTE),
"BRD_CD" VARCHAR2(10 BYTE),
"DOCNUM" NUMBER primary KEY,
"ADD_USR_NM" VARCHAR2(150 BYTE),
"TITLE" VARCHAR2(1000 BYTE),
"CONTENTS" CLOB,
"ATTACH" CHAR(1 BYTE) DEFAULT 'N',
"DEL_CONF" CHAR(1 BYTE) DEFAULT 'N',
"VIEWCOUNT" NUMBER DEFAULT 0
);
COMMENT ON COLUMN "DEV_PORTLET"."BOARD_MAIN_TEST"."BRD_TYPE" IS '게시판타입';
COMMENT ON COLUMN "DEV_PORTLET"."BOARD_MAIN_TEST"."BRD_CD" IS '게시판코드';
COMMENT ON COLUMN "DEV_PORTLET"."BOARD_MAIN_TEST"."DOCNUM" IS '게시물번호';
COMMENT ON COLUMN "DEV_PORTLET"."BOARD_MAIN_TEST"."ADD_USR_NM" IS '등록자명';
COMMENT ON COLUMN "DEV_PORTLET"."BOARD_MAIN_TEST"."TITLE" IS '제목';
COMMENT ON COLUMN "DEV_PORTLET"."BOARD_MAIN_TEST"."CONTENTS" IS '내용';
COMMENT ON COLUMN "DEV_PORTLET"."BOARD_MAIN_TEST"."ATTACH" IS '첨부여부';
COMMENT ON COLUMN "DEV_PORTLET"."BOARD_MAIN_TEST"."DEL_CONF" IS '게시글삭제여부';
COMMENT ON COLUMN "DEV_PORTLET"."BOARD_MAIN_TEST"."VIEWCOUNT" IS '조회수';
보통, 프로젝트에서는 게시판의 DEL_CONF 값 같은걸 컬럼으로 생성하여, 게시글 삭제시 게시물을 DB에서 삭제하는게 아닌 컬럼 값만을 변경하여 목록에 안보이게 한다.
DATA의 중요성, 보존가능성 등 여러가지 이유 때문이다.
(2) 시퀀스 생성
각 게시글은 게시글 마다 고유한 KEY값을 가져야 한다. 여기서는 DOCNUM이라고 명칭했다.
그걸 위해 시퀀스를 생성한다.
시퀀스에 대한 개념 및 내용은 여기 참조 > http://mkil.tistory.com/218
CREATE SEQUENCE SEQ_BOARD_MAIN_TEST_IDX
START WITH 1
INCREMENT BY 1
NOMAXVALUE
NOCACHE;
COMMIT; /* COMMIT은 자주하는 습관을 가지자! */
(3) Controller 구현
ModelMap을 통해 데이터와 뷰를 같이 리턴하겠습니다.
list라는 키값으로 service를 통해 가져온 data를 넣어주고 boardMain.jsp를 return해주었습니다.
@Controller
public class BoardController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
@Autowired
private boardService boardService;
/**
* boardMain화면
*/
@RequestMapping(value = "/boardMain")
public ModelAndView boardMain(Map param) {
ModelMap model = new ModelMap();
List
(4) Service 구현
@Service
public class boardService {
@Autowired
private boardDao boardDao;
public List
(5) Dao 구현
@Repository
public class boardDao {
@Autowired
@Resource(name="sqlSession")
private SqlSessionTemplate sqlsession;
@SuppressWarnings("unchecked")
public List selectList(Map param) {
List result = sqlsession.selectList("boardSql.selectList",param);
return result ;
}
}
(6) XML 구현
<mapper namespace="boardSql">
<select id="boardSql.selectList" parameterType="java.util.HashMap" resultType="java.util.HashMap">
SELECT BRD_TYPE,
BRD_CD,
DOCNUM,
ADD_USR_NM,
TITLE,
CONTENTS,
ATTACH,
DEL_CONF,
VIEWCOUNT
FROM BOARD_MAIN_TEST
ORDER BY DOCNUM DESC
</select>
</mapper>
(7) JSP 구현
컨트롤러에서 ModelMap을 사용해 list라는 키값으로 데이터를 가져왔었다.
그 데이터 출력을 위해 JSTL을 사용하였다.
<c:choose> 구문으로 Data값이 있을때와 없을때의 템플릿을 다르게 주었고,
<c:forEach> 구문으로 ${list} 가져온 list를 담아 var="resultList" 에서 resultList라는 이름으로 사용하겠다고 정의해 주었다.
따라서 resultList라는 이름으로 가져온 데이터의 컬럼 하나하나 접근이 가능해졌다.
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
</head>
<body>
<table class="tbl_port" style="border: 1px solid #ccc">
<caption style="background-color: #ccc">목록</caption>
<colgroup>
<col width="10%" />
<col width="*"/>
<col width="15%"/>
<col width="10%"/>
</colgroup>
<thead>
<tr>
<th scope="col">글번호</th>
<th scope="col">제목</th>
<th scope="col">작성자</th>
<th scope="col">조회수</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${fn:length(list) > 0}">
<c:forEach items="${list}" var="resultList">
<tr>
<th><a href="#">${resultList.DOCNUM}</a></th>
<th><a href="#">${resultList.TITLE}</a></th>
<td>${resultList.ADD_USR_NM}</td>
<td>${resultList.VIEWCOUNT}</td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="3">조회된 결과가 없습니다.</td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</body>
</html>
(8) 1차 결과 확인
결과를 확인해보면 다음과 같이 나온다. 당연하다.
테이블을 생성하고나서 아무 데이터가 없기 때문이다.
가져온 데이타의 list 갯수가 0이기 때문에 처음 조건문이 아닌 <c:otherwise>의 조건에 맞아 다음 템플릿이 출력된 것이다.
(9) DATA Insert
2개의 데이터만 insert 해보면..... SQL로 직접 INSERT
시퀀스를 사용하여 생성했습니다.
insert into BOARD_MAIN_TEST (BRD_TYPE,BRD_CD,DOCNUM,ADD_USR_NM,TITLE,CONTENTS,ATTACH,DEL_CONF,VIEWCOUNT)
values ('TEST','00001',SEQ_BOARD_MAIN_TEST_IDX.NEXTVAL,'Admin','test글 제목','test글 컨텐츠입니다~~~~~~~~~~','N','N',0);
(10) 2차 결과 확인
Controller에서 찍어본 Data 결과는 다음과 같았고
[{DEL_CONF=N, ATTACH=N, VIEWCOUNT=0, TITLE=test글 제목2, DOCNUM=2, BRD_TYPE=TEST, BRD_CD=00001, ADD_USR_NM=Admin, CONTENTS=oracle.sql.CLOB@6f9e86f5}, {DEL_CONF=N, ATTACH=N, VIEWCOUNT=0, TITLE=test글 제목, DOCNUM=1, BRD_TYPE=TEST, BRD_CD=00000, ADD_USR_NM=Admin, CONTENTS=oracle.sql.CLOB@6c4cac52}]
이렇게 게시판이 생성된 결과를 확인할 수 있었다 !
보통 추가 될 기본적인 사항들은 수정 & 삭제 & 글쓰기 & 상세보기 와 페이징 처리 등이다. 하나하나 살을 붙여서 개발하면 되는 것이다......
게시판 별.거.없.다. (깊이 들어가면 게시판도 어려워지지만...................)