본문 바로가기

웹 개발 한걸음

[Mybatis] 게시판 목록 구현해보기

** 이전에 구현해두었던 게시판 목록 기능 중 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. 결과화면    

 

 

 

 

♣ 참고 및 인용