[Spring] 전자 도서관 서비스 1

2023. 11. 8. 02:52학부 강의/웹프로그래밍 (Spring)

0. 출처

 

아직 배우고 있는 중이라 부정확한 정보가 포함되어 있을 수 있습니다!
주의하세요!

 

 

올인원 스프링 프레임워크 참고.

 

올인원 스프링 프레임워크 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

 


 

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;
    }
}
  • @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" />
    ...
  • <jsp:include page="./include/nav.jsp" /> : admin/home.jspadmin/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>
  • 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>

관리자 계정 생성과 관련된 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;
    }

}

회원 가입 요청에 회원 가입 양식을 반환하는 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>

회원가입에 사용할 View다.

  • <form action="<c:url value='/admin/member/createAccountConfirm' />" name="create_account_form" method="post">
    : /admin/member/createAccountConfirm url로 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;
    }
}

AdminMemberController/admin/member/createAccountConfirm을 처리하기 위한 메서드를 추가한다.

  • public String createAccountConfirm(AdminMemberVo adminMemberVo) {
    : 회원의 정보를 입력받기 위해서 VO 객체를 이용한다. (AdminMemberVo의 대한 구체적인 내용은 생략)
  • int result = adminMemberService.createAccountConfirm(adminMemberVo);
    : 서비스에서 구체적인 처리를 맡기고 결과를 받아온다.
  • 회원가입에 성공하면 WEB-INF/views/admin/member/create_account_ok.jspWEB-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")

@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;
        }
    }
}

관리자 계정을 생성하기에 앞서서 문제가 없는지 확인한다.

 

  • 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랑 연결하면서 구현하겠다.