일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- DART
- Web
- Spring
- 반다이몰
- 자바
- javascript
- rails7
- ruby
- springboot
- vscode
- 건담베이스
- jsp
- 건담
- 単語
- 일본어
- C로 시작하는 컴퓨터 프로그래밍4판
- CSS
- rails
- メソッド
- 인프런
- 비즈니스일본어
- 연습문제
- 日本語
- Python
- nico
- Flutter
- 一日一つメソッド
- 디지몬
- java
- html
- Today
- Total
AR삽질러
JSP 개인프로젝트(7) - singleton적용, 게시판만들기 본문
https://arang95.tistory.com/43
지난시간에는 로그인, 로그아웃, 회원가입, 회원수정, 회원탈퇴 까지 구현하였다.
이번시간부터는 현재까지 구현한 코드들을 깔끔하게 수정하고 singleton을 적용해서 하나의 인스턴스만을 갖게 만들고
게시판구현을 시작한다.
패턴 :
소프트웨어 공학에서 말하는 "패턴"은, 특정한 문제를 해결하기 위한 소프트웨어 디자인의 재사용 가능한 해결책을 의미합니다. 이러한 패턴은 다양한 상황에서 반복적으로 나타나는 공통적인 문제를 해결하기 위한 일종의 "템플릿"이라고 생각할 수 있습니다.
소프트웨어 디자인 패턴은 주로 "Gang of Four"라는 그룹에서 소개었고 소개한 패턴 중 일부는 객체지향 프로그래밍에서 자주 사용됩니다.
싱글톤 패턴, 팩토리 메서드 패턴, 어댑터 패턴, 데코레이터 패턴, 옵저버 패턴 등이 있습니다.
이 패턴을 사용하면 일반적으로 좋은 소프트웨어 디자인의 원칙을 따르면서도, 특정한 문제를 해결하기 위한 구체적인 해결책을 제시할 수 있습니다.
패턴은 소프트웨어 개발자들에게 유용한 도구로 코드의 재사용성과 유지보수성을 향상시키는 데 큰 도움을 줄 수 있습니다.
디자인 패턴 :
디자인 패턴은 객체지향 소프트웨어 디자인에서 특정 문제를 해결하기 위한 재사용이 가능한 솔루션을 제공하는 방법으로 크게 생성 패턴, 구조패턴, 행동패턴으로 분류됩니다.
생성패턴 : 객체를 생성하는 방법과 관련된 패턴
추상팩토리패턴, 팩토리메서드패턴, 싱글톤패턴 등
구조패턴 : 클래스나 객체를 조합해 더 큰 구로를 만드는 패턴
어댑터패턴, 브리지패턴, 컴포지트패턴, 데코레이터패턴 등
행동패턴 : 객체 간의 상호작용 패턴
커맨드패턴, 인터프리터패턴, 옵저버패턴, 템플릿메서드 등
장점 : 재사용성을 높여 유지보수성을 개선시킨다. 유연성을 높여 개발자들간의 표준화된 용어와 패턴을 공유해 이해가 수월해진다.
1. singleton적용
singleton을 적용하게 되면 생성자가 private이여서 useBean을 사용할수 없기때문에 getInstance()메소드를 사용해야한다.
이전코드의 useBean내용을 수정해준다.
// singletion적용
private static MemberDAO instance = null; // 맴버필드
private MemberDAO() {}
public static MemberDAO getInstance() {
if(instance == null) {
synchronized (MemberDAO.class) {
instance = new MemberDAO();
}
}
return instance;
}
2. jsp파일에서 <jsp:useBean id="dao" class="MemberDAO" />를
<% MemberDAO dao = MemberDAO.getInstance(); %>로 수정해준다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
3. 회원 게시판 만들기
개요
회원가입 -> 로그인 -> 게시판(게시판 글목록, 글쓰기, 수정, 삭제 등)
게시판 테이블과 시퀀스를 만들어준다.
번호, 글쓴이, 이메일, 제목, 내용, 날짜, 조회수, 비밀번호, 글쓴이주소
4. Model만들기
DAO, VO
public class BoardVO {
private int num;
private String writer;
private String email;
private String subject;
private String pass;
private int readcount;
private int ref;
private int step;
private int depth;
private Timestamp regdate;
private String content;
private String ip;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}
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 getDepth() {
return depth;
}
public void setDepth(int depth) {
this.depth = depth;
}
public Timestamp getRegdate() {
return regdate;
}
public void setRegdate(Timestamp regdate) {
this.regdate = regdate;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
private static BoardDAO instance = null;
private BoardDAO() {
}
public static BoardDAO getInstance(){
if(instance == null) {
synchronized (BoardDAO.class) {
instance = new BoardDAO();
}
}
return instance;
}
// ------------------
public void insertArticle(BoardVO article) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
int num = article.getNum();
int ref = article.getRef();
int step = article.getStep();
int depth = article.getDepth();
int number = 0;
String sql = "";
try {
conn = ConnUtil.getcConnection();
pstmt = conn.prepareStatement("select max(ref) from board");
rs = pstmt.executeQuery();
if(rs.next())
number = rs.getInt(1) + 1;
else number = 1;
if(num != 0) {
sql = "update board set step=step+1 where ref=? and step> ?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, ref);
pstmt.setInt(2, step);
pstmt.executeUpdate();
step = step + 1;
depth = depth + 1;
}else {
ref = number;
step=0;
depth=0;
}
sql = "insert into board(num, writer, email, subject, pass, regdate, ref, step, depth, content, ip) values(board_seq.nextval,?,?,?,?,?,?,?,?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, article.getWriter());
pstmt.setString(2, article.getEmail());
pstmt.setString(3, article.getSubject());
pstmt.setString(4, article.getPass());
pstmt.setTimestamp(5, article.getRegdate());
pstmt.setInt(6, ref);
pstmt.setInt(7, step);
pstmt.setInt(8, depth);
pstmt.setString(9, article.getContent());
pstmt.setString(10, article.getIp());
pstmt.executeUpdate();
}catch(Exception e) {
e.printStackTrace();
}finally {
if(rs != null)try {rs.close();}catch(SQLException e) {}
if(pstmt != null)try {pstmt.close();}catch(SQLException e) {}
if(conn != null)try {conn.close();}catch(SQLException e) {}
}
}
insert문의 경우에는 답변글과 새글일 경우를 고려한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="../css/bootstrap.css">
<link rel="stylesheet" href="../css/custom.css">
<title>메인페이지</title>
<script type="text/javascript" src="script.js"></script>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="../js/bootstrap.js"></script>
</head>
<%
int num=0, ref=1, step=0, depth=0;
try{
if(request.getParameter("num")!=null){
num = Integer.parseInt(request.getParameter("num"));
ref = Integer.parseInt(request.getParameter("ref"));
step = Integer.parseInt(request.getParameter("step"));
depth = Integer.parseInt(request.getParameter("depth"));
}
%>
<body>
<%
String id = (String)session.getAttribute("id");
%>
<nav class="navbar navbar-default">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed"
data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"
aria-expanded="false">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="main.jsp">AR 웹페이지</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="../memberone/main.jsp">메인</a>
<li class="active"><a href="writeForm.jsp">게시판</a>
</ul>
<%
if(id == null){
%>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle"
data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false">접속하기<span class="caret"></span>
</a>
<ul class="dropdown-menu">
<li><a href="../memberone/login.jsp">로그인</a></li>
<li><a href="../memberone/regForm.jsp">회원가입</a></li>
</ul>
</li>
</ul>
<%
}
%>
</div>
</nav>
<div class="container">
<form method="post" name="writeForm" action="writeProc.jsp" onsubmit="return writeSave()">
<input type="hidden" name="num" value="<%=num %>">
<input type="hidden" name="ref" value="<%=ref %>">
<input type="hidden" name="step" value="<%=step %>">
<input type="hidden" name="depth" value="<%=depth %>">
<table class="table table-bordered table-hover" style="text-align: center; border: 1px solid #ddddddd">
<thead>
<tr>
<th colspan="3"><h4>게시판 글쓰기</h4></th>
</tr>
</thead>
<tbody>
<tr>
<td align="right" colspan="2" style="width:110px;">
<a href="list.jsp"><h5>글목록</h5></a>
</td>
</tr>
<tr>
<td style="width:110px;"><h5>작성자</h5></td>
<td><input class="form-control" type="text" name="writer" maxlength="12" placeholder="작성자를 입력하세요.">
</tr>
<tr>
<td style="width:110px;"><h5>이메일</h5></td>
<td><input class="form-control" type="text" name="email" maxlength="30" placeholder="이메일를 입력하세요.">
</tr>
<tr>
<td style="width:110px;"><h5>제목</h5></td>
<%if(request.getParameter("num")==null){ %>
<td><input class="form-control" type="text" name="subject" maxlength="50" placeholder="제목을 입력하세요."></td>
<%}else{ %>
<td><input class="form-control" type="text" maxlength="50" name="subject" value="[답변]"/>
<%} %>
</td>
</tr>
<tr>
<td style="width:70px;"><h5>내용</h5></td>
<td><textarea class="form-control" name="content" rows="13" cols="50" placeholder="내용를 입력하세요."></textarea>
</td>
</tr>
<tr>
<td style="width:70px;"><h5>비밀번호</h5></td>
<td><input class="form-control" type="password" name="pass" maxlength="12" placeholder="비밀번호를 입력하세요.">
</tr>
<tr>
<td colspan="2" align="center">
<input class="btn btn-primary" type="submit" value="글쓰기"/>
<input class="btn btn-primary" type="reset" value="다시입력">
<input class="btn btn-primary" type="button" value="목록" onClick="window.location='list.jsp'">
</td>
</tr>
</tbody>
</table>
</form>
<%
}catch(Exception e){}
%>
</body>
</html>
스크립트를 통해서 유효성검사를 해준다.
function writeSave(){
if(document.writeForm.writer.value==""){
alert("작성자를 입력하세요.");
document.writeForm.writer.focus();
return false;
}
if(document.writeForm.email.value==""){
alert("이메일를 입력하세요.");
document.writeForm.email.focus();
return false;
}
if(document.writeForm.subject.value==""){
alert("제목를 입력하세요.");
document.writeForm.subject.focus();
return false;
}
if(document.writeForm.content.value==""){
alert("내용를 입력하세요.");
document.writeForm.content.focus();
return false;
}
if(document.writeForm.pass.value==""){
alert("비밀번호를 입력하세요.");
document.writeForm.pass.focus();
return false;
}
}
view
'JAVA > JSP' 카테고리의 다른 글
JSP 개인프로젝트(9) - 게시판만들기(게시글내용보기) (0) | 2023.02.28 |
---|---|
JSP 개인프로젝트(8) - 게시판만들기(게시글목록) (0) | 2023.02.28 |
JSP 개인프로젝트(6) - 회원탈퇴 (0) | 2023.02.17 |
JSP 개인프로젝트(5) - 회원정보수정 (0) | 2023.02.17 |
JSP 개인프로젝트(4) - 회원가입완성, 로그인구현 (0) | 2023.02.16 |