본문 바로가기
Framework/Spring

[SPRING 시작-8] # 스프링 게시판을 만들어 보자! / 게시판 목록 소스 / Spring board example

by 나비와꽃기린 2016. 10. 18.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

지금까지 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.jspreturn해주었습니다.



@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> list = boardService.selectBoardList(param);

		

		logger.debug("list :::::::::::::::::::::::: " +list);

		//ModelMap model = mav.getModelMap();

		model.addAttribute("list", list); 

		return new ModelAndView("/views/boardMain", model);

		

	}


}


(4) Service 구현

@Service

public class boardService {

	

	@Autowired

	private boardDao boardDao;



	public List> selectBoardList(Map param) {

		List list=boardDao.selectList(param);

		return 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}]


이렇게 게시판이 생성된 결과를 확인할 수 있었다 ! 

보통 추가 될 기본적인 사항들은 수정 & 삭제 & 글쓰기 & 상세보기 와 페이징 처리 등이다. 하나하나 살을 붙여서 개발하면 되는 것이다......

게시판 별.거.없.다. (깊이 들어가면 게시판도 어려워지지만...................)