-
게시판 등록(2) & 수정 & 삭제 기능 구현프로젝트 일지/Spring Boot & MyBatis - 게시판 2022. 8. 29. 20:43
BoardMapper.java
package com.example.board.mapper; import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.springframework.web.bind.annotation.RequestParam; import com.example.board.BoardDTO; @Mapper // 데이터 접근 객체인 DAO와 같은 역할. 마이바티스에서는 DAO보다 SqlSessionDaoSupport나 SqlSessionTemplate를 사용하기를 권장함. // 매퍼를 사용하면 일일이 DAO를 만들지 않고, 인터페이스만을 이용해 편하게 개발이 가능 public interface BoardMapper { // 게시물 목록 public List<BoardDTO> boardList() throws Exception; // 게시물 목록 + 검색 public List<BoardDTO> boardListSearch(@RequestParam("searchType") String searchType, @RequestParam("keyword") String keyword) throws Exception; // 게시물 상세 public BoardDTO boardDetail(@RequestParam(value="pIdx") int pIdx) throws Exception; // 게시물 등록 public void boardInsert(BoardDTO reqDto) throws Exception; // 게시물 수정 public void boardUpdate(BoardDTO reqDto) throws Exception; // 게시물 삭제 public void boardDelete(int pIdx) throws Exception; }
BoardMapper.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="com.example.board.mapper.BoardMapper"> <!-- xml파일을 사용할 mapper가 있는 경로 --> <!-- 게시물 목록 --> <!-- <select> 태그를 이용하여 select 쿼리임을 나타냄. 앞서 mapper에서 말했던 메소드의 이름은 select 쿼리의 id값과 같아야함. --> <select id="boardList" resultType="com.example.board.BoardDTO"> SELECT idx AS pIdx, title, writer, regdate FROM board_table ORDER BY idx DESC </select> <!-- 게시물 목록 + 검색 --> <select id="boardListSearch" parameterType="String" resultType="com.example.board.BoardDTO"> SELECT idx AS pIdx, title, writer, regdate FROM board_table WHERE 1=1 <if test='searchType.equals("title")'> AND title LIKE <![CDATA[ concat('%', #{keyword}, '%')]]> </if> <if test='searchType.equals("content")'> AND content LIKE <![CDATA[ concat('%', #{keyword}, '%')]]> </if> <if test='searchType.equals("writer")'> AND writer = #{keyword} </if> ORDER BY idx DESC </select> <!-- 게시물 상세 조회 --> <select id="boardDetail" parameterType="int" resultType="com.example.board.BoardDTO"> SELECT idx AS pIdx, title, content, writer, regdate FROM
BoardService.java
package com.example.board.service; import java.util.List; import com.example.board.BoardDTO; public interface BoardService { // 게시물 목록 List<BoardDTO> boardList() throws Exception; // 게시물 목록 + 검색 List<BoardDTO> boardListSearch(String searchType, String keyword) throws Exception; // 게시물 상세 조회 BoardDTO boardDetail(int pIdx) throws Exception; // 게시물 등록 void boardInsert(BoardDTO reqDto) throws Exception; // 게시물 수정 void boardUpdate(BoardDTO reqDto) throws Exception; // 게시물 삭제 void boardDelete(int pIdx) throws Exception; }
BoardServiceImpl.java
package com.example.board.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.example.board.BoardDTO; import com.example.board.mapper.BoardMapper; @Service // 서비스임을 선언 public class BoardServiceImpl implements BoardService{ BoardDTO dto; // 데이터 전달 확인용 @Autowired // Mapper와 연결 private BoardMapper boardMapper; // 게시물 목록 @Override public List<BoardDTO> boardList() throws Exception { return boardMapper.boardList(); } // 게시물 목록 + 검색 @Override public List<BoardDTO> boardListSearch (String searchType, String keyword) throws Exception { return boardMapper.boardListSearch(searchType, keyword); } // 게시물 상세 조회 @Override public BoardDTO boardDetail(int pIdx) throws Exception { return boardMapper.boardDetail(pIdx); } // 게시물 등록 @Override public void boardInsert(BoardDTO boardDto) throws Exception { boardMapper.boardInsert(boardDto); } // 게시물 수정 @Override public void boardUpdate(BoardDTO reqDto) throws Exception { boardMapper.boardUpdate(reqDto); } // 게시물 삭제 @Override public void boardDelete(int pIdx) throws Exception { boardMapper.boardDelete(pIdx); } }
BoardController.java
package com.example.board.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.example.board.BoardDTO; import com.example.board.service.BoardService; @Controller // 컨트롤러 선언 //@ResponseController -> controller + responseboody @RequestMapping("/board/*") // getmapping + postmapping public class BoardController { BoardDTO dto; // 데이터 전달 확인용 @Autowired private BoardService boardService; //서비스와 연결 // Slf4j 로그 //private static final Logger logger = LoggerFactory.getLogger(BoardController.class); /* * RequestMapping을 통해 해당 url을 호출 시 해당되는 화면(view)을 매핑시켜주는 역할 * localhost:8080/openBoardList.do 에서 "/openBoardList.do" 맵핑 설정 * 해당 request 호출 시 리턴되는 화면 (BoardList.jsp) 호출 */ //@RequestMapping("/openBoardList.do") //게시물 목록 @RequestMapping(value = "/openBoardList") public ModelAndView openBoardList() throws Exception{ /* * logger.debug("boardController dedug"); * logger.info("boardController info"); * logger.error("boardController error"); */ // jsp파일 부르기 - 방법1 // return "BoardList"; (String 메소드로 변경) // jsp파일 부르기 - 방법2 ModelAndView mv = new ModelAndView("/BoardList"); //게시글 목록을 조회하기 위해 ServiceImpl 클래스의 boardList 메서드 호출 List<BoardDTO> boardlist = boardService.boardList(); mv.addObject("list", boardlist); return mv; } /* // 게시판 목록 조회 + 검색 (Get) @GetMapping(value = "/search") // localhost:8080/openBoardList/search?searchType=writer&keyword=최수빈 <- 이런식으로 구글에 직접 입력하여 확인 public ModelAndView search(@RequestParam(value="searchType") String searchType, @RequestParam(value="keyword") String keyword) throws Exception{ // URL을 통해 searchType과 keyword를 받아낼 수 있도록 ModelAndView mv = new ModelAndView("/BoardList"); List<BoardDTO> boardlist = boardService.boardListSearch(searchType, keyword); mv.addObject("list", boardlist); return mv; }*/ /* * Post과 Get의 차이 * GET method는 클라이언트에서 서버로 어떠한 리소스로 부터 정보를 요청하기 위해 사용. * 쿼리스트링 포함. * POST method는 리소스를 생성/업데이트하기 위해 서버에 데이터를 보내는 데 사용. * 데이터가 body로 전송되므로 보안에 강함. */ // 게시판 목록 조회 + 검색 (Post) @PostMapping(value = "/search") public ModelAndView search(@RequestParam(value="searchType") String searchType, @RequestParam(value="keyword") String keyword) throws Exception{ ModelAndView mv = new ModelAndView("/BoardList"); List<BoardDTO> boardlist = boardService.boardListSearch(searchType, keyword); mv.addObject("list", boardlist); return mv; } // 게시판 상세 조회 1 - form-data로 받을 떄 @PostMapping(value = "/detail") @ResponseBody public BoardDTO detail (@RequestParam(value="pIdx") int pIdx) throws Exception { System.out.println("Boardcontroller 작동 / 파라미터pIdx : " + pIdx); return boardService.boardDetail(pIdx); } /* * 게시판 상세 조회 2 - json으로 받을 때 * postman에서 raw-json으로 맞춰주고 직접 { "pIdx" : 1 } 입력 * @RequestBody은 자동으로 json을 string에서 dto객체로 변환시켜줌 ( * json 키값 = dto 파라미터명 전제 필요) */ /* @PostMapping(value = "/detail") @ResponseBody public BoardDTO detail (@RequestBody BoardDTO reqDto) throws Exception { BoardDTO boarddetail = boardService.boardDetail(reqDto.getpIdx()); return boarddetail; } */ // 게시물 작성폼 호출 @PostMapping(value="/openInsert") @ResponseBody public String openInsertForm () throws Exception { return "insert"; } // 게시물 등록 @PostMapping(value="/insertBoard") @ResponseBody public String insertBoard (BoardDTO reqDto) throws Exception { if (reqDto != null) { boardService.boardInsert(reqDto); return "게시물 등록 성공!"; } else { return "게시물 등록 실패"; } } /* * Put과 Post의 차이 : 멱등성 (동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지님.) * PUT은 멱등성을 가짐 * 여러 번 호출할 경우, 클라이언트가 받는 응답은 동일. 즉 똑같은 수정을 여러번해도 변경되지 않는다. */ // 게시물 수정 @PutMapping(value="/updateBoard") @ResponseBody public String updateBoard (BoardDTO reqDto) throws Exception { if (reqDto != null) { boardService.boardUpdate(reqDto); return "게시물 수정 성공!"; } else { return "게시물 수정 실패"; } } // 게시물 삭제 @DeleteMapping(value="/deleteBoard") @ResponseBody public String deleteBoard (@RequestParam(value="pIdx") int pIdx) throws Exception { boardService.boardDelete(pIdx); return "게시물 삭제 성공!"; } }
등록 기능 postman으로 확인하고 DBMS를 통해 db에도 잘 반영되는지 체크
수정 기능도 동일하게 체크
삭제도 체크
postman에서 파라미터로 삭제할 인덱스(pIdx)값을 넘겨줌
'프로젝트 일지 > Spring Boot & MyBatis - 게시판' 카테고리의 다른 글
게시판 페이징과 인덱스 수정 (1) (0) 2022.08.29 게시판 목록 조회 - 등록일 날짜포맷 수정 (0) 2022.08.29 게시판 등록 기능 (1) (0) 2022.08.24 게시물 상세 조회 기능 (1) (0) 2022.08.23 게시판목록 검색기능 (0) 2022.08.17