본문 바로가기
👨‍💻 2. 웹개발_Back end/2-6 Spring

[Spring] 셋째 날 1장~2장 Model 1 아키텍처로 게시판 개발 (로그인과 로그아웃, 글 등록, 수정, 삭제 기능) 및 포워드와 리다이렉트 방식 차이

by 달님🌙 2021. 10. 29.
반응형

 

실습 코드 참조

 

moonhy7/SpringFramework: Spring Framework 실습 코드 정리 (github.com)

 

GitHub - moonhy7/SpringFramework: Spring Framework 실습 코드 정리

Spring Framework 실습 코드 정리. Contribute to moonhy7/SpringFramework development by creating an account on GitHub.

github.com

 

 

1.1절 Model 1 아키텍처 구조

 

1. Moel 1 아키텍처의 구조

- Model 1 아키텍처 : JSP와 JavaBeans만 사용하여 웹을 개발하는 것으로 2000년대 초까지 웹 애플리케이션 개발에 사용되었던 아키텍처이다.

- JavaBeans : 데이터베이스 연동에 사용되는 자바 객체들을 의미한다.

- Model : 데이터베이스 연동 로직을 제공하면서 DB에서 검색한 데이터가 저장되는 자바 객체

- 우리가 만든 VO, DAO 클래스가 바로 Model 기능의 자바 객체다.

 

2. Controller에 해당되는 자바 코드 예

 

- Model 1 아키텍처에서는 JSP가 Controller와 View 기능을 모두 처리하기 때문에 가장 중요함

- Controller : 사용자의 요청 처리와 관련된 자바 코드를 의미함 

 

3. Model 1 구조의 특징

 

- JSP에서는 검색한 데이터를 사용자가 원하는 화면으로 제공하기 위해서 HTML과 CSS를 이용하여 View 기능을 담당한다.

- Model 1 구조는 JSP 파일에서 Controller 기능과 View 기능을 모두 처리하기 때문에 자바 코드와 마크업 관련 코드가 섞여있어  디버깅과 유지보수에 어려움이 많음 -> 복잡한 시스템에서는 부적절한 모델임

 

4. Model 2 구조의 특징

 

- Model 2를 일반적으로 MVC모델이라고 하며 Model, View, Controller 요소로 기능을 분리하여 개발한다.

- Model 1 구조의 단점을 보완하기 위해 만들어진 구조

 

 

1.2절 로그인 기능 구현 ( _051_BoardWeb_Model_One )



0. mysql-connector-java-8.0.26.jar 파일 경로 변경

 

1) 경로 변경 이유

- 나중에 배포하기 위함

 

2) 라이브러리 추가

 

2) Web App Libraries 선택

 

3) mysql-connector-java-8.0.26.jar 파일 선택

 

1. 로그인 화면 

 

1) 파일 경로 

2) login.jsp 파일

- 로그인 버튼 클릭시  id와 password 파라미터 정보를 가지고 login_proc.jsp 파일을 호출함

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
</head>
<body>
	<center>
		<h1>로그인</h1>
		<hr>
		<!-- login_proc.jsp : 컨트롤러에 해당 jsp 파일. 로그인 기능처리 -->
		<form action="login_proc.jsp" method="post">
			<table border="1" cellpadding="0" cellspacing="0">
				<tr>
					<td bgcolor="orange">아이디</td>
					<td><input type="text" name="id"></td>
				</tr>
				<tr>
					<td bgcolor="orange">비밀번호</td>
					<td><input type="password" name="password"></td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<input type="submit" value="로그인">
					</td>
				</tr>
			</table>
		</form>
	</center>
</body>
</html>

 

3) 톰캣 서버 path 설정

 

4) 실행 화면

서버 실행 -> web.xml 내용지우기 ->hello 서블릿 제거 -> Ctrl + F11

 

2. 로그인 인증 처리

 

1) login_proc.jsp

- 사용자가 입력한 아이디와 비밀번호를 request 객체로부터 추출함

- Model에 해당하는 UserVO와 UserDAO 객체를 이용하여 사용자 정보를 검색

- 검색 결과로 UserVO 객체가 리턴되면 로그인 성공이고 null이 return되면 로그인 실패로 처리

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page import="com.springbook.biz.user.impl.UserDAO" %>
<%@page import="com.springbook.biz.user.UserVO" %>
<%
	//1. 사용자 입력 정보 추출(login.jsp 에서 전송한 id, password 받기)
	String id = request.getParameter("id");
	String password = request.getParameter("password");
	
	//2. DB연동 처리(UserDAO의 메소드 호출)
	UserVO vo = new UserVO();
	vo.setId(id);
	vo.setPassword(password);
	
	UserDAO userDAO = new UserDAO();
	UserVO user = userDAO.getUser(vo);
	
	//3. 화면 네비게이션(로그인 후 화면 이름 처리)
	//로그인 성공 시 게시판 목록 조회 화면으로 이동
	if(user != null) {
		response.sendRedirect("getBoardList.jsp");
	//로그인 실패 시 다시 로그인 화면으로 이동
	} else {
		response.sendRedirect("login.jsp");
	}
%>

 

2) 로그인 성공 화면

- 로그인 시 우선 404 에러가 뜨는게 정상 (getBoardList.jsp를 아직 안만들어서)

 

3) 로그인 실패 화면

- 없는 아이디로 로그인시 다시 로그인 페이지로 이동

 

3) 포워드 vs 리다이렉트

① forward, include

- requestDispatcher를 이용하여 응답으로 보여줄 화면을 리턴

- 한 번의 요청과 응답으로 처리되므로 속도가 빠르고 URL 변경되지 않음

- 이전 페이지에서 작성한 데이터의 공유가 가능함

- forward : 이동할 페이지에 제어권을 영구적으로 넘겨줌

- include : 이동할 페이지의 처리가 끝나면 다시 이전 페이지에 제어권을 넘겨줌

 

② redirect

- 이동할 JSP에서 브라우저로 응답메시지를 보내주고 다시 서버로 재요청 방식

- 속도가 forward, include에 비해서 느리고 URL이 이동할 페이지로 변경

- 요청과 응답 객체를 새로 생성해서 전송하기 때문에 이전 페이지에서 작성한 데이터 공유가 불가능

 

 

1.3절 글 목록 검색 기능 구현

 

1) getBoardList.jsp

- BoardVO와 BoardDAO 객체를 이용하여 BOARD 테이블에 저장된 게시글 목록을 검색한다.

- 검색 결과로 얻은 List<BoardVO> 객체를 이용하여 로그인에 성공한 다음 이동될 글 목록 화면을 구성함

- 게시글 제목에 링크를 설정하여 게시글 상세 정보 조회 기능 추가할 예정

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.springbook.biz.board.impl.BoardDAO"%>
<%@ page import="com.springbook.biz.board.BoardVO"%>
<%@ page import="java.util.List"%>
<%
	//1. 사용자 입력 정보 추출(검색기능 나중에 구현)
	//2. DB 연동 처리(BoardDAO의 메소드 호출)
	BoardVO vo = new BoardVO();
	BoardDAO boardDAO = new BoardDAO();
	List<BoardVO> boardList = boardDAO.getBoardList(vo);
	
	//3. 응답 화면 구현
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 목록</title>
</head>
<body>
	<center>
		<h1>글 목록</h1>
		<h3>테스트님 환영합니다...<a href="logout_proc.jsp">Log-out</a></h3>
		
		<!-- 검색 시작 -->
		<form action="getBoardList.jsp" method="post">
			<table border="1" cellpadding="0" cellspacing="0" width="700">
				<tr>
					<td align="right">
						<select name="searchCondition">
							<option value="TITLE">제목
							<option value="CONTENT">내용
						</select>
						<input name="searchKeyword" type="text">
						<input type="submit" value="검색">
					</td>
				</tr>
			</table>
		</form>
		<!-- 검색 종료 -->
		<table border="1" cellpadding="1" cellspacing="0" width="700">
			<tr>
				<th bgcolor="orange" width="100">번호</th>
				<th bgcolor="orange" width="200">제목</th>
				<th bgcolor="orange" width="150">작성자</th>
				<th bgcolor="orange" width="150">등록일</th>
				<th bgcolor="orange" width="100">조회수</th>
			</tr>
			<% for(BoardVO board : boardList) { %>
			<tr>
				<td><%= board.getSeq() %></td>
				<td><a href="getBoard.jsp?seq=<%= board.getSeq() %>"><%= board.getTitle() %></a></td>
				<td><%= board.getWriter() %></td>
				<td><%= board.getRegDate() %></td>
				<td><%= board.getCnt() %></td>
			</tr>
			<% } %>
		</table>
		<br>
		<a href="insertBoard.jsp">새 글 등록</a>
	</center>
</body>
</html>

 

 

2) 게시글 목록 화면

 

 

1.4절 글 상세 기능 구현

 

1) getBoard.jsp

- 글 목록 화면에서 사용자가 클릭한 게시글을 조회하여 게시글의 상세 화면을 제공하는 파일 작성

- 가장 먼저 글 목록 화면에서 사용자가 클릭한 게시글 번호 추출 후 BoardDAO 객체의 getBoard() 메소드를 이용하여 게시글 번호에 해당하는 BoardVO 객체 검색

- 마지막으로 검색된 BoardVO 객체의 값들을 화면에 적절히 출력

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.springbook.biz.board.impl.BoardDAO" %>
<%@ page import="com.springbook.biz.board.BoardVO" %>
<%
	//1. 상세 조회할 게시글 번호 추출
	String seq = request.getParameter("seq");

	//2. DB 연동 처리(BoardDAO의 메소드 호출)
	BoardVO vo = new BoardVO();
	vo.setSeq(Integer.parseInt(seq));
	
	BoardDAO boardDAO = new BoardDAO();
	BoardVO board = boardDAO.getBoard(vo);

	//3. 응답 화면 구성
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 상세</title>
</head>
<body>
	<center>
		<h1>글 상세</h1>
		<a href="logout_proc.jsp">Log-out</a>
		<form action=update_proc.jsp method="post">
			<table border="1" cellpadding="0" cellspacing="0">
				<tr>
					<td bgcolor="orange" width="70">제목</td>
					<td align="left"><input name="title" type="text" value="<%= board.getTitle()%>"></td>
				</tr>
				<tr>
					<td bgcolor="orange">작성자</td>
					<td align="left"><%= board.getTitle()%></td>
				</tr>
				<tr>
					<td bgcolor="orange">내용</td>
					<td align="left">
						<textarea name="content" cols="40" rows="10"><%= board.getContent()%></textarea>
					</td>
				</tr>
				<tr>
					<td bgcolor="orange">등록일</td>
					<td align="left"><%=board.getRegDate()%></td>
				</tr>
				<tr>
					<td bgcolor="orange">조회수</td>
					<td align="left"><%= board.getCnt()%></td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<input type="submit" value="글 수정">
					</td>
				</tr>
			</table>
		</form>
		<hr>
		<a href="insertBoard.jsp">글 등록</a>&nbsp;&nbsp;&nbsp;
		<a href="deleteBoard_proc.jsp">글 삭제</a>&nbsp;&nbsp;&nbsp;
		<a href="getBoardList.jsp">글 목록</a>
	</center>
</body>
</html>

 

2) 실행 화면

- 글 목록 화면(getBoardList.jsp)에서 제목 링크를 클릭하면 해당 게시글의 상세 화면이 출력됨

- URL 끝 부분에 조회할 게시글의 일련번호가 쿼리 문자열 형태로 추가됨

- 제목과 내용을 수정할 수 있도록 수정 버튼을 만들고 글등록, 글삭제, 글목록 기능을 위한 버튼도 추가해줌

 

 

1.5절 글 등록 기능 구현

 

1. 글 등록 화면

 

1) insertBoard.jsp 파일 생성하여 글 등록 화면 구성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>새 글 등록</title>
</head>
<body>
	<center>
		<h1>새 글 등록</h1>
		<a href="logout_proc.jsp">Log-out</a>
		<form action="insertBoard_proc.jsp" method="post">
			<table border="1" cellpadding="0" cellspacing="0">
				<tr>
					<td bgcolor="orange" width="70">제목</td>
					<td align="left"><input type="text" name="title"></td>
				</tr>
				<tr>
					<td bgcolor="orange">작성자</td>
					<td align="left"><input type="text" name="writer" size="10"></td>
				</tr>
				<tr>
					<td bgcolor="orange">내용</td>
					<td align="left">
						<textarea name="content" cols="40" rows="10"></textarea>
					</td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<input type="submit" value="새 글 등록">
					</td>
				</tr>
			</table>
		</form>
		<hr>
		<a href="getBordList.jsp">글 목록 가기</a>
	</center>
</body>
</html>

 

2) 글 등록 화면

- 로그인 화면과 유사하게 사용자가 title, writer, content 파라미터 정보를 입력하고 등록 버튼을 클릭하면 insertBoard_proc.jsp 파일을 호출함

 

 

2. 글 등록 처리

 

1) insertBoard_proc.jsp

- 가장 먼저 인코딩 관련 코드를 작성하여 setCharacterEncoding() 메소드로 한글 인코딩을 처리해준다.

-그 후 BoardVO 객체를 생성하여 추출된 값들을 BoardDAO의 insertBoard() 메소드를 호출할 때 인자로 전달하면 DB 연동 처리가 끝난다.

- 마지막으로 getBoardList.jsp 화면을 리다이렉트해주어 글 등록이 성공하고 나면 글 목록 화면을 출력해준다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.springbook.biz.board.impl.BoardDAO"%>
<%@ page import="com.springbook.biz.board.BoardVO"%>

<%
	//1. 사용자 입력정보 추출(insertBoard.jsp에서 전송된 정보 추출)
	//입력된 정보가 한글일 경우 깨짐 방지
	request.setCharacterEncoding("UTF-8");
	String title = request.getParameter("title");
	String writer = request.getParameter("writer");
	String content = request.getParameter("content");
	
	//2. DB 연동 처리(BoardDAO의 메소드 호출)
	BoardVO vo = new BoardVO();
	vo.setTitle(title);
	vo.setWriter(writer);
	vo.setContent(content);
	
	BoardDAO boardDAO = new BoardDAO();
	boardDAO.insertBoard(vo);
	
	//3. 화면 네비게이션
	//글 등록 처리 후 글 목록 페이지로 이동
	response.sendRedirect("getBoardList.jsp");
%>

 

2) 실행 화면

 

 

1.6절 글 수정 기능 구현

 

1. hidden 추가

 

- 글 수정을 처리하려면 수정할 글의 제목과 내용 뿐만 아니라 게시글 번호도 알아야 하므로 form 태그 아래 Hidden 타입의 <input> 태그로 수정할 게시글 번호도 같이 전달될 수 있도록 해줌

<form action=updateBoard_proc.jsp method="post">
	<input type="hidden" name="seq" value="<%= board.getSeq() %>">
    		...
</form>

 

2. updateBoard_proc.jsp

 

- 글 등록과 마찬가지로 글 수정 작업에서도 한글 인코딩 처리를 해준다.

- getParameter() 메소드를 사용하기 전에 setCharacterEncoding() 메소드를 추가한다.

- 인코딩 처리된 입력값들을 BoardVO 객체에 저장했으면 BoardDAO의 updateBoard() 메소드를 이용하야 데이터를 수정한다. 

- 마지막으로 글 목록 화면으로 이동하도록 처리해준다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.springbook.biz.board.impl.BoardDAO"%>
<%@ page import="com.springbook.biz.board.BoardVO"%>

<%
	//1. 사용자 입력정보 추출(getBoard.jsp에서 전송된 정보 추출)
	request.setCharacterEncoding("UTF-8");
	String seq = request.getParameter("seq");
	String title = request.getParameter("title");
	String content = request.getParameter("content");

	//2. DB 연동 처리 (BoardDAO의 메소드 호출)
	BoardVO vo = new BoardVO();
	vo.setSeq(Integer.parseInt(seq));
	vo.setTitle(title);
	vo.setContent(content);
	
	BoardDAO boardDAO = new BoardDAO();
	boardDAO.updateBoard(vo);
	
	//3. 화면 네비게이션
	//수정처리 후 글 목록 화면으로 이동
	response.sendRedirect("getBoardList.jsp");
%>

 

3. 실행 화면

 

- 수정 내용을 입력 후 글 수정 버튼을 누르면 title, content 파라미터 정보와 Hidden으로 설정한 게시글 번호를 가지고 updateBoard_proc.jsp 파일을 호출함

 

 

1.7절 글 삭제 기능 구현

 

1. deleteBoard_proc.jsp

 

- 삭제 요청된 게시글 번호를 추출하여 BoardVO 객체에 저장한다.

- BoardDAO의 deleteBoard() 메소드를 호출하여 데이터를 삭제 처리하고 글 목록 화면으로 이동

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.springbook.biz.board.impl.BoardDAO"%>
<%@ page import="com.springbook.biz.board.BoardVO"%>

<%
	//1. 사용자 입력정보 추출(getBoard.jsp에서 전송된 정보 추출)
	String seq = request.getParameter("seq");

	//2. DB 연동 처리 (BoardDAO의 메소드 호출)
	BoardVO vo = new BoardVO();
	vo.setSeq(Integer.parseInt(seq));
	
	BoardDAO boardDAO = new BoardDAO();
	boardDAO.deleteBoard(vo);
	
	//3. 화면 네비게이션 
	//글 삭제 처리 후 글 목록 화면으로 이동
	response.sendRedirect("getBoardList.jsp");
%>

 

2. 실행 결과

 

 

 

1.8절 로그아웃 기능 구현

 

1. logout_proc_jsp

 

- 로그아웃 요청에 대해서 연관된 세션을 강제로 종료하고 메인 화면으로 이동하도록 구현

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	//1. 브라우저와 연결된 세션 객체를 강제 종료한다.
	session.invalidate();

	//2. 세션 종료 후, 로그인 화면으로 이동
	response.sendRedirect("login.jsp");
%>

 

2. 실행 결과

 

 

다시 로그인 화면으로 이동

 

 

반응형

댓글