프로젝트 구조
오늘은 프로젝트할 때 꼭 필요한 관리자 페이지 목록을 구현해보려 합니다.
기능 위주라서 폼은 간단하게 구현합니다.
Admin Table 생성
관리자 테이블을 생성해서 각 칼럼의 데이터를 추가합니다.
create table admin (
userid varchar2(50) not null,
passwd varchar2(50) not null,
name varchar2(50) not null,
email varchar2(100),
join_date date default sysdate,
primary key(userid)
);
insert into admin (userid, passwd, name ) values ('admin','1234','관리자');
commit;
마지막에 꼭 커밋해주기!
다음으로 흐름대로 DTO를 생성했는데, 기존에 생성했던 MEMBER 테이블과 칼럼 명이 같아서 MemberDTO를 사용해서 구현합니다.
menu.jsp
여기서 두 가지 방법으로 나뉘는데 로그인했을 때,
관리자 데이터가 들어오면 해당 페이지로 이동하는 방법이랑 관리자 로그인 페이지를 생성해서 나누는 방식이 있는데
, 이번 포스팅에서는 관리자 로그인 버튼을 별도로 생성합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="path" value="${pageContext.request.contextPath}" />
<div style="text-align: center;">
<a href="${path}">Home</a> |
<c:if test="${sessionScope.admin_userid == null}">
<a href="${path}/memo/list.do">메모장</a> |
<a href="${path}/upload/uploadForm">업로드 테스트</a> |
<a href="${path}/shop/product/list.do">상품목록</a> |
</c:if>
<c:if test="${sessionScope.userid != null && sessionScope.admin_userid == null}">
<a href="${path}/shop/cart/list.do">장바구니</a> |
</c:if>
<div style="text-align: right;">
<c:choose>
<c:when test="${sessionScope.userid == null}">
<!-- 로그인하지 않은 상태 -->
<a href="${path}/member/login.do">로그인</a> |
<a href="${path}/admin/login.do">관리자 로그인</a> | <!-- 기능 추가 -->
</c:when>
<c:otherwise>
<!-- 로그인한 상태 -->
${sessionScope.name}님이 로그인중입니다.
<a href="${path}/member/logout.do">로그아웃</a>
</c:otherwise>
</c:choose>
</div>
</div>
<hr>
Controller
Controller에서는 해당 요청을 받아서 Service로 보내주는 중간 다리 역할을 합니다.
메뉴에서 요청한 logion.do 확장자는 별도로 Service로 보내주지 않고 관리자 로그인 폼을 호출하는 코드로만 작성합니다.
package com.example.spring.controller.admin;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.example.spring.model.member.dto.MemberDTO;
import com.example.spring.service.admin.AdminService;
import com.example.spring.service.shop.ProductService;
@Controller
@RequestMapping("admin/*") //공통 url mapping
public class AdminController {
@Inject
AdminService adminService;
@Inject
ProductService productService;
@RequestMapping("login.do")//세부 url
public String login() {
return "admin/login";
}
메뉴에서 요청한 url을 admin 폴더에 login 페이지 호출하도록 코드 구현을 했습니다.
그럼 페이지 생성을 합니다.
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file="../include/header.jsp" %>
<script>
$(function(){
$("#btnLogin").click(function(){
var userid=$("#userid").val();
var passwd=$("#passwd").val();
if(userid==""){
alert("아이디를 입력하세요.");
$("#userid").focus();
return;
}
if(passwd==""){
alert("비밀번호를 입력하세요.");
$("#passwd").focus();
return;
}
document.form1.action="${path}/admin/login_check.do";
document.form1.submit();
});
});
</script>
</head>
<body>
<%@ include file="../include/admin_menu.jsp" %>
<h2>관리자 로그인</h2>
<form name="form1" method="post">
<table border="1" style="width: 100%;">
<tr>
<td>아이디</td>
<td><input name="userid" id="userid"></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="password" name="passwd" id="passwd"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="button" id="btnLogin" value="로그인">
<c:if test="${param.message == 'nologin' }">
<div style="color:red;">
로그인 하신 후 사용하세요.
</div>
</c:if>
<c:if test="${message == 'error' }">
<div style="color:red;">
아이디 또는 비밀번호가 일치하지 않습니다.
</div>
</c:if>
<c:if test="${message == 'logout' }">
<div style="color:blue;">
로그아웃 처리되었습니다.
</div>
</c:if>
</td>
</tr>
</table>
</form>
</body>
</html>
관리자 로그인 폼에서 간단한 안전성 검사를 통해서 데이터를 Controller에 요청을 보내줍니다.
다음으로 로그인할 수 있게 Controller에 기능 추가합니다.
Controller
폼에서 요청을 보냈으니 Controller에서 Service로 보내줘야 하는데, 로그인 기능이 있다면 로그아웃도 할 수 있게 해줘야 하기 때문에 미리 코드 작업을 해서 같이 보냈습니다.
@RequestMapping("login_check.do")
public ModelAndView login_check(MemberDTO dto, HttpSession session,
ModelAndView mav) {
String name=adminService.loginCheck(dto);//로그인 체크
if(name != null) {//로그인 성공
//관리자용 세션변수
session.setAttribute("admin_userid", dto.getUserid());
session.setAttribute("admin_name", name);
//일반 사용자용 세션변수
session.setAttribute("userid", dto.getUserid());
session.setAttribute("name", name);
mav.setViewName("admin/admin");
}else {
mav.setViewName("admin/login");
mav.addObject("message", "error");
}
return mav;
}
@RequestMapping("logout.do")
public String logout(HttpSession session) {
session.invalidate();//세션 초기화
//관리자 로그인 페이지로 이동
return "redirect:/admin/login.do";
}
Service
Service 에서는 DAO와 의존 관계를 주입시키고 연결해 줍니다.
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import com.example.spring.model.admin.dao.AdminDAO;
import com.example.spring.model.member.dto.MemberDTO;
@Service
public class AdminServiceImpl implements AdminService {
@Inject
AdminDAO adminDao;
@Override
public String loginCheck(MemberDTO dto) { //DAO에 전송
return adminDao.loginCheck(dto);
}
}
DAO
DAO에서는 session 처리를 해줘야 하는데, 매개변수로 dto를 mapper 파일에 같이 보내줘야 합니다.
전체 리스트 목록을 가져오는 게 아니라 관리자 데이터만 호출했기 때문에 selectOne()으로 보내줍니다.
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import com.example.spring.model.member.dto.MemberDTO;
@Repository
public class AdminDAOImpl implements AdminDAO {
@Inject
SqlSession sqlsession;
@Override
public String loginCheck(MemberDTO dto) {
return sqlsession.selectOne("admin.login_check", dto);
}
}
mapper.xml
<!-- 다른 mapper와 중복되지 않도록 네임스페이스 기재 -->
<mapper namespace="admin">
<select id="login_check" resultType="String">
select name from admin
where userid=#{userid} and passwd=#{passwd}
</select>
</mapper>
mapper 작업이 끝났다면 Controller에서 설정한 admin 페이지를 생성해서 간단하게 로그인 성공 시 안내 문구를 표출할 수 있게 해 줍니다.
admin.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<%@ include file="../include/header.jsp" %>
</head>
<body>
<%@ include file="../include/admin_menu.jsp" %> <!-- 관리자 메뉴 -->
<h2>
${sessionScope.admin_name }(${sessionScope.admin_userid })님 환영합니다.
</h2>
</body>
</html>
로그인 성공하면 메뉴 파일을 관리자 메뉴 페이지를 생성해서 교체 해줍니다.
admin_menu.jsp
관리자 메뉴에 추가할 기능은 상품 등록, 목록 페이지를 생성하고 일반 로그인도 할 수 있게 구현합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="path" value="${pageContext.request.contextPath }"/>
<div style="text-align: center;">
<a href="${path}/admin/list.do">상품 목록</a> |
<c:if test="${sessionScope.admin_userid != null }">
<a href="${path}/admin/write.do">상품등록</a> |
</c:if>
<div style="text-align: right;">
<c:choose>
<c:when test="${sessionScope.admin_userid == null }">
<!-- 로그인하지 않은 상태 -->
<a href="${path}/member/login.do">일반 로그인</a> |
<a href="${path}/admin/login.do">관리자 로그인</a> |
</c:when>
<c:otherwise>
<!-- 로그인한 상태 -->
${sessionScope.admin_name }님이 로그인중입니다.
<a href="${path}/admin/logout.do">로그아웃</a> |
</c:otherwise>
</c:choose>
</div>
</div>
<hr>
Controller에 요청만 보내는 코드만 구현하고 추가로 코드 작업은 안 했습니다.
기능 추가는 다음 포스팅에서 이어서 하겠습니다.
마지막으로 출력 결과를 확인합니다.
출력
< 메인 화면 >
< 관리자 로그인 >
< 관리자 페이지 >
마치며
오늘은 관리자 페이지 구현을 해보았습니다.
다음 포스팅에서 뵙겠습니다.
'[ JAVA ] > JAVA Spring' 카테고리의 다른 글
[ Spring ] 상품 수정/삭제 기능 구현 (0) | 2023.04.14 |
---|---|
[ Spring ] 상품 등록/목록 페이지 구현 (0) | 2023.04.13 |
[ Spring ] 장바구니 기능 구현 (0) | 2023.04.11 |
[ Spring ] 상품 목록 기능 구현 (0) | 2023.04.10 |
[ Spring ] 파일 업로드 테스트 구현 (0) | 2023.04.07 |