실습 코드 참조
moonhy7/SpringFramework: Spring Framework 실습 코드 정리 (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>
<a href="deleteBoard_proc.jsp">글 삭제</a>
<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. 실행 결과
다시 로그인 화면으로 이동
댓글