AR삽질러

JSP 개인프로젝트(7) - singleton적용, 게시판만들기 본문

JAVA/JSP

JSP 개인프로젝트(7) - singleton적용, 게시판만들기

아랑팡팡 2023. 2. 28. 19:47
728x90

https://arang95.tistory.com/43

 

JSP 개인프로젝트(6) - 회원탈퇴

https://arang95.tistory.com/42 JSP 개인프로젝트(5) - 회원정보수정 https://arang95.tistory.com/40 JSP 개인프로젝트(4) - 회원가입완성, 로그인구현 https://arang95.tistory.com/34 JSP 개인프로젝트(3) - 로그인, 회원가입

arang95.tistory.com

지난시간에는 로그인, 로그아웃, 회원가입, 회원수정, 회원탈퇴 까지 구현하였다. 

이번시간부터는 현재까지 구현한 코드들을 깔끔하게 수정하고 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="글쓰기"/>&nbsp;&nbsp;
			<input class="btn btn-primary" type="reset" value="다시입력">&nbsp;&nbsp;
			<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

 

728x90
반응형
LIST