▸JSP & Servlet/기본 문법

MVC 패턴의 게시판 만들기_게시물 보기 로직 [5/5]

코데방 2020. 3. 3.
728x90

로그인 페이지 만들기에 이어 이번에는 MVC 패턴을 적용한 웹 어플리케이션에서 게시판을 만들어봅니다. Spring 없이 순수 JSP와 서블릿으로 구성되며, 기존 로그인과 회원가입, 정보조회를 만들었던 웹페이지에 기능을 붙여서 구현합니다. 

 

[· JSP & Servlet/- 부트스트랩] - 부트스트랩으로 게시판 만들기_리스트 화면 [1/3]

[· JSP & Servlet/- 부트스트랩] - 부트스트랩으로 게시판 만들기_글쓰기 화면 [2/3]

[· JSP & Servlet/- 부트스트랩] - 부트스트랩으로 게시판 만들기_게시물 보기 화면 [3/3]

[· JSP & Servlet/- 기본 문법] - MVC 패턴의 게시판 만들기_계층형 게시판 로직 설계 [1/5]

[· JSP & Servlet/- 기본 문법] - MVC 패턴의 게시판 만들기_페이징 처리(오라클DB) [2/5]

[· JSP & Servlet/- 기본 문법] - MVC 패턴의 게시판 만들기_리스트 출력 로직 [3/5]

[· JSP & Servlet/- 기본 문법] - MVC 패턴의 게시판 만들기_글작성 로직 [4/5]

[· JSP & Servlet/- 기본 문법] - MVC 패턴의 게시판 만들기_게시물 보기 로직 [5/5]

 

 

전체 코드는 깃허브에 있습니다. 커밋 시점은 "add board" 입니다. 

https://github.com/codevang/hssweb

 

 

 


 

 

뷰에서 요청한 게시물 번호에 대한 내용을 DB에서 꺼내 DTO에 넣어 전달해주는 DAO 코드입니다. 구조가 간단한 경우는 그냥 select만 해오면 되지만, 만약 조회수를 늘려주는 등의 기능이 별도로 있다면 조회와 동시에 update도 같이 진행돼야 합니다.

 

 

게시물을 보여주는 뷰에 대한 내용은 위 링크를 참조하시면 됩니다.

 

 


 

 

먼저 간단한 select 쿼리로 요청된 게시물에 대한 데이터를 DTO에 담아줍니다. 데이터 전달은 request 객체에 Attribute로 담아주는 방식을 사용했는데 각자 설계한 구조에 맞게 어떻게든 전달해주면 될 것 같습니다. DTO 데이터의 전달은 모든 작업이 정상적으로 완료된 뒤 할 것이므로 가장 마지막으로 미룹니다. 그리고 검색된 게시물이 없을 경우 리턴시킨 뒤 따로 처리를 해줍니다. 

 

	/* 컨텐츠 보기 */
	public int readBoard(int bdNum) {

		BoardDTO dto = new BoardDTO();

		try {
			dbConnect(); // db 연결
			stmt = conn.createStatement();

			String query = "select * from board_chat where bdnum = " + bdNum;
			result = stmt.executeQuery(query);
			int i = 0;
			while (result.next()) {
				i++;
				dto.setBdNum(result.getInt("bdnum"));
				dto.setBdGroup(result.getInt("bdgroup"));
				dto.setBdOrder(result.getInt("bdorder"));
				dto.setBdIndent(result.getInt("bdindent"));
				dto.setBdTitle(result.getString("bdtitle"));
				dto.setBdContent(result.getString("bdcontent"));
				dto.setBdUserID(result.getString("bduserid"));
				dto.setBdViewCount(result.getInt("bdviewcount"));
				dto.setBdDate(result.getString("bddate"));
			}
            
        	        // 검색된 게시물이 하나도 없을 경우 (삭제된 게시물 등)
			if (i == 0) {
				return Ctrl.FALSE;
			}

 

 


 

 

이제 해당 게시물에 대한 조회수를 하나 늘려줍니다. 조회수는 무조건 누른다고 늘지 않고 일정 기준으로 늘어납니다. 저 같은 경우는 같은 세션을 가진 사용자가 한 게시물을 여러 번 클릭하더라도 한 번 이상 조회수가 늘어나지 않게 설정했습니다.

 

이를 위해 session의 Attribute에 게시물을 봤다는 정보를 넣어줘야 하는데, 각 게시물마다 정보가 들어가야 하므로 Attribute name을 게시물 번호로 지정했습니다. 따라서 해당 게시물에 대한 Attribute가 존재하면 이미 본 것으로 간주해 처리하지 않고, 없다면 조회수를 늘려준 뒤 Attribute를 추가해줍니다.

 

			// 조회수 늘리기 (이미 게시글을 본 세션에 대해서는 조회수를 늘리지 않음)
			HttpSession session = request.getSession();
			String view = "viewBdNum" + bdNum;
			
			// 게시물을 이미 본 세션이 아니면 조회수 올려줌
			if (session.getAttribute(view) == null) {
				query = "update board_chat set "
						+ "bdviewcount = bdviewcount + 1 where bdnum = "
						+ bdNum;
				stmt.executeUpdate(query);
				conn.commit();
				// 조회수를 올렸으면 세션에 표시
				session.setAttribute(view, true);
			}

 

 


 

 

마지막으로 정상적인 쿼리 수행이 끝났다면 DTO 객체를 전달하고 리턴시킵니다. 만약 조회수 업데이트 쿼리에서 예외가 발생했다면 롤백을 수행해줍니다. 이 부분은 이전글의 마지막 부분을 참조 부탁드립니다.

 

[· JSP & Servlet/- 기본 문법] - MVC 패턴의 게시판 만들기_글작성 로직

 

			// 최종적으로 객체를 담고 리턴
			request.setAttribute("boardDTO", dto);
			return Ctrl.TRUE;
		
		// 업데이트 쿼리 예외 발생 시 롤백 수행 
		} catch (Exception e) {
			try {
				conn.rollback();
			} catch(Exception rollbackEx) {
				rollbackEx.printStackTrace();
				System.out.println("view update rollaback fail");
			}
			System.out.println("board db select fail");
			e.printStackTrace();
		} finally {
			dbClose(); // 모든 자원 해제
		}
		return Ctrl.EXCEPT;
	}

 

 


 

 

[ db.boardDAO - 게시물 보기 로직 전체 코드 ]

 

	/* 컨텐츠 보기 */
	public int readBoard(int bdNum) {

		BoardDTO dto = new BoardDTO();

		try {
			dbConnect(); // db 연결
			stmt = conn.createStatement();

			String query = "select * from board_chat where bdnum = " + bdNum;
			result = stmt.executeQuery(query);
			int i = 0;
			while (result.next()) {
				i++;
				dto.setBdNum(result.getInt("bdnum"));
				dto.setBdGroup(result.getInt("bdgroup"));
				dto.setBdOrder(result.getInt("bdorder"));
				dto.setBdIndent(result.getInt("bdindent"));
				dto.setBdTitle(result.getString("bdtitle"));
				dto.setBdContent(result.getString("bdcontent"));
				dto.setBdUserID(result.getString("bduserid"));
				dto.setBdViewCount(result.getInt("bdviewcount"));
				dto.setBdDate(result.getString("bddate"));
			}

			// 검색된 게시물이 하나도 없을 경우 (삭제된 게시물 등)
			if (i == 0) {
				return Ctrl.FALSE;
			}
			
			// 조회수 늘리기 (이미 게시글을 본 세션에 대해서는 조회수를 늘리지 않음)
			HttpSession session = request.getSession();
			String view = "viewBdNum" + bdNum;
			
			// 게시물을 이미 본 세션이 아니면 조회수 올려줌
			if (session.getAttribute(view) == null) {
				query = "update board_chat set "
						+ "bdviewcount = bdviewcount + 1 where bdnum = "
						+ bdNum;
				stmt.executeUpdate(query);
				conn.commit();
				// 조회수를 올렸으면 세션에 표시
				session.setAttribute(view, true);
			}
			
			// 최종적으로 객체를 담고 리턴
			request.setAttribute("boardDTO", dto);
			return Ctrl.TRUE;
		
		// 업데이트 쿼리 예외 발생 시 롤백 수행 
		} catch (Exception e) {
			try {
				conn.rollback();
			} catch(Exception rollbackEx) {
				rollbackEx.printStackTrace();
				System.out.println("view update rollaback fail");
			}
			System.out.println("board db select fail");
			e.printStackTrace();
		} finally {
			dbClose(); // 모든 자원 해제
		}
		return Ctrl.EXCEPT;
	}
728x90

댓글

💲 추천 글