공부/그룹 스터디

[6회차 02] 게시판 리스트 만들기 - DB값 불러오기

junani0v0 2024. 5. 11. 21:24

[6회차 02]

BoardDao

이전 코드

class BoardRowMapper implements RowMapper<BoardDto>{

    @Override
    public BoardDto mapRow(ResultSet rs, int rowNum) throws SQLException {
        BoardDto boardDto = null;
        while(rs.next()) {
            boardDto = new BoardDto();
            boardDto.setBoardSeq(rs.getInt("board_seq"));
            boardDto.setBoardTypeSeq(rs.getInt("board_type_seq"));
            boardDto.setTitle(rs.getString("title"));
            boardDto.setContent(rs.getString("content"));
            boardDto.setDelYn(rs.getString("del_yn"));
            boardDto.setHit(rs.getInt("hit"));
            boardDto.setRegDtm(rs.getString("reg_dtm"));
            boardDto.setRegMemberSeq(rs.getInt("reg_member_seq"));
            boardDto.setUpdateDtm(rs.getString("update_dtm"));
            boardDto.setUpdateMemberSeq(rs.getInt("update_member_seq"));
            boardDto.setBoardTypeNm(rs.getString("board_type_nm"));

        }
        return boardDto;
    }
}

수정 코드

전에 작성한 BoardRowMapper클래스는 RowMapper 인터페이스를 구현했는데요 단일 행 객체로 맵핑하는데 사용됩니다 하지만 저희는 게시물 리스트를 가져오기위해 새로운 클래스를 만들어 보겠습니다

class BoardListMapper implements ResultSetExtractor<List<BoardDto>>{

    @Override
    public List<BoardDto> extractData(ResultSet rs) throws SQLException, DataAccessException {
        ArrayList<BoardDto> list = new ArrayList<>();

        BoardDto boardDto = null;
        while(rs.next()) {
            boardDto = new BoardDto();
            boardDto.setBoardSeq(rs.getInt("board_seq"));
            boardDto.setBoardTypeSeq(rs.getInt("board_type_seq"));
            boardDto.setTitle(rs.getString("title"));
            boardDto.setContent(rs.getString("content"));
            boardDto.setDelYn(rs.getString("del_yn"));
            boardDto.setHit(rs.getInt("hit"));
            boardDto.setRegDtm(rs.getString("reg_dtm"));
            boardDto.setRegMemberSeq(rs.getInt("reg_member_seq"));
            boardDto.setUpdateDtm(rs.getString("update_dtm"));
            boardDto.setUpdateMemberSeq(rs.getInt("update_member_seq"));
            boardDto.setBoardTypeNm(rs.getString("board_type_nm"));

            list.add(boardDto);
        }
        return list;
    }
} 

먼저 클래스 이름은 BoardListMapper라하고 객체를 리스트로 맵핑해야하기에 ResultSetExtractor인터페이스로 구현합니다

  • extractData메서드는 ResultSet에서 모든 행을 가져와서 각 행을 객체로 맵핑하여 리스트에 추가합니다
    (모든 행을 가져오기에 전처럼 int rowNum으로 행을 따로 지정해주지 않아도 됩니다)
  • BoardDto 객체를 담을 ArrayList를 만들어줍니다
  • 새로운 BoardDto 객체를 생성
  • while(rs.next()) : ResultSet에 다음 레코더가 있을때까지 반복합니다
  • ResultSet으로부터 각 열의 값을 가져와 boardDto 객체의 각 필드에 set합니다
  • while문으로 돌린 값을 boardDto 객체로 변환 후 list에 추가합니다
  • 값을 담은 list를 반환합니다

이제 서버를 돌려 list값을 찍어보면

이렇게 값이 나온걸 확인 할 수 있습니다

list.jsp - 값 출력

<tr>
    <td>1</td>
    <td>
        <a href="<c:url value='/forum/notice/readPage.do'/>">
            Payoneer
        </a>
    </td>
    <td>2024.03.23 21:57:13</td>
    <td>홍길동</td>
</tr>
<tr>
    <td>1</td>
    <td>Payoneer</td>
    <td>2024.03.23 21:57:13</td>
    <td>홍길동</td>
</tr>
<tr>
    <td>1</td>
    <td>Payoneer</td>
    <td>2024.03.23 21:57:13</td>
    <td>홍길동</td>
</tr>
<tr>
    <td>1</td>
    <td>Payoneer</td>
    <td>2024.03.23 21:57:13</td>
    <td>홍길동</td>
</tr>
<tr>
    <td>1</td>
    <td>Payoneer</td>
    <td>2024.03.23 21:57:13</td>
    <td>홍길동</td>
</tr>

지금 위처럼 임시 값이 이렇게 하나씩 다 입력해서 들어가 있는데요
list에 담은 값을 이렇게 다 손으로 넣어 줄 수 없기에 출력할 때는 forEach문을 사용해 하나씩 출력해줍니다

<c:forEach items="${list}" var="i" begin ="0" step="1" varStatus="status">
    <tr>
        <td>${i.boardSeq}</td>
        <td>${i.title}</td>
        <td>${i.regDtm}</td>
        <td>${i.regMemberSeq}</td>
    </tr>
</c:forEach>

forEach문을 사용해 코드가 간결해집니다
간단하게 forEach문을에 들어간 속성설명을 적어보겠습니다

  • items : 반복할 항목들의 컬렉션을 지정(컬렉션은 배열이나 컬렉션 객체)
  • var : 각 항목을 참조할때 사용할 변수의 이름을 지정
  • begin : 속성을 반복을 시작할 인덱스 지정(기본값 0)
  • step : 반복을 진행할 때마다 증가되는 값
  • varStatus : 현재 반복 상태를 저장할 변수 이름 지정

즉, list값을 i라고 지정하고 0부터 1씩 증가하며 반복되는 코드입니다


실행하면 이렇게 값이 바뀐걸 확인 할 수 있습니다 하지만 지금 작성자가 숫자로 되어있습니다 이걸 id로 바꿔 보겠습니다

BoardDao

    public List<BoardDto> getList(){
        String sql = "SELECT b.board_seq , b.board_type_seq , b.title , b.content , b.hit , b.del_yn ,b.reg_dtm , "
                + "b.reg_member_seq ,b.update_dtm , b.update_member_seq , bt.board_type_nm , m.member_id  "
                + "FROM board b  "
                + "JOIN board_type bt ON bt.board_type_seq  = b.board_type_seq  "
                + "JOIN member m ON m.member_seq = b.reg_member_seq "
                + "WHERE 1 = 1 "
                + "LIMIT 0, 10";

        Object[] args = {};

        return query(sql, new BoardListMapper(), args);
    }

Join으로 member테이블의 member_seq와 reg_member_seq를 연결합니다
join을 했기에 member테이블의 member_id값을 가져옵니다

BoardDto

private String memberId;

public String getMemberId() {
    return memberId;
}
public void setMemberId(String memberId) {
    this.memberId = memberId;
}

이제 memberId를 추가하고 getter와 setter를 만들어줍니다

BoardDao

boardDto.setMemberId(rs.getString("member_id"));

BoardListMapper에 memberId값도 set해줍니다

list.jsp

이제 ${i.regMemberSeq}${i.memberId}로 변경하고 서버를 실행

이제 작성자가 memberId로 바뀐걸 확인 하실 수 있습니다