해야할 일
- BoardController → MemberController
- BoardService/Impl → MemberService/Impl
- BoardMapper → MemberMapper
- BoardVO/BoardPageDTO/BoardCriteria → MemberVO/MemberPageDTO/MemberCriteria
- BoardMapper.xml → MemberMapper.xml
- JSP파일 수정: list.jsp / get.jsp / register.jsp
파일 순서
- domain
- mapper / mapper.xml
- service / impl
- controller
- Board 파일들을 복사하여 Member 파일들을 만들고 변수들을 바꿔주는 작업을 한다.
- xml 파일에 쓰인 컬럼들을 Member 파일에 맞게 변환시켜 준 후 jsp 파일을 Member에 맞는 폼을 만든다.
[Board 관련 코드]
1. Board - domain (VO, DTO, Criteria)
// domain(1) BoardVO
@Data
public class BoardVO {
private int bno;
private String title;
private String content;
private String wrtier;
private Date regDate;
private Date updateDate;
}
// domain(2) BoardPageDTO
@Getter
@ToString
public class BoardPageDTO {
private int startPage;//시작페이지
private int endPage;//끝페이지
private boolean prev, next; //이전 다음
private int total;//전체 레코드수
private BoardCriteria cri;//현재페이지, 한페이지당 보여줄 갯수
private final int PAGE_NUM = 5; //아래에 나오게 할 페이지의 갯수
public BoardPageDTO(int total, BoardCriteria cri) {
this.total = total;
this.cri = cri;
this.endPage = (int)(Math.ceil(cri.getPageNum()/(PAGE_NUM*1.0)))*PAGE_NUM;
this.startPage = this.endPage - (PAGE_NUM-1);
int realEnd = (int)(Math.ceil((total * 1.0) / cri.getAmount()));
if(realEnd < this.endPage) {
this.endPage = realEnd;
}
this.prev = this.startPage > 1;
this.next = this.endPage < realEnd;
}
}
// domain(3) BoardCriteria
@Data
public class BoardCriteria {
private int pageNum; //현재페이지번호
private int amount; //한 페이지당 보여줄 게시글 수
//0527 추가
private String type;
private String keyword;
public BoardCriteria() {
this(1, 10);
}
public BoardCriteria(int pageNum, int amount) {
this.pageNum = pageNum;
this.amount = amount;
}
//사용법: Mybatis xml에서 #{pageStart} 로 사용된다.
//mySql에서 (getPageNum() -1) * getAmount()가 syntax에러가 나서 메소드로 만들어준다.
public int getPageStart() {
return (getPageNum() -1) * getAmount();
}
}
2. Board - mapper (Mapper.java, Mapper.xml)
// Mapper(1) BoardMapper.java
public interface BoardMapper {
// 목록보기
public List<BoardVO> getList();
public List<BoardVO> getListWithPaging(BoardCriteria cri);
// 등록하기
public void insert(BoardVO board);
// 읽기(특정번호)
public BoardVO read(int bno);
public int update(BoardVO board);
public int delete(int bno);
public int getListWithCnt(BoardCriteria cri);
}
// Mapper(2) BoardMapper.xml
<mapper namespace="com.kb.mapper.BoardMapper">
<select id="getList" resultType="com.kb.domain.BoardVO">
SELECT * FROM tbl_board ORDER BY bno DESC LIMIT 0, 10
</select>
<!-- WHERE 1=1 추가 0527 -->
<!-- 추가: <choose> <when> -->
<select id="getListWithPaging" resultType="com.kb.domain.BoardVO">
<![CDATA[
SELECT * FROM tbl_board
WHERE 1=1
]]>
<choose>
<when test="type == 'title'">
AND title LIKE concat('%',#{keyword},'%')
</when>
<when test="type == 'content'">
AND content LIKE concat('%',#{keyword},'%')
</when>
</choose>
<![CDATA[
ORDER BY bno DESC
LIMIT #{amount} offset #{pageStart}
]]>
</select>
<select id="getListWithCnt" resultType="int">
SELECT count(*) FROM tbl_board
WHERE 1=1
<choose>
<when test="type == 'title'">
AND title LIKE concat('%',#{keyword},'%')
</when>
<when test="type == 'content'">
AND content LIKE concat('%',#{keyword},'%')
</when>
</choose>
</select>
<!-- id=메소드명 -->
<insert id="insert">
INSERT INTO tbl_board(title, content, wrtier)
VALUES (#{title}, #{content}, #{wrtier});
</insert>
<select id="read" resultType="com.kb.domain.BoardVO">
SELECT * FROM tbl_board WHERE bno = #{bno}
</select>
<update id="update">
UPDATE tbl_board SET title = #{title}, content = #{content}, wrtier = #{wrtier}, updateDate = now()
WHERE bno = #{bno}
</update>
<delete id="delete">
DELETE FROM tbl_board WHERE bno = #{bno}
</delete>
</mapper>
3. Board - service (ServiceImpl, Service)
// service(1) Boardservice.java
public interface BoardService {
// insert
public void register(BoardVO board);
// read(int)
public BoardVO get(int bno);
//update
public boolean modify(BoardVO board);
//delete
public boolean remove(int bno);
// read(list)
public List<BoardVO> getList();
public List<BoardVO> getListWithPaging(BoardCriteria cri);
public int getListWithCnt(BoardCriteria cri);
}
// service(2) BoardServiceImpl.java
@Service
@Log4j
@AllArgsConstructor
public class BoardServiceImpl implements BoardService {
@Setter(onMethod_ = @Autowired)
private BoardMapper mapper; //mapper 객체를 만들어야 mapper로 갈거 아녀~
@Override
public void register(BoardVO board) {
log.info("register"); // 게시글 등록한다~
mapper.insert(board); // service -> mapper의 insert
// service의 register 호출하면 mapper의 insert가 딩동~
}
@Override
public BoardVO get(int bno) {
return mapper.read(bno);
}
@Override
public boolean modify(BoardVO board) {
return mapper.update(board) == 1;
}
@Override
public boolean remove(int bno) {
return mapper.delete(bno) == 1;
}
@Override
public List<BoardVO> getList() {
log.info("getList..................");
return mapper.getList(); // 전체 내용을 보여달라
}
@Override
public List<BoardVO> getListWithPaging(BoardCriteria cri) {
//전체 내용
log.info("getList..................");
return mapper.getListWithPaging(cri);
}
@Override
public int getListWithCnt(BoardCriteria cri) {
log.info("getList..................");
return mapper.getListWithCnt(cri);
}
}
4. Board - controller (Controller)
//BoardController
@RequestMapping("/board/*")
@Controller
@Log4j
@AllArgsConstructor
public class BoardController {
private BoardService service;
@RequestMapping(value = "/list", method = RequestMethod.GET)
public void list(BoardCriteria cri, Model model) {
log.info(cri);
model.addAttribute("list", service.getListWithPaging(cri));
model.addAttribute("pageMaker", new BoardPageDTO(service.getListWithCnt(cri), cri));
}
@RequestMapping(value = "/register", method = RequestMethod.GET)
public void register() {
}
// 오버로딩_메소드명은 같지만 변수명을 달리주는 것.
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(BoardVO board, RedirectAttributes rttr) {
service.register(board);
return "redirect:/board/list";
}
@RequestMapping(value = "/get", method = RequestMethod.GET)
public void get(@RequestParam("bno") int bno, Model model) {
model.addAttribute("board", service.get(bno));
}
@RequestMapping(value = "/get", method = RequestMethod.POST)
public String get(BoardVO board) {
boolean result = service.modify(board);
if(result) {
return "redirect:/board/list";
} else {
return "redirect:/board/get?bno="+board.getBno();
}
}
//GET 방식 삭제
@RequestMapping(value = "/remove", method = RequestMethod.GET)
public String remove(@RequestParam("bno") int bno) {
service.remove(bno);
return "redirect:/board/list";
}
@RequestMapping(value = "/remove", method = RequestMethod.POST)
public String remove(BoardVO board) {
service.remove(board.getBno());
return "redirect:/board/list";
}
}
[Board 관련 jsp 파일들]
1. get.jsp
<!-- JSP include -->
<%@ include file="../includes/header.jsp" %>
<div class="col-md-12">
<h4 class="m-b-lg">Board Read Page</h4>
</div><!-- END column -->
<div class="col-md-12">
<div class="widget p-lg">
<h4 style="display:inline;" class="m-b-lg">Board Read Page</h4>
<p class="m-b-lg docs">
<!-- Add <code>.table-hover</code> to enable a hover state on table rows within a <code><tbody></code>. -->
</p>
<div class="panel-body">
<!-- Get으로 온걸 Post로 넘긴다. -->
<!-- action에 값이 없는 것은 자기 자신에게로 값을 던진다. -->
<form id="frm" method="post" action="">
<input type="hidden" id="bno" name="bno" value="${board.bno }">
<div class="form-group"><label>Title</label>
<input type="text" name="title" id="title" class="form-control" value="${board.title }" required="required">
</div>
<div class="form-group"><label>Content</label>
<textarea required="required" name="content" id="content" class="form-control" style="resize:none">${board.content }</textarea>
</div>
<div class="form-group"><label>Writer</label>
<input value="${board.wrtier }" required="required" type="text" name="wrtier" id="wrtier" class="form-control" value="">
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Update</button>
<button type="button" class="btn btn-default">Cancel</button>
<button type="button" id="btn_del" class="btn btn-link pull-right">Delete</button>
</div>
</form>
</div>
</div><!-- .widget -->
</div><!-- END column -->
<script>
$(document).ready(function () {
$("#btn_del").on("click", function () {
if(confirm("정말로 삭제하시겠습니까")) {
// get방식(링크): location.href="remove?bno=${board.bno}"
// POST방식(폼)
$("#frm").attr("action", "remove");
$("#frm").submit();
}
console.log("삭제버튼" + res);
})
});
</script>
2. list.jsp
<!-- JSP include -->
<%@ include file="../includes/header.jsp"%>
<!-- JSP 액션태그 include -->
<%-- <jsp:include page="../includes/header.jsp"></jsp:include> --%>
<div class="col-md-12">
<h4 class="m-b-lg">Tables</h4>
</div>
<!-- END column -->
<div class="col-md-12">
<div class="widget p-lg">
<h4 style="display: inline;" class="m-b-lg">Board List Page</h4>
<a href="register" style="float: right;" class="btn btn-primary" role="button">Register New Board</a><br/>
<p class="m-b-lg docs">
</p>
<table class="table table-hover">
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>수정일</th>
</tr>
</thead>
<!-- var: 변수선언, items: 넘겨받는 값 -->
<c:forEach items="${list }" var="board">
<tr>
<td>${board.bno }</td>
<td><a href="get?bno=${board.bno }">${board.title }</a></td>
<!-- get 방식으로 가는 것. -->
<td>${board.wrtier }</td>
<td><f:formatDate value="${board.regDate }"
pattern="Y-M-d HH:mm:ss" /></td>
<td><f:formatDate value="${board.updateDate }"
pattern="yyyy-MM-dd HH:mm:ss" /></td>
</tr>
</c:forEach>
</table>
<div class="container-fluid">
<div class="row">
<div class="col-xs-7 pagination">
<div>
<form>
<!-- cri.type -->
<select name="type" class="form-control" style="float:left; width:21%; height:32px;">
<option value="">전체</option>
<option value="title" ${pageMaker.cri.type == "title"?"selected='selected'":""}>제목</option>
<option value="content" ${pageMaker.cri.type == "content"?"selected='selected'":""}>내용</option>
</select>
<!-- cri.keyword -->
<!-- jQuery로 안 할 거면 id 필요 없음. -->
<!-- value에다 넘어온 값 출력 -->
<input type="text" placeholder="검색어를 입력하세요" value="${pageMaker.cri.keyword }" name="keyword" class="form-control" style="float:left; width:50%;">
<button class="btn btn-default" style="float:left;">검색</button>
</form>
</div>
</div>
<div class="col-xs-5" style="text-align:right;">
<ul class="pagination">
<c:if test="${pageMaker.prev}">
<li class="paginate_button">
<a href="?pageNum=${pageMaker.startPage - 1}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
</c:if>
<c:forEach begin="${pageMaker.startPage}" end="${pageMaker.endPage}" var="num">
<li class="paginate_button">
<a href="?pageNum=${num}">${num}</a>
</li>
</c:forEach>
<c:if test="${pageMaker.next}">
<li class="paginate_button">
<a href="?pageNum=${pageMaker.endPage + 1}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</c:if>
</ul>
</div>
</div>
</div>
<!-- .widget -->
</div>
</div>
<!-- END column -->
<form id="operForm" action="" method="get">
<input type="hidden" id="pageNum" name="pageNum" value="${pageMaker.cri.pageNum }"> <input
type="hidden" name="amount" value="${pageMaker.cri.amount }">
</form>
<script>
/* e.preventDefault() 무효화 버튼, 누르면 이동해야 하는데 안 감 */
$(document).ready(function() {
$(".paginate_button a").on("click", function(e) {
e.preventDefault();
$("#pageNum").val($(this).attr("href"));
$("#operForm").submit();
});
});
</script>
3. register.jsp
<!-- JSP include -->
<%@ include file="../includes/header.jsp" %>
<!-- JSP 액션태그 include -->
<%-- <jsp:include page="../includes/header.jsp"></jsp:include> --%>
<div class="col-md-12">
<h4 class="m-b-lg">Board Register</h4>
</div><!-- END column -->
<div class="col-md-12">
<div class="widget p-lg">
<h4 style="display:inline;" class="m-b-lg">Board Register</h4>
<p class="m-b-lg docs">
<!-- Add <code>.table-hover</code> to enable a hover state on table rows within a <code><tbody></code>. -->
</p>
<div class="panel-body">
<!-- Get으로 온걸 Post로 넘긴다. -->
<!-- action에 아무것도 안 적으면 자기자신의 페이지를 부른다. -->
<form method="post" action="">
<div class="form-group">
<label>Title</label><input type="text" name="title" id="title" class="form-control" value="" required="required">
</div>
<div class="form-group">
<label>Content</label><textarea required="required" name="content" id="content" class="form-control" style="resize:none"></textarea>
</div>
<div class="form-group">
<label>Writer</label><input required="required" type="text" name="wrtier" id="wrtier" class="form-control" value="">
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button>
<button type="button" class="btn btn-link">Cancel</button>
</div>
</form>
</div>
</div><!-- .widget -->
</div><!-- END column -->
<!-- JSP include -->
<jsp:include page="../includes/footer.jsp"/>
이제 이걸 Member 관련 코드로 바꾸면 된다.
'수업정리' 카테고리의 다른 글
[소스 동냥(3)] 수업 중 springframework 한글 깨짐 (0) | 2022.06.16 |
---|---|
스프링 (2) - BoardVO, BoardController, BoardServiceImpl (0) | 2022.05.19 |
스프링 (1) (0) | 2022.05.13 |
0420 - 서버프로그램 구현_jsp(1) (0) | 2022.04.25 |