본문 바로가기
[ JAVA ]/JAVA Spring

[ Spring ] 관리자 페이지 목록 구현

by 환이s 2023. 4. 12.


프로젝트 구조

 

 

오늘은 프로젝트할 때 꼭 필요한 관리자 페이지 목록을 구현해보려 합니다.

기능 위주라서 폼은 간단하게 구현합니다.


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

 

메뉴에서 요청한 urladmin 폴더에 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 처리를 해줘야 하는데, 매개변수로 dtomapper 파일에 같이 보내줘야 합니다.

전체 리스트 목록을 가져오는 게 아니라 관리자 데이터만 호출했기 때문에 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에 요청만 보내는 코드만 구현하고 추가로 코드 작업은 안 했습니다.

기능 추가는 다음 포스팅에서 이어서 하겠습니다.

 

마지막으로 출력 결과를 확인합니다.


출력

 

< 메인 화면 >

 

 

 

 

< 관리자 로그인 >

 

 

< 관리자 페이지 >

 


마치며

 

오늘은 관리자 페이지 구현을 해보았습니다.

다음 포스팅에서 뵙겠습니다.

728x90