[JAVA] CRUD 토이 프로젝트 - 3

Hyeonseok Jeong·2023년 8월 25일
0

Java

목록 보기
3/5

드디어 3편 오늘은 왠만한 기능은 대부분 구현하게 되었다 이제 3일차인데 너무 늦은감이 있는것 같기도하다.

오늘도 기록을 해보자면 오늘 한 작업은
1. 검색기능 확인
2. 게시물 작성하기 기능 구현
3. 게시물 수정하기 기능 구현
4. 게시물 삭제하기 기능 구현
5. 댓글 리스트 구현
6. 댓글 등록 & 삭제 기능 구현
7. 게시물 다음글 이전글 내용 출력

이정도 이다.

진행상황

검색기능

검색기능은 코드라고 할것은 없고 저번편에 이미 구현은 다 해놓은상태여서 쿼리문과 controller, service, dao 부분을 확인해보면 된다 오늘 한건 검색 기능이 정상적으로 작동하는지 확인하였다.

게시물 작성 & 수정하기

게시물 작성 기능 구현시 아직 미구현 부분이 존재한다
바로 파일전송 부분이다.
사실 이부분은 파일 전송을 input multi폼을 이용하여 로컬에 저장하여 사용하면 되긴하는데 기회가 되면 aws에서 서비스중인 스토리지 서비스를 구독하여 해보고싶어 남겨 두었다

그럼 먼저 컨트롤단 코드를 확인해보면


package com.CRUDp.web.client.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.CRUDp.web.client.dto.BoardDto;
import com.CRUDp.web.client.service.BoardDetailService;
import com.CRUDp.web.client.service.PostService;

@WebServlet("/client/board/reg")
public class RegController extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		String boardId_ = req.getParameter("board_id");

		if (boardId_ != null && !boardId_.equals("")) {
			int boardId = Integer.parseInt(boardId_);

			BoardDetailService service = new BoardDetailService();
			BoardDto boardDetail = new BoardDto();

			boardDetail = service.getBoardDetailService(boardId);

			req.setAttribute("boardDetail", boardDetail);
		}

		req.getRequestDispatcher("/WEB-INF/view/client/board/reg/reg.jsp").forward(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		req.setCharacterEncoding("UTF-8");

		String regState = req.getParameter("reg");

		HttpSession session = req.getSession();
		PostService service = new PostService();

		if (session.getAttribute("userId") != null) {

			if (regState.equals("등록")) {
				String title_ = req.getParameter("title");
				String title = title_ != null ? title_ : "";
				String content_ = req.getParameter("content");
				String content = content_ != null ? content_ : "";
				String writerId = (String) session.getAttribute("userId");

				service.setBoardPost(title, content, "", writerId);
			} else if (regState.equals("수정")) {
				String boardId_ = req.getParameter("board_id");
				int boardId = boardId_ != null && !boardId_.equals("") ? Integer.parseInt(boardId_) : 0;
				String title_ = req.getParameter("title");
				String title = title_ != null ? title_ : "";
				String content_ = req.getParameter("content");
				String content = content_ != null ? content_ : "";
				String writerId = (String) session.getAttribute("userId");

				System.out.printf("title : %s\ncontent : %s\nwriterId : %s", title, content, writerId);
				// update
				service.updateBoardPost(boardId, title, content, "", writerId);
			}

			resp.sendRedirect("/client/board/list");
		} else {
			resp.sendRedirect("/client/signIn");
		}

	}
}

이 글을 작성하면서 보인 문제점이 하나 생각났다 바로 저 req.setCharacterEncoding("UTF-8") 부분이다. 해당 코드는 분명 filter 에 처리를 해놨는데도 불구하고 따로 저렇게 설정해야지만 정상적으로 한글이 안깨지고 보이는 현상이 보여졌다.

분명 filter단에 처리하게 되면

이와 같이 filter를 거쳐 지나가기 때문에 가장 먼저 접근하게 되는곳이라 characterEncoding 설정 부분을 하게되면 될줄 알았는데 어떤점 때문인지 자동이 안되는 현상이 있어 따로 컨트롤러에 셋팅을 해주었다.

아무튼 character 셋팅을 하고 '등록' 부분과 '수정' 부분을 doPost(_)에 기능 구현을 위해 코드를 작성하였고 doGet() 부분에는 수정시에 board_id 가 존재할때 기존의 값을 받아와 view에 보여주기 위해서 작성한 코드이다.
어려울건 없는 부분이여서 그런지 인코딩 부분을 제외하고는 수월하게 넘어갔다.

  • service
package com.CRUDp.web.client.service;

import com.CRUDp.web.client.dao.BoardDao;
import com.CRUDp.web.client.dto.BoardDto;

public class PostService {
	public int setBoardPost(String title, String content, String files, String writerId) {
		int result = 0;

		BoardDao boardDao = new BoardDao();
		BoardDto post = new BoardDto();
		post.setTitle(title);
		post.setContent(content);
		post.setFiles(files);
		post.setWriterId(writerId);

		boardDao.insertBoardPost(post);

		return result;
	}

	public int delBoardPost(int boardId, String writerId) {
		BoardDao boardDao = new BoardDao();
		int result = 0;
		boardDao.allDeleteCmt(boardId);
		result = boardDao.deleteBoardPost(boardId, writerId);

		return result;
	}

	public int updateBoardPost(int boardId, String title, String content, String files, String writerId) {

		int result = 0;

		BoardDao boardDao = new BoardDao();
		BoardDto post = new BoardDto();

		post.setTitle(title);
		post.setContent(content);
		post.setFiles(files);
		post.setWriterId(writerId);

		result = boardDao.updateBoardPost(boardId, post);

		return result;
	}
}

해당 service 부분에서는 매게변수를 보면 좀 어지러울 수 있다.
원래는 컨트롤단에서 바로 Dto에 집어넣어 전달할려고 하였지만 그런 처리는 비즈니스 로직인 Service단에서 해결해야 하지 않을까? 하는 생각에 이와 같이 처리하였다.
그런데 다시 생각해보니 그럴거면 String을 int로 형 변환하는 부분도 Service단에서 해결해야 하는게 아닌가 하는 생각도 들었다. (나중에 기회되면 고쳐보도록 하자)

중간에 delBoardPost()는 메소드 이름 그대로 게시물 삭제 기능을 위한 서비스 로직이다.
이는 잠시후 삭제 소제목에서 언급하도록 하겠다.

다음으로는 Dao단


	public int insertBoardPost(BoardDto post) {
		int result = 0;

		String sql = "insert into board( title, content, files, writer_id ) " + "values( ? , ? , ? , ?)";

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con = DriverManager.getConnection(url, dbName, dbPwd);
			PreparedStatement st = con.prepareStatement(sql);

			st.setString(1, post.getTitle());
			st.setString(2, post.getContent());
			st.setString(3, post.getFiles());
			st.setString(4, post.getWriterId());

			result = st.executeUpdate();

			st.close();
			con.close();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return result;
	}

	public int updateBoardPost(int boardId, BoardDto board) {
		int result = 0;
		String sql = "update board set title = ?, content = ?, files = ? where id = ? and writer_id = ?";

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con = DriverManager.getConnection(url, dbName, dbPwd);
			PreparedStatement st = con.prepareStatement(sql);

			st.setString(1, board.getTitle());
			st.setString(2, board.getContent());
			st.setString(3, board.getFiles());
			st.setInt(4, boardId);
			st.setString(5, board.getWriterId());

			result = st.executeUpdate();

			st.close();
			con.close();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return result;
	}

Dao단은 시퀄만 잘 사용하면 된다고 생각하기 때문에 자세한 설명은 생략한다
는 아니고 코드에서 보이는 것 처럼 insert로 등록 기능 구현과 update로 수정 기능 구현을 위해 SQL문을 작성하였다.

게시물 삭제

게시물 삭제하는 부분에서 사실 오랜만에 SQL을 사용하다보니 외래키 설정한걸 까먹고 왜 삭제가 안되지..? 하면서 좀 해매긴했지만 다행이 바로 해결하여 외래키로 연결된 해당 게시물 관련 댓글삭제를 먼저 진행하고 다음으로 게시물 삭제를 하였다. 굿

package com.CRUDp.web.client.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.CRUDp.web.client.service.PostService;

@WebServlet("/client/post/action")
public class PostController extends HttpServlet {
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		req.setCharacterEncoding("UTF-8");

		String actionState = req.getParameter("actionState");
		HttpSession session = req.getSession();
		PostService service = new PostService();
		String boardId_ = req.getParameter("board_id");
		int boardId = boardId_ != null && !boardId_.equals("") ? Integer.parseInt(boardId_) : 0;

		if (actionState.equals("삭제")) {
			String userId = (String) session.getAttribute("userId");

			// result 변수를 만들어 삭제에 실패하는경우도 산정하면 좋을것 같음
			service.delBoardPost(boardId, userId);
			resp.sendRedirect("/client/board/list");

		} else if (actionState.equals("수정")) {

			resp.sendRedirect("/client/board/reg?board_id=" + boardId);
		} else if (actionState.equals("선택삭제")) {
			// admin의 경우 게시물 전체를 삭제할 수 있는 권한이 있기 때문에 해당 기능을 구현
		}

	}
}

코드를 보면 수정 버튼이 디테일 부분에 존재하여 req.sendRedirect()로 reg view로 전환하는 부분도 있다.

삭제시에는 actionState 변수에 들어오는 값이 "삭제"로 들어오게 되어 게시물 삭제가 진행된다.

  • service 단
	public int delBoardPost(int boardId, String writerId) {
		BoardDao boardDao = new BoardDao();
		int result = 0;
		boardDao.allDeleteCmt(boardId);
		result = boardDao.deleteBoardPost(boardId, writerId);

		return result;
	}

boardDao.allDeleteCmt(boardId) 부분이 게시물을 삭제하기전 먼저 관련된 댓글을 삭제하기를 먼저 진행하게 되고 이후 선택한 게시물이 삭제되게 된다.

view에서 해당 게시물을 생성한 유저가 아니면 버튼이 보이지 않지만 그래도 유저 검증을 한번더 하기 위해 writerId 를 전달하여 시퀄에서 한번더 확인하는 작업을 해주었다.

public int allDeleteCmt(int boardId) {
		int result = 0;

		String sql = "delete from cmt where board_id = ?";

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con = DriverManager.getConnection(url, dbName, dbPwd);
			PreparedStatement st = con.prepareStatement(sql);

			st.setInt(1, boardId);
			result = st.executeUpdate();

			st.close();
			con.close();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		System.out.println("삭제되는 상태 : " + result);
		return result;
	}

public int deleteBoardPost(int boardId, String writerId) {
		int result = 0;
		String sql = "delete from board where id = ? and writer_id = ?";

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con = DriverManager.getConnection(url, dbName, dbPwd);
			PreparedStatement st = con.prepareStatement(sql);

			st.setInt(1, boardId);
			// 프론트에서 게시물을 작성한 사용자가 아니면 삭제버튼이 생성되지 않지만 다시한번 Dao 에서 사용자가 맞는지 확인
			st.setString(2, writerId);

			result = st.executeUpdate();

			st.close();
			con.close();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return result;
	}

위와 같이 작성자가 로그인한 유저와 일치하는지에 대해서 다시한번 확인하는 작업을 하게되고 해당 게시물 ID를 가져와 삭제하는 작업을 진행하게 된다.

댓글 리스트 & 삭제 & 등록 & Post 다음, 이전글

이부분은 게시판 페이지네이션과 비슷한 작업이여서 편하게 작업했다.

<c:set var="page" value="${empty param.page ? 1 : param.page}" />
			<c:set var="stPage" value="${page - (page - 1) % 5}" />
			<c:set var="edPage"
				value="${fn:substringBefore(Math.ceil(cmtCount / 10), '.')}" />

			<c:if test="${cmtCount != 0}">
				<div class="page-controller">

					<c:if test="${stPage > 1}">
						<a href="?board_id=${param.board_id}&page=${stPage - 1}"
							class="prev sign"><</a>
					</c:if>
					<c:if test="${stPage <= 1}">
						<span onclick="alert('이전페이지가 존재하지 않습니다.')"><</span>
					</c:if>

					<div class="number-box">
						<c:forEach var="i" begin="0" end="4">
							<c:if test="${(stPage + i) <= edPage }">
								<a class="sign"
									href="?board_id=${param.board_id}&page=${i + stPage}">${i + stPage}</a>
							</c:if>
						</c:forEach>
					</div>

					<c:if test="${stPage + 4 < edPage}">
						<a href="?board_id=${param.board_id}&page=${stPage + 5}"
							class="prev sign">></a>
					</c:if>
					<c:if test="${stPage + 4 >= edPage}">
						<span onclick="alert('이전페이지가 존재하지 않습니다.')">></span>
					</c:if>

				</div>
			</c:if>

taglib를 사용하여 리스트 부분과 같이 작업한 페이지네이션 JSP이다.

package com.CRUDp.web.client.controller;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.CRUDp.web.client.dto.BoardDto;
import com.CRUDp.web.client.dto.CmtDto;
import com.CRUDp.web.client.service.BoardDetailService;

@WebServlet("/client/board/detail")
public class BoardDetailController extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		String cmt = req.getParameter("comment");

		String boardId_ = req.getParameter("board_id");
		int boardId = boardId_ != null && !boardId_.equals("") ? Integer.parseInt(boardId_) : 0;

		String page_ = req.getParameter("page");
		int page = page_ != null && !page_.equals("") ? Integer.parseInt(page_) : 1;

		BoardDto boardDetail = new BoardDto();
		BoardDto nextPost = new BoardDto();
		BoardDto prevPost = new BoardDto();
		int cmtCount = 0;

		BoardDetailService service = new BoardDetailService();
		List<CmtDto> cmtList = new ArrayList<>();

		service.setBoardHit(boardId);
		nextPost = service.getNextPost(boardId);
		prevPost = service.getPrevPost(boardId);
		boardDetail = service.getBoardDetailService(boardId);
		cmtList = service.getCmtList(boardId, page);
		cmtCount = service.getCmtCount(boardId);

		req.setAttribute("detailBoard", boardDetail);
		req.setAttribute("nextPost", nextPost);
		req.setAttribute("prevPost", prevPost);
		req.setAttribute("cmtList", cmtList);
		req.setAttribute("cmtCount", cmtCount);

		req.getRequestDispatcher("/WEB-INF/view/client/board/detail/detail.jsp").forward(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		req.setCharacterEncoding("UTF-8");
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html; charset=UTF-8");

		HttpSession session = req.getSession();

		String cmtAction = req.getParameter("cmt-action");
		String boardId_ = req.getParameter("board_id");
		int boardId = boardId_ != null && !boardId_.equals("") ? Integer.parseInt(boardId_) : 0;
		BoardDetailService service = new BoardDetailService();
		// 사용자 인지 확인 &

		if (cmtAction.equals("등록")) {
			if (session.getAttribute("userId") != null) {
				String cmt = req.getParameter("comment");
				String writerId = (String) session.getAttribute("userId");

				service.setCmt(cmt, writerId, boardId);

				resp.sendRedirect("/client/board/detail?board_id=" + boardId);

			} else {
				resp.sendRedirect("/client/signIn");
			}
		} else if (cmtAction.equals("X")) {
			if (session.getAttribute("userId") != null) {

				String cmtId_ = req.getParameter("cmtId");
				int cmtId = cmtId_ != null && !cmtId_.equals("") ? Integer.parseInt(cmtId_) : 0;
				service.deleteCmt(cmtId);

				resp.sendRedirect("/client/board/detail?board_id=" + boardId);
			}
		}

	}

}

get 요청에서는 댓글 구현과 다음글과 이전글을 보여주기위해 service단을 사용한 코드이다.
post에서는 댓글 부분의 등록과 삭제 부분에 대해서 작동하기 위한 코드이다.

댓글 부분도 view에서 작성한 사용자에게만 삭제 부분이 보여지게 된다.

  • service
package com.CRUDp.web.client.service;

import java.util.ArrayList;
import java.util.List;

import com.CRUDp.web.client.dao.BoardDao;
import com.CRUDp.web.client.dto.BoardDto;
import com.CRUDp.web.client.dto.CmtDto;

public class BoardDetailService {

	private BoardDao boardDao = new BoardDao();

	public BoardDto getBoardDetailService(int boardId) {

		BoardDto boardDto = new BoardDto();

		boardDto = boardDao.selectBoardDetailDao(boardId);

		return boardDto;
	}

	public int setBoardHit(int boardId) {

		int result;

		result = boardDao.updateBoardHitDao(boardId);

		return result;
	}

	public BoardDto getNextPost(int boardId) {

		BoardDto nextPost = new BoardDto();

		nextPost = boardDao.selectNextPost(boardId);
		return nextPost;
	}

	public BoardDto getPrevPost(int boardId) {

		BoardDto prevPost = new BoardDto();

		prevPost = boardDao.selectPrevPost(boardId);

		return prevPost;
	}

	public List<CmtDto> getCmtList(int boardId, int page) {

		List<CmtDto> cmtList = new ArrayList<>();
		cmtList = boardDao.selectCmtList(boardId, page);

		return cmtList;
	}

	public int getCmtCount(int boardId) {
		int result = boardDao.selectCountCmt(boardId);
		return result;
	}

	public int setCmt(String content, String writerId, int boardId) {
		int result = boardDao.insertCmtContent(content, writerId, boardId);

		return result;
	}

	public int deleteCmt(int cmtId) {
		int result = 0;
		result = boardDao.deleteCmt(cmtId);

		return result;
	}
}

  • Dao
//	comment ======================================================================================================

	public int deleteCmt(int cmtId) {
		String sql = "delete from cmt where id = ?";

		int result = 0;

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con = DriverManager.getConnection(url, dbName, dbPwd);
			PreparedStatement st = con.prepareStatement(sql);

			st.setInt(1, cmtId);

			result = st.executeUpdate();

			st.close();
			con.close();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return result;
	}

	public int insertCmtContent(String content, String writerId, int boardId) {
		String sql = "insert into cmt(content, writer_id, board_id) values( ?, ?, ?)";

		int result = 0;

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con = DriverManager.getConnection(url, dbName, dbPwd);
			PreparedStatement st = con.prepareStatement(sql);

			st.setString(1, content);
			st.setString(2, writerId);
			st.setInt(3, boardId);

			result = st.executeUpdate();

			st.close();
			con.close();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return result;
	}

	public int selectCountCmt(int boardId) {

		String sql = "select COUNT(id) count from cmt where board_id = ?";

		int result = 0;

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con = DriverManager.getConnection(url, dbName, dbPwd);
			PreparedStatement st = con.prepareStatement(sql);

			st.setInt(1, boardId);

			ResultSet rs = st.executeQuery();

			if (rs.next()) {
				result = rs.getInt("count");
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return result;
	}

	public List<CmtDto> selectCmtList(int boardId, int page) {

		String sql = "select * from ( " + "select rownum num, c.* from ( "
				+ "select * from cmt where board_id = ? order by regdate desc ) c ) " + "where num between ? and ?";

		int start = 1 + (page - 1) * 10;
		int end = page * 10;

		List<CmtDto> commentList = new ArrayList<>();

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con = DriverManager.getConnection(url, dbName, dbPwd);
			PreparedStatement st = con.prepareStatement(sql);

			st.setInt(1, boardId);
			st.setInt(2, start);
			st.setInt(3, end);

			ResultSet rs = st.executeQuery();

			while (rs.next()) {
				int id = rs.getInt("id");
				String content = rs.getString("content");
				Date regDate = rs.getDate("regdate");
				String writerId = rs.getString("writer_id");
				int boardId_ = rs.getInt("board_id");

				CmtDto cmt = new CmtDto(id, content, regDate, writerId, boardId_);

				commentList.add(cmt);

			}

			rs.close();
			st.close();
			con.close();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return commentList;
	}

//	comment ======================================================================================================
//	post ======================================================================================================

	public BoardDto selectPrevPost(int boardId) {
		// Board 의 내용을 가지고오는
		String sql = "select * from board where id < ? order by regdate desc";

		BoardDto prevPost = new BoardDto();

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con = DriverManager.getConnection(url, dbName, dbPwd);
			PreparedStatement st = con.prepareStatement(sql);

			st.setInt(1, boardId);

			ResultSet rs = st.executeQuery();

			if (rs.next()) {
				int id = rs.getInt("id");
				String title = rs.getString("title");
				String content = rs.getString("content");
				Date regDate = rs.getDate("regdate");
				int hit = rs.getInt("hit");
				String files = rs.getString("files");
				String writerId = rs.getString("writer_id");

				prevPost = new BoardDto(id, title, content, regDate, hit, files, writerId);
			}

			rs.close();
			st.close();
			con.close();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return prevPost;
	}

	public BoardDto selectNextPost(int boardId) {
		// Board 의 내용을 가지고오는
		String sql = "select * from board where id > ? order by regdate";

		BoardDto nextPost = new BoardDto();

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			Connection con = DriverManager.getConnection(url, dbName, dbPwd);
			PreparedStatement st = con.prepareStatement(sql);

			st.setInt(1, boardId);

			ResultSet rs = st.executeQuery();

			if (rs.next()) {
				int id = rs.getInt("id");
				String title = rs.getString("title");
				String content = rs.getString("content");
				Date regDate = rs.getDate("regdate");
				int hit = rs.getInt("hit");
				String files = rs.getString("files");
				String writerId = rs.getString("writer_id");

				nextPost = new BoardDto(id, title, content, regDate, hit, files, writerId);
			}

			rs.close();
			st.close();
			con.close();

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return nextPost;
	}

//	post ======================================================================================================

Dao단을 살펴보면 댓글 리스트 구현 다음 포스트, 이전 포스트, 댓글 등록, 댓글 삭제 가 존재한다.

여긴 설명보단 코드를 확인하면서 복습하는게 좋을것 같아 자세한 설명은 생략한다!!
라기 보단 코드가 보이는데로 댓글과 리스트 다음, 이전을 출력하기 위해 시퀄을 이용해 SELECT 를 사용하였고, 댓글 등록과 삭제를 위해 UPDATE, DELETE 시퀄문을 이용한 부분이다.

사진을 첨부한 설명

  • 로그인한 유저가 등록한 게시물이 아닐때

  • 로그인한 유저가 등록한 게시물일때

  • 수정시 기존에 있던 데이터를 가져와 출력


사진과 같이 수정한 모습을 볼 수 있다.

  • 댓글 삭제

삭제 버튼을 눌러 댓글을 삭제한 모습 & 내가 작성한 댓글에만 삭제 버튼이 활성화 되는 모습을 볼 수 있다.

  • post삭제

포스트 또한 관련된 댓글들이 삭제되고 다음으로 post가 삭제되는 모습이다.

  • 게시물 작성



사진과 같이 등록하기를 눌러 정상적으로 게시물이 등록되는것을 확인할 수 있다.

마무리

실상 이제 끝난 토이프로젝트라고 할 수있다.
다음으로 할 작업은 ADMIN 페이지와 백엔드 코드를 작성만이 남았는데
이부분은 admin이 모든 게시물과 모든 댓글을 삭제할 수 있는 기능만 넣으면되기에 실상 끝났다고 본다. (물론 끝날때까지 끝난게 아니지만)

아무튼 각설하고 프로젝트를 하면서 아직은 부족한 부분이 보여 어지럽긴했지만 내가 더 발전할 수 있다는 점에서 즐거운 마음이 든다.
나는 아직 더 발전할 수 있고 더 나아갈 수 있다는 점에서 감사하며 오늘자 정리를 마친다.

굿

profile
풀스텍 개발자

0개의 댓글