본문 바로가기

Programming/SERVER

DAY 126. MVC2 패턴 - 게시글 상세 조회

게시글 상세 조회

01. list.jsp

- 리스트에 게시된 글의 제목을 클릭하면 작성된 글의 상세 보기로 넘어갈 수 있도록 ${ board.title } 을 <a></a> 태그로 감싼다.

- <a href=""> 속성에 경로 지정하면서 페이지에 대한 게시글을 구분할 수 있는 PK 값을 URL에 함께 넘긴다.

<a href="${ pageContext.request.contextPath }/board/view?no=${ board.no }">

<!-- 혹은 시퀀스를 활용해서 rowNum 컬럼이 있다면 rowNum으로 전체 게시글 중에 몇 번째 게시글인지 찾아와도 된다. -->

 

 

02. view.jsp

- 이 페이지와 연결 시킨다.

- 서블릿에서 NO 값을 받아서 NO에 해당하는 게시글 조회해서 데이터를 주면, 데이터를 받아서 view.jsp에서는 화면을 그려준다. 

 

03. ViewServlet.java

- com > kh > mvc > board > controller 밑에 생성

- view.jsp 페이지로 forward를 위한 작업 

- requst.getReqeustDispatcher("URL").forward(request, response);

- 요청을 Dispatcher를 통해서 URL에게 보내는데, forward를 가지고 요청, 응답 정보를 같이 보낸다.

 

- 게시글 조회할 때는 딱히 로그인 로직이 필요 없다고 간주, 작성하지 않고 진행

- no 값을 숫자로(정수 값 변수로) 읽어오자. (Interger 객체 활용 parseInt() 로 형변환)

 

- 사용자는 게시글을 누르고 들어오겠지만, 직접 사용자가 URL 작성해서 들어온다거나, 잘못 된 형식의 URL 입력 했을 경우 (해당하는 파라미터의 값이 없거나, 파라미터의 값이 숫자가 아니라면 500 에러 발생) 처리하는 로직 구현 고민해 볼 것

 

- 서블릿에서는 비즈니스 로직을 직접 처리하지 않으므로, BoardService service = new BoardService(); 객체를 만든다.

- 사용자가 보낸 값을 전달한다. HOW?

- service 객체에게 내가 정한 메소드 findBoardbyNo에게 no 값을 넘겨준다. 그러면 Board board 객체를 리턴하도록 한다.

- Board board객체는 reqeust 영역 객체에 Attribute로써 담아줘야 한다. 하나의 요청에 대한 결과를 객체로 보여주기 때문에 굳이 session 영역 객체일 필요가 없다.

 

04. BoardService.java

- findBoardbyNo() 메소드 생성

- SELECT 쿼리문을 활용할 부분

- Board로 리턴을 해야하기 때문에 board 객체 생성

- 데이터 베이스에 연결할 때는 dao를 통해서 작업하기 때문에, Connection 객체 생성하고 

- dao에서 사용할 connection과 no를 같이 매개값으로 넘겨준다. 이 실행하는 메소드는 결과 값이 board 객체이다.

- close(connection); 작성

 

 

05. BoardDao.java

- findBoardbyNo() 메소드 생성

- PreparedStatment 객체 생성

- ResultSet 객체 생성

- SELECT 쿼리문 작성

- Connection 객체에서 쿼리문을 넘김으로써 pstmt를 얻어온다. 이 때 발생하는 것은 SQLException 처리 한다.

- 위치홀더에 해당하는 값을 넣어준다. setAttribute (위치홀더 순서, 매개값으로 전달받은 값)

- SELECT 쿼리문 실행 결과 값은 정수형으로 오기 때문에 ResultSet 객체에 담아준다.

- 검색 결과로 오는 것은 1건이다. WHY? NO PK 값을 가지고 SELECT 하고 있기 때문에 조회된 하나의 행의 값을 보드 객체를 만들어서 SET 해주면 된다.

try{

	pstmt = connection.preparedStatement(query);
    
    pstmt.setInt(1, no);
    
    rs = pstmt.executeQuery();
    
    // next()가 true이면 커서가 실제 데이터를 가르키므로 board 참조 변수에 Board 객체를 만들고 값을 set
    if(rs.next()){
    	board = new Board();
        
        // 조회할 때 사용하던 no 사용해도 되고
        board.setNo(no);
        // 혹은 쿼리문에 no를 찾으라고 줬던 컬럼명 사용해도 된다.
        board.setNo(rs.getInt("NO");
        // 등등 쿼리에 해당하는 값대로 다 SET
    }


} catch (SQLException e) {
	e.printStackTrace();
} finally {
	close(rs);
    close(pstmt);
}

 

 

06. view.jsp

- 각 영역에 정보를 받아올 수 있도록 EL 구문 활용하여 코드 수정