JAVA

[spring]board Business,Dataservice(xml방식)

docc 2021. 8. 6. 17:22

게시판 추가

DTO,VO : 모델빈
◆src/main/java/
co.kr.Hello.dto.BoardDTO.java  

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 이 된다.

컨트롤러 
BoardController.java ( 수정중 )

 

>> mybatis-config.xml ( 수정 )

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd" >

<configuration>
	<typeAliases>
	  <typeAlias alias="member77" type="co.kr.Hello.dto.MemberDTO"/>
	</typeAliases>

	<mappers>
		<mapper resource="/mybatis/member.xml"/>
		<mapper resource="/mybatis/board.xml"/>
	</mappers>
</configuration>

 

>> BoardDTO.java

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