본문 바로가기
BackEnd/Spring

스프링 5일차(데이터베이스 단일 테이블에서 카테고리를 이용해 여러 게시판 사용하기)

by JaeHa.K 2021. 8. 27.
728x90

지난 시간에는 게시판에 CRUD기능 구현을 했었습니다. Insert, Select, Update, Delete로 게시판을 등록하고, 읽고, 수정하고, 삭제하는 기능 구현을 해봤었는데, 오늘은 카테고리 3가지를 설정하고 각 카테고리 별로 게시판 내용이 바뀌고, 잘못된 접근을 막아서 에러페이지가 안뜨도록 잡는 것도 해볼 예정입니다~

 

1. 우선 각 게시판으로 접근할 수 있도록 링크를 걸어줍니다.

<a href="./board?sb_cate=1">자유게시판</a> |
<a href="./board?sb_cate=2">공지사항</a> |
<a href="./board?sb_cate=3">문의게시판</a>


<!-- 이런식으로 나오겠죠? -->
자유게시판 | 공지사항 | 문의게시판

파라미터 값을 갖고 이동하는 것을 볼 수 있습니다.

 

 

2.  Controller 작업을 해줍니다.

	@Autowired
	private Util util;
    
	@RequestMapping(value = "/board", method = RequestMethod.GET)
	public ModelAndView board(HttpServletRequest request) {
		int sb_cate = util.str2Int2(request.getParameter("sb_cate"));
        
		ModelAndView mv = new ModelAndView("board");
		List<TestDTO> boardList = testService.boardList(sb_cate);

		mv.addObject("list", boardList);
		mv.addObject("sb_cate",sb_cate);
		return mv;
	}

(Util은 Integer.parseInt를 하기 위한 컴포넌트입니다.)

 

위의 내용 대로라면 파라미터를 잡아 Service로 던져서 값을 받아 저장해둔 "list"라는 변수와, 받은 파라미터값 그대로 다시 돌려주기 위한 "sb_cate"라는 변수가 생성되었음을 볼 수 있습니다.

 

 

3. Service 작업을 해줍니다.

	public List<TestDTO> boardList(int sb_cate){
		return testDAO.boardList(sb_cate);
	}

 

 

4. DAO 작업을 해줍니다.

	public List<TestDTO> boardList(int sb_cate){
		return sqlSession.selectList("test.boardList", sb_cate);
	}

 

 

5. Mapper 작업을 해줍니다.

	<select id="boardList" resultType="TestDTO">
		SELECT * FROM sbboardview WHERE sb_cate=#{sb_cate}
	</select>

받아온 파라미터 값을 갖고 view에서 해당되는 카테고리의 게시글 리스트를 뽑아냅니다.

 

이런식으로 각 게시판 카테고리 별로 리스트가 추출되는 것을 볼 수 있습니다.

 

하지만 여기서 문제점이 발생합니다. 파라미터값을 꼭 받도록 설정되어 있기 때문에 이 상태에서 주소창에 파라미터값을 다 지운다거나, 없는 파라미터 값을 입력하면 에러페이지가 뜰 것입니다.

 

그리고 제가 지금 어느 카테고리의 게시판에 있는지 알 수 가 없습니다.

 

이 두가지를 해결해보겠습니다.

 

 

6. Controller로 이동합니다.

	@Autowired
	private Util util;
    
	@RequestMapping(value = "/board", method = RequestMethod.GET)
	public ModelAndView board(HttpServletRequest request) {
		//int sb_cate = util.str2Int2(request.getParameter("sb_cate"));
        //ModelAndView mv = new ModelAndView("board");
		//List<TestDTO> boardList = testService.boardList(sb_cate);
		//mv.addObject("list", boardList);
		//mv.addObject("sb_cate",sb_cate);
		//return mv;
        
        int sb_cate = 1;
		
		if(request.getParameter("sb_cate") != null || util.str2Int(request.getParameter("sb_cate"))) {
			sb_cate = util.str2Int2(request.getParameter("sb_cate"));
		}
		ModelAndView mv = new ModelAndView("board");//jsp
		
		List<TestDTO> boardList = testService.boardList(sb_cate);
		String category = testService.getCategory(sb_cate);
		mv.addObject("category", category);
		mv.addObject("list", boardList);
		mv.addObject("sb_cate",sb_cate);
		return mv;
	}

주석 처리된 부분은 맨 처음 설정한 부분이고, 아래 쪽은 추가된 설정을 포함한 버전입니다.

달라진 점이 눈에 들어 오시나요?

 

파라미터 값이 NULL인지, 또는 파라미터 값을 parseInt 했을 때 변환되는 값이 있는지 없는지(참고로 util.str2Int는 아래와 같습니다.) 확인하여, True라면 파라미터 값을 갖고 Service로 날라가도록 하였습니다. 만약에 false라면 위에 int sb_cate = 1; 이라고 변수를 설정했기 떄문에 1이라는 값을 갖고 Service로 넘어가겠죠?

		try {
			Integer.parseInt(str);
			return true;
		} catch (Exception e) {
			return false;
		}

 

String category = testService.getCategory(sb_cate);
mv.addObject("category", category); 이 부분이 이제 게시판에서 카테고리 명을 보여줄 친구입니다.

 

 

7. Mapper에 카테고리 이름을 갖고 올 수 있는 sql문만 생성하면 끝납니다.

	<select id="getCategory" resultType="String">
		SELECT sc_category from scategory WHERE sc_no=#{sb_cate}
	</select>

 

짜잔~

 

Ajax를 사용하면 페이지 전환 없이 내용이 바뀌겠죠? ㅎㅎ 그 부분은 차차 해보도록 하겠습니다.

해당 게시판에서 글쓰기 기능 사용시 해당 카테고리 값을 갖고 날라갈 수 있도록 하는 기능은 jQuery에서 다뤘습니다~

반응형