Spring / (게시판 작성) 게시물 목록
먼저 테스트할 내용들을 DB에 추가해준다
이렇게 테이블 안에 잘 추가 되었는지 확인한다
insert into tbl_board(title, content, writer)
values('제목입니다1', '내용입니다1', '작성자1');
insert into tbl_board(title, content, writer)
values('제목입니다2', '내용입니다2', '작성자2');
insert into tbl_board(title, content, writer)
values('제목입니다3','내용입니다3', '작성자3');
insert into tbl_board(title, content, writer)
values('제목입니다4', '내용입니다4', '작성자4');
insert into tbl_board(title, content, writer)
values('제목입니다5', '내용입니다5', '작성자5');
commit;
select * from tbl_board;
그 뒤에 view 폴더에 board 라는 폴더를 추가해준다
만든 board 폴더 우클릭 > New > Other... > jsp File > 이름은 list.jsp > Next
html 5 인지 확인 후 Finish 를 눌러서 생성해준다
만든 list.jsp 파일 맨 위에 위 코드를 추가해준다 이 코드는 JSTL을 사용하기위해 추가한다
JSTL 이란 기존에 사용하던 스클립틀릿보다 가독성이 좋고 이해하기 쉬워 사용한다
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
list.jsp 파일의 태그 내부에 위 코드를 추가해준다
<table>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성일</th>
<th>작성자</th>
<th>조회수</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
그 다음 home.jsp로 넘어와 게시물 목록 페이지로 이동하는 링크를 추가한다
board 폴더 내부의 list 파일로 간다는 내용이다
<p><a href="/board/list">게시물 목록</a></p>
/board/list 에 해당되는 컨트롤러를 추가해주기 위해 src/main/java > com.board.controller 내부에 클래스를 추가해준다
이름은 BoardController
컨트롤러를 추가해주지 않고 게시물 목록 버튼을 누르면 404 에러가 뜬다
만들어진 파일에 코드를 집어넣는다
컨트롤러에 필요한것들을 import 해준다
BoardController는 " /board/* " 로 시작하는 path에 반응하는데
1. 사용자가 게시물 목록 버튼을 누른다
2. http//localhost:8080/board/* 가 요청된다
3. 그럼 그 안의 코드가 실행이되는데
4. @RequestMapping(value = "/list" , method = RequestMethod.GET)
value 는 요청받을 url 설정 method 는 어떤 요청으로 받을지 정의한다 (GET, POST, DELETE, PUT 등등)
package com.board.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/board/*")
public class BoardController {
@RequestMapping(value = "/list", method = RequestMethod.GET)
public void getList() throws Exception {
}
}
톰캣 서버 더블클릭 > Modules 탭 선택 > 프로젝트 선택 > Edit...
path > / 로 변경 > OK
프로젝트를 실행해서 연결이 잘 되었는지 확인한다
아직 데이터베이스에서 데이터를 가져오지않아서 내용은 출력이 안된다
먼저 데이터베이스에서 쿼리를 작성에 필요한 데이터를 출력해본다
이때 모두를 선택하는 문자 * 를 사용하지않고 필요한 컬럼을 직접 입력한다
데이터를 출력해본 쿼리를 사용해서 매퍼에 코드를 추가해준다
id 는 매퍼 내에서 쿼리를 구분짓는 고유한 이름
resultType 는 쿼리의 결과의 형태이다
<!-- 게시물 목록 -->
<select id="list" resultType="com.board.domain.BoardVO">
select
bno, title, content, writer, regDate, viewCnt
from tbl_board
</select>
src/main/java > New > Package > com.board.dao
src/main/java > New > Package > com.board.service
src/main/java 내에 두개의 패키지를 추가해준다
src/main/java > com.board.dao > New > Interface 생성
Interface 이름은 BoardDAO 로 해준다
만든 인터페이스 내에 코드를 추가해준다
package com.board.dao;
import java.util.List;
import com.board.domain.BoardVO;
public interface BoardDAO {
public List list() throws Exception;
}
src/main/java > com.board.dao > New > class > BoardDAOImpl
Add 버튼을 눌러 아까 생성한 BoardDAO 인터페이스를 생성해주고 BoardDAOImpl 라는 이름을 가진 클래스를 생성해준다
BoardDAO 를 상속받는 BoardDAOImpl 이 생성된다
생성된 BoardDAOImpl 안에 코드를 추가해준다
게시물 즉, tbl_board 1행의 데이터의 형태는 BoardVO에 있는 변수들과 같다 게시물 목록은 tbl_board 가 1행 이상 존재하는것이므로 BoardVO 를 리스트 형태로 만들면 게시물 목록을 받아올수 있다
package com.board.dao;
import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.board.domain.BoardVO;
@Repository
public class BoardDAOImpl implements BoardDAO {
@Inject
private SqlSession sql;
private static String namespace = "com.board.mappers.board";
// 게시물 목록
@Override
public List list() throws Exception {
return sql.selectList(namespace + ".list");
}
}
이때 BoardDAOImpl에 있는 namespace는 매퍼의 namespace와 일치해야한다
위의 BoardDAO, BoardDAOImpl 을 생성한방법과같이
BoardService 인터페이스를 상속받는 클래스인 BoardServiceImpl 를 생성해준다
BoardService 에 코드를 추가해준다
package com.board.service;
import java.util.List;
import com.board.domain.BoardVO;
public interface BoardService {
List list() throws Exception;
}
BoardServiceImpl 에도 코드를 추가해준다
코드는 BoardDAOImpl과 크게 다르지 않지만 BoardDAOImpl 과 다른역할을 맡고있다
package com.board.service;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.board.dao.BoardDAO;
import com.board.domain.BoardVO;
@Service
public class BoardServiceImpl implements BoardService {
@Inject
private BoardDAO dao;
@Override
public List list() throws Exception {
return dao.list();
}
}
BoardController 에 코드를 추가해준다
바뀌는것
package com.board.controller;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.board.dao.BoardDAO;
import com.board.domain.BoardVO;
import com.board.service.BoardService;
@Controller
@RequestMapping("/board/*")
public class BoardController {
@Inject
private BoardService service;
@RequestMapping(value = "/list", method = RequestMethod.GET)
public void getList(Model model) throws Exception {
List list = null;
list = service.list();
model.addAttribute("list", list);
}
}
위의것들이 추가된다
Model 은 Controller 와 View 를 연결해주는 역할을 한다
list.jps 의 <tbody>안쪽에 코드를 추가해준다
<c:forEach items="${list}" var="list">
<tr>
<td>${list.bno}</td>
<td>${list.title}</td>
<td>${list.regDate}</td>
<td>${list.writer}</td>
<td>${list.viewCnt}</td>
</tr>
</c:forEach>
이제 프로젝트를 실행 해보면 500 에러가 뜨는데
스프링이 BoardDAO와 BoardService를 찾을수 없기때문
root-context.xml 으로 가서 안쪽에 코드를 추가한다
<context:component-scan base-package="com.board.domain" />
<context:component-scan base-package="com.board.dao" />
<context:component-scan base-package="com.board.service" />
이제 프로젝트를 실행해보면 연결이 완료되었다
만약 500 에러가 또 뜬다면 root-context.xml 에서 데이터베이스 bean부분 데이터베이스명을 잘 입력해주었는지 확인해본다