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

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

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

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


 

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

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

kimdevel.tistory.com

 

 

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

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

kimdevel.tistory.com


국비 수업 중에 너무 어려워서 정리하고자 한다.

 

  • MVC모델을 적용해 게시판을 만들어보자 (서블릿, JSP)
  • DB에 있는 게시판 목록들을 웹브라우저에 출력하기.

일단 어떤식으로 코드가 진행되는지 알아보자.

그림으로 그리면 대략 이런식의 진행이 이루어진다.


준비해야할 것들

  • Board dto
  • Controller
  • Service interface / Service implement
  • Dao interface / Dao implement
  • Board DB
  • JDBC Template

Controller 작성하기 (코드가 너무 길어서 import부분은 다 생략)

@WebServlet("/board/list")
public class BoardListController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doGet 호출 완료");
        
		//리스트를 조회하는 코드.
        
		req.getRequestDispatcher("/WEB-INF/views/board/list.jsp").forward(req, resp);
	}
}
  • /board/list를 주소로 저장하고 입력하면 컨트롤러의 doGet메소드가 실행한다.
  • req.getRequestDispatcher를 통해 JSP로 리스트를 전달해준다.
  • 순서
    • 쉽게 말하자면 doGet호출 (호출 성공하면 콘솔창에 출력) ->
    • 리스트를 조회하는 코드를 통해 리스트를 받아오고 ->
    • req.getRequestDispatcher로 리스트를 JSP로 전달
    • 화면에 출력!

다음은 JSP가 잘 열리는지 확인해보자.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
ㅎㅇㅎ
</body>
</html>

잘 출력되는것을 확인할 수 있다.


리스트를 조회하는 코드 작성 (흐름 이해하기)

Service를 통해 list를 얻어오는 코드.

@WebServlet("/board/list")
public class BoardListController 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("doGet 호출 완료");
		
		List<Board> boardList = boardService.getList();
		
		
		req.getRequestDispatcher("/WEB-INF/views/board/list.jsp").forward(req, resp);
	}
}

Service interface

public interface BoardService {

	List<Board> getList();

}

Service implement - Dao를 통해 DB에 있는 list를 조회하고 반환한다.

public class BoardServiceImpl implements BoardService {

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

 

...

...

DAO interface

public interface BoardDao {

	List<Board> selectList();

}

DAO implement - DB에서 list를 조회한 후 ArrayList객체에 저장하고 반환한다.

public class BoardDaoImpl implements BoardDao {

	@Override
	public List<Board> selectList() {
		
		List<Board> boardList = new ArrayList();
		
		// DB에서 list를 조회한 후 boardList에 저장하는 코드
		
		return boardList;
	}

}

흐름을 이해하자. 나도 아직 100프로 이해를 하지는 못했지만 대략 이런식의 흐름으로 mvc 패턴이 이루어진다.

위의 코드를 보면 사실 service가 왜 있어야 하는지 잘 이해가 가지 않는다. 그냥 service 무시하고 바로 dao에서 list를 받아오면 되는거 아닌가 싶은데.. 그냥 연습하다보니까 익숙해졌다. 

- Service는 비지니스 로직 / DAO는 DB에 직접적으로 접근.

아마 구글링 하면 이렇게만 나와서 잘 이해가 안 갈수도 있다. 블로그 글들을 몇 번이고 읽어도 이해가 잘 안 갔었는데 직접 코드를 짜보니까 받아들여지는..? 뭔가 자연스러워졌다. 이 부분이 어려우면 직접 코드를 통해 익히는 것을 추천한다.

(단순한 작업에서는 둘의 차이가 없을 수도 있다. 현재 코드가 그렇다)


DB에서 list를 조회한 후  반환하기. (DAO를 통해 DB에 접근하기)

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

	@Override
	public List<Board> selectList() {
		
		
		// DB에서 list를 조회한 후 boardList에 저장하는 코드
		
		//JDBCTemplate으로 DB에 접근하기
		Connection conn = JDBCTemplate.getConnection();
		
		// 게시판 DB를 조회하는 sql 작성하기 (SELECT * FROM board ORDER BY boardno DESC)
		String sql = "";
		sql += "SELECT boardno, title, userid, hit, write_date FROM board";
		sql += " ORDER BY boardno DESC"; //띄어쓰기 필수! 게시판 조회는 내림차수가 기본
		
        //결과를 저장할 List
		List<Board> boardList = new ArrayList();
		
		try {
			ps = conn.prepareStatement(sql); //sql를 수행할 객체
			rs = ps.executeQuery(); //sql 수행
			
			while(rs.next()) {
				Board board = new Board();
				
				board.setBoardno(rs.getInt("boardno"));
				board.setTitle(rs.getString("title"));
				board.setUserid(rs.getString("userid"));
				board.setHit(rs.getInt("hit"));
				board.setWriteDate(rs.getDate("write_date"));
				
				boardList.add(board);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(rs);
			JDBCTemplate.close(ps);
		}
		
		return boardList;
	}

}

위의 코드가 핵심 코드라 할 수 있는데.. 이 부분 공부할 때 애를 좀 먹었다.

대충 주석으로 설명을 해 놓았지만 최고의 방법은 여러번 반복 작성하면서 자연스레 받아들이는게 최고인 것 같다.

처음에 이 코드를 따라치면서 진짜 샘이 뭐라하건 하나도 이해를 못했다. 진지하게 내가 개발자의 길과 안 맞는 것일까 생각도 들었다.

무작정 반복해보자 하고 저 위의 코드를 한 5~6번은 반복해서 치니까 이 코드가 무슨 역할을 하는 코드인지 받아들이게 됐다.

물론 할 때마다 하나하나씩 구글링 해보았다. 

 

PrepareStatement니 ResultSet이니 rs.next()니 이 부분 이해가 안 가는 사람이 나 말고도 분명 있을거라 생각이 든다. 최대한 포기하지말고 여러번 반복학습 하길 바란다. 

 

어쨌든 저렇게 DB에서 List를 조회한 후 ArrayList boardList에 저장 후 반환을 해주었다. 

그럼boardList가 DaoImpl -> Dao -> ServiceImpl -> Service -> Controller까지 전달된다.

 

그럼 이제 최종적으로 컨트롤러에서 JSP로 전달받은 boardList를 보내주면 된다.

@WebServlet("/board/list")
public class BoardListController 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("doGet 호출 완료");
		
        //최종적으로 DB에 있던 List값이 boardList에 전달된다.
		List<Board> boardList = boardService.getList();
		
        //HttpServletRequest req에 속성값을 지정해준다.
		req.setAttribute("boardList", boardList);
		
        //JSP로 forward해주면 끝
		req.getRequestDispatcher("/WEB-INF/views/board/list.jsp").forward(req, resp);
	}
}

req.setAttribute 이 코드가 정말로 이해가 안됐는데 쉽게 말해 이름과 값을 지정해주는거다.

req에서 "boardList"라는 이름에 List<Board> boardList(DB에서 전달받은 List)를 지정해주는 것이다.

"boardList"는 아무렇게나 이름을 지정해 주어도 된다. "hello"라고 지정해주면 "hello"라는 키값은 boardList라는 값을 가지고 있는 것이다. 저걸 왜 해주냐면 아래 코드에서 확인할 수 있다.

<%@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><%=boardList.get(i).getUserid() %></td>
		<td><%=boardList.get(i).getHit() %></td>
		<td><%=boardList.get(i).getWriteDate() %></td>
	</tr>
	<%	} %>
</table>

</body>
</html>

아까 ㅎㅇㅎ라고 대충 썼던 list.jsp다.

  • req.setAttribute를 한 것을 Line 6에서 getAttribut로 그 값을 받아온다.
  • Line 27. for문으로 boardList의 size만큼 반복 실행시켜준다.
  • <%=boardList.get(i).getBoardno() %> -> boardList의 i번째 boardno를 가져온다. 대략 이런 뜻이다.

 

최종 결과물!!!


아직 정리할게 많이 남았다. list를 조회했으니 페이징 처리하여 실제 게시판 처럼 보이게 만들고 제목 클릭하면 본문내용 보이게도 만들어야하고 클릭 할때마다 조회수도 늘어나야하고 등등...

list를 이해하고 나니까 뒤의 내용들이 하나둘 이해가 가기 시작했고 혼자 코드를 작성할 수 있게 되었다.

 

같은 반 수강생 분들중 3분의 1은 벌써 게시판을 완성했지만 나같은 경우는 list하나정도 겨우 겨우 이해했다.

아직 갈길은 멀지만 그 분들하고 경쟁하는 것이 아니라 내 페이스대로 꾸준히 공부한다는 마인드로 열심히 공부하는 중이다.

 

처음 딱 이해하고 코드 복붙 말고 스스로 생각하면서 작성하고 성공했을 때 정말 코딩의 재미를 느꼈다.

중간에 포기할까 하다가 재미를 붙이니 다시금 공부욕구가 뿜뿜 했다


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

 

자바 국비 일주일 후기

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

kimdevel.tistory.com

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

댓글