0. 출처
아직 배우고 있는 중이라 부정확한 정보가 포함되어 있을 수 있습니다!
주의하세요!
올인원 스프링 프레임워크 참고.
1. 프로젝트 설명
일반 도서관에서 사용할 만한 프로그램이다.
도서 대여, 반납, 희망 도서 신청, 회원 가입 등 기능을 제공한다.

가. 관리자 기능

나. 사용자 기능

2. 프로젝트 생성
새로운 Spring Legacy Project를 생성한다.
- Project name : BookRentalPjt
- Template : Spring MVC Project
- Package name : com.office.library
pom.xml의 java와 spring-framework 버전을 수정한 다음 web.xml에 한글 인코딩 설정을 추가한다.
resources, views 폴더에 실습에 필요한 JSP 파일을 붙여 넣는다.
user 폴더는 아직 비워둔다.
(JSP, CSS, 이미지 파일 복사 : http://www.hanbit.co.kr/src/4663)

3. 관리지 회원가입

오늘은 빨간 박스로 표시한 기능을 구현할 것이다.
- 관리자 홈 만들기
- 관리자 회원가입 화면 만들기
- 관리자 회원가입 처리하기
- 컨트롤 기능 구현
- 서비스 기능 구현
- DAO 기능 구현
가. 관리자 홈 화면
@Controller
@RequestMapping("/admin")
public class AdminHomeController {
@RequestMapping(value= {"","/"}, method = RequestMethod.GET)
public String home() {
System.out.println("[AdminHomeController] home()");
String nextPage = "admin/home";
return nextPage;
}
}
Code language: JavaScript (javascript)
@RequestMapping("/admin"):AdminHomeController은 관리자 홈 화면에 대한 요청/admin을 처리한다.String nextPage = "admin/home";:/WEB-INF/views/sign_up_ok.jsp을 view로 사용한다.@RequestMapping(value= {"","/"}, method = RequestMethod.GET)
:home()은/admin/과/admin모두를 처리함.
http://localhost:8090/library/admin이나 http://localhost:8090/library/admin/으로 접속하면 DispatcherServlet은 해당 AdminHomeController를 호출한다.

나. 관리자 회원가입 화면
// home.jsp
<body>
<jsp:include page="../include/header.jsp" />
<jsp:include page="./include/nav.jsp" />
...
<jsp:include page="../include/footer.jsp" />
...
Code language: HTML, XML (xml)
<jsp:include page="./include/nav.jsp" />:admin/home.jsp는admin/include/nav.jsp를 include한다. 이하동일

<!-- admin/include/nav.jsp -->
<%@page import="com.office.library.admin.member.AdminMemberVo"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<link href="<c:url value='/resources/css/admin/include/nav.css' />" rel="stylesheet" type="text/css">
<jsp:include page="./nav_js.jsp" />
<nav>
<div id="nav_wrap">
<%
AdminMemberVo loginedAdminMemberVo = (AdminMemberVo) session.getAttribute("loginedAdminMemberVo");
if (loginedAdminMemberVo != null) {
%>
<div class="menu">
<ul>
<li><a href="<c:url value='/admin/member/logoutConfirm' />">로그아웃</a></li>
<li><a href="<c:url value='/admin/member/modifyAccountForm' />">계정수정</a></li>
<c:if test="${loginedAdminMemberVo.a_m_id eq 'super admin'}">
<li><a href="<c:url value='/admin/member/listupAdmin' />">관리자목록</a></li>
</c:if>
<li><a href="<c:url value='/book/admin/getRentalBooks' />">대출도서</a></li>
<li><a href="<c:url value='/book/admin/getAllBooks' />">전체도서</a></li>
<li><a href="<c:url value='/book/admin/getHopeBooks' />">희망도서(입고처리)</a></li>
<li><a href="<c:url value='/book/admin/registerBookForm' />">도서등록</a></li>
</ul>
</div>
<%
} else {
%>
<div class="menu">
<ul>
<li><a href="<c:url value='/admin/member/loginForm' />">로그인</a></li>
<li><a href="<c:url value='/admin/member/createAccountForm' />">회원가입</a></li>
</ul>
</div>
<%
}
%>
<div class="search">
<form action="<c:url value='/book/admin/searchBookConfirm' />" name="search_book_form" method="get">
<input type="text" name="b_name" placeholder="Enter the name of the book you are looking for.">
<input type="button" value="search" onclick="searchBookForm();">
</form>
</div>
</div>
</nav>
Code language: HTML, XML (xml)
AdminMemberVo loginedAdminMemberVo = (AdminMemberVo) session.getAttribute("loginedAdminMemberVo");
: 세션에서 로그인된 관리자 정보를 가져온다.if (loginedAdminMemberVo != null) { … } else { … }: 로그인 상태에 따라서 다른 화면을 보여줌.
<li><a href="<c:url value='/admin/member/loginForm' />">로그인</a></li>
<li><a href="<c:url value='/admin/member/createAccountForm' />">회원가입</a></li>
Code language: HTML, XML (xml)
관리자 계정 생성과 관련된 href주소 /admin/member/...를 처리하기 위해서 AdminMemberController 생성한다.
//BookRentalPjt/src/main/java/com/office/library/admin/member/AdminMemberController.java
@Controller
@RequestMapping("/admin/member")
public class AdminMemberCotroller {
@RequestMapping(value="/createAccountForm", method=RequestMethod.GET)
public String createAccountForm() {
System.out.println("[AdminMemberController] createAccoutForm()");
String nextPage = "admin/member/create_account_form";
return nextPage;
}
}
Code language: JavaScript (javascript)
회원 가입 요청에 회원 가입 양식을 반환하는 createAccountForm 메서드를 생성, 맵핑한다.
<!-- WEB-INF/views/admin/member/create_account_form.jsp -->
<%@ 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">
<jsp:include page="../../include/title.jsp" />
<link href="<c:url value='/resources/css/admin/create_account_form.css' />" rel="stylesheet" type="text/css">
<jsp:include page="../include/create_account_form_js.jsp" />
</head>
<body>
<jsp:include page="../../include/header.jsp" />
<jsp:include page="../include/nav.jsp" />
<section>
<div id="section_wrap">
<div class="word">
<h3>CREATE ACCOUNT FORM</h3>
</div>
<div class="create_account_form">
<form action="<c:url value='/admin/member/createAccountConfirm' />" name="create_account_form" method="post">
<input type="text" name="a_m_id" placeholder="INPUT ADMIN ID."> <br>
<input type="password" name="a_m_pw" placeholder="INPUT ADMIN PW."> <br>
<input type="password" name="a_m_pw_again" placeholder="INPUT ADMIN PW AGAIN."> <br>
<input type="text" name="a_m_name" placeholder="INPUT ADMIN NAME."> <br>
<select name="a_m_gender">
<option value="">SELECET ADMIN GENDER.</option>
<option value="M">Man</option>
<option value="W">Woman</option>
</select> <br>
<input type="text" name="a_m_part" placeholder="INPUT ADMIN PART."> <br>
<input type="text" name="a_m_position" placeholder="INPUT ADMIN POSITION."> <br>
<input type="email" name="a_m_mail" placeholder="INPUT ADMIN MAIL." ><br>
<input type="text" name="a_m_phone" placeholder="INPUT ADMIN PHONE."> <br>
<input type="button" value="create account" onclick="createAccountForm();">
<input type="reset" value="reset">
</form>
</div>
<div class="login">
<a href="<c:url value='/admin/member/loginForm' />">login</a>
</div>
</div>
</section>
<jsp:include page="../../include/footer.jsp" />
</body>
</html>
Code language: HTML, XML (xml)
회원가입에 사용할 View다.
<form action="<c:url value='/admin/member/createAccountConfirm' />" name="create_account_form" method="post">
:/admin/member/createAccountConfirmurl로create_account_form라는 이름으로 HTTP POST method로 전송한다.<input type="button" value="create account" onclick="createAccountForm();">
: “create account” 버튼을 누르면createAccountForm()을 동작한다.
: 이는../include/create_account_form_js.jsp에 정의되어 있는 함수다.
: 비어있는 정보가 있는지 확인한다.

관리자 계정을 생성하기 위해서 필요한 정보를 입력하고 “create account” 버튼을 누른다.
@Controller
@RequestMapping("/admin/member")
public class AdminMemberCotroller {
@Autowired
AdminMemberService adminMemberService;
...
@RequestMapping(value="/createAccountConfirm", method = RequestMethod.POST)
public String createAccountConfirm(AdminMemberVo adminMemberVo) {
System.out.println("[AdminMemberController] createAccoutConfirm()");
String nextPage = "admin/member/create_account_ok";
int result = adminMemberService.createAccountConfirm(adminMemberVo);
if(result <= 0)
nextPage = "admin/member/create_account_ng";
return nextPage;
}
}
Code language: JavaScript (javascript)
AdminMemberController에 /admin/member/createAccountConfirm을 처리하기 위한 메서드를 추가한다.
public String createAccountConfirm(AdminMemberVo adminMemberVo) {
: 회원의 정보를 입력받기 위해서 VO 객체를 이용한다. (AdminMemberVo의 대한 구체적인 내용은 생략)int result = adminMemberService.createAccountConfirm(adminMemberVo);
: 서비스에서 구체적인 처리를 맡기고 결과를 받아온다.- 회원가입에 성공하면
WEB-INF/views/admin/member/create_account_ok.jsp를WEB-INF/views/admin/member/create_account_ng.jsp를 view로 사용한다.
참고 – HTTP Method 선택
@RequestMapping(value = "/createAccountForm", method= RequestMethod.GET)
@GetMapping("/createAccountForm")
@RequestMapping(value = "/createAccountConfirm", method= RequestMethod.POST)
@PostMapping("/createAccountConfirm")
Code language: CSS (css)
@GetMapping, @PostMapping와 같이 사용할 수도 있다.
다. 관리자 회원가입 서비스 구현
AdminMemberService에 회원가입 요청을 처리하는 createAccountConfirm()를 구현한다.
@Service
public class AdminMemberService {
final static public int ADMIN_ACCOUNT_ALREADY_EXIST = 0;
final static public int ADMIN_ACCOUNT_CREATE_SUCCESS = 1;
final static public int ADMIN_ACCOUNT_CREATE_FAIL = -1;
@Autowired
AdminMemberDao adminMemberDao;
public int createAccountConfirm(AdminMemberVo adminMemberVo) {
System.out.println("[AdminMemberService] createAccountConfirm()");
boolean isMember = adminMemberDao.isAdminMember(adminMemberVo.getA_m_id());
if(!isMember) {
int result = adminMemberDao.insertAdminAccount(adminMemberVo);
if(result > 0)
return ADMIN_ACCOUNT_CREATE_SUCCESS;
else
return ADMIN_ACCOUNT_CREATE_FAIL;
}else {
return ADMIN_ACCOUNT_ALREADY_EXIST;
}
}
}
Code language: PHP (php)
관리자 계정을 생성하기에 앞서서 문제가 없는지 확인한다.
ADMIN_ACCOUNT_ALREADY_EXIST,ADMIN_ACCOUNT_CREATE_SUCCESS,ADMIN_ACCOUNT_CREATE_FAIL
: 관리자 계정 생성과 관련된 상태 코드 추가한다.boolean isMember = adminMemberDao.isAdminMember(adminMemberVo.getA_m_id());
: 동일한 id의 관리자 계정이 존재하는지 확인한다.int result = adminMemberDao.insertAdminAccount(adminMemberVo);
: DAO 객체에게 새로운 관리자 계정을 생성할 것을 요청한다.
AdminMemberVo는 다음에 실제 DB랑 연결하면서 구현하겠다.