ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 게시판 등록(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)값을 넘겨줌

Designed by Tistory.