Spring MVC - 게시판 만들기 feat.입문편
그럼 전편에 이어 게시판의 기본기능 하나씩 구현해 나가보자.
위 전편 포스팅에 기본적인 틀 구조를 잡은 소스코드가 있으니 다운로드 받아 사용하는 것도 한 방법이다.
이번 포스팅에서는 게시글 작성하는 기능을 구현할 것이다.(CRUD의 Create에 해당한다.)
우선 DB툴에서 쿼리를 작성해보고 정상 작동하는지 확인해보자.
1 2 | insert into board (bno, title, content, writer ) values ((select nvl(max(bno)+1,1) from board), '글제목', '내용', '작성자') | cs |
위 SQL문이 정상 작동하는걸 확인했고 '글제목', '내용', '작성자' 부분을 변수 처리하면 되겠다는 결론을 내릴 수 있다.
Mapper.xml 파일에 작성하도록 하자. 여기서 주의할 점은 $가 아닌 #을 사용한다는 점이다.
boardMapper.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?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와 중복되지 않도록 네임스페이스 기재 --> <mapper namespace="board"> <!-- 게시글 목록 불러오기 --> <select id="boardList" resultType="com.board.example.dto.BoardDTO"> select bno,title,writer,regdate,viewcnt from board order by bno desc </select> <!-- Create 부분에 해당하는 글 쓰기 쿼리 --> <insert id="boardWriter"> insert into board (bno, title, content, writer ) values ((select nvl(max(bno)+1,1) from board), #{title}, #{content}, #{writer}) </insert> </mapper> | cs |
그리고 mybatis 컨피그 파일에 다음 소스 코드를 좀 넣어두자.
(이것은 매핑되는 파라미터에 Null 값이 있는 경우 발생하는 에러에 대비하기 위한 코드다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <settings> <!-- null값이 파라미터로 전달될 때 오류나지 않게 NULL 처리 --> <!-- 이거 하면 #{parameter, jdbcType=VARCHAR} 이렇게 안해도 된다 --> <setting name="jdbcTypeForNull" value="NULL"/> </settings> <typeAliases> <package name="com.board.example" /> </typeAliases> </configuration> | cs |
Mapper에 SQL문도 추가했고 설정도 해줬고... DAO도 구현해보자.
네임스페이스나 id 를 잘못 입력하는 경우가 잦으니 만들 때 같이 구현하도록 하자.
BoardDAO.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.board.example.dao; import java.util.List; import com.board.example.dto.BoardDTO; public interface BoardDAO { // 게시물 목록 보기 public List<BoardDTO> boardList() throws Exception; // 게시물 작성 public void writerBoard(BoardDTO bdto) throws Exception; } | cs |
BoardDAOImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | package com.board.example.dao; import java.util.List; import javax.inject.Inject; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Repository; import com.board.example.dto.BoardDTO; @Repository public class BoardDAOImpl implements BoardDAO { @Inject SqlSession sqlSession; // 게시물 목록 불러오기 @Override public List<BoardDTO> boardList() throws Exception { return sqlSession.selectList("board.boardList"); } // 게시물 글쓰기 @Override public void writerBoard(BoardDTO bdto) throws Exception { sqlSession.insert("board.boardWriter", bdto); } } | cs |
이제 뷰를 구현해보도록 하자. 그냥 게시판 글 작성할 수 있는 폼 형식을 가진 페이지를 만들어 보는 것이다.
우선 view 단에서 간단하게 form 태그를 포함한 페이지를 작성해보자.
아래와 같은 페이지를 만들 것이다. 동시에 board_list.jsp 파일에 테이블 소스코드 나오기 전에
1 | <a href="${path}/board/writer_page">글쓰기</a> | cs |
소스코드를 추가해줘서 글쓰기 page로 이동할 수 있는 a 태그를 추가해주자.
writer_page.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <%@ include file="../include/menu.jsp" %> <h2>writer_page 페이지입니다.</h2> <form name="bdto" method="post" action="${path}/board/insert.do"> <div>제목<input name="title" id="title" size="80" placeholder="글 제목 입력"></div> <div>내용<textarea name="content" id="content" rows="8" cols="80" placeholder="글 내용 입력"></textarea></div> <div>이름<input name="writer" id="writer" placeholder="이름 입력"></div> <div style="width:650px; text-align:center;"> <input type="submit" value="확인"> </div> </form> </body> </html> | cs |
글쓰기 a 태그를 클릭해 페이지 이동이 잘 이뤄지기 위해 컨트롤러 작성을 하자.
BoardController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | package com.board.example.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 org.springframework.web.servlet.ModelAndView; import com.board.example.dto.BoardDTO; import com.board.example.service.BoardService; import com.sun.media.jfxmedia.logging.Logger; @Controller @RequestMapping("/board/*") public class BoardController { @Inject BoardService boardService; // 과거 ModelAndView를 활용한 방법 // @RequestMapping("list.do") // public ModelAndView boardMenu() throws Exception { // List<BoardDTO> list = boardService.boardList(); // ModelAndView mav = new ModelAndView(); // mav.setViewName("board/board_list"); // mav.addObject("list", list); // return mav; // board/board_list.jsp로 이동 // } // 현재 자주 쓰는 Model 클래스를 DI 하는 방법 @RequestMapping("list.do") public String boardList(Model model) throws Exception { List<BoardDTO> list = boardService.boardList(); // list 변수에 결과 값을 담는다 model.addAttribute("list", list); // model에 데이터 값을 담는다 return "board/board_list"; // board/board_list.jsp로 이동 } // writer_page.jsp 매핑 @RequestMapping("writer_page") public String writerpage() { return "board/writer_page"; } // 게시글 from 데이터 처리 @RequestMapping(value="insert.do", method=RequestMethod.POST) public String boardWriter(BoardDTO bdto) throws Exception { boardService.writerBoard(bdto); return "redirect:list.do"; } } | cs |
글쓰기 a 태그를 통해 writer_page.jsp 로 잘 이동이 되는 것을 확인할 수 있다.
사실 Service 구현 없이 DAO 로도 접근할 수 있지만....
패턴을 맞추고 나중에 추가될 가능성이 있는 비즈니스 로직(게시글 쓰면 포인트를 준다던가....)을 고려해서
Service 도 구현해주도록 하자.
BoardService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | package com.board.example.service; import java.util.List; import com.board.example.dto.BoardDTO; public interface BoardService { // 게시물 목록 조회 public List<BoardDTO> boardList() throws Exception; // 게시물 글 쓰기 public void writerBoard(BoardDTO bdto) throws Exception; } | cs |
BoardServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package com.board.example.service; import java.util.List; import javax.inject.Inject; import org.springframework.stereotype.Service; import com.board.example.dao.BoardDAO; import com.board.example.dto.BoardDTO; @Service public class BoardServiceImpl implements BoardService { @Inject BoardDAO boardDao; // 게시물 목록 불러오기 @Override public List<BoardDTO> boardList() throws Exception { return boardDao.boardList(); } // 게시물 글 쓰기 @Override public void writerBoard(BoardDTO bdto) throws Exception { boardDao.writerBoard(bdto); } } | cs |
이렇게 클라이언트에서 post 방식의 데이터를 전송하기 위한 준비가 되었다.
게시글을 쓰고 나면 데이터가 정상적으로 등록이 되고 바로 게시글 목록 페이지로 리다이렉트 되는 모습을 확인할 수 있다.
'Certification > Spring(2V0-72.22, SCP)' 카테고리의 다른 글
Spring MVC - 게시판 만들기CR(U)D - feat.입문편 (0) | 2018.08.21 |
---|---|
Spring MVC - 게시판 만들기C(R)UD - feat.입문편 (0) | 2018.08.21 |
Spring MVC - 게시판 만들기 feat.입문편 (1) | 2018.08.10 |
Spring MVC - View / JSP (0) | 2018.08.07 |
Spring MVC - DAO & Service + Mapper (1) | 2018.08.07 |