2017년 1월 25일 수요일

자바교육/스프링교육/스프링프레임워크/스프링부트학원추천★탑크리에듀_spring을 이용한 간단한 게시판 만들기 (6)

게시글 등록, 수정, 리플등록 등에 대해서 올립니다~ 

위 서비스의 차이점은 모두 게시물 등록을 하는 한 화면을 보지만 
등록의 경우 등록화면이 비어있고 
수정의 경우 등록화면에 값이 들어있고 
리플의 경우 등록화면에 값은 비어있지만 숨은 값들이 있어야겠죠 

그러면 같은 등록화면의 url를 호출하되 그전에 미리 등록화면과 매칭되는 DTO객체의 값들을 해당 서비스에 맞게 세팅해 인자로 해서 넘겨주면 되겠죠? 
그후 다시 그 등록하면으로부터 재 세팅된 DTO객체를 넘겨 받아 로직 처리하는 서비스 호출 후 view를 리턴합니다~ 

이것을 처리하는 컨트롤러가 SimpleFormController 를 상속한 BoardSave컨트롤러 하나 입니다~ ㅠㅠ 

이것이 가능한 이유는 해당 컨트롤러는 두개의 메소드를 override하게 되는데 
호출되는 방법에 있어서 요청이 
get으로 오게되면 formBackingObject() 
post로 오게되면 onSubmit()로 달리하는거지요 

단 이때  BoardSave의 파라메터값으로 sessionForm을 true로 지정해야지 됩니다. xml문서에서 하면 되겠죵~ 
설정을 안하게 되면 기본값인 false로 post로 요청되더라도formBackingObject()를 호출하게  되도록 설정이 되어있습니다.이것땜시 한참을 삽질했습니다~ ㅠㅠ 

먼저 
spring_servlet.xml에 다음 url입력시 board_save 컨트롤러를 호출하게 매핑되어 있습니다 단 처리로직이 틀리기때문에 mod를 파라메터로 넘겨주었습니다~ 
게시물등록 : board_save.do?mod=insert 
게시물수정 : board_save.do?mod=modify&num=${board.num} 
답변 등록 : board_save.do?mod=reply&num=~" 

BoardSave 로직은 
1. get으로 요청이 들어오므로 formBackingObject() 호출 
  해당 메소드에서는 request로 넘어온 mod에 따라  BoardDTO를 세팅하여 
  요청이 들어온 페이지로 반환 
  이렇게되면  같은화면인데 수정일때는 입력된값을 볼수있지만 새등록일때는 
  비어있는 화면을 보겠죠 
  **** 
  insert는 new BoardDTO 
  modify는 num파라메터로 select하여 얻어온 BoardDTO 
  reply는 역시 num파라메터로 select하여 얻어온 BoardDTO중 일부만 세팅 

2.게시물등록페이지에서 값 입력후 POST로 요청들어오면 onSubmit()호출 
  이 메소드는  Object command라는 파라메터를 하나 더 받는데요 
  이파라메터를 통해 값들이 BoardDTO에 자동 매핑됩니다. 
  그럼 이값들을 가지고 로직을 수행하는 DAO를 호출~ 
  다른 컨트롤들과 마찬가지로 ModelAndView를 반환하여 view를 보여줍니다~ 

 package board.controller; 

import java.util.Iterator; 
import java.util.List; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.springframework.validation.BindException; 
import org.springframework.web.bind.RequestUtils; 
import org.springframework.web.bind.ServletRequestDataBinder; 
import org.springframework.web.multipart.MultipartFile; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.SimpleFormController; 

import board.common.FileUploadUtil; 
import board.dto.BoardDTO; 
import board.dto.BoardFile; 
import board.service.BoardService; 

public class BoardSave extends SimpleFormController{ 
        
        private BoardService boardService; 
        private String realUploadPath = null;; 
        
        public BoardSave(){ 
                setCommandName("board"); 
                setCommandClass(BoardDTO.class); 
        } 
        
        /** SimpleFormController POST 
        * 폼으로부터 데이터 받아서 로직 처리 command 객체 session 저장~  **/ 
        public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, 
                        BindException exception ) 
                        throws Exception { 

                if(logger.isDebugEnabled()){ 
                        logger.debug("entering '0nSubmit' method..."); 
                } 
                                
                int result = 0; 
                BoardDTO board = (BoardDTO)command; 
                
                if(request.getParameter("num")!= null){ 
                        board.setNum(Integer.parseInt(request.getParameter("num"))); 
                } 

                List fileList = board.getFile(); 
                /*Iterator fileIter = fileList.iterator(); 
                while(fileIter.hasNext()){ 
                        MultipartFile multiFile = (MultipartFile)fileIter.next(); 
                        if(multiFile.getSize() > 0){ 
                                board.addBoardFiles(FileUploadUtil.uploadFormFile(multiFile, realUploadPath)); 
                        } 
                }*/ 
                for(int i=0; i<fileList.size(); i++){ 
                        if(fileList.isEmpty()){ 
                                break; 
                        } 
                        board.addBoardFiles(FileUploadUtil.uploadFormFile((MultipartFile)fileList.get(i), realUploadPath)); 
                } 
                
                /** 
                * submit name에 따라 처리 로직 호출 
                */ 
                if(request.getParameter("add") != null){ 
                        if(logger.isDebugEnabled()){                                      
                                logger.debug("executing 'add board' mehtod..");                                                                  
                        } 
                        result = boardService.insert(board); 
                }else if(request.getParameter("modify") != null){ 
                        if(logger.isDebugEnabled()){ 
                                logger.debug("executing 'update board' mehtod..."); 
                        } 
                        result = boardService.update(board); 
                }else{ 
                        if(logger.isDebugEnabled()){ 
                                logger.debug("executing 'reply board' mehtod..."); 
                        } 
                        result = boardService.reply(board); 
                } 
                
                if(result == 1){ 
                        return new ModelAndView(getSuccessView()); 
                }else{ 
                        //return new ModelAndView("boardError"); 
                        ModelAndView mav = new ModelAndView(); 
                        mav.setViewName("boardError"); 
                        return mav; 
                } 
        } 
        
        /** SimpleFormController GET 방식 
        * request mod값에 따라 bean boardwrite.jsp로 반 
        *        insert,reply : new board 
        *        modify : select board**/ 
        protected Object formBackingObject(HttpServletRequest request) throws Exception { 
                
                if(logger.isDebugEnabled()){ 
                        logger.debug("entering 'formBackingObject' method..."); 
                } 
                
                if(request.getParameter("mod")!=null){ 
                        String mod = request.getParameter("mod"); 
                        logger.debug(mod); 

                        if(mod.equals("modify")){ 
                                
                                if(request.getParameter("num")!=null){ 
                                        int num = Integer.parseInt(request.getParameter("num")); 

                                        BoardDTO board = (BoardDTO)boardService.select(num); 
                                        return board; 
                                }else{ 
                                        return new BoardDTO(); 
                                } 
                                
                        }else if(mod.equals("reply")){ 
                                BoardDTO board = new BoardDTO(); 
                                board.setNum(Integer.parseInt(request.getParameter("num"))); 
                                board.setBgroup(Integer.parseInt(request.getParameter("group"))); 
                                board.setBpos(Integer.parseInt(request.getParameter("pos"))); 
                                board.setBdepth(Integer.parseInt(request.getParameter("depth"))); 
                                board.setContent("RE : "); 

                                return board; 
                        } 
                } 
        return new BoardDTO(); 

        } 

        public void setRealUploadPath(String realUploadPath) { 
                this.realUploadPath = realUploadPath; 
        } 
        
        public void setBoardService(BoardService boardService){ 
                this.boardService = boardService; 
        } 

  

자바교육/스프링교육/스프링프레임워크/스프링부트학원추천★탑크리에듀_spring을 이용한 간단한 게시판 만들기 (5)

DAO 를 보시죠~ 
일단 DB연결은 spring내에서 지원하는 Jdbc Template을 사용하였습니다. 
연결 설정은  springJDBC.xml을 참조합니다~ 
url user, password 등 값을 설정하여 dataSource를 만들고요~ 이것을 
boardDAO클래스의  속성으로 넣어주고 있습니다~ 
매하단에는 앞에서 설명한 boardservice에서 bean도 설정하고 있습니다~ 

======WebContent\WEB-INF\springContext\springJDBC.xml====== 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
    "http://www.springframework.org/dtd/spring-beans.dtd"
    <beans>        
        
        <!-- DBCP 설정  --> 
        <bean id="dataSource" 
      class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
      <property name="driverClassName"> 
          <value>oracle.jdbc.driver.OracleDriver</value> 
      </property> 
      <property name="url"> 
          <value>jdbc:oracle:thin:@localhost:1521:orcl</value> 
      </property> 
      <property name="username"> 
          <value>scott</value> 
      </property> 
      <property name="password"> 
          <value>tiger</value> 
      </property>      
    </bean> 

        
        <bean id="boardDAO" class="board.dao.BoardDAO"> 
                <property name="dataSource"> 
                        <ref local="dataSource"/> 
                </property> 
        </bean> 
        
        <bean id="boardService" class="board.service.BoardServiceImpl"> 
                <property name="boardDAO"> 
                        <ref local="boardDAO"/> 
                </property> 
        </bean> 
    
</beans> 
==================================================================== 

다음으로...DAO내 구현은.. dataSource를 인자로 jdbcTemplate 생성 
합니다. 
sql작성시 외부 인자를 ?로 주고 이에 대응하는 값을 Object배열에 저장합니다.. 
String sql = select * from test where a = ? 
Object[] params = new Object[]{key1,key2}; 

쿼리는 다음메서드를 통해서 날리게 됩니다. 
- insert delete update경우 update() 
- select이며 하나의 Object로 반환코자할때 queryForObject() 
- select이며 다수의 Object를 List로 반환코자 할때 query() 

int jdbcTemplate.update(String sql, Object[] object) 
Object jdbcTemplate.queryForObject(String sql, Object[] object, Object object) 
list jdbcTemplate.query(String sql, Object[] object, List list) 

** Object는 RowMapper를 통해 게시판 정보를 저장하고 있는 DTO객체로 
    생성하면 한답니다~*** 

List부분의  소스만 간단히 보면 ~ 
public class BoardDAO { 
        private JdbcTemplate jdbcTemplate; 
        private DataSource dataSource; 
        
        Logger logger = Logger.getLogger(this.getClass()); 
        
        public void setDataSource(DataSource dataSource){ 
                this.jdbcTemplate = new JdbcTemplate(dataSource); 
        }        public Collection getList(int start, int end){ 
                if(logger.isDebugEnabled()){ 
                        logger.debug("DAO 'select list' mehtod..."); 
                } 
                
                String sql = "select * from(select num, title, name, regdate, bdepth, hitcount, rownum r from myboard order by bgroup desc ) where r > ? and r < ?"; 
                
                List boardList = new ArrayList(); 
                
                Object[] params = new Object[]{ 
                                new Integer(start), 
                                new Integer(end) 
                }; 
                
                boardList = this.jdbcTemplate.query(sql, params, new RowMapper(){ 
                        public Object mapRow(ResultSet rs, int rowNum) throws SQLException{ 
                                BoardDTO board = new BoardDTO(); 
                                board.setNum(rs.getInt(1)); 
                                board.setTitle(rs.getString(2)); 
                                board.setName(rs.getString(3)); 
                                board.setRegdate(rs.getString(4)); 
                                board.setBdepth(rs.getInt(5)); 
                                board.setHitcount(rs.getInt(6)); 
                                return board; 
                        } 
                }); 
                
                return boardList; 
        } 
..................................... 


이렇게 해서 간단하게 spring을 통한 게시판의 기본흐름을 적어봤구요 
list의 컨트롤의 경우 기본적인 controll를 상속받아서 하나의 컨트롤로 하나의 서비스를 처리하는 로직을 구현했는데요~ 
게시물의 쓰기, 수정, 리플쓰기등은 SimpleFormController를 상속받아서 한 컨트롤로 처리했습니다. 계속~~~