수업(국비지원)/Mybatis

[MYBATIS] (MVC 2) 게시판 생성(list, board, BoardController, ShopService, BoardDao, BoardMapper)

byeolsub 2023. 4. 21. 21:14

📌 list.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- /springmvc2/src/main/webapp/WEB-INF/view/board/list.jsp --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html><head><meta charset="UTF-8">
<title>게시판 목록 보기</title>
<script>
   if ('${param.msg}') { 
	   alert('${param.msg}')
   }
</script>
</head>
<body>
<table class="w3-table-all">
  <tr><td colspan="4">${boardName} 게시판</td><td>글개수:${listcount}</td></tr>
 <c:if test="${listcount > 0}">
  <tr><th>번호</th><th>제목</th><th>글쓴이</th><th>날짜</th><th>조회수</th></tr>
  <%-- 글목록 출력 --%>
 <c:forEach var="board" items="${boardlist}">
  <tr><td>${boardno}</td>
      <c:set var="boardno" value="${boardno - 1}" />
      <td style="text-align: left;">
      <c:if test="${! empty board.fileurl}">
         <a href="file/${board.fileurl}">@</a></c:if>
      <c:if test="${empty board.fileurl}">&nbsp;&nbsp;&nbsp;</c:if>
  <c:forEach begin="1" end="${board.grplevel}">&nbsp;&nbsp;</c:forEach>
      <c:if test="${board.grplevel > 0}">└</c:if> <%-- ㅂ한자 --%> 
    <a href="detail?num=${board.num}">${board.subject}</a></td>
      <td>${board.writer}</td>
      <td><fmt:formatDate value="${board.regdate}" pattern="yyyy-MM-dd HH:mm:ss" /></td>
      <td>${board.readcnt}</td></tr>
 </c:forEach>
 
 <%-- 페이징 부분 --%>
 <tr><td colspan="5">
  <div class="w3-center w3-padding-32">
    <div class="w3-bar">
     <c:if test="${pageNum > 1}">
       <a href="list?pageNum=${pageNum - 1}&boardid=${boardid}">[이전]</a></c:if>
       <c:if test="${pageNum <= 1}">[이전]</c:if>
     <c:forEach var="a" begin="${startpage}" end="${endpage}">
         <c:if test="${a == pageNum}"><a class="w3-button w3-black" href="#">${a}</a></c:if>
         <c:if test="${a != pageNum}"> 
           <a class="w3-button w3-hover-black" 
              href="list?pageNum=${a}&boardid=${boardid}">${a}</a></c:if>
     </c:forEach>
     <c:if test="${pageNum < maxpage}">
           <a href="list?pageNum=${pageNum + 1}&boardid=${boardid}">[다음]</a></c:if>
     <c:if test="${pageNum >= maxpage}">[다음]</c:if></td></tr>
    </div>
  </div>
</c:if>

<c:if test="${listcount == 0}">
     <tr><td colspan="5">등록된 게시물이 없습니다.</td></tr>
 </c:if>
   <c:if test="${!empty param.boardid && param.boardid != '1'}">
    <tr><td colspan="5" align="right"><a href="write">[글쓰기]</a></td></tr>
   </c:if>      
   <%-- 공지사항인 경우 관리자만 글쓰기가 가능하도록 설정 --%>
   <c:if test="${empty param.boardid || param.boardid == '1'}">
     <c:if test="${loginUser.userid == 'admin'}">
     <tr><td colspan="5" align="right"><a href="write">[글쓰기]</a></td></tr>
     </c:if>
   </c:if>      
</table></body></html>

 

📌 board.java 생성

package logic;

import java.util.Date;
import org.springframework.web.multipart.MultipartFile;

public class Board {
	private int num;
	private String boardid;
	private String writer;
	private String pass;
	private String subject;
	private String content;
	private MultipartFile file1;
	private String fileurl;
	private String ip;
	private Date regdate;
	private int readcnt;
	private int grp;
	private int grplevel;
	private int grpstep;
	
	//getter,setter, toString
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getBoardid() {
		return boardid;
	}
	public void setBoardid(String boardid) {
		this.boardid = boardid;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public MultipartFile getFile1() {
		return file1;
	}
	public void setFile1(MultipartFile file1) {
		this.file1 = file1;
	}
	public String getFileurl() {
		return fileurl;
	}
	public void setFileUrl(String fileurl) {
		this.fileurl = fileurl;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	public Date getRegdate() {
		return regdate;
	}
	public void setRegdate(Date regdate) {
		this.regdate = regdate;
	}
	public int getReadcnt() {
		return readcnt;
	}
	public void setReadcnt(int readcnt) {
		this.readcnt = readcnt;
	}
	public int getGrp() {
		return grp;
	}
	public void setGrp(int grp) {
		this.grp = grp;
	}
	public int getGrplevel() {
		return grplevel;
	}
	public void setGrplevel(int grplevel) {
		this.grplevel = grplevel;
	}
	public int getGrpstep() {
		return grpstep;
	}
	public void setGrpstep(int grpstep) {
		this.grpstep = grpstep;
	}
	@Override
	public String toString() {
		return "Board [num=" + num + ", boardid=" + boardid + ", writer=" + writer + ", pass=" + pass + ", subject="
				+ subject + ", content=" + content + ", file1=" + file1 + ", fileurl=" + fileurl + ", ip=" + ip
				+ ", regdate=" + regdate + ", readcnt=" + readcnt + ", grp=" + grp + ", grplevel=" + grplevel
				+ ", grpstep=" + grpstep + "]";
	}
}

 

 📌 BoardController.java 생성

package controller;

import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import logic.Board;
import logic.ShopService;

@Controller
@RequestMapping("board")
public class BoardController {
	
	@Autowired
	private ShopService service;
	
	@RequestMapping("list")
	public ModelAndView list(Integer pageNum, String boardid, HttpSession session) {
		ModelAndView mav = new ModelAndView();
		if(pageNum == null || pageNum.toString().equals("")) {
			pageNum = 1;
		}  
		if(boardid == null || boardid.equals("")) {
			boardid = "1";
		}
		session.setAttribute("boardid",boardid);
		String boardName = null;
		switch(boardid) {
		case "1" : boardName = "공지사항"; break;
		case "2" : boardName = "자유게시판"; break;
		case "3" : boardName = "QNA"; break;
		}
		int limit = 10;
		int listcount = service.boardcount(boardid);
		List<Board> boardlist = service.boardlist(pageNum,limit,boardid);
		
		int maxpage = (int)((double)listcount/limit + 0.95);
		int startpage = (int)((pageNum/10.0 + 0.9) -1) * 10 + 1;
		int endpage = startpage + 9;
		if(endpage > maxpage) endpage = maxpage;
		int boardno = listcount - (pageNum - 1) * limit;
		
		mav.addObject("boardid",boardid);
		mav.addObject("boardName",boardName);
		mav.addObject("pageNum",pageNum);
		mav.addObject("maxpage",maxpage);
		mav.addObject("startpage",startpage);
		mav.addObject("endpage",endpage);
		mav.addObject("listcount",listcount);
		mav.addObject("boardlist",boardlist);
		mav.addObject("boardno",boardno);
		return mav;
	}
}

📌 ShopService.java 내용 추가

package logic;

import java.io.File;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import dao.ItemDao;
import dao.SaleDao;
import dao.SaleItemDao;
import dao.UserDao;

/*
 *  @Component : 해당 클래스를 객체화
 *     - Service 기능 : Controller 와 Model사이의 중간 역할의 클래스
 */

@Service //@Component + Service 기능
public class ShopService {
	@Autowired //현재 내 컨테이너(객체)들 중에 itemDao 객체를 주입.
	private ItemDao itemDao;
	@Autowired
	private UserDao userDao;
	@Autowired
	private SaleDao saleDao;
	@Autowired
	private SaleItemDao saleItemDao;
	
	public List<Item> itemList() { 
		return itemDao.list();
	}

	public Item getItem(Integer id) {
		return itemDao.getItem(id);
	}
//db에 내용 저장. 파일 업로드.
//item : 저장 정보. 입력된 파라미터 값 + 업로드 된 파일의 내용	
	public void itemCreate(@Valid Item item, HttpServletRequest request) {
		//item.getPicture() : 업로드 된 파일의 내용
		if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
			String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
			uploadFileCreate(item.getPicture(), uploadPath); //업로드 구현 완료
			item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름
		}
		//maxid : item테이블 중 최대 id 값
		int maxid = itemDao.maxId(); 
		item.setId(maxid+1);
		itemDao.insert(item);
	}

	private void uploadFileCreate(MultipartFile file, String uploadPath) {
		//uploadPath : 파일이 업로드 되는 폴더
		String orgFile = file.getOriginalFilename(); //업로드 된 파일의 이름
		File fpath = new File(uploadPath);
		if(!fpath.exists()) fpath.mkdirs(); //업로드 폴더를 생성(없으면)
		try { 
			//파일의 내용 => uploadPath + orgFile 로 파일 저장
			file.transferTo(new File(uploadPath + orgFile)); //파일업로드
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

	public void itemUpdate(Item item, HttpServletRequest request) {
		System.out.println(item);
		//item.getPicture() : 업로드 된 파일의 내용
		if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
			String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
			uploadFileCreate(item.getPicture(), uploadPath); //파일 업로드 : 업로드된 내용을 서버에 파일로 저장
			item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름을 db에 등록하기 위해 설정
		}
		itemDao.update(item);
	}

	public void itemDelete(Integer id) {
		 itemDao.delete(id);
	}

	public void userInsert(@Valid User user) {
		userDao.insert(user);
	}
	
	public User getUser(String userid) {
		return userDao.selectOne(userid);
	}

	public void userUpdate(@Valid User user) {
		userDao.update(user);
	}

	public void userDelete(String userid) {
		userDao.delete(userid);
		
	}

	public void userChgPass(String userid, String pass) {
		userDao.chgpass(userid,pass);
	}

	public String getSearch(User user, String url) {
		return userDao.search(user, url);
	}

	public List<User> userlist() {
		return userDao.list();
	}
/*
 * 로그인 정보, 장바구니 정보에서 sale, saleitem 테이블에 데이터 저장
 *  결과를 Sale 객체로 저장
 *  1. sale 테이블의 saleid의 최대 값 조회
 *  2. sale 테이블에  최대값+1, userid,sysdate 등록
 *  3. Cart 데이터에서 saleitem 데이터 추출. insert
 *  4. saleitem 정보를 sale객체에 모든 데이터 저장
 *  5. sale 데이터 리턴  
 */
	public Sale checkend(User loginUser, Cart cart) {
		//1. sale 테이블의 saleid의 최대 값 조회 
		int maxid = saleDao.getMaxSaleId();
		//2. sale 테이블 등록 
		Sale sale = new Sale();
		sale.setSaleid(maxid + 1);
		sale.setUserid(loginUser.getUserid());
		sale.setUser(loginUser);
		saleDao.insert(sale); //sale 테이블에 데이터 저장
		//3. Cart 데이터에서 saleitem 데이터 추출. insert
		int seq = 0;
		for(ItemSet is : cart.getItemSetList()) {
			SaleItem saleItem = new SaleItem(sale.getSaleid(), ++seq, is);
			sale.getItemList().add(saleItem);
			saleItemDao.insert(saleItem); //saleitem 테이블에 저장
		}
		return sale;
	}

	public List<Sale> salelist(String id) {
		//Sale 테이블의 내용 저장
		List<Sale> list = saleDao.list(id); //sale 테이블에서 id에 해당하는 목록 조회
		for(Sale sa : list) {
			//주문 번호에 해당하는 주문상품 조회
			List<SaleItem> saleitemlist = saleItemDao.list(sa.getSaleid());
			//SaleItem 객체에 Item 객체 저장
			for(SaleItem si : saleitemlist) {
				Item item = itemDao.getItem(si.getItemid()); //주문상품의 상품데이터(item) 조회
				si.setItem(item); //Item 객체를 SaleItem 객체에 추가
			}
			sa.setItemList(saleitemlist); //Sale 객체에 SaleItem 목록 추가
		}
		return list;
	}

	**public int boardcount(String boardid) {
		return boardDao.count(boardid);
	}

	public List<Board> boardlist(Integer pageNum, int limit, String boardid) {
		
		return boardDao.list(pageNum,limit,boardid);
	}**
}

 

 📌 BoardDao.java 생성

package dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import dao.mapper.BoardMapper;
import logic.Board;

@Repository
public class BoardDao {
	@Autowired
	private SqlSessionTemplate template;
	private Map<String, Object> param = new HashMap<>();
	private Class<BoardMapper> cls = BoardMapper.class;
	public int count(String boardid) {
		return template.getMapper(cls).count(boardid);
	}
	public List<Board> list(Integer pageNum, int limit, String boardid) {
		param.clear();
		int startrow = (pageNum - 1) * limit + 1;
		int endrow = startrow + limit -1;
		param.put("startrow", startrow);
		param.put("endrow", endrow);
		param.put("boardid", boardid);
		return template.getMapper(cls).list(param);
	}
}

 

📌 BoardMapper.java 생성

package dao.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Select;

import logic.Board;

public interface BoardMapper {
	@Select("select count(*) from board where boardid=#{value}")
	int count(String boardid);
	String sql = "select * from "
	     + " (select rownum rnum, num, writer, subject, content, file1 fileurl, regdate, grp, grplevel, grpstep, pass, readcnt from "
		 + "(select * from board where boardid=#{boardid}"
		 + " order by grp desc, grpstep asc))"
		 + " where rnum between #{startrow} and #{endrow}";
	
	@Select(sql)
	List<Board> list(Map<String, Object> param);
}