본문 바로가기
👋국비 후기 모음👋 (이력도 확인 가능!)
개발/서블릿JSP

서블릿(Servlet) 게시판 만들기 2 - 게시글 상세보기

by 킴뎁 2021. 4. 13.
728x90
반응형

[내 소개..?? 겸 국비 일주일 후기]


 

서블릿(Servlet)을 이용한 게시판 만들기 1 - 게시판 목록/리스트 조회

국비 수업 중에 너무 어려워서 정리하고자 한다. MVC모델을 적용해 게시판을 만들어보자 (서블릿, JSP) DB에 있는 게시판 목록들을 웹브라우저에 출력하기. 일단 어떤식으로 코드가 진행되는지 알

kimdevel.tistory.com

 

 

서블릿(Servlet) 게시판 만들기 3 - 회원가입 / 로그인 / 로그아웃

서블릿(Servlet) 게시판 만들기 1 - 게시판 목록/리스트 조회 국비 수업 중에 너무 어려워서 정리하고자 한다. MVC모델을 적용해 게시판을 만들어보자 (서블릿, JSP) DB에 있는 게시판 목록들을 웹브라

kimdevel.tistory.com


DB에 있는 게시판 목록을 조회했으니 이제 게시글 상세보기를 구현해보자.

구현해야할 것들

  • 게시글 제목 클릭시 게시글 본문내용 조회 (상세보기)
  • 게시글 조회시 조회수 증가

일단 코드의 흐름을 알아보자

대략 이런 느낌...!!??

여기부분은 좀 헷갈리지만 리스트 조회 부분을 어느정도 이해했다면 충분히 할 수 있다.

우선 전에 작성했던 list.jsp를 조금 수정해주자.

<%@page import="dto.Board"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%	List<Board> boardList = (List) request.getAttribute("boardList"); %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>게시판 목록 전체 조회</h1>
<hr>

<table>
	<tr>
		<th>번호</th>
		<th>제목</th>
		<th>아이디</th>
		<th>조회수</th>
		<th>작성일</th>
	</tr>
	<%	for(int i=0; i<boardList.size(); i++) { %>
	<tr>
		<td><%=boardList.get(i).getBoardno() %></td>
  <%-- 	<td><%=boardList.get(i).getTitle() %></td>     --%>
		<td><a href="/board/view?boardno=<%=boardList.get(i).getBoardno() %>"><%=boardList.get(i).getTitle() %></a></td>
		<td><%=boardList.get(i).getUserid() %></td>
		<td><%=boardList.get(i).getHit() %></td>
		<td><%=boardList.get(i).getWriteDate() %></td>
	</tr>
	<%	} %>
</table>

</body>
</html>

중요하게 볼 것은 Line 30. 이 코드를 이해 해야만 한다.

원래 코드 <td><%=boardList.get(i).getTitle() %></td>

수정 코드 <td><a href="/board/view?boardno=<%=boardList.get(i).getBoardno() %>"><%=boardList.get(i).getTitle() %></a></td>

 

둘의 차이점을 보자. 제목을 a href로 감싸주면서 "/board/view"(게시글 컨트롤러)로 보내주는 코드다. 단순히 게시글 컨트롤러로 보내주려면 <td><a href="/board/view"><%=boardList.get(i).getTitle() %></a></td> 이렇게 해주어도 상관 없다.

하지만 정확히 어떤 게시글을 보여줄지 알아야하므로 ?boardno=<%=boardList.get(i).getBoardno() %>를 붙여주면서 파라미터를 전달해준다. 해석해보자면 컨트롤러로 이동하긴 하는데 boardno를 같이 전달해준다. 이런 뜻이다.

 

잘 이동 되고 잘 넘겨주는지 확인해보자.

@WebServlet("/board/view")
public class BoardViewController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		System.out.println("제목 클릭 후 /board/view doGet 호출 완료");
		
		//jsp로 forward
		req.getRequestDispatcher("/WEB-INF/views/board/view.jsp").forward(req, resp);
		
	}
}

제목에 링크가 걸리고 클릭시 번호를 전달해주면서 view.jsp로 forwarding해주는 것을 확인할 수 있다.

 

Controller 코드 작성하기

1. 전달파라미터를 Board DTO에 저장

Controller

@WebServlet("/board/view")
public class BoardViewController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	BoardService boardService = new BoardServiceImpl();
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		System.out.println("제목 클릭 후 /board/view doGet 호출 완료");
		
		//1. 전달파라미터를 Board DTO에 저장
		Board board = boardService.getBoardno(req);
		
		//jsp로 forward
		req.getRequestDispatcher("/WEB-INF/views/board/view.jsp").forward(req, resp);
		
	}
}

Service interface

public interface BoardService {
	
	List<Board> getList();

	/**
	 * 전달파라미터를 board dto에 저장
	 * 
	 * @param req
	 * @return
	 */
	Board getBoardno(HttpServletRequest req);

}

Service implement

public class BoardServiceImpl implements BoardService {

	BoardDao boardDao = new BoardDaoImpl();
	
	@Override
	public List<Board> getList() {
		
		List<Board> boardList = boardDao.selectList();
		
		return boardList;
	}

	@Override
	public Board getBoardno(HttpServletRequest req) {
		
        //전달파라미터를 String 타입에 저장.
		String param = req.getParameter("boardno");
		
        //저장할 dto 생성
		Board board = new Board();
		
		if(param != null && !"".equals(param)) { //전달파라미터가 null값이 아니거나 빈문자가 아닐때
			int boardno = Integer.parseInt(param); //String을 int로 변환
			board.setBoardno(boardno); //dto객체에 boardno 저장
		}
		
		return board; //dto 반환
	}
}

주석에 설명을 적어놨다.

전달받은 파라미터를 dto에 저장만 할 뿐, DB에서 가져오거나 수정하는 등의 일은 하지 않으므로 DAO는 사용하지 않는다.

2. 글번호에 맞는 게시글 조회

Controller

@WebServlet("/board/view")
public class BoardViewController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	BoardService boardService = new BoardServiceImpl();
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		System.out.println("제목 클릭 후 /board/view doGet 호출 완료");
		
		//1. 전달파라미터를 Board DTO에 저장
		Board board = boardService.getBoardno(req);
		
		//2. 글번호에 맞는 게시글 조회
		Board viewBoard = boardService.view(board);
		
		//jsp로 forward
		req.getRequestDispatcher("/WEB-INF/views/board/view.jsp").forward(req, resp);
		
	}
}

Service interface

public interface BoardService {

	List<Board> getList();

	Board getBoardno(HttpServletRequest req);

	Board view(Board board);

}

Service implement

public class BoardServiceImpl implements BoardService {

	BoardDao boardDao = new BoardDaoImpl();
	
	...
    ...

	@Override
	public Board view(Board board) {
		
        //조회수 +1
        
        //게시글 조회
		
		return null;
	}
}

먼저 조회수 +1 코드 작성

public class BoardServiceImpl implements BoardService {

	BoardDao boardDao = new BoardDaoImpl();
	
	...
    ...

	@Override
	public Board view(Board board) {
		
        Connection conn = JDBCTemplate.getConnection();
		
		//조회수 +1
	 	if( boardDao.UpdateHit(conn, board) > 0 ) {
	 		JDBCTemplate.commit(conn);
	 	} else {
	 		JDBCTemplate.rollback(conn);
	 	}
        
        //게시글 조회
		
		return null;
	}
}

DAO interface

public interface BoardDao {

	public List<Board> selectList();

	public int UpdateHit(Connection conn, Board board);

}

DAO implement

public class BoardDaoImpl implements BoardDao {
	
	private PreparedStatement ps = null;
	private ResultSet rs = null;

	...
    ...

	@Override
	public int UpdateHit(Connection conn, Board board) {
		
		String sql = "";
		sql += "UPDATE board";
		sql += " SET hit = hit+1";
		sql += " WHERE boardno = ?";
		
		int result = -1;
		
		try {
			ps = conn.prepareStatement(sql);
			ps.setInt(1, board.getBoardno());
			
			result = ps.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
 		} finally {
 			JDBCTemplate.close(ps);
 		}
		
		return result;
	}
}
  • update가 되면 1로 반환 후 commit하는 코드.

다음 게시글 조회 코드 작성

Service implement

public class BoardServiceImpl implements BoardService {

	BoardDao boardDao = new BoardDaoImpl();
	
	...
    ...

	@Override
	public Board view(Board board) {
		
		Connection conn = JDBCTemplate.getConnection();
		
		//조회수 +1
	 	if( boardDao.UpdateHit(conn, board) > 0 ) {
	 		JDBCTemplate.commit(conn);
	 	} else {
	 		JDBCTemplate.rollback(conn);
	 	}
	 	
	 	//게시글 조회
	 	Board viewBoard = boardDao.getBoardByBoardno(conn, board);
		
		return viewBoard;
	}
}

DAO interface

public interface BoardDao {

	public List<Board> selectList();

	public int UpdateHit(Connection conn, Board board);

	public Board getBoardByBoardno(Connection conn, Board board);

}

DAO implement

public class BoardDaoImpl implements BoardDao {
	
	private PreparedStatement ps = null;
	private ResultSet rs = null;

	...
    ...

	@Override
	public int UpdateHit(Connection conn, Board board) {
		...
        ...
		return result;
	}

	@Override
	public Board getBoardByBoardno(Connection conn, Board board) {

		String sql = "";
		sql += "SELECT * FROM board";
		sql += " WHERE boardno = ?";
		
		Board viewBoard = new Board();
		
		try {
			ps = conn.prepareStatement(sql);
			ps.setInt(1, board.getBoardno());
			
			rs = ps.executeQuery();
			
			while(rs.next()) {
				viewBoard.setBoardno(rs.getInt("boardno"));
				viewBoard.setTitle(rs.getString("title"));
				viewBoard.setUserid(rs.getString("userid"));
				viewBoard.setContent(rs.getString("content"));
				viewBoard.setHit(rs.getInt("hit"));
				viewBoard.setWriteDate(rs.getDate("write_date"));
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
 		} finally {
 			JDBCTemplate.close(rs);
 			JDBCTemplate.close(ps);
 		}
		
		return viewBoard;
	}

}
  • 게시판 리스트 조회할 때와 비슷한 코드.
  • ArrayList 대신 Board로 반환. (게시글 하나만 조회하므로)

3. 반환된 Board를 최종적으로 req 속성값으로 지정

@WebServlet("/board/view")
public class BoardViewController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	BoardService boardService = new BoardServiceImpl();
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//		System.out.println("제목 클릭 후 /board/view doGet 호출 완료");
		
		//1. 전달파라미터를 Board DTO에 저장
		Board board = boardService.getBoardno(req);
		
		//2. 글번호에 맞는 게시글 조회
		Board viewBoard = boardService.view(board);
		
        //3. 게시글을 req 속성에 저장
		req.setAttribute("viewBoard", viewBoard);
		
		//4. jsp로 forward
		req.getRequestDispatcher("/WEB-INF/views/board/view.jsp").forward(req, resp);
		
	}
}

4. jsp로 forward

<%@page import="dto.Board"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%	Board b = (Board) request.getAttribute("viewBoard"); %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>게시글 상세보기</h1>
<hr>

<table>
	<tr>
		<td>글번호 : </td>
		<td><%=b.getBoardno() %> |</td>
		<td>제목 : </td>
		<td><%=b.getTitle() %> |</td>
		<td>아이디 : </td>
		<td><%=b.getUserid() %> |</td>
		<td>조회수 : </td>
		<td><%=b.getHit() %> |</td>
		<td>작성일 : </td>
		<td><%=b.getWriteDate() %></td>
	</tr>
	<tr>
		<td>본문</td>
		<td><%=b.getContent() %></td>
	</tr>
</table>
<button onclick='location.href="/board/list"'>게시판으로 돌아가기</button>

</body>
</html>

.

.

.

실행결과.

387 조회하면 게시글을 자세히 보여준다. 조회수도 7로 늘어난 것을 확인할 수 있다.
게시판으로 돌아가기를 누르면 조회수가 반영된 것을 확인할 수 있다.

이렇게 게시판 상세보기가 끝났다.

확실히 글로 쓰면서 정리하니까 애매했던 부분들이 다시금 정리되는것 같다.


[내 소개..?? 겸 국비 일주일 후기]

 

자바 국비 일주일 후기

[자바 국비 한달 후기] [자바 국비 50% 후기] 자바 국비지원을 다닌 지 일주일이 지났다. 진짜 많은 걸 배웠다. 자바, 이클립스 설치, 자바 프로그램 개발(실행) 과정(컴파일), 데이터 타입, 변수, 스

kimdevel.tistory.com

반응형
👋국비 후기 모음👋 (이력도 확인 가능!)

댓글