반응형

오늘은 게시판 별 카테고리(type)을 주어 다중 게시판을 만들어 보고자 한다. 

 

1. Sql 테이블 생성

 

테이블 생성

 

다중게시판을 위해 Board_type으로 게시판을 나눈다. 

 

2. VO객체 생성

 

public class BoardVO {
	private int board_no;
	private String board_title;
	private String board_writer;
	private String board_content;
	private int board_hit;
	private int board_like;
	private int board_hate;
	private String board_img;
	private String board_img_path;
	private int board_type;
	private Timestamp board_regdate;
}

vo 객체 생성 뒤 페이징 및 검색을 위한 객체 생성

 

@Getter
@Setter
public class PageVO {

	//사용자가 선택한 페이지 정보를 담을 변수.
	private int pageNum;
	private int countPerPage;
	
	//검색에 필요한 데이터를 변수로 선언.
	private String keyword;
	private String condition;
	
	public PageVO() {
		this.pageNum = 1;
		this.countPerPage = 5;
	}
	
}

페이징을 위한 다음 이전 등 버튼 개수를 위한 클래스 제작

 

@Setter
@Getter
@ToString
public class PageCreator {
	
	private PageVO paging;
	private int articleTotalCount;
	private int endPage;
	private int beginPage;
	private boolean prev;
	private boolean next;
	
	private final int buttonNum = 5;
	
	
	private void calcDataOfPage() {
		
		endPage = (int) (Math.ceil(paging.getPageNum() / (double) buttonNum) * buttonNum);
		
		beginPage = (endPage - buttonNum) + 1;
		
		prev = (beginPage == 1) ? false : true;
		
		next = articleTotalCount <= (endPage * paging.getCountPerPage()) ? false : true;
		
		if(!next) {
			endPage = (int) Math.ceil(articleTotalCount / (double) paging.getCountPerPage()); 
		}
		
	}
	
	//컨트롤러가 총 게시물의 개수를 PageCreator에게 전달한 직후에 
	//바로 페이징 버튼 알고리즘이 돌아갈 수 있도록 setter를 커스텀.
	public void setArticleTotalCount(int articleTotalCount) {
		this.articleTotalCount = articleTotalCount;
		calcDataOfPage();
	}

}

 

jsp (view) 제작

 

<body>
	<header id="header">
		<%@ include file="../include/header.jsp"%>
	</header>



	<section>
		<div class="body-box">
			<div class="row">

				<div class="titlebox">
					<c:choose>
						<c:when test="${type == 1}">
							<h2>사기업게시판</h2>
						</c:when>
						<c:when test="${type == 2}">
							<h2>공기업게시판</h2>
						</c:when>
						<c:when test="${type == 3}">
							<h2>아시아게시판</h2>
						</c:when>
						<c:when test="${type == 4}">
							<h2>유럽게시판</h2>
						</c:when>
						<c:when test="${type == 5}">
							<h2>남미게시판</h2>
						</c:when>
						<c:when test="${type == 6}">
							<h2>북미게시판</h2>
						</c:when>
						<c:when test="${type == 7}">
							<h2>아프리카게시판</h2>
						</c:when>
						<c:when test="${type == 8}">
							<h2>국가자격증게시판</h2>
						</c:when>
						<c:when test="${type == 9}">
							<h2>민간자격증게시판</h2>
						</c:when>
						<c:when test="${type == 10}">
							<h2>어학게시판</h2>
						</c:when>
						<c:when test="${type == 11}">
							<h2>자유게시판</h2>
						</c:when>
						<c:when test="${type == 12}">
							<h2>취뽀게시판</h2>
						</c:when>
						<c:when test="${type == 13}">
							<h2>취업게시판</h2>
						</c:when>
						<c:when test="${type == 14}">
							<h2>자격증게시판</h2>
						</c:when>
						<c:when test="${type == 15}">
							<h2>자소서게시판</h2>
						</c:when>



					</c:choose>
				</div>
				<hr>



				<div class="search-wrap">

					<div id="search_box">
						<form action=<c:url value="/board/JBoardList"/>>
							<input type="hidden" name="board_type" value="${type}" />
							<div class="search-wrap clearfix">
								<select class="form-control search-select" name="condition">
									<option value="board_title"
										${pc.paging.condition == 'board_title' ? 'selected' : ''}>제목</option>
									<option value="board_content"
										${pc.paging.condition == 'board_content' ? 'selected' : ''}>내용</option>
									<option value="board_writer"
										${pc.paging.condition == 'board_writer' ? 'selected' : ''}>작성자</option>
								</select> <input type="text" name="keyword"
									class="form-control search-input" value="${pc.paging.keyword}">
								<button type="submit" class="btn btn-info search-btn">검색</button>
							</div>
						</form>
					</div>
				</div>
				<table>
					<colgroup>

						<col class="no">
						<col class="title">
						<col class="writer">
						<col class="date">
						<col class="count">
						<col class="like">
					</colgroup>
					<thead>
						<tr>

							<th>번호</th>
							<th>제목</th>
							<th>작성자</th>
							<th>작성일</th>
							<th>조회</th>
							<th>추천</th>
						</tr>
					</thead>
					<tbody>

						<c:forEach var="vo" items="${boardList}">
							<tr>
								<td>${vo.board_no}</td>
								<td><a href="<c:url value ='/board/JBoardDetail?board_no=${vo.board_no}&board_type=${type}'/>">${vo.board_title} (${count})</a></td>
								<td><a href="#" id="modal-writer1">${vo.board_writer}</a></td>
								<td>${vo.board_regdate}</td>
								<td>${vo.board_hit}</td>
								<td>${vo.board_like}</td>
							</tr>
						</c:forEach>



					</tbody>
				</table>
				<a href=<c:url value="/board/JBoardWrite?board_type=${type}"/> class="myButton">글쓰기</a>



				<form action=<c:url value="/board/JBoardList?board_type=${type}"/>
					name="pageForm">
					<div class="text-center clearfix">
						<hr>
						<ul class="pagination" id="pagination">
							<c:if test="${pc.prev}">
								<li><a href="#" data-pageNum="${pc.beginPage-1}">이전</a></li>
							</c:if>

							<c:forEach var="num" begin="${pc.beginPage}" end="${pc.endPage}">
								<li class="${pc.paging.pageNum == num ? 'active' : ''}"><a
									href="#" data-pageNum="${num}">${num}</a></li>
							</c:forEach>

							<c:if test="${pc.next}">
								<li><a href="#" data-pageNum="${pc.endPage+1}">다음</a></li>
							</c:if>
						</ul>

						<!-- 페이지 관련 버튼을 클릭 시 같이 숨겨서 보낼 값 -->
						<input type="hidden" name="board_type" value="${type}">
						 <input type="hidden" name="pageNum" value="${pc.paging.pageNum}">
						<input type="hidden" name="countPerPage"value="${pc.paging.countPerPage}">
						<input type="hidden" name="keyword" value="${pc.paging.keyword}"> 
						<input type="hidden" name="condition" value="${pc.paging.condition}">


					</div>
				</form>
			</div>
		</div>
		</div>

		<!--쪽지모달-->


		<div class="modal_wrap">


			<div class="modal-contnet">
				<div class="mini-title">작성자님에게 보내는 쪽지</div>
				<textarea class="modal-txtcontent" rows="4" cols=25"></textarea>
				<button class="send-modalBtn">
					<a href="#">보내기</a>
				</button>
				<button class="close-modalBtn">
					<a href="#">닫기</a>
				</button>
			</div>


		</div>



	</section>


	<footer id="footer">
		<%@ include file="../include/footer.jsp"%>
	</footer>
</body>

 

tittle_box에서 jstl로 게시판을 구분해준다. 

이건 헤더에서도 마찬가지로 구분해준다. 

 

대략 요론 페이지가 나온다.

sql문을 만들자!

 

  		<sql id="search">
		<if test="paging.condition == 'board_title'">
			and board_title LIKE '%'||#{paging.keyword}||'%'
		</if>
		<if test="paging.condition == 'board_content'">
			and board_content LIKE '%'||#{paging.keyword}||'%'
		</if>
		<if test="paging.condition == 'board_writer'">
			and board_writer LIKE '%'||#{paging.keyword}||'%'
		</if> 

	</sql>	
    
    <select id="getJBoard" resultType="com.community.shy.board.command.BoardVO" >
		
		select * from
		(
		select rownum as rn , tbl. * from
		(
		SELECT * FROM job_board 
		where board_type = #{board_type}
		<include refid="search" />
		ORDER BY Board_no DESC
		)tbl
		)
		<![CDATA[
		WHERE rn > (#{paging.pageNum ,jdbcType=VARCHAR} - 1) * #{paging.countPerPage,jdbcType=VARCHAR}
		AND rn <= #{paging.pageNum,jdbcType=VARCHAR} * #{paging.countPerPage,jdbcType=VARCHAR}
		]]>
		
	</select>

search라는 이름으로 검색을 할수 있게 해주었다. 

where절에 board_type으로 구분해준다. 

view에서 파라미터 값으로 type을 전달해 줄것이다. 

이떄 sql문 board_type으로 구분을 해준다. 

 

그 뒤 페이징을 통해 처음에 구성해준 countparpage를 통해 몇개의 열이 화면에 보여줄지를 결정하게 된다. 

 

컨트롤러 구성

@Controller
@RequestMapping("/board")
public class BoardController {

	@Autowired
	private IBoardService service;

	
	@GetMapping("/JBoardList")
	public String BoardList(int board_type , PageVO paging ,Model model) {
		System.out.println("리스트 페이지 입니다. ");
		
		System.out.println("검색어: " + paging.getKeyword());
		System.out.println("검색 조건: " + paging.getCondition());
		
		PageCreator pc = new PageCreator();
		System.out.println(paging);
		pc.setPaging(paging);
		pc.setArticleTotalCount(service.getJTotal(paging, board_type));
		
		model.addAttribute("boardList", service.getJBoard(board_type, paging));
		model.addAttribute("type", board_type);
		model.addAttribute("pc", pc);
		System.out.println(pc);
		
		return "/board/JBoardList";
		
				
	}

컨트롤러에서는 board_type과 page에 대한 정보를 받고 model객체로 감싸 view에 뿌려준다. 

 

@Service
public class BoardService implements IBoardService {
	
	@Autowired
	private IBoardMapper mapper; 
	
	@Override
	public List<BoardVO> getJBoard(int board_type, PageVO paging) {
		List<BoardVO> list = new ArrayList<BoardVO>();
		
		Map<String, Object> data = new HashMap<>();
		data.put("board_type", board_type);
		data.put("paging", paging);
		
		return mapper.getJBoard(data);
	}

서비스 구분 2개의 파라미터를 전달을 해주기위해 map으로 포장해준다. 

 

인터페이스 메퍼에서는 map 타입으로 전달 받는다. 

public interface IBoardMapper {
//	게시판 구분 
	List<BoardVO> getJBoard(Map<String, Object> data)

그 후 

이렇게 더미데이터를 몇개 넣어주면

 

대략 요론 페이지가 나온다.

페이징을 통한 여러 게시판이 완성이 된다!

 

https://github.com/MoonSeokHyun/JobJob_community

 

GitHub - MoonSeokHyun/JobJob_community

Contribute to MoonSeokHyun/JobJob_community development by creating an account on GitHub.

github.com

 

반응형

+ Recent posts