본문 바로가기
수업(국비지원)/Spring

[Spring] (MVC 2) 관리자 설정(AdminController, AdminLoginAspect, ShopService, UserDao, list)

by byeolsub 2023. 4. 21.

📌 AdminController.java 생성

package controller;

import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import logic.ShopService;
import logic.User;
/*
 * AdminController의 모든 메서드들은 반드시 관리자로 로그인 해야한 실행되도록
 * AOP 설정해야함. => AdminLoginAspect 클래스 생성.
 *   1. 로그아웃 : 로그인하세요. login 페이지로 이동
 *   2. 관리자 아닌 경우 : 관리자만 거래 가능합니다. mypage 페이지로 이동
 */
@Controller
@RequestMapping("admin")
public class AdminController {
	@Autowired
	private ShopService service;

   @RequestMapping("list")
   public ModelAndView list(HttpSession session) {
	   ModelAndView mav = new ModelAndView();
	   List<User> list = service.userlist();
	   mav.addObject("list",list);
	   return mav;
   }
}

 

 

📌 AdminLoginAspect.java 생성

package aop;

import javax.servlet.http.HttpSession;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import exception.LoginException;
import logic.User;

@Component //객체화
@Aspect //AOP 기능의 클래스
public class AdminLoginAspect {
	@Around("execution(* controller.Admin*.*(..)) && args(..,session)")
	public Object adminCheck(ProceedingJoinPoint joinPoint, HttpSession session) throws Throwable {
		User loginUser = (User)session.getAttribute("loginUser");
		if(loginUser == null) { //로그아웃 상태인 경우
			throw new LoginException("[adminCheck]로그인 후 거래하세요.", "../user/login");
		} else if(!loginUser.getUserid().equals("admin")) { //2. 관리자 아닌 경우
			throw new LoginException("[adminCheck]관리자만 거래 가능합니다.", "../user/mypage?id=" + loginUser.getUserid());
		}
		return joinPoint.proceed();
	}
	
}

 

📌 ShopService.java 내용 추가

package logic;

import java.io.File;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import dao.ItemDao;
import dao.UserDao;

/*
 *  @Component : 해당 클래스를 객체화
 *     - Service 기능 : Controller 와 Model사이의 중간 역할의 클래스
 */

@Service //@Component + Service 기능
public class ShopService {
	@Autowired //현재 내 컨테이너(객체)들 중에 itemDao 객체를 주입.
	private ItemDao itemDao;
	@Autowired
	private UserDao userDao;
	
	public List<Item> itemList() { 
		return itemDao.list();
	}

	public Item getItem(Integer id) {
		return itemDao.getItem(id);
	}
//db에 내용 저장. 파일 업로드.
//item : 저장 정보. 입력된 파라미터 값 + 업로드 된 파일의 내용	
	public void itemCreate(@Valid Item item, HttpServletRequest request) {
		//item.getPicture() : 업로드 된 파일의 내용
		if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
			String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
			uploadFileCreate(item.getPicture(), uploadPath); //업로드 구현 완료
			item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름
		}
		//maxid : item테이블 중 최대 id 값
		int maxid = itemDao.maxId(); 
		item.setId(maxid+1);
		itemDao.insert(item);
	}

	private void uploadFileCreate(MultipartFile file, String uploadPath) {
		//uploadPath : 파일이 업로드 되는 폴더
		String orgFile = file.getOriginalFilename(); //업로드 된 파일의 이름
		File fpath = new File(uploadPath);
		if(!fpath.exists()) fpath.mkdirs(); //업로드 폴더를 생성(없으면)
		try { 
			//파일의 내용 => uploadPath + orgFile 로 파일 저장
			file.transferTo(new File(uploadPath + orgFile)); //파일업로드
		} catch(Exception e) {
			e.printStackTrace();
		}
	}

	public void itemUpdate(Item item, HttpServletRequest request) {
		//item.getPicture() : 업로드 된 파일의 내용
		if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
			String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
			uploadFileCreate(item.getPicture(), uploadPath); //파일 업로드 : 업로드된 내용을 서버에 파일로 저장
			item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름을 db에 등록하기 위해 설정
		}
		itemDao.update(item);
	}

	public void itemDelete(Integer id) {
		 itemDao.delete(id);
	}

	public void userInsert(@Valid User user) {
		userDao.insert(user);
	}
	
	public User getUser(String userid) {
		return userDao.selectOne(userid);
	}

	public void userUpdate(@Valid User user) {
		userDao.update(user);
	}

	public void userDelete(String userid) {
		userDao.delete(userid);
		
	}

	public void userChgPass(String userid, String pass) {
		userDao.chgpass(userid,pass);
	}

	public String getSearch(User user, String url) {
		return userDao.search(user, url);
	}

	**public List<User> userlist() {
		return userDao.list();
	}**
}

 

 

📌 UserDao.java 내용 추가

package dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;
import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;

import logic.User;

@Repository
public class UserDao {
	private NamedParameterJdbcTemplate template;
	private Map<String, Object> param = new HashMap<>();
	private RowMapper<User> mapper = new BeanPropertyRowMapper<>(User.class);

	@Autowired
	public void setDataSource(DataSource dataSource) {
		template = new NamedParameterJdbcTemplate(dataSource);
	}
	
	public void insert(@Valid User user) {
		SqlParameterSource param = new BeanPropertySqlParameterSource(user);
		String sql = "insert into useraccount"
				 + " (userid, password, username, phoneno, postcode,"
				 + "address, email, birthday)"
				 + " values(:userid, :password, :username, :phoneno, :postcode,"
				 + " :address, :email, :birthday)";
		            template.update(sql, param);
	}

	public User selectOne(String userid) {
		param.clear();
		param.put("userid", userid);
		//EmptyResultDataAccessException : 해당 레코드 없을 때 예외 발생
		return template.queryForObject("select * from useraccount where userid=:userid", param, mapper);
	}

	public void update(User user) { 
		SqlParameterSource param = new BeanPropertySqlParameterSource(user);
		String sql = "update useraccount set username=:username, "
				 + " birthday=:birthday, phoneno=:phoneno, postcode=:postcode,"
				 + "address=:address, email=:email where userid=:userid";
		            template.update(sql, param);
	}

	public void delete(String userid) {
		param.clear();
		param.put("userid", userid);
		template.update("delete from useraccount where userid=:userid", param);
	}

	public void chgpass(String userid, String pass) {
		String sql = "update useraccount set password=:password where userid=:userid";
		param.clear();
		param.put("userid",userid);
		param.put("password",pass);
		template.update(sql, param);
	}

	public String search(User user, String url) {
		String col = "userid";
		if(url.equals("pw")) col = "password"; 
			String sql = "select " + col + " from useraccount "
					+ " where email=:email and phoneno=:phoneno ";
		 if(url.equals("pw")) {
			sql += "and userid=:userid";
		}
		SqlParameterSource param = new BeanPropertySqlParameterSource(user);
		return template.queryForObject(sql, param, String.class);
	}

	**public List<User> list() {
		return template.query("select * from useraccount ", param, mapper);
	}**
}

 

 📌 list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- /springmvc1/src/main/webapp/WEB-INF/view/admin/list.jsp --%>    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

<!DOCTYPE html><html><head>
<meta charset="UTF-8">
<title>회원목록</title>
<script type="text/javascript">
   function allchkbox(allchk) {
	   $(".idchks").prop("checked",allchk.checked)
   }
</script>
<style>
   .noline {text-decoration: none;}
</style>
</head><body>
  <table class="w3-table-all"><tr><td colspan="7">회원목록</td></tr>
  <tr><th>아이디<a href="list?sort=1" class="noline">▲</a>
              <a href="list?sort=2" class="noline">▼</a></th>
      <th>이름<a href="list?sort=3" class="noline">▲</a>
             <a href="list?sort=4" class="noline">▼</a></th>
      <th>전화</th>
      <th>생일</th>
      <th>이메일<a href="list?sort=5" class="noline">▲</a>
              <a href="list?sort=6" class="noline">▼</a></th><th>&nbsp;</th></tr>
<c:forEach items="${list}" var="user">
<tr><td>${user.userid}</td><td>${user.username}</td><td>${user.phoneno}</td>
   <td><fmt:formatDate value="${user.birthday}"  pattern="yyyy-MM-dd"/></td>
   <td>${user.email}</td>
   <td><a href="../user/update?id=${user.userid}">수정</a>
       <a href="../user/delete?id=${user.userid}">강제탈퇴</a>
       <a href="../user/mypage?id=${user.userid}">회원정보</a>
   </td>
</c:forEach>
  </table></body></html>

 

📌 AdminController.java 내용 수정 및 추가

package controller;

import java.util.Collections;
import java.util.List;

import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import logic.ShopService;
import logic.User;
/*
 * AdminController의 모든 메서드들은 반드시 관리자로 로그인 해야한 실행되도록
 * AOP 설정해야함. => AdminLoginAspect 클래스 생성.
 *   1. 로그아웃 : 로그인하세요. login 페이지로 이동
 *   2. 관리자 아닌 경우 : 관리자만 거래 가능합니다. mypage 페이지로 이동
 */
@Controller
@RequestMapping("admin")
public class AdminController {
	@Autowired
	private ShopService service;

   **@RequestMapping("list")
   public ModelAndView list(Integer sort, HttpSession session) {
	   ModelAndView mav = new ModelAndView();
	   List<User> list = service.userlist();
	   if(sort == null) sort = 0; //정렬하지 않겠다.
	   switch(sort) {
	   case 1 : //아이디의 오름차순 정렬
		   Collections.sort(list, (u1,u2)->u1.getUserid().compareTo(u2.getUserid()));
		   break;
	   case 2 : //아이디의 내림차순 정렬
		   Collections.sort(list, (u1,u2)->u2.getUserid().compareTo(u1.getUserid()));
		   break;
	   case 3 : //이름의 오름차순 정렬
		   Collections.sort(list, (u1,u2)->u1.getUserid().compareTo(u2.getUserid()));
		   break;
	   case 4 : //이름의 내림차순 정렬
		   Collections.sort(list, (u1,u2)->u2.getUserid().compareTo(u1.getUserid()));
		   break;
	   case 5 : //이메일의 오름차순 정렬
		   Collections.sort(list, (u1,u2)->u1.getUserid().compareTo(u2.getUserid()));
		   break;
	   case 6 : //이메일의 내림차순 정렬
		   Collections.sort(list, (u1,u2)->u2.getUserid().compareTo(u1.getUserid()));
		   break;
	   }
	   mav.addObject("list",list);
	   return mav;
   }**
}