ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링(Spring) DB 연동 예제
    Spring/컨셉 2018. 9. 7. 09:45

    데이터베이스와 연동해 게시판 테이블의 정보를 가져오는 예제. 
    서블릿과 똑같이 작성하는데 앞선 예제에서 데이터베이스 연동은 rootContext에서 수행해준다. 따라서 daoImpl에서는 rootContext에 등록해둔 DataSource bean을 이용해 getConnection 메소드만 호출하면 된다. 글로는 난해할 수 있기 때문에 바로 예제를 보자.


    테이블은 다음과 같이 작성했고, 데이터는 직접 예전 예제에서 등록했던 데이터들을 사용했다. 글 수정부분은 아직 미완성한 상태

    전체 코드가 필요하면 깃허브 참조

    https://github.com/minwoohi/board_spring

    DaoImpl 클래스. 서블릿 이용할 때에는 멤버나 setter가 없었지만 rootContext.xml 파일에 등록한
    dataSource 객체를 이용해 연동을 더 편하게 할 수 있다. 
    Class.forName 등의 메소드 필요 없이 conn = dataSource.getConnection(); 메소드 호출만으로 원하는 스키마에 연결할 수 있다. rootContext.xml에 대해 상기하자면

    다음과 같이 id와 class를 지정해주고, property를 통해 setter까지 수행한다. 여기서 class는 데이터 타입을 의미하는데 BasicDataSource로 되어 있는데 왜 dao에서는 DataSource로 하는지 궁금해서 ctrl + 클릭으로 코드를 봤다.

    DataSource 인터페이스를 implements 하고 있기 때문에 DataSource 타입임을 파악할 수 있었다.
    개인적인 의문 해결 ~

    Biz, Service 패키지는 서블릿 때와 같으므로 생략하고 컨트롤러에 대해 정리.


    package com.blog.naver.board.web;
    
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.blog.naver.board.service.BoardService;
    import com.blog.naver.board.vo.BoardVO;
    
    @Controller
    public class BoardController {
    	
    	private BoardService boardService;
    	
    	public void setBoardService(BoardService boardService) {
    		this.boardService = boardService;
    	}
    	
    	@RequestMapping("/board/list")
    	public ModelAndView ViewBoardListPage(){
    		
    		ModelAndView view = new ModelAndView();
    		
    		List boardList = boardService.getAllArticles();
    		
    		view.setViewName("board/list");
    		view.addObject("boardList", boardList);
    		
    		return view;
    	}
    	
    	@RequestMapping("/board/detail/{id}")
    	public ModelAndView ViewDetailPage(@PathVariable int id){
    		ModelAndView view = new ModelAndView();
    		
    		BoardVO board = boardService.getOneBoard(id);
    		
    		view.setViewName("board/detail");
    		view.addObject("board", board);
    		
    		return view;
    	}
    	
    	@RequestMapping(value="/board/write", method=RequestMethod.GET) // 없어도 되지만 가독성
    	// 향상 위해 POST 메소드 존재하는 경우 GET 사용
    	public String viewWritePage(){
    		return "board/write";
    	}
    	
    	//redirect시 ModelAndView 필요 없다. String 리턴 타입으로 처리할 수 있다.
    	@RequestMapping(value="/board/write", method=RequestMethod.POST) // POST 방식 지원
    	public String doWriteAction(BoardVO board, HttpServletRequest request){ 
    		
    		String ip = request.getRemoteAddr();
    		
    		board.setIp(ip);
    		
    		if(boardService.addOneBoard(board)){
    			return "redirect:/board/list";
    		}
    		else return "redirect:/board/write";
    	}
    	
    	@RequestMapping("/board/delete/{boardId}")
    	public String doDeleteAction(@PathVariable int boardId){
    		
    		if(boardService.removeOneBoard(boardId)){
    			return "redirect:/board/list";
    		}
    		
    		return "/";
    		
    	}
    	
    }
    

    1) public ModelAndView ViewBoardListPage()
    ModelAndView 객체를 이용해 jsp 페이지에 필요한 정보를 전달 
     서블릿의 경우 setAttribute, getRequestDispatcher() 를 사용했지만 
    addObject, setViewName을 통해 보여줄 jsp 페이지와 DB 정보를 전달한다.

    2) public ModelAndView ViewDetailPage()
    서블릿에서 매개변수 받기 위해  '?' 기호를 사용했지만 스프링에서는 {}를 이용한다. 또한 모든 타입이 String인 서블릿과 달리 데이터 타입을 정할 수 있다. 따라서 @PathVariable을 통해 데이터 타입을 반드시 지정해줘야 한다.
    매개변수가 늘어날 경우 "/board/detail/{id}/{name}" 등으로 다음 매개변수 추가하고
    @PathVariable을 통해 name의 타입 지정해주도록 한다.

    3) public String doWriteAction()
    RequestMapping부터 조금 다르다. 특정 method로만 접근을 허용하고 싶은 경우에 다음과 같이 value, method 매개변수를 이용해 지정한다.

    서블릿에서 jsp 페이지의 정보를 받아오기 위해 getParameter 함수를 vo멤버 갯수만큼 작성해야 했다. 하지만 스프링에서는 vo의 멤버명과 같은 name 속성을 지정해준다면 BoardVO의 private 멤버명과 맞춰서 jsp에서 name 속성을 주면 set할 필요 없이 들어가 있다.

    jsp페이지의 name 속성 이름을 잘 보고,

    vo의 멤버변수명과 일치함을 확인할 수 있다.
    이렇게만 하면 doWriteAction 메소드의 매개변수 board에 subject, content, writer가 set된다. 서블릿을 배우고 나니 스프링의 강력함을 새삼 느끼고 있다.
    또한  ServletRequest, HttpSession 등 매개변수 필요한 경우 메소드의 매개변수에 추가하면 사용할 수 있다. 예제 코드에서 ip 정보를 가져오기 위해 HttpServletRequest 객체를 매개변수로 가져왔다.

    return value
    String으로 반환 타입을 정하면 서블릿에서 forward, sendRedirect 두가지 방법 중 하나로 새 페이지 요청을 할 수 있다. "redirect:" 를 앞에 붙이면 sendRedirect, 없다면 forward 방식이다.

    결과를 확인해보면

    다음과 같이 데이터베이스의 정보를 가져오고

    글 쓰기

    잘 등록됨을 확인할 수 있다.




Designed by Tistory.