** 이전에 구현해두었던 게시판 목록 기능 중 jdbc방식에서 mybatis로 교체작업을 했다.
** JSP에서는 컨트롤러로부터 온 게시물의 목록을 받고 뿌려주기만 하면 되서 전혀 건드릴 필요가 없었는데 연결되었을 땐 프론트 앤드와 백앤드의 영역이 구별됨을 새삼 느꼈다.
** 코드를 쭈욱 쓰고 첫 시도를 했을 때 당연히 오류가 나겠지? 어떤 데서 오류가 나타날까? 하는 마음이었는데 한번에 성공하여 뿌듯뿌듯. 사실 코드가 크게 바뀐 것은 아니고 간단한 작업이었지만 이런 소소한 성취감이 쌓여 언젠가 좋은 개발자가 되는 밑거림이 되길.
[Servlet] 게시판 목록 구현하기
** 이전에 JSP로 만들었던 코드를 이용해 이를 서블릿으로 구현해보았다. [JSP] 11강 - 게시글 목록 구현 본 포스팅은 정보 제공용이 아닌 유튜브 동빈나님의 JSP 게시판 만들기 강좌 11강을 바탕으
egu99.tistory.com
1. BbsController.java
@WebServlet("/bbs2")
public class BbsControl2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int pageNumber = 1 ;
String pageNumber_ = request.getParameter("pageNumber");
if(pageNumber_!=null) {
pageNumber = Integer.parseInt(pageNumber_);
}
BbsDAO2 bao = BbsDAO2.getInstance();
List<Bbs> list = bao.getList(pageNumber);
int count = bao.getNoticeCount();
System.out.println("총 게시물의 수는 "+count+"개");
request.setAttribute("count", count);
request.setAttribute("list", list);
request.getRequestDispatcher("/WEB-INF/bbs2.jsp").forward(request, response);
}
}
기존과 거의 흡사한 코드이다. 다만 dao가 싱글톤으로 바뀌어 getInstance로 호출.
jsp에서 페이징에 필요한 총게시물수와 dao의 getList를 통해 받은 게시물들의 list를 request에 담아 forward 해준다.
2. BbsDAO.java
public class BbsDAO2 {
private static BbsDAO2 bao;
SqlSessionFactory factory;
private BbsDAO2() {
factory = MybatisConnector.getInstance().getFactory();
}
public static BbsDAO2 getInstance() {
if(bao == null) {
bao = new BbsDAO2();
}
return bao;
}
//게시글 목록 가져오기
public List<Bbs> getList(int pageNumber){
SqlSession session = factory.openSession();
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("start", (pageNumber-1)*5);
map.put("count", 5);
List<Bbs> list = session.selectList("bbs.getList", map);
return list;
}
//총 게시물 수 가져오기
public int getNoticeCount() {
SqlSession session = factory.openSession();
int count = session.selectOne("bbs.count");
return count;
}
}
- Servlet 컨트롤러에서 request에 담을 게시글 목록과 총게시물수를 여기서 mybatis의 selectList와 selectOne을 통해 해당 네임스페이스를 가진 맵퍼로 DB에 접근, 조회할 것이다.
- Mybatis에서 반드시 필요한 sqlsession을 미리 만들어둔 sqlsessionfactory를 통해 만든다.
- 게시물수는 pageNumber에 맞게 가져와야한다. 컨트롤러에서 기본값을 1로 설정해두었지만 jsp에서 pageNumber를 보내면 그에 맞는 게시물들을 가져온다.
- sql문에 필요한 첫번째 파라미터로 (pageNumber-1)*5 이렇게 해두면 아래와 같이 시작 번지수를 만들 수 있다.
- pageNumber 1일 때 0번지부터
- pageNumber 2일 때 5번지부터
- pageNumber 3일 때 10번지부터
- 1페이지에 5개씩 보여줄 것이므로 두번째 파라미터를 5로 해두면 첫번째 파라미터 번지부터 5개의 게시글을 가져온다.
3. bbsMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="bbs">
<!-- 게시물 목록 가져오기 -->
<select id="getList" resultType="Bbs" parameterType="java.util.Map">
SELECT * FROM BBS WHERE bbsAvailable =1 ORDER BY bbsID DESC LIMIT #{start} , #{count};
</select>
<!-- 총 게시물 수 가져오기 -->
<select id="count" resultType="int">
SELECT COUNT(*) AS CNT FROM BBS WHERE bbsAvailable = 1;
</select>
</mapper>
dao에서 받은 map에서 start와 count를 뽑아야하는데 #{키값}을 해두면 value값이 알아서 꽂혀 sql문을 완성한다.
매핑된 VO객체 Bbs들이 list에 하나하나 담아서 반환될 것이다.
페이징에 필요한 총 게시물 수도 여기서 가져오는데 resultType을 어떻게 설정해야하나 잠시 고민했었다.
sql문의 결과인데 저 CNT의 값을 어떻게 가지고 와 반환할 것인가에 대한 고민이었는데 그냥 resultType을 int로 해두면 알아서 가져오는듯 하다.
아래는 resultType에 올 수 있는 형태를 정리해둔 것이다.
별칭(alias) | 데이터 형태(data type) |
string | String |
date | Date |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
decimal | BigDecimal |
bigdecimal | BigDecimal |
biginteger | BigInteger |
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
_byte[] | byte[] |
_long[] | long[] |
_short[] | short[] |
_int[] | int[] |
_integer[] | int[] |
_double[] | double[] |
_float[] | float[] |
_boolean[] | boolean[] |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
byte[] | Byte[] |
long[] | Long[] |
short[] | Short[] |
int[] | Integer[] |
integer[] | Integer[] |
double[] | Double[] |
float[] | Float[] |
boolean[] | Boolean[] |
object | Object |
date[] | Date[] |
decimal[] | BigDecimal[] |
bigdecimal[] | BigDecimal[] |
biginteger[] | BigInteger[] |
object[] | Object[] |
collection | Collection |
iterator | Iterator |
ResultSet | ResultSet |
※ 주의 : 원시형의 경우는 언더스코어(_)를 앞에 붙인다. 붙이지 않는 경우 래퍼(Wrapper) 클래스로 변환된다.
4. 결과화면
♣ 참고 및 인용
'웹 개발 한걸음' 카테고리의 다른 글
[ServletFilter] 로그인 필터 구현해보기 (0) | 2021.05.24 |
---|---|
[Mybatis + Ajax] 게시판 글쓰기 구현해보기 + 썸머노트 추가 (0) | 2021.05.23 |
[Mybatis + Ajax] 회원가입 구현해보기 (0) | 2021.05.13 |
[Mybatis + Ajax] 아이디 중복 확인 구현해보기 (0) | 2021.05.10 |
[Javascript] 정규표현식 유효성 검사 + 비밀번호 재확인 구현해보기 (0) | 2021.05.06 |