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

전자 도서관 프로젝트 - 관리자 계정 정보 수정 기능 구현

YJ_ma 2023. 11. 28. 22:42

관리자가 자신의 계정 정보를 수정하고, 비밀번호를 분실했을 경우 새로운 비밀번호를 메일로 발송하는 기능에 대해 알아본다. 또한 관리자의 신규 도서 등록과 검색 그리고 수정과 삭제 기능도 구현해본다.

 

계정 수정 화면 구현하기

관리자 계정 정보를 수정한다. 관리자가 로그인한 후 '계정수정' 메뉴를 선택하면 관리자 정보를 수정할 수 있다.

관리자는 로그인 후에 '계정수정' 메뉴로 정보를 수정할 수 있음

 

'계정수정' 메뉴는 nav.jsp에 있다.

경로: WEB-INF/views/admin/include/nav.jsp

<li><a href="<c:url value='/admin/member/modifyAccountForm' />">계정수정</a></li>

 

계정수정 메뉴에 대한 링크는 /admin/member/modifyAccountForm으로, AdminMemberController.java 에서 클라이언트 요청을 처리할 수 있는 메서드를 선언해야 한다.

■ AdminMemberController.java에 회원 정보 수정 modifyAccountForm() 코드는 다음과 같다.

// 회원 정보 수정
@GetMapping("/modifyAccountForm")
public String modifyAccountForm(HttpSession session) {
    System.out.println("[AdminMemberController] modifyAccountForm()");

    String nextPage = "admin/member/modify_account_form";

    AdminMemberVo loginedAdminMemberVo = (AdminMemberVo) session.getAttribute("loginedAdminMemberVo");
    if (loginedAdminMemberVo == null)
        nextPage = "redirect:/admin/member/loginForm";

    return nextPage;
}

 

· modifyAccountForm()은 /modifyAccountForm 요청에 매핑되어 있다.

· 매개변수 HttpSession : 관리자 정보를 수정하기 위해 현재 관리자가 로그인되어 있는지 확인하는 용도

· 관리자 정보를 수정하기 위해 modify_account_form.jsp로 이동한다.

· modifyAccountForm()에서 리다이렉트되는 경우

① 세션에 저장되어 있는 관리자 정보가 null이면 로그인 전으로 판단하여 로그인 화면으로 리다이렉트한다.

② 세션에 설정한 유효 시간(30분)을 초과해서 자리를 비우면 클라이언트는 로그아웃 상태가 되어 로그인 화면으로 전환

 

관리자 정보 수정하기

 modify_account_form.jsp : 계정 정보를 수정할 수 있는 화면으로 관리자 가입 화면과 거의 동일

경로 : WEB-INF\views\admin\member\modify_account_form.jsp

..생략..
<form action="<c:url value='/admin/member/modifyAccountConfirm' />" name="modify_account_form" method="post">

    <input type="hidden" name="a_m_no" value="${loginedAdminMemberVo.a_m_no}">

    <input type="text" name="a_m_id" value="${loginedAdminMemberVo.a_m_id}" readonly disabled> <br>
    <input type="password" name="a_m_pw" value="******" readonly disabled> <br>
    <input type="text" name="a_m_name" value="${loginedAdminMemberVo.a_m_name}" placeholder="INPUT USER NAME."> <br>
    <select name="a_m_gender">
        <option value="">SELECET USER GENDER.</option>
        <c:set var="gender" value="${loginedAdminMemberVo.a_m_gender}" />
        <option value="M" <c:if test = "${gender eq 'M'}"> selected </c:if>>Man</option>
        <option value="W" <c:if test = "${gender eq 'W'}"> selected </c:if>>Woman</option>
    </select> <br>
    <input type="text" name="a_m_part" value="${loginedAdminMemberVo.a_m_part}" placeholder="INPUT USER PART." ><br>
    <input type="text" name="a_m_position" value="${loginedAdminMemberVo.a_m_position}" placeholder="INPUT USER POSITION." ><br>
    <input type="email"	name="a_m_mail"	value="${loginedAdminMemberVo.a_m_mail}" placeholder="INPUT USER MAIL." ><br>
    <input type="text"	name="a_m_phone" value="${loginedAdminMemberVo.a_m_phone}" placeholder="INPUT USER PHONE."> <br>
    <input type="button" value="modify account" onclick="modifyAccountForm();"> 
    <input type="reset"	value="reset">

</form>
..생략..

 

modify_account_form.jsp 코드 설명

· 수정된 관리자 정보를 /admin/member/modifyAccountConfirm 주소로 전송한다.

·  관리자를 구분할 수 있는 관리자 번호(a_m_no)를 설정한다.

이때 관리자 번호는 화면에 출력할 필요가 없으므로 type을 hidden으로 한다. 

· 관리자 아이디가 입력되는 <input>은 아이디의 경우 변경이 불가하기 때문에 readonly와 disabled를 명시해 읽기 전용으로 설정한다.

· 관리자 비밀번호가 입력되는 <input>은 아이디와 마찬가지로 읽기 전용으로 설정해서 변경할 수 없다. 그리고 value 속성의 값을 "*****"로 설정해서 비밀번호가 화면에 노출되는 것을 방지한다.

· 관리자 이름이 입력되는 <input>은 세션의 loginedAdminMemberVo의 a_m_name을 이용해서 value를 설정한다.

나머지 근무부서(a_m_part), 직무(a_m_position), 메일(a_m_mail), 연락처(a_m_phone)에 대해서도 세션에 저장된 loginedAdminMemberVo의 값을 이용해서 value를 설정한다.

· 관리자 성별을 선택하는 <select>는 <c:if> 구분을 이용해서 세션에 저장된 a_m_gender와 일치하는 M 또는 W를 선택한다.

 

이제 '계정수정' 메뉴가 정상적으로 화면을 출력하는지 확인해본다.

최고 관리자의 정보 수정 화면

 

<modify account> 버튼을 클릭하면 정보가 서버로 전송된다. 따라서 요청 URL(/admin/member/modifyAccountConfirm)를 처리할 수 있는 메서드인 modifyAccountConfirm()을 AdminMemberController.java에 선언하고 매핑해준다.

// 회원 정보 수정 확인
@PostMapping("/modifyAccountConfirm")
public String modifyAccountForm(AdminMemberVo adminMemberVo, HttpSession session) {
    System.out.println("[AdminMemberController] modifyAccountConfirm()");

    String nextPage = "admin/member/modify_account_ok";

    int result = adminMemberService.modifyAccountConfirm(adminMemberVo);

    if (result > 0) {
        AdminMemberVo loginedAdminMemberVo = adminMemberService.getLoginedAdminMemberVo(adminMemberVo.getA_m_no());

        session.setAttribute("loginedAdminMemberVo", loginedAdminMemberVo);
        session.setMaxInactiveInterval(60 * 30);
    } else {
        nextPage = "admin/member/modify_account_ng";
    }

    return nextPage;
}

 

컨트롤러 작업이 끝났으면 다음으로 서비스를 작업한다. 서비스에는 2개의 메서드를 선언한다.

① modifyAccountConfirm() : 관리자 정보를 업데이트하는 역할

② getLoginedAdminMemberVo() : 가장 최근의 관리자 정보를 가져오는 역할

public int modifyAccountConfirm(AdminMemberVo adminMemberVo) {
    System.out.println("[AdminMemberService] modifyAccountConfirm()");

    return adminMemberDao.updateAdminAccount(adminMemberVo);
}

public AdminMemberVo getLoginedAdminMemberVo(int a_m_no) {
    System.out.println("[AdminMemberService] getLoginedAdminMemberVo()");

    return adminMemberDao.selectAdmin(a_m_no);
}

 

서비스 작업이 끝났으면 다음으로 DAO를 작업한다.

 updateAdminAccount() : AdminMemberDao에 관리자 정보를 업데이트

② selectAdmin() : 관리자 정보 조회

public int updateAdminAccount(AdminMemberVo adminMemberVo) {
    System.out.println("[AdminMemberDao] updateAdminAccount()");

    String sql = "UPDATE tbl_admin_member SET " + "a_m_name = ?, "
            + "a_m_gender = ?, " + "a_m_part = ?, "
            + "a_m_position = ?, " + "a_m_mail = ?, "
            + "a_m_phone = ?, " + "a_m_mod_date = NOW() "
            + "WHERE a_m_no = ?";

    int result = -1;
    try {
        result = jdbcTemplate.update(sql, adminMemberVo.getA_m_name(),
                adminMemberVo.getA_m_gender(), adminMemberVo.getA_m_part(),
                adminMemberVo.getA_m_position(), adminMemberVo.getA_m_mail(),
                adminMemberVo.getA_m_phone(), adminMemberVo.getA_m_no());
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

public AdminMemberVo selectAdmin(int a_m_no) {
    System.out.println("[AdminMemberDao] selectAdmin()");

    String sql = "SELECT * FROM tbl_admin_member " + "WHERE a_m_no = ?";

    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;
            }
        }, a_m_no);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return adminMemberVos.size() > 0 ? adminMemberVos.get(0) : null;
}

 

AdminMemberDao에는 selectAdmin이 오버로딩 되어있다.

· selectAdmin(AdminMemberVo adminMemberVo) : 로그인하려는 관리자가 입력한 정보와 일치하는 관리자를 tbl_admin_member테이블에서 조회하기 위한 메서드

· selectAdmin(int a_m_no) : 관리자 정보를 조회하는 메서드

· selectAdmin(String a_m_id, String a_m_name, String a_m_mail) : 새로운 비밀번호 생성 및 메일 발송 시 해당 관리자를 인증하기 위한 메서드

 

이제 프로젝트를 실행하여 브라우저에서 최고 관리자 정보를 수정하고 <modify account> 버튼을 클릭하여 변경된 정보 결과를 확인해본다.

변경 변경

 

관리자 정보 변경
관리자 정보 변경 

 

최고 관리자 정보가 정상적으로 업데이트됐으므로 다시 '계정수정'을 누르면 변경된 정보가 출력된다.

업데이트 완료된 최고 관리자 정보