학원/Servlet

13. WriterBoardCon.java / Board.java(DTO) / BoardMapper.xml / BoardDAO.java(DAO)

주먀 2023. 5. 3. 14:41

기능구현 -> DB 구성부터 잡고 가기

 

1. views 안에 있는 file -> webapp 폴더로 옮기기 ( 에러시 -> 톰캣 우클릭 클린 -> 프로젝트 클린 )

 

2. request.getServletContext() -> webapp 기준이다라는 말

 

3. WriterBoardCon

package kr.smhrd.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

import kr.smhrd.dao.BoardDAO;
import kr.smhrd.entity.Board;

public class WriterBoardCon implements Controller {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1) 데이터 수집
		// post 방식 인코딩
		request.setCharacterEncoding("UTF-8");

		// 1. 모든 요청 정보가 들어있는 request 객체
		// 2. 업로드 된 파일 (이미지)을 저장할 경로(DB에 이미지를 저장하지 않고 경로만 저장)
		String path = request.getServletContext().getRealPath("file");

		// 3. 파일의 max size (byte)
		int maxSize = 10 * 1024 * 1024; // 10MB

		// 4. 인코딩 방식
		String encoding = "UTF-8";

		// 5. 파일이름 중복 제거 -> 파일명 뒤에 숫자를 붙여주는 객체
		DefaultFileRenamePolicy rename = new DefaultFileRenamePolicy();

		// 파일 업로드 --> MultipartRequest 객체 필요 : 라이브러리 추가해줘야 함 -> cos.jar 라이브러리 (pom.xml에
		// 넣기)
		MultipartRequest multi = new MultipartRequest(request, path, maxSize, encoding, rename);

		// 2. DB에 저장하기 위해서 게시글 정보 가져오기 -> title, writer, filename, content
		String title = multi.getParameter("title");
		String writer = multi.getParameter("writer");
		String content = multi.getParameter("content");

		// 우리가 파일의 이름을 가져올 떄 save
		String filename = multi.getFilesystemName("filename");

		System.out.println("title" + title);
		System.out.println("writer" + writer);
		System.out.println("filename" + filename);
		System.out.println("content" + content);

		// 데이터 갯수가 2개 이상이면 묶기
		Board dto = new Board();
		dto.setTitle(title);
		dto.setWriter(writer);
		dto.setFilename(filename);
		dto.setContent(content);

		// 2. 기능구현
		// 게시글 작성 --> web_board 테이블에 게시글 데이터를 저장하겠다.
		// 1) DTO/VO 한개
		// 2) 테이블 별 DAO /Mapper
		BoardDAO dao = new BoardDAO();

		dao.write(dto);
		// 3. View 선택
		// 게시글 목록을 보여주기
		// C --> C : redirect

		return "redirect:/goBoardMain.do";

	}

}

 

4. Board.java(DTO)

4-1. kr.smhrd.entity -> Board -> 클래스 만들기 ( 인터페이스X )

package kr.smhrd.entity;

public class Board {

	// 1. Table 컬럼명 == 필드 변수 명
	private int num;
	private String title;
	private String writer;
	private String filename;
	private String content;

	// java.util.Date
	private String b_date;

	// 3. 기본생성자
	public Board() {
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getFilename() {
		return filename;
	}

	public void setFilename(String filename) {
		this.filename = filename;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getB_date() {
		return b_date;
	}

	public void setB_date(String b_date) {
		this.b_date = b_date;
	}

	// 2. Getter / Setter

}

 

 

5. BoardMapper.xml -> sql문 작성 ( 사용자가 입력한 값은 # { }로 감싸주기 )

5-1. kr.smhrd.dao -> Other -> XML 만들기

5-2. 방금 만든 xml 파일 이름 변경하기 -> BoardDAO

5-3. mybatis -> 한줄추가해서 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="kr.smhrd.dao.BoardDAO">

	<!-- 게시글 저장 -->
	<insert id="write" parameterType="kr.smhrd.entity.Board">
		insert into web_board
		values(
		num_board.nextval,
		#{title},
		#{writer},
		#{filename},
		#{content},
		sysdate
		)
	</insert>

	<!-- 전체 게시물 조회 -->
	<select id="list" resultType="kr.smhrd.entity.Board">
		select * from web_board
		order by
		b_date desc
	</select>

	<!-- 하나의 게시물 조회 -->
	<select id="view" resultType="kr.smhrd.entity.Board">
		select * from web_board
		where num =
		#{num}
	</select>



</mapper>

 

 

6. BoardDAO.java

6-1. kr.smhrd.dao -> BoardDAO -> 클래스 만들기

package kr.smhrd.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import kr.smhrd.entity.Board;
import kr.smhrd.entity.Member;

public class BoardDAO {

	// 1. DB와 연견들 가져오기

	private SqlSessionFactory factory = SqlSessionManager.getSqlSessionFactory();

	// 2. 기능 구현

	public int write(Board dto) {

		SqlSession session = factory.openSession(true);

		int row = session.insert("write", dto);

		session.close();

		return row;

	}

	public List<Board> list() {

		SqlSession session = factory.openSession(true);

		List<Board> list = session.selectList("list");

		session.close();

		return list;

	}

	public Board view(int num) {

		SqlSession session = factory.openSession(true);

		Board dto = session.selectOne("view", num);

		session.close();

		return dto;
	}

	
}