Spring & Springboot/올인원 스프링 프레임워크

전자 도서관 프로젝트 - 일반 관리자 승인 처리 기능 구현

YJ_ma 2023. 10. 12. 15:29

최고 관리자가 일반 관리자 목록을 조회하고 특정 일반 관리자의 로그인 권한을 승인해서 일반 관리자의 로그인이 가능하도록 기능을 구현해본다.

 

일반 관리자 추가하기

먼저, 일반 관리자 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은 일반 관리자이기 때문에 최고 관리자와 달리 다른 관리자를 승인할 수 있는 권한은 없어야 한다. 또한 다른 관리자의 개인정보를 볼 수도 없어야 한다. 즉 로그인 상태 메뉴에 '관리자목록'이 없어야한다.