Spring

SpringMVC 게시판

rlaxogns2 2016. 5. 18. 21:42

SpringMVC 프레임워크로 만드는 게시판


1. SpringMVCFramework 구조와 설계 




=> 프로젝트를 생성하는 것은 이전과 같고, Board.command, Board.controller, Board.dao, Boadrd.dto 

패키지에 각각 Command, Controller, DAO, DTO 를 생성하였다. 

클라이언트의 요청과 알맞은 URL 을 Controller 에서 확인 후 그에 맞는 Command 를 수행, 

DAO, DTO 를 통해 DB 와 연동하여 로직을 실행 후에 다시 Controller 로 돌아온 값들을 가지고 

View 페이지를 보여주게 된다.


2. 데이터 베이스


bId NUMBER(4) PRIMARY KEY => 고유번호

bName VARCHAR2(20) => 작성자명

bTitle VARCHAR2(100) => 글 제목

bContent VARCHAR2(300) => 글 내용

bDate DATE DEFAULT SYSDATE => 글 작성일

bHit NUMBER(4) DEFAULT 0 => 조회수

bGroup NUMBER(4) => 그룹(원글과 답변의 묶음)번호

bStep NUMBER(4) => 답글의 번호(기본 글들은 글을 쓴 순서에 따라 정렬이 되지만 답글은 글들의 

중간에도 위치할 수 있기 때문에, 중간에 쓴 답글을 기준으로하여 게시글의 번호를 +1 씩 함)

bIndent NUMBER(4) => 들여쓰기(원글의 대한 답글인지, 답글에 대한 답글인지 여부)

create sequence mvc_board seq => sequence 는 초기값 0, 후에 1씩 증가(글들의 정렬을 위해)



*실행결과 

=> list.jsp(뷰페이지) 를 실행하였다. 

 list.jsp 

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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    
    <table width="500" cellpadding="0" cellspacing="0" border="1">
        <tr>
            <td>번호</td>
            <td>이름</td>
            <td>제목</td>
            <td>날짜</td>
            <td>히트</td>
        </tr>
        <c:forEach items="${list}" var="dto">
        <tr>
            <td>${dto.bId}</td>
            <td>${dto.bName}</td>
            <td>
                <c:forEach begin="1" end="${dto.bIndent}">-</c:forEach>
                <a href="content_view?bId=${dto.bId}">${dto.bTitle}</a></td>
            <td>${dto.bDate}</td>
            <td>${dto.bHit}</td>
        </tr>
        </c:forEach>
        <tr>
            <td colspan="5"> <a href="write_view">글작성</a> </td>
        </tr>
    </table>
    
</body>
</html>
cs


글작성
 을 눌렀을 때 보이는 페이지 이다.


list.jsp 의 <a href="write_view">글작성</a> 에 따라 Controller 을 거친 클라이언트의 요청에 맞게 

 write_view.jsp   를 불러오게 된다. (write_view.jsp 의 실행 모습은 위와 같음)

 BController.java    의 write_view 메핑 부분

1
2
3
4
5
6
@RequestMapping("/write_view")
    public String write_view(Model model) {
        System.out.println("write_view()");
        
        return "write_view";
    }
cs

위의 테이블에 이름과 제목 그리고 내용을 적고 '입력' 버튼을 누르게 되면 '입력' 버튼에 

<form> 태그로 연결된 write 가 불려지게 되며 이 write 는 BController.java  에 매핑된 

1
2
3
4
5
6
7
8
9
10
@RequestMapping("/write")
    public String write(HttpServletRequest request, Model model) {
        System.out.println("write()");
        
        model.addAttribute("request", request);
        command = new BWriteCommand();
        command.execute(model);
        
        return "redirect:list";
    }
cs

에 따라 BWriteCommand() 을 실행하게 된다. BWriteCommand() 는 다음과 같다.

 BWriteCommand.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.javalec.springMVCBoard.command;
 
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
 
import org.springframework.ui.Model;
 
import com.javalec.springMVCBoard.dao.BDao;
 
 
public class BWriteCommand implements BCommand {
 
    @Override
    public void execute(Model model) {
        // TODO Auto-generated method stub
        
        Map<String, Object> map = model.asMap();
        HttpServletRequest request = (HttpServletRequest) map.get("request");
        String bName = request.getParameter("bName");
        String bTitle = request.getParameter("bTitle");
        String bContent = request.getParameter("bContent");
        
        BDao dao = new BDao();
        dao.write(bName, bTitle, bContent);
    }
}
cs

입력된 작성자명과 글제목 그리고 글내용을 가지고와서  dao.write(bName, bTitle, bContent)

를 실행시킨다.(DB와 연동) 

 BDao.java   의 dao.write() 부분

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
public void write(String bName, String bTitle, String bContent) {
        // TODO Auto-generated method stub
        
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        
        try {
            connection = dataSource.getConnection();
            String query = "insert into mvc_board (bId, bName, bTitle, bContent, bHit, bGroup, bStep, bIndent) values (mvc_board_seq.nextval, ?, ?, ?, 0, mvc_board_seq.currval, 0, 0 )";
            preparedStatement = connection.prepareStatement(query);
            preparedStatement.setString(1, bName);
            preparedStatement.setString(2, bTitle);
            preparedStatement.setString(3, bContent);
            int rn = preparedStatement.executeUpdate();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        } finally {
            try {
                if(preparedStatement != null) preparedStatement.close();
                if(connection != null) connection.close();
            } catch (Exception e2) {
                // TODO: handle exception
                e2.printStackTrace();
            }
        }
        
    }
cs

데이터 베이스와 연동하여 쿼리문을 실행, 입력된 작성자명과 글 제목 그리고 글 내용을 DB에 저장한다.

(preparedStatement 를 사용, 1 - 작성자명 / 2 - 글 제목 3 - 글 내용 을 저장하였다.)

위에서 만들었던  create sequence mvc_board seq 에 의해서 bId 의 부분은 mvc_board_seq.nextval

로써 첫번째 게시글은 글 번호가 1이 된다. 입력 버튼을 누르게 되면 BController.java  에 매핑된 

return "redirect:list";  에 따라서 작성한 글 리스트를 가지고 글 목록으로 돌아가게 된다.

*실행결과

'입력' 클릭 시



-계속-