설명에 앞서,
이번 게시판 프로젝트는 여러 개의 테이블로 카테고리를 나누지 않고,
한 개의 테이블에 bgno라는 number 컬럼으로 카테고리를 나누었다,
게시글목록 쿼리에 where bgno = #{bgno} 를 추가해서 게시글을 카테고리 별로 나눠 출력하고,
bgno가 0일때는 해당 where문을 없애서 ( if문) ALL 카테고리를 만들었다.
[스프링] 다중 게시판 구현 (CRUD) :: 간편 웹프로그래밍 (tistory.com)
현재 공지사항 카테고리는 모든 회원이 작성할 수 있지만,
배포 전에는 관리자 계정만 공지사항 카테고리에 글을 작성할 수 있도록 수정 할 예정이다.
최근 2개의 공지사항이 모든 카테고리의 상단에 위치하도록 하는데,
만약 내가 선택한 공지사항이 표시되게 만드는 방법도 뒤에서 설명하겠다.
Mapper
<select id="notice" resultType="kr.co.vo.BoardVO" >
<![CDATA[select * from (select * from mp_board where bgno=2 order by bno desc) where ROWNUM <=2 order by BNO desc]]>
</select>
게시판테이블(mp_board)의 공지사항 카테고리(bgno=2)의 게시글을 bno( 게시판PR ) 순으로 정렬해서 가져온다.
서브쿼리를 통해 게시판PR순으로 한번 정렬하고, 그 값을 2개의 제한을 두고 가져온다.
쿼리는 간단하기도 하고, 흔한 게시글을 최신순으로 가져오는 쿼리기 때문에 설명을 줄이겠다.
DAO, DAOImpl
public List<BoardVO> notice() throws Exception;
@Override
public List<BoardVO> notice() throws Exception{
return sqlsession.selectList("boardMapper.notice");
}
여러 개의 값을 List로 값을 받아준다.
Service, ServiceImpl
public List<BoardVO> notice() throws Exception;
@Override
public List<BoardVO> notice() throws Exception{
return dao.notice();
}
Controller
/*@RequestMapping(value = "board/list", method = RequestMethod.GET)
public String list(Model model, @ModelAttribute("scri") SearchCriteria scri) throws Exception{
logger.info("list");
model.addAttribute("list", service.list(scri));
model.addAttribute("notice", service.notice());
PageMaker pageMaker = new PageMaker();
pageMaker.setCri(scri);
pageMaker.setTotalCount(service.listCount(scri));
model.addAttribute("pageMaker", pageMaker); */
model.addAttribute("notice", service.notice());
return "board/list";
}
컨트롤러 부분은 정말 간단하다..
단순한 select문이라 매개변수를 줄 필요도 없고, 페이징을 적용 할 필요도 없다.(scri)
그냥 model에 데이터를 담아서 뷰로 돌려주자..
list.jsp
<table class="table table-hover" width="100%" cellspacing="0" >
<thead class="thead-dark">
<tr>
<th>번호</th>
<th>카테고리</th>
<th width="400" >제목</th>
<th>작성자</th>
<th>등록일</th>
<th>조회</th>
<th>추천</th>
</tr>
</thead>
<c:forEach items="${notice}" var="notice">
<tr>
<td>#${notice.bno} </td>
<td><strong>공지사항</strong> </td>
<td><a href="/board/readView?bno=${notice.bno}&
bgno=2&
page=${scri.page}&
perPageNum=${scri.perPageNum}&
searchType=${scri.searchType}&
keyword=${scri.keyword}&
sort=${scri.sort}"
> <strong>[공지] ${notice.title} </strong></a></td>
<td><strong>관리자</strong></td>
<td><fmt:formatDate value="${notice.regdate}"
pattern="yyyy-MM-dd hh:mm" /></td>
<td>${notice.hit} </td>
<td>${notice.likehit} </td>
</tr>
</c:forEach>
<c:forEach items="${list}" var="list">
<tr>
<td>#<c:out value="${list.bno}" /></td>
<td>
//생략
컨트롤러에서 List형식으로 보낸 데이터를 forEach로 화면에 뿌려준다. (key = notice)
제목 - 링크에서 , 카테고리를 담당하는 bgno는 2로 고정시켜서 공지사항 카테고리에 맞춰준다.
(공지사항 게시글에 들어가서 이전글, 다음글 버튼을 누를 시 공지사항만 볼 수 있도록 )
결과
1장, 다른 카테고리에서도 공지사항 카테고리의 글 최신순 2개가 가장 상단에 올라감
(페이징 적용과 무관하기 때문에 다른 페이지로 넘어가도 계속 유지)
2장.공지사항 카테고리에 글을 작성하면 공지사항이 변경됨
간단하게 구현해보았다.
만약, 원하는 글을 공지사항으로 하고 싶다면,
- 게시판 테이블에 칼럼을 하나 추가하고 ( ex _ noticeYN), DEFAULT를 N으로 준다.
- Mapper 쿼리에서 where 문에 noticeYN = Y 를 추가한다.
- 직접 DB에서 설정하거나, 관리자 페이지에서 update 문을 이용해 원하는 게시글의 noticeYN값을 Y로 바꿔준다.
- 원하는 게시글이 공지사항으로 출력된다.
아직 관리자 페이지, 관리자 계정을 만들기 전이라 최신순으로 설정해놓았는데,
후에 관리자 관련 로직을 완성하면 추가 할 예정이다.
이미 구상을 해놓고 구현을 해서 시간이 얼마 안걸릴 거라고 생각했는데,
DAO쪽에서 오타;; 를 발견못해서 애꿏은 뷰와 컨트롤러만 건들이다가 한시간은 날려버렸다,,
블로그 포스팅 까지 하니 간단한 기능에 시간이 너무 걸려버렸다..ㅜㅜ 할 게 많은데..
비밀글같은 경우도 칼럼을 추가하고 where문과 if문을 이용해서 구분하면 간단하게 구현 할 수 있을 것 같다.
'SPRING > IceWater Community' 카테고리의 다른 글
[스프링] 게시판 이전글 다음글 읽은 글 표시 (1) | 2021.10.01 |
---|---|
[스프링]게시판 읽은 글 표시 (3) | 2021.10.01 |
[스프링] 추천기능 구현 (OKKY사이트 추천기능 참고) (4) | 2021.09.28 |
[스프링] 회원정보수정 - 회원탈퇴 (ajax) (0) | 2021.09.25 |
[스프링] 회원정보수정 - 비밀번호 (ajax) (0) | 2021.09.24 |