8/25/2019

스프링 게시판 만들기 #6. 게시물 조회 구현

board 하위의 write.jsp를 복사/붙여넣기(Ctrl+C/V)를 하면 파일이 복사되며 이름을 입력할 수 있습니다. view.jsp를 입력하고 확인(OK)버튼을 클릭합니다.

조회 페이지의 구성은 작성 페이지와 크게 다르지 않기 때문에 이런식으로 복사해서 사용합니다.

타이틀(<title>)의 내용을 바꾸고, 불필요해진 작성 버튼을 주석처리합니다.

컨트롤러에 게시물 조회용 겟(get) 메서드를 작성합니다.

// 게시물 조회
@RequestMapping(value = "/view", method = RequestMethod.GET)
public void getView() throws Exception {

}

게시판에서 게시물을 구분하는 방법은 여러가지가 있지만, 보편적으로는 게시물에 고유번호(또는 문자)를 이용해서 구분합니다. 지금 만들고 있는 게시판에서는 고유번호로 각 게시물을 구분하므로, 이를 이용하여 코드를 작성해야합니다.

list.jsp에서 제목 부분의 태그를 수정합니다.

<td>
    <a href="/board/view?bno=${list.bno}">${list.title}</a>
</td>

이렇게하면 링크 태그의 주소(href)는 /board/view?bno=[고유번호]가 되기 때문에, 주소의 파라미터값 컨트롤러에 전달할 수 있습니다.

프로젝트를 재시작하여, 제목에 마우스를 올려주면 주소가 위에서 말한 방식으로 되어있는걸 확인할 수 있습니다.

물론 아직 코드가 작성되지 않았기 때문에 내용은 없습니다.

DBMS에서 직접 쿼리를 입력하여 테스트해봅니다.

이때 와일드 카드 문자(*)는 되도록이면 사용하지 않고 필요한 컬럼을 모두 입력하는 방식으로 합니다. 이렇게하는 이유는, 쿼리문만 보고 그 구조를 이해할 수 있도록 작성하기 위함입니다.

작성한 쿼리문을 매퍼(mapper)에 추가합니다.

<!-- 게시물 조회 -->
<select id="view" parameterType="int" resultType="com.board.domain.BoardVO">
 select 
  bno, title, content, writer, regDate, viewCnt
 from 
  tbl_board
 where
  bno = #{bno}   
</select>

파라미터 타입(parameterType)은 매퍼에 들어오는 데이터, 리설트 타입(resultType)은 매퍼가 내보내는 데이터입니다.

정수(int)형인 게시물 번호를 보내고, 게시물의 데이터형인 BoardVO를 내보내게됩니다.

BoardDAO와 BoardDAOImpl에 코드를 추가합니다.

// 게시물 조회
public BoardVO view(int bno) throws Exception;
// 게시물 조회
public BoardVO view(int bno) throws Exception {
 
 return sql.selectOne(namespace + ".view", bno);
}

마찬가지로 BoardService와 BoardServiceImpl에 코드를 추가합니다.

// 게시물 조회
public BoardVO view(int bno) throws Exception;
// 게시물 조회
@Override
public BoardVO view(int bno) throws Exception {

 return dao.view(bno);
}

지금은 단순히 데이터를 주고 받는것뿐이라 별다른 코드는 없습니다.,

이제 컨트롤러에도 코드를 추가 했는데, 게시물 목록에서 했던것 처럼 Model을 이용하면 됩니다만... 이번에는 게시물 번호를 받아야합니다.

주소는 /board/view?bno=[고유번호] 방식으로 되기 때문에, 이 주소에서 bno의 값을 걸러내면 됩니다.

@RequestParam([문자열])을 이용하면, 주소에 있는 특정한 값을 가져올 수 있습니다. 위 스크린샷에서는 주소에서 bno를 찾아 그 값을 int bno에 넣어줍니다.

BoardVO응 이용하여 서비스(service)에서 데이터를 받고, 모델(model)을 이용하여 뷰(view)에 데이터를 넘겨줍니다. 이때, 넘겨주는 모델의 이름은 view입니다.

컨트롤러에서 전달받은 모델(model)명인 view를 이용해 출력할 수 있습니다.

프로젝트를 시작하고, 목록에서 게시물 제목중 하나를 클릭합니다.

view 페이지로 이동되며, 고유번호에 맞는 내용이 출력됩니다.

작성 페이지를 그대로 복사해서 사용했는데, 조회에서는 게시물을 입력 또는 수정할 인풋(input)이나 텍스트에어리어(textarea)가 필요없습니다.

불필요한 코드를 삭제합니다.

<label>제목</label>
${view.title}<br />

<label>작성자</label>
${view.writer}<br />

<label>내용</label><br />
${view.content}<br />

뭔가 눈에 들어오지 않는 디자인이 되어버렸습니다. 디자인은 게시물 수정 작업 이후에 다루겠습니다.

게시물 수정
  1. 안녕하세요 게시물 잘 도움받으면서 처음으로 진도 여기까지 왔습니다 감사합니다.
    근데 문제가 하나 생겨서 질문합니다
    제가 sql developer를 db로 쓰고있는데 db에서 시퀀스 적용해서 잘따라오다 조회부분에서
    Required int parameter 'bnumber' is not present 이 경고음이 떴습니다 ㅠㅠ
    어떻게 해야할지 알려주실수 있을까요...??
    (참고로 bno를 bnumber로 사용하고 있습니다)

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      Required int parameter 'bnumber' is not present는 bnumber가 숫자 타입이 아니어서 생기는 에러같습니다. (즉, 입력이 되질 않아서 null로 되어있다는 의미)
      뷰(화면, jsp_)에서 bnumber값이 제대로 받아져오는지 확인해보셔야할 것 같습니다.

      삭제
    2. 감사합니다 찾아보다가 기본생성자를 만드니까 되었습니다 :)

      삭제
  2. 정수(int)형인 게시물 번호를 보내고, 게시물의 데이터형인 BoardVO를 내보내게됩니다.

    이부분에서 BoardVO를 내보낸다는 말이 정확히 어떤 설명인지 알 수 있을까요??

    제가 시작한지 얼마 안된 초보라 자세하게 설명해주시면 감사하겠습니다

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      질문하신곳의 코드에서 눈여겨 보셔야할곳은 매퍼에 있는 코드입니다.

      <select id="view" parameterType="int" resultType="com.board.domain.BoardVO">
      select
      bno, title, content, writer, regDate, viewCnt
      from
      tbl_board
      where
      bno = #{bno}
      </select>


      여기에서 parameterType는 입력받는 데이터, resultType는 출력할 데이터입니다.
      출력할 데이터란, 쿼리문이 실행된 결과입니다.

      1. 게시물 목록에서 33번 게시물을 클릭
      2. 게시물 번호인 '33'이 컨트롤러의 int bno에 저장
      3. 2번에서 저장된 bno가 service → dao를 통해 매퍼(mapper)로 전달
      4. 매퍼의 parameterType이 int(정수형)이므로, 정수형이 아닌 데이터가 입력되면 에러 발생
      5. bno는 33인 정수이므로, 에러가 없이 쿼리문이 실행되고
      6. 쿼리문이 실행된 결과(제목, 내용, 작성자, 작성일)를 resultType에 지정된 BoardVO형태로 반환
      7. dao → service를 통해 컨트롤러에 전달
      8. 컨트롤러는 받은 데이터를 화면에 전달

      이 되겠습니다.

      삭제
  3. 익명3/23/2021

    쉽게 설명해주셔서 감사합니다.. 큰 도움 되었습니다ㅠㅠ

    답글삭제
  4. 안녕하세요. 진행하다가 에로사항이 한 가지고 있는데...
    게시글을 작성완료하면 DB에 잘 저장되고 목록에 나타납니다.
    클릭해도 상세페이지 잘 나타나구요.
    근데 다시 목록으로 돌아가서 똑같은 글을 누르면 에러가 나타나면서 상세페이지가 나타나지가 않네요.
    url상으로는 주소 매칭이 잘 되어있는데..
    왜 클릭이 한 번만 되고 두 번째 부터는 에러페이진가 나오는지.. 혹시 어떤 이유가 있을까요...?!

    답글삭제
  5. @RequestParam 이 뜻하는게 뭔가요

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      특정 파라미터값을 가져오는거라 이해하시면 되겠습니다.

      삭제
  6. 제가 하면서 느낀점이 kuzuro 님 방식은 리퀘스트맵핑 메소드만 만들어주면 URL 주소와 같은 템플릿을 봐로싸주는 방식이라 리턴이 없게 만드시는것같은데 맞나요?

    답글삭제
  7. 감사합니다~ 덕분에 자바 공부하면서 잘 적용하고 있네요 ㅎㅎ
    자바 11 환경이고 mysql이라 코드가 살짝 다르긴 하지만 그때 마다 구글 검색하면서 하니까 시간이 좀 걸려도 비슷하게? 구현되네요

    답글삭제
  8. 익명8/21/2023

    감사합니다~ 좋은 일 가득하세요~~

    답글삭제