최고 관리자가 일반 관리자 목록을 조회하고 특정 일반 관리자의 로그인 권한을 승인해서 일반 관리자의 로그인이 가능하도록 기능을 구현해본다.
일반 관리자 추가하기
먼저, 일반 관리자 admin2를 생성한다.
· 데이터베이스에서 tbl_admin_member 테이블을 조회하면 일반 관리자인 admin1, admin2는 아직 최고 관리자의 승인 전이여서 a_m_approval이 0인 것을 확인할 수 있다.
· 최고 관리자가 일반 관리자의 a_m_approval 값을 1로 변경(승인)해서 일반 관리자도 로그인이 가능할 수 있도록 해준다.
![]() |
![]() |
일반 관리자 목록 조회하기
최고 관리자로 로그인하고 일반 관리자 목록을 조회하기 위해 '관리자 목록' 메뉴를 클릭한다.
· 관리자 목록 메뉴 : 회원가입한 관리자 목록을 조회하는 메뉴로, nav.jsp에 다음과 같이 링크되어 있다.
· 경로 : WEB-INF/views/admin/include/nav.jsp
<c:if test="${loginedAdminMemberVo.a_m_id eq 'super admin'}">
<li><a href="<c:url value='/admin/member/listupAdmin' />">관리자목록</a></li>
</c:if>
<c:if> 구문을 이용해서 현재 로그인되어 있는 관리자가 최고 관리자라면 '관리자 메뉴' 목록을 노출하고, 서버 요청 주소를 /admin/member/listupAdmin으로 정의했다.
1. AdminMemberController에 클라이언트의 요청(/listupAdmin)을 처리하는 listupAdmin()을 선언한다.
// 관리자 목록
@RequestMapping(value="/listupAdmin", method=RequestMethod.GET)
public String listupAdmin(Model model) {
System.out.println("[AdminMemberController] modifyAccountConfirm()");
String nextPage = "admin/member/listup_admins";
List<AdminMemberVo> adminMemberVos = adminMemberService.listupAdmin();
model.addAttribute("adminMemberVos", adminMemberVos);
return nextPage;
}
2. AdminMemberService에 listupAdmin()을 선언한다.
· listupAdmin() : DAO(adminMemberDao)을 이용해서 데이터베이스에 관리자 목록을 요청
public List<AdminMemberVo> listupAdmin() {
System.out.println("[AdminMemberService] listupAdmin()");
return adminMemberDao.selectAdmins();
}
3. AdminMemberDAO에 selectAdmins()을 선언한다.
· selectAdmins()
- tbl_admin_member 테이블에서 모든 관리자를 조회(select)하고 RowMapper를 이용해 List<AdminMemberVo> adminMemberVos 리스트에 저장
- 데이터베이스에서 모든 관리자를 조회 → AdminMemberService에 반환 → AdminMemberController에 반환
public List<AdminMemberVo> selectAdmins(){
System.out.println("[AdminMemberDao] selectAdmins()");
String sql = "SELECT * FROM tbl_admin_member";
List<AdminMemberVo> adminMemberVos = new ArrayList<AdminMemberVo>();
try {
adminMemberVos = jdbcTemplate.query(sql, new RowMapper<AdminMemberVo>() {
@Override
public AdminMemberVo mapRow(ResultSet rs, int rowNum) throws SQLException{
AdminMemberVo adminMemberVo = new AdminMemberVo();
adminMemberVo.setA_m_no(rs.getInt("a_m_no"));
adminMemberVo.setA_m_approval(rs.getInt("a_m_approval"));
adminMemberVo.setA_m_id(rs.getString("a_m_id"));
adminMemberVo.setA_m_pw(rs.getString("a_m_pw"));
adminMemberVo.setA_m_name(rs.getString("a_m_name"));
adminMemberVo.setA_m_gender(rs.getString("a_m_gender"));
adminMemberVo.setA_m_part(rs.getString("a_m_part"));
adminMemberVo.setA_m_position(rs.getString("a_m_position"));
adminMemberVo.setA_m_mail(rs.getString("a_m_mail"));
adminMemberVo.setA_m_phone(rs.getString("a_m_phone"));
adminMemberVo.setA_m_reg_date(rs.getString("a_m_reg_date"));
adminMemberVo.setA_m_mod_date(rs.getString("a_m_mod_date"));
return adminMemberVo;
}
});
} catch (Exception e) {
e.printStackTrace();
}
return adminMemberVos;
}
AdminMemberController는 모든 관리자 정보(adminMemberVos)를 List 타입으로 반환받았다.
이제 뷰에 adminMemberVos를 전달하기 위해 스프링 org.springframework.ui 패키지의 Model 인터페이스를 사용한다.
· Model : 서버의 데이터를 뷰에 전달하는 역할
따라서 AdminMemberController는 Model에 모든 관리자 정보를 저장해서 클라이언트로 전달하면 된다.
Model을 사용하기 위해서는 우선 매개변수로 Model을 받고, addAttribute()로 데이터를 추가하면 된다.
· addAttribute(데이터의 이름, 실제 데이터)
💡ModelAndView 클래스
· 뷰와 데이터를 하나의 객체에 담아서 전달할 때 사용하는 클래스
· 뷰와 데이터를 동시에 설정하여 전달이 가능
// 관리자 목록
@RequestMapping(value="/listupAdmin", method=RequestMethod.GET)
public String listupAdmin() {
System.out.println("[AdminMemberController] modifyAccountConfirm()");
String nextPage = "admin/member/listup_admins";
List<AdminMemberVo> adminMemberVos = adminMemberService.listupAdmin();
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName(nextPage);
modelAndView.addObject("adminMemberVos", adminMemberVos);
return modelAndView;
}
이제 관리자 목록을 출력하는 listup_admin.jsp 코드는 다음과 같다.
· <c:forEach>를 이용해 모든 관리자 정보를 출력한다. 이때 서버에서 전달된 데이터는 ${adminMemberVos}를 이용해 받는다.
· <c:choose>를 이용해서 승인 완료된 관리자와 그렇지 않은 관리자를 구분한다.
· a_m_approval 값이 0이면 승인 전으로 <승인처리> 버튼을 출력한다.
· a_m_approval 값이 1이면 승인 완료로 '승인완료' 문구를 출력한다.
<section>
...
<c:forEach var="item" items="${adminMemberVos}">
<tr>
<td>${item.a_m_id}</td>
<td>${item.a_m_name}</td>
<td>${item.a_m_gender}</td>
<td>${item.a_m_part}</td>
<td>${item.a_m_position}</td>
<td>${item.a_m_mail}</td>
<td>${item.a_m_phone}</td>
<td>
<c:choose>
<c:when test="${item.a_m_approval eq 0}">
<c:url value='/admin/member/setAdminApproval' var='approval_url'>
<c:param name='a_m_no' value='${item.a_m_no}'/>
</c:url>
<a href="${approval_url}">승인처리</a>
</c:when>
<c:when test="${item.a_m_approval eq 1}"> <c:out value="승인완료" /> </c:when>
</c:choose>
</td>
</tr>
</c:forEach>
...
</section>
일반 관리자 승인하기
관리자목록 화면(listup_admins.jsp)에서 <승인처리> 버튼은 <c:url>을 이용해 다음과 같이 코딩되어 있다.
<c:choose>
<c:when test="${item.a_m_approval eq 0}">
<c:url value='/admin/member/setAdminApproval' var='approval_url'>
<c:param name='a_m_no' value='${item.a_m_no}'/>
</c:url>
<a href="${approval_url}">승인처리</a>
</c:when>
<c:when test="${item.a_m_approval eq 1}"> <c:out value="승인완료" /> </c:when>
</c:choose>
버튼을 클릭하면 /admin/member/setAdminApproval로 요청하고, 관리자 번호(a_m_no)를 같이 전달해서 승인 대상 관리자를 서버에 알려준다.
· admin에 대한 서버 요청 URI : /admin/member/setAdminApproval?a_m_no=2
컨트롤러 → 서비스 → DAO 순서로 클라이언트 요청을 처리하기 위한 메서드를 선언해준다.
1. AdminMemberController에 setAdminApproval()을 선언한다.
// 관리자 승인
@RequestMapping(value="/setAdminApproval", method=RequestMethod.GET)
public String setAdminApproval(@RequestParam("a_m_no") int a_m_no) {
System.out.println("[AdminMemberController] setAdminApproval()");
String nextPage = "redirect:/admin/member/listupAdmin";
adminMemberService.setAdminApproval(a_m_no);
return nextPage;
}
2. 승인 작업이 끝나면 관리자목록 갱신을 위해 /admin/member/listupAdmin으로 리다이렉트한다.
public void setAdminApproval(int a_m_no) {
System.out.println("[AdminMemberService] setAdminApproval()");
int result = adminMemberDao.updateAdminAccount(a_m_no);
}
3. DAO(AdminMemberDao)에 관리자 번호(a_m_no)를 전달해서 데이터베이스의 a_m_approval 값을 0에서 1로 업데이트 하도록 해준다.
public int updateAdminAccount(int a_m_no) {
System.out.println("[AdminMemberDao] updateAdminAccount()");
String sql = "UPDATE tbl_admin_member SET "
+ "a_m_approval = 1 "
+ "WHERE a_m_no = ?";
int result = -1;
try {
result = jdbcTemplate.update(sql, a_m_no);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
![]() |
![]() |
승인완료 실행 확인하기
이제 admin1이 '승인완료'된 상태이기 때문에 로그인이 가능하다.
최고 관리자(super admin)을 로그아웃하고 admin1 계정을 로그인해본다.
![]() |
![]() |
admin1은 일반 관리자이기 때문에 최고 관리자와 달리 다른 관리자를 승인할 수 있는 권한은 없어야 한다. 또한 다른 관리자의 개인정보를 볼 수도 없어야 한다. 즉 로그인 상태 메뉴에 '관리자목록'이 없어야한다.
'Spring & Springboot > 올인원 스프링 프레임워크' 카테고리의 다른 글
전자 도서관 프로젝트 - 관리자 새 비밀번호 생성 기능 구현 (0) | 2023.11.29 |
---|---|
전자 도서관 프로젝트 - 관리자 계정 정보 수정 기능 구현 (0) | 2023.11.28 |
전자 도서관 프로젝트 - 로그인 상태 유지 및 로그아웃 기능 구현 (0) | 2023.10.11 |
전자 도서관 프로젝트 - 관리자 로그인 처리 기능 구현 (0) | 2023.10.10 |
전자 도서관 프로젝트 - 데이터베이스 연동 (0) | 2023.10.07 |