DAO : 비니지스 로직 ◆src/main/resources/ mybatis /mybatis-config.xml : 여기에 board.xml를 등록 ◆src/main/resources/ mybatis /board.xml
컨트롤러 ◆ co.kr.Hello.BoardController.java
◆ views board 폴더/*.jsp
Board - num ref 제목 re_level re_step 원글과 댓글과 대댓글 한번에 관리
- num : 글번호 - ref : 글 그룹 ( 원글의 num 으로 통일 ) 하나의 원글과 그에 따른 댓글 대댓글 모두 한그룹 - re_level : 원글이면 0, 댓글이면 1, 대댓글이면 2... - re_step : 글 순서
댓글1 - 대댓글1 - 댓글2 - 대댓글1 순서대로 가다가 댓글1 에 대댓글2 를 넣는다면?
댓글1 - 대댓글1 -대댓글2 - 댓글2 - 대댓글1 이렇게 중간에 삽입이 된다. 그 때 순서대로 들어가는 re_step 를 다시 정렬하기 위해 뒤의 글들의 re_step 은 +1 이 된다.
package co.kr.Hello.dto;
import java.util.Date;
public class BoardDTO {
//전역변수=필드=프로퍼티=property
private int num;//글번호
private String writer;//글쓴이
private String subject;//글제목
private String pw;//암호
private Date regdate;//날짜
private int readcount;//조회수
private int ref;//답글그룹
private int re_step;//글 순서
private int re_level;//답글 깊이
private String content;//글내용
private String ip;//ip
public BoardDTO() {}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}
public int getRef() {
return ref;
}
public void setRef(int ref) {
this.ref = ref;
}
public int getRe_step() {
return re_step;
}
public void setRe_step(int re_step) {
this.re_step = re_step;
}
public int getRe_level() {
return re_level;
}
public void setRe_level(int re_level) {
this.re_level = re_level;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
>> board.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="board">
<!-- resultType 에 co.kr.Hello.dto.BardoDTO 또는 별칭인 board77 둘 다 가능 -->
<!-- 최대 글번호 얻기 -->
<select id="numMax" resultType="Integer">
select max(num) from board
</select>
<!-- 답글 끼워넣기 위치 확보 -->
<update id="reStep" parameterType="board77">
update board set re_step=re_step+1
where ref=#{ref} and re_step>#{re_step}
</update>
<!-- insert 글쓰기, 답글쓰기 -->
<insert id="insertDao" parameterType="board77">
insert into board(writer,subject,pw,regdate,ref,re_step,re_level,content,ip)
values(#{writer},#{subject},#{pw},NOW(),#{ref},#{re_step},#{re_level},#{content},#{ip})
</insert>
<!-- 글 갯수 -->
<select id="countDao" resultType="int">
select count(*) from board;
</select>
<!-- 리스트 -->
<select id="listDao" parameterType="java.util.Map" resultType="board77">
select * from board
order by ref desc,re_step asc
limit #{start},#{cnt}
</select>
<!-- 조회수 증가 -->
<update id="readcountDao" parameterType="Integer">
update board set readcount=readcount+1
where num=#{num}
</update>
<!-- 글 내용 보기, 글 수정 폼 -->
<select id="getBoard" parameterType="Integer" resultType="board77">
select * from board
where num=#{num}
</select>
<!-- DB 글 수정 -->
<update id="updateDao" parameterType="board77">
update board set writer=#{writer},subject=#{subject},content=#{content}
where num=#{num} and pw=#{pw}
</update>
<!-- 글삭제 -->
<delete id="deleteDao" parameterType="int">
delete from board
where num=#{num}
</delete>
</mapper>
>> BoardController.java ( 글삭제는 다음에 )
package co.kr.Hello;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.ibatis.session.SqlSession;//MyBatis
import java.util.*;//HashMap 사용
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import javax.naming.NamingException;
import org.springframework.ui.Model;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.annotation.ModelAttribute;
import co.kr.Hello.dto.BoardDTO;
@Controller
public class BoardController {
@Autowired private SqlSession sqlSession;//변수, setter 자동으로 된다.
//글쓰기 폼, 답글쓰기
@RequestMapping("writeForm.do")
public String writeForm(Model model,String num,
String ref, String re_step,String re_level,String pageNum) {
if(num==null) {//원글 쓰기(답글이라면 원글의 num 이 들어올 예정)
//원글이면 초기화해서 게시판목록보여주기!
num = "0";//글번호
ref = "1";//글 그룹
re_step="0";//글순서
re_level="0";//글 깊이
}//if-end
model.addAttribute("pageNum",pageNum);
model.addAttribute("num",new Integer(num));
model.addAttribute("ref",new Integer(ref));
model.addAttribute("re_step",new Integer(re_step));
model.addAttribute("re_level",new Integer(re_level));
return "board/writeForm";// writeForm.jsp
}//writeForm()-end
//DB글 쓰기
@RequestMapping(value="writePro.do",method=RequestMethod.POST)
public String writePro(@ModelAttribute("boardDTO")BoardDTO boardDTO,
HttpServletRequest request) {
int maxNum = 0;//최대 글번호 넣을 변수
if(sqlSession.selectOne("board.numMax")!=null) {
//글번호가 있다는 것은, 글이 있다는 것이다.
maxNum = sqlSession.selectOne("board.numMax");//최대 글번호 maxNum에 할당
}
if(maxNum != 0) {//글이 존재하면
maxNum = maxNum+1;//ref(글그룹)에 넣으려고 - 원글의 num 으로 통일( 원글의 num 이 마지막글에서 +1 이다 )
}else {//처음 글이면
maxNum=1;//ref그룹에 1을 넣는다.
}
String ip = request.getRemoteAddr();//ip 얻기
boardDTO.setIp(ip);
//원글-답글처리
if(boardDTO.getNum()!=0) {//답글이면
//답글 끼워넣기 위치 확보
sqlSession.update("board.reStep",boardDTO);
boardDTO.setRe_step(boardDTO.getRe_step()+1);//글순서 + 1
boardDTO.setRe_level(boardDTO.getRe_level()+1);//글깊이 + 1
}else {//원글이면
boardDTO.setRef(new Integer(maxNum));//글그룹
boardDTO.setRe_step(new Integer(0));//글 순서
boardDTO.setRe_level(new Integer(0));//글 깊이
}
sqlSession.insert("board.insertDao",boardDTO);//글 DB저장
return "redirect:list.do";
}//writePro()-end
//리스트
@RequestMapping("list.do")
public String listBoard(Model model,String pageNum) {
if(pageNum==null) {//처음 진입시
pageNum="1";//페이지는 1번으로
}
int pageSize = 10;//페이지 당 10개의 글
int currentPage=Integer.parseInt(pageNum);//현재 페이지
int startRow = (currentPage - 1)*pageSize + 1;//페이지의 첫번째 행(첫번째 글) 파라미터는 0부터 시작
int endRow = currentPage * pageSize;//페이지의 마지막 행(마지막 글)
int count = 0;//총 글 갯수 넣을 변수
int pageBlock = 10;//블럭당 10개 페이지 넣을려고(페이지블럭단위)
count = sqlSession.selectOne("board.countDao");
int number = count - (currentPage-1)*pageSize;//글 37개이면, 37 36 35(나중쓴글이 최근글이니 반대로 글번호 매기기)
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("start", startRow+1);
map.put("cnt", pageSize);
//페이지 수 구하기
int pageCount=count/pageSize+(count%pageSize==0?0:1);// 37 3(몫) + 1
// 몫 + 꽁다리 레코드
int startPage=(currentPage/pageBlock)*10+1;//블럭의 시작 페이지
int endPage=startPage+pageBlock-1;//블럭의 끝 페이지
//----------------------------------
List<BoardDTO> list = sqlSession.selectList("board.listDao",map);
//페이지에 넘기기
model.addAttribute("pageNum",pageNum);
model.addAttribute("currentPage",currentPage);
model.addAttribute("startRow",startRow);
model.addAttribute("endRow",endRow);
model.addAttribute("pageBlock",pageBlock);
model.addAttribute("pageCount",pageCount);
model.addAttribute("startPage",startPage);
model.addAttribute("endPage",endPage);
model.addAttribute("count",count);//전체 글 갯수
model.addAttribute("pageSize",pageSize);
model.addAttribute("number",number);//글 번호
model.addAttribute("list",list);
return "board/list";//list.jsp
}
//글 내용보기
@RequestMapping("content.do")
public String content(Model model,String num,String pageNum) {
int num1 = Integer.parseInt(num);
sqlSession.update("board.readcountDao",num1);//조회수 증가
BoardDTO bdto = sqlSession.selectOne("board.getBoard",num1);
String content = bdto.getContent();
content = content.replace("\n", "<br>");
model.addAttribute("content",content);
model.addAttribute("pageNum",pageNum);
model.addAttribute("num",num1);
model.addAttribute("bdto",bdto);
return "board/content";//content.jsp
}
//글 수정폼
@RequestMapping("updateForm.do")
public ModelAndView updateForm(String num,String pageNum) {
int num1=Integer.parseInt(num);
BoardDTO bdto = sqlSession.selectOne("board.getBoard",num1);
ModelAndView mv = new ModelAndView();
mv.addObject("pageNum",pageNum);
mv.addObject("bdto",bdto);
mv.setViewName("board/content");//content.jsp
return mv;
}
//DB글 수정
@RequestMapping(value="updatePro.do",method=RequestMethod.POST)
public ModelAndView updatePro(BoardDTO boardDTO,String pageNum) {
sqlSession.update("board.updateDao",boardDTO);
ModelAndView mv = new ModelAndView();
mv.addObject("pageNum",pageNum);
mv.setViewName("redirect:list.do");
return mv;
}
}//class-end