Mybatis 활용한 기초 board 만들기 1 (기본파일 세팅, index, 게시판 목록)
쌤께서 아래와 같이 사용된다고 Mybatis를 연습시키셨다.
- 스프링framework + Mybatis
- 스프링boot(스프링 업뎃버전) +jpa
1. 기본 파일 세팅
<Controller>
- doProcess를 활용해서 데이터 주고 받도록
<DTO>
- 변수생성 getter, setter
그 전에는 DAO패키지를 만들어
데이터 베이스를 실행과 종료를 담당하는 JDBCUtil과
sql 기능을 실행하는 DAO를 각각 생성하여 실행하였다.
이제는 Service와 Sqlmap 패키지를 각각 만들어서
각 요소별로 세분화하였다.
<Service>
- interface를 활용하여 실질적으로 실행할 메소드 생성
<Sqlmap>
1) mapper.xml - 데이터베이스 실행할 SQL쿼리 작성하는 공간
2) sqlSessionManager.java - try, catch문 실행
3) configuration.xml - 데이터베이스 접속 정보를 세팅하고,
mapper파일을 설정한다.
2. index.jsp를 만들어 servlet으로 가도록 만들기
나는 servlet에서 .do로 보냈을 때 받도록 설정했다.
servlet으로 갔을때 게시판 목록으로 가도록 설정할 것이다.
<jsp:forward page="boardList.do"></jsp:forward>
3. 메소드 실행을 위한 생성자 만들기 및 초기화 하기
Mybatis에서는 실행영역을 패키지로 만들어서 나눴다.
우리는 메소드 실행을 인터페이스로 만들어서 sql이 실행되도록 했기에
이를 위해 sevlet 메소드 아래에서 인터페이스를 선언해주고,
생성자에서 초기화를 시켜준다.
4. boardList.do servlet 만들어 게시판 목록으로 이동하기
boardList.do가 실행되었을 때 우리는 게시판 목록으로 이동하게 만들것이라고 했다.
게시판 목록에는 작성글이 없을 수도 있지만, 글이 여러개 일수도 있다.
또한, 글 안에는 글번호, 작성자, 작성일, 제목, 내용 등등의 다양한 변수들이 포함되어 있다.
이럴때 우리는 List를 사용하여 여러 정보를 담을 수 있게 한다.
if(command.equals("/boardList.do")) {
List<BoardDTO> boardList = boardService.selectBoardList();
request.setAttribute("boardList", boardList);
page="board_list.jsp";
}
5. 게시판 목록(board_list.jsp) 만들기
게시판에는 데이터가 없을 때 게시글이 없다는 내용이 뜨고,
게시글이 있을때는 위와 같이 데이터를 불러오도록 만들것이다.
이럴때 사용하는게 taglib이기 때문에 jsp 상단에 taglib태그를 만들어 준다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<table>
(열 간격을 colgroup으로 지정했다. css부분)
<colgroup>
<col width="8%">
<col width="*">
<col width="15%">
<col width="30%">
<col width="15%">
</colgroup>
<tr>
<td>번호</td>
<td>제목</td>
<td>작성자</td>
<td>작성일</td>
<td>조회수</td>
</tr>
나는 choose when otherwise를 사용할 것이다.
when에는 게시글이 없을때 게시판에 표시될 내용을
otherwise는 데이터가 있을 때 표시될 내용을 넣고자 한다.
boardList <- 우리가 list에서 받은 데이터
<c:choose>
<c:when test="${boardList.size() eq 0}">
<tr>
<td colspan="5">
게시글이 없습니다.
</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach var="board" items="${boardList }">
<tr>
<td>${board.board_num }</td>
<td> <a href="board_detail.do?board_num=${board.board_num }">
${board.title }</a> </td>
(나는 글제목을 누르면 글 상세페이지로 넘어가도록 설정했다)
(sql에서 글번호를 primary key로 설정했다)
<td>${board.writer }</td>
<td>${board.create_date }</td>
<td>${board.read_cnt }</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
(글쓰기버튼을 누르면 글쓰기 화면으로 가도록 설정했다)
<div align="center">
<input type="button" value="글쓰기" onclick="location.href='board_write_form.jsp';">
</div>
7. mapper쿼리 만들기
게시글 전체를 불러올것이기 때문에 SELECT를 활용한다.
★ SELECT태그는 반드시 조회 결과를 어떻게 자바로 가져올 지에 대해 정의를 해줘야 한다.
SELECT 쿼리만 데이터 조회 후 자바로 가져오기 때문이다.
INSERT, UPDATE는 자바에서 받은 자료를 DB로 넣기만 한다.
조회된 데이터가 자바에서 제공하는 자료형(int, String)인 경우 resultType을 사용한다.
(데이터 하나 가져오는 경우 BOARD_NUM 가져올 땐 int boardNum =1,
Writer를 가져올 땐 String writer = 김자바)
조회 결과 클래스형 자료형(dto)을 사용해야 한다면 resultMap을 사용해야 한다.
-resultMap : DB에서 조회된 데이터를 자바로 가져올 때 어떻게 가져올 지 정의
<mapper namespace="boardMapper">
mapper 파일에 나는 boardMapper라고 이름을 부여했다.
<resultMap type="dto.BoardDTO" id="board">
type : 조회된 데이터를 저장할 수 있는 DTO클래스
BoardDTO가 어느 패키지에 저장되어 있는지 정확하게 작성하기
패키지.클래스명 = dto.BoardDTO
id : 각각 데이터를 담는 것 자체를 board라고 하겠다.
<id column="BOARD_NUM" property="board_num"/>
(id는 모양 <id/>인데 혼자서 <id></id> 역할을 다한다는 뜻이다.)
(primary key는 id에 데이터를 입력한다)
<result column="TITLE" property="title"/>
<result column="writer" property="writer"/>
<result column="CONTENT" property="content"/>
<result column="CREATE_DATE" property="create_date"/>
<result column="READ_CNT" property="read_cnt"/>
(result column은 DB에 실제 콜론값을 입력하고,
property는 dto에 입력한 변수명을 입력한다.)
</resultMap>
게시글은 글번호, 제목, 작성자, 내용, 조회수 등 여러 변수를 받아와야 하기 때문에
resultMap을 사용한다.
<select id="selectBoardList" resultMap="board">
SELECT BOARD_NUM
, TITLE
, WRITER
, TO_CHAR(CREATE_DATE, 'YYYY-MM-DD') AS CREATE_DATE
(게시글 작성일자를 2022-08-07로 표현하도록 변경했다)
, READ_CNT
FROM BOARD
ORDER BY BOARD_NUM DESC
</select>
8. 인터페이스에서 메소드 만들기
boardService에서 매소드를 먼저 만든다.
리턴값 메소드명(매개변수); 형태로 메소드를 만들어 준다.
List<BoardDTO> selectBoardList();
BoardServiceImpl로 넘어오면 빨간색으로 표시가되는데
그때 마우스를 BoardServiceImpl에 두고 add 버튼을 클릭한다.
@Override
public List<BoardDTO> selectBoardList() {
List<BoardDTO> list = sqlSession.selectList("boardMapper.selectBoardList");
(★쿼리 결과값이 여러 행 나올 때는 selectList
한 행 나올 때 selectOne)
(selectList(mapper 이름부여한것.내가 실행할 쿼리명))
sqlSession.commit();
(원래 커밋을 해줄 필요 없지만 자바랑 Mybatis특성상 DB에 반영안될 때도 있어서)
return list;
}