반응형
자바 빈 클래스 제작
BoardDTO.java
--게시판 글 하나의 데이터를 저장하기 위해 사용
--BOARD 테이블의 각 컬럼에 대응하는 멤버 변수 선언
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
package board.model;
import java.sql.Date;
import java.sql.Time;
public class BoardDTO {
private int num;
private String name;
private String password;
private String subject;
private String content;
private Date writeDate;
private Time writeTime;
private int ref;
private int step;
private int lev;
private int readCnt;
private int childCnt;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Date getWriteDate() {
return writeDate;
}
public void setWriteDate(Date writeDate) {
this.writeDate = writeDate;
}
public Time getWriteTime() {
return writeTime;
}
public void setWriteTime(Time writeTime) {
this.writeTime = writeTime;
}
public int getRef() {
return ref;
}
public void setRef(int ref) {
this.ref = ref;
}
public int getStep() {
return step;
}
public void setStep(int step) {
this.step = step;
}
public int getLev() {
return lev;
}
public void setLev(int lev) {
this.lev = lev;
}
public int getReadCnt() {
return readCnt;
}
public void setReadCnt(int readCnt) {
this.readCnt = readCnt;
}
public int getChildCnt() {
return childCnt;
}
public void setChildCnt(int childCnt) {
this.childCnt = childCnt;
}
}
|
cs |
게시판 글 목록 기능 구현
BoardFrontController.java
--요청 커맨드가 boardList.bbs일 경우 수행됨.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
package board;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import board.command.BoardCmd;
import board.command.BoardDeleteCheckCmd;
import board.command.BoardDeleteCmd;
import board.command.BoardDeletePasswordCmd;
import board.command.BoardListCmd;
import board.command.BoardReadCmd;
import board.command.BoardReplyCmd;
import board.command.BoardReplyFormCmd;
import board.command.BoardSearchCmd;
import board.command.BoardUpdateCheckCmd;
import board.command.BoardUpdateCmd;
import board.command.BoardUpdateFormCmd;
import board.command.BoardUpdatePasswordCmd;
import board.command.BoardWriteCmd;
@WebServlet("*.bbs")
public class BoardFrontController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String requestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String cmdURI = requestURI.substring(contextPath.length());
BoardCmd cmd = null;
String viewPage = null;
//글 목록 조회 처리
if(cmdURI.equals("/boardList.bbs")) {
cmd = new BoardListCmd();
cmd.execute(request, response);
viewPage = "boardList.jsp";
}
RequestDispatcher dis = request.getRequestDispatcher(viewPage);
dis.forward(request, response);
}
}
|
cs |
BoardDAO.java
--게시판 목록에서 한 페이지당 출력할 글은 10개로 [WRITING_PER_PAGE]변수를 통해 지정
--조회된 글 데이터는 ArrayList에 담아 리턴 -> boardList.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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
package board.model;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.util.ArrayList;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class BoardDAO {
DataSource ds;
public static final int WRITING_PER_PAGE = 10;
public BoardDAO() {
try {
Context initContext = (Context) new InitialContext().lookup("java:comp/env/");
ds = (DataSource) initContext.lookup("jdbc/mysql");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 게시판 목록 조회 기능 수행
// 입력 파라미터로 현재 표시할 페이지 번호를 받은 후에 sql문을 통해 BOARD 테이블 조회
// ref, step 컬럼은 답변글을 처리하기 위한 컬럼이며
// MYSQL에서는 LIMIT을 사용하여 SELECT문의 결과 출력 범위를 지정해줄 수 있다.
public ArrayList<BoardDTO> boardList(String curPage) {
ArrayList<BoardDTO> list = new ArrayList<BoardDTO>();
Connection conn = null; // 데이터베이스 접속을 수행하는 객체
PreparedStatement pstmt = null; // pstmt : sql문을 데이터베이스에 전달시켜 실제 그 내용과 동작 등을 수행하는 객체
ResultSet rs = null; // 메모리에 존재하는 조회된 데이터의 결과물
try {
conn = ds.getConnection();
String sql = "SELECT num, name, password, subject, content, write_date, write_time, ref, step, lev, read_cnt, child_cnt";
sql += "FROM BOARD ORDER BY ref desc, step asc";
sql += "LIMIT ? , ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, WRITING_PER_PAGE * (Integer.parseInt(curPage) - 1));
pstmt.setInt(2, WRITING_PER_PAGE);
// resultSet 객체 값을 반환
// resultSet 객체에 결과값을 담을 수 있음.
rs = pstmt.executeQuery();
while (rs.next()) {
int num = rs.getInt("num");
String name = rs.getString("name");
String password = rs.getString("password");
String subject = rs.getString("subject");
String content = rs.getString("content");
Date writeDate = rs.getDate("write_date");
Time writeTime = rs.getTime("write_time");
int ref = rs.getInt("ref");
int step = rs.getInt("step");
int lev = rs.getInt("lev");
int readCnt = rs.getInt("read_cnt");
int childCnt = rs.getInt("child_cnt");
BoardDTO writing = new BoardDTO();
writing.setNum(num);
writing.setPassword(password);
writing.setSubject(subject);
writing.setContent(content);
writing.setWriteDate(writeDate);
writing.setWriteTime(writeTime);
writing.setRef(ref);
writing.setStep(step);
writing.setLev(lev);
writing.setReadCnt(readCnt);
writing.setChildCnt(childCnt);
list.add(writing);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
// 게시판 페이징 처리를 위한 기능 수행
public int boardPageCnt() {
int pageCnt = 0;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = ds.getConnection();
String sql = "SELECT COUNT(*) AS num FROM BOARD";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if (rs.next()) {
pageCnt = rs.getInt("num") / WRITING_PER_PAGE + 1;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return pageCnt;
}
}
|
cs |
BoardListCmd.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
28
29
30
31
32
33
34
|
package board.command;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import board.model.BoardDAO;
import board.model.BoardDTO;
public class BoardListCmd implements BoardCmd {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
BoardDAO dao = new BoardDAO();
ArrayList<BoardDTO> list;
int pageCnt = 0;
String curPage=request.getParameter("curPage");
if(curPage == null) curPage = "1";
list = dao.boardList(curPage);
request.setAttribute("boardList", list);
pageCnt = dao.boardPageCnt();
request.setAttribute("pageCnt", pageCnt);
}
}
|
cs |
boardList.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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
<%@ 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>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판 목록 조회</title>
</head>
<body>
<h3>게시판 목록 조회</h3>
<table border="1">
<tr>
<td colspan="7" align="right">
<a href="boardWriteForm.bbs">[새 글쓰기]</a>
</td>
</tr>
<tr>
<td>글 번호</td>
<td>글 제목</td>
<td>작성자</td>
<td>작성일</td>
<td>작성시간</td>
<td>조회수</td>
<td>답글수</td>
</tr>
<c:forEach items="${boardList}" var="dto">
<tr>
<td><a href="boardRead.bbs?num=${dto.num }">${dto.num }</a></td>
<td>
<c:forEach begin="1" end="${dto.lev }">
<%=" " %>
</c:forEach>
<a href="boardRead.bbs?num=${dto.num }">${dto.subject }</a>
</td>
<td>${dto.name }</td>
<td>${dto.writeDate }</td>
<td>${dto.writeTime }</td>
<td>${dto.readCnt }</td>
<td>${dto.chidCnt }</td>
</tr>
</c:forEach>
<tr>
<td colspan="7">
<a href="boardList.bbs">[첫 페이지로]</a>
<c:forEach var="i" begin="1" end="${pageCnt }">
<a href="boardList.bbs?curPage=${i }">[${i }]</a>
</c:forEach>
</td>
</tr>
<tr>
<td colspan="7">
<form action="boardSearch.bbs" method="post">
<select name="searchOption">
<option value="subject">제목</option>
<option value="content">본문</option>
<option value="both">제목+본문</option>
<option value="name">작성자</option>
</select>
<input type="text" name="searchWord">
<input type="submit" value="검색">
</form>
</td>
</tr>
</table>
</body>
</html>
|
cs |
<실행 화면>
게시판 글 작성 기능 구현
BoardFrontController.java
--boardWriteForm.bbs 커맨드를 통해 새 글 작성 화면 출력
--[글 올리기] 버튼을 클릭하면 boardWrite.bbs 커맨드를 통해 작성한 글이
BOARD 테이블에 INSERT됨.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
package board;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import board.command.BoardCmd;
import board.command.BoardDeleteCheckCmd;
import board.command.BoardDeleteCmd;
import board.command.BoardDeletePasswordCmd;
import board.command.BoardListCmd;
import board.command.BoardReadCmd;
import board.command.BoardReplyCmd;
import board.command.BoardReplyFormCmd;
import board.command.BoardSearchCmd;
import board.command.BoardUpdateCheckCmd;
import board.command.BoardUpdateCmd;
import board.command.BoardUpdateFormCmd;
import board.command.BoardUpdatePasswordCmd;
import board.command.BoardWriteCmd;
@WebServlet("*.bbs")
public class BoardFrontController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String requestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String cmdURI = requestURI.substring(contextPath.length());
BoardCmd cmd = null;
String viewPage = null;
//글 목록 조회 처리
if(cmdURI.equals("/boardList.bbs")) {
cmd = new BoardListCmd();
cmd.execute(request, response);
viewPage = "boardList.jsp";
}
//글 작성 화면 제공
if(cmdURI.equals("/boardWriteForm.bbs")) {
viewPage = "boardWrite.jsp";
}
//글 작성 처리
if(cmdURI.equals("/boardWrite.bbs")) {
cmd = new BoardWriteCmd();
cmd.execute(request, response);
viewPage = "boardList.bbs";
}
RequestDispatcher dis = request.getRequestDispatcher(viewPage);
dis.forward(request, response);
}
}
|
cs |
BoardDAO.java
--MAX함수, IFNUMM 함수를 이용해 최초 글 번호가 1이 되도록 설정
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
38
39
40
41
42
43
44
45
46
|
// 게시판 등록 기능 수행
public void boardWrite(String name, String subject, String content, String password) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
int num = 1;
try {
conn = ds.getConnection();
String sql = "SELECT IFNULL(MAX(num),0)+1 AS NUM FROM BOARD";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if (rs.next()) {
num = rs.getInt("num");
}
sql = "INSERT INTO BOARD (num, name, password, subject, content, write_date, write_time, ref, step, lev, read_cnt, child_cnt) values "
+ "(?,?,?,?,?,curdate(), curtime(), ?,0,0,0,0)";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
pstmt.setString(2, name);
pstmt.setString(3, password);
pstmt.setString(4, subject);
pstmt.setString(5, content);
pstmt.setInt(6, num);
pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
|
cs |
|
|
BoardWriteCmd.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
|
package board.command;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import board.model.BoardDAO;
public class BoardWriteCmd implements BoardCmd{
//글의 등록 지시
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
String subject= request.getParameter("subject");
String content = request.getParameter("content");
String password = request.getParameter("password");
BoardDAO dao = new BoardDAO();
dao.boardWrite(name, subject, content, password);
}
}
|
cs |
boardWrite.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
38
39
40
|
<%@ 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>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판 새 글 쓰기</title>
</head>
<body>
<h3>게시판 새글 쓰기</h3>
<form action="boardWrite.bbs" method="post">
<table>
<tr>
<td colspan="4" align="right"><a href="boardList.bbs">[목록으로]</a></td>
</tr>
<tr>
<td>글 제목</td>
<td colspan="3"><input type="text" name="subject" maxlength="50"></td>
</tr>
<tr>
<td>작성자</td>
<td><input type="text" name="name" maxlength="20"></td>
<td>비밀번호</td>
<td><input type="password" name="password" maxlength="20" size="12"></td>
</tr>
<tr>
<td>본문</td>
<td colspan="3"><textarea name="content" rows="8" cols="45"></textarea></td>
</tr>
<tr>
<td colspan="4" align="right">
<input type="submit" value="글 올리기">
</td>
</tr>
</table>
</form>
</body>
</html>
|
cs |
<실행 화면>
mysql INSERT 활용하여 게시글 여러 개 한꺼번에 올리기
게시판 글 열람 기능 구현
BoardFrontController.java
1
2
3
4
5
6
|
//글 열람 처리
if(cmdURI.equals("/boardRead.bbs")) {
cmd=new BoardReadCmd();
cmd.execute(request, response);
viewPage = "boardRead.jsp";
}
|
cs |
BoardDAO.java
--글을 열람할 경우 UPDATE문을 통해 해당 글의 조회수를 1 올려줌.
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
// 게시글 열람 기능 수행
public BoardDTO boardRead(String inputNum) {
BoardDTO writing = new BoardDTO();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = ds.getConnection();
String sql = "UPDATE BOARD SET READ_CNT = READ_CNT +1 WHERE NUM = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, Integer.parseInt(inputNum));
pstmt.executeUpdate();
sql = "SELECT num, name, password, subject, content, write,_date, write_time, ref, step, lev, read_cnt, child_cnt, FROM BOARD WHERE NUM = ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, Integer.parseInt(inputNum));
rs = pstmt.executeQuery();
if (rs.next()) {
int num = rs.getInt("num");
String name = rs.getString("name");
String password = rs.getString("password");
String subject = rs.getString("subject");
String content = rs.getString("content");
Date writeDate = rs.getDate("write_date");
Time writeTime = rs.getTime("write_time");
int ref = rs.getInt("ref");
int step = rs.getInt("step");
int lev = rs.getInt("lev");
int readCnt = rs.getInt("read_cnt");
int childCnt = rs.getInt("child_cnt");
writing.setNum(num);
writing.setPassword(password);
writing.setSubject(subject);
writing.setContent(content);
writing.setWriteDate(writeDate);
writing.setWriteTime(writeTime);
writing.setRef(ref);
writing.setStep(step);
writing.setLev(lev);
writing.setReadCnt(readCnt);
writing.setChildCnt(childCnt);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (rs != null)
rs.close();
if (pstmt != null)
pstmt.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return writing;
}
|
cs |
BoardReadCmd.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
package board.command;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import board.model.BoardDAO;
import board.model.BoardDTO;
public class BoardReadCmd implements BoardCmd{
//글 열람 처리 수행
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
String inputNum = request.getParameter("num");
BoardDAO dao = new BoardDAO();
BoardDTO writing = dao.boardRead(inputNum);
request.setAttribute("boardRead", writing);
}
}
|
cs |
boardRead.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
38
39
40
|
<%@ 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>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>게시판 글 열람</title>
</head>
<body>
<h3>게시판 글 열람</h3>
<table>
<tr>
<td colspan="4" align="right"><a href="boardList.bbs">[목록으로]</a></td>
</tr>
<tr>
<td>글 제목</td>
<td colspan="3"><input type="text" name="name" maxlength="50" size="50" value="${boardRead.name }" disabled="disabled"></td>
</tr>
<tr>
<td>작성자</td>
<td><input type="text" name="name" maxlength="20" size="20" value="${boardRead.readCnt }" disabled="disabled"></td>
<td>조회수: ${boardRead.readCnt },</td>
<td>답글수: ${boardRead.childCnt }</td>
</tr>
<tr>
<td>본문</td>
<td colspan="3"><textarea name="content" rows="8" cols="45" disabled="disabled">${boardRead.content }</textarea></td>
</tr>
<tr>
<td colspan="4" align="right">
<a href="boardUpdatePassword.bbs?num=${boardRead.num }">[수정]</a>
<a href="boardDeletePassword.bbs?num=${boardRead.num }">[삭제]</a>
<a href="boardReplyForm.bbs?num=${boardRead.num }">[답글]</a>
</td>
</tr>
</table>
</body>
</html>
|
cs |
<실행 화면>
반응형
'💻 my code archive > 🎨게시판 만들기' 카테고리의 다른 글
[STS Spring] 게시판 만들기 -- 01. Spring MVC Project 생성 (0) | 2022.01.16 |
---|---|
MVC 패턴 model2 방식 - 회원 정보 조회, 수정, 삭제 (0) | 2021.12.22 |
[게시판 설계 및 구축 --4] 게시판 글 수정, 글 삭제, 글 검색, 답글 작성 기능 구현 (7) | 2021.12.05 |
[게시판 설계 및 구축--2] mysql 테이블 생성, Model 클래스 설계, View JSP 페이지 설계 (0) | 2021.12.05 |
[게시판 설계 및 구축 --1] Model1 방식, Model2 방식, MVC 패턴이란 (0) | 2021.12.05 |