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

전자 도서관 프로젝트 - 로그인 및 로그아웃 구현

YJ_ma 2023. 12. 2. 21:41

 

로그인 화면으로 이동

'로그인' 메뉴도 '회원가입' 메뉴와 마찬가지로 nav.jsp에 코딩되어 있다.

<li><a href="<c:url value='/user/member/loginForm' />">로그인</a></li>

 

'로그인' 메뉴가 /user/member/loginForm에 링크되어 있으므로 UserMemberController에 loginForm()을 만들고 매핑한다.

// 로그인
@GetMapping("/loginForm")
public String loginForm() {
    System.out.println("[UserMemberController] loginForm()");

    String nextPage = "user/member/login_form";

    return nextPage;
}

 

로그인 처리하기

로그인 화면은 login_form.jsp로 로그인 양식과 관련된 코드는 다음과 같다.

· 로그인 정보가 전송되는 서버 주소는 /user/member/loginConfirm이고, 전송 방식은 post이다.

<form action="<c:url value='/user/member/loginConfirm' />" name="login_form" method="post">

    <input type="text"		name="u_m_id" 		placeholder="INPUT USER ID."> <br>
    <input type="password"	name="u_m_pw" 		placeholder="INPUT USER PW."> <br>
    <input type="button"	value="login" onclick="loginForm();"> 
    <input type="reset"		value="reset">

</form>

 

컨트롤러 기능 구현

서버에서 로그인 요청을 처리하기 위해서 UserMemberController에 loginConfirm()을 선언하고 클라이언트 요청(/user/member/loginConfirm)을 매핑한다.

// 로그인 확인
@PostMapping("/loginConfirm")
public String loginConfirm(UserMemberVo userMemberVo, HttpSession session) {
    System.out.println("[UserMemberController] loginConfirm()");

    String nextPage = "user/member/login_ok";

    UserMemberVo loginedUserMemberVo = userMemberService.loginConfirm(userMemberVo);

    if (loginedUserMemberVo == null) {
        nextPage = "user/member/login_ng";
    } else {
        session.setAttribute("loginedUserMemberVo", loginedUserMemberVo);
        session.setMaxInactiveInterval(60 * 30);
    }
    return nextPage;
}

 

서비스 기능 구현

컨트롤러의 업무 지시를 처리하기 위해서 UserMemberService 서비스에 loginConfirm()을 선언한다.

public UserMemberVo loginConfirm(UserMemberVo userMemberVo) {
    System.out.println("[UserMemberService] loginConfirm()");

    UserMemberVo loginedUserMemberVo = userMemberDao.selectUser(userMemberVo);
    if (loginedUserMemberVo != null)
        System.out.println("[UserMemberService] USER MEMBER LOGIN SUCCESS!!");
    else
        System.out.println("[UserMemberService] USER MEMBER LOGIN FAIL!!");

    return loginedUserMemberVo;
}

 

DAO 기능 구현

서비스에서 지시한 업무를 처리하기 위해서 UserMemberDao에 selectUser()을 다음과 같이 코딩한다.

public UserMemberVo selectUser(UserMemberVo userMemberVo) {
    System.out.println("[UserMemberDao] selectUser()");

    String sql = "SELECT * FROM tbl_user_member "
            + "WHERE u_m_id = ?";

    List<UserMemberVo> userMemberVos = new ArrayList<UserMemberVo>();

    try {
        userMemberVos = jdbcTemplate.query(sql, new RowMapper<UserMemberVo>() {

            @Override
            public UserMemberVo mapRow(ResultSet rs, int rowNum) throws SQLException{

                UserMemberVo userMemberVo = new UserMemberVo();

                userMemberVo.setU_m_no(rs.getInt("u_m_no"));
                userMemberVo.setU_m_id(rs.getString("u_m_id"));
                userMemberVo.setU_m_pw(rs.getString("u_m_pw"));
                userMemberVo.setU_m_name(rs.getString("u_m_name"));
                userMemberVo.setU_m_gender(rs.getString("u_m_gender"));
                userMemberVo.setU_m_mail(rs.getString("u_m_mail"));
                userMemberVo.setU_m_phone(rs.getString("u_m_phone"));
                userMemberVo.setU_m_reg_date(rs.getString("u_m_reg_date"));
                userMemberVo.setU_m_mod_date(rs.getString("u_m_mod_date"));

                return userMemberVo;
            }
        }, userMemberVo.getU_m_id());

        if (!passwordEncoder.matches(userMemberVo.getU_m_pw(), userMemberVos.get(0).getU_m_pw()))
            userMemberVos.clear();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return userMemberVos.size() > 0 ? userMemberVos.get(0) : null;
}

 

이제 프로젝트를 실행하여 로그인 페이지에서 아이디 user1과 비밀번호(1234)를 입력하고 <login> 버튼을 클릭해서 로그인 결과를 확인한다.

 

계정수정 화면으로 이동

'계정수정' 메뉴도 다른 메뉴와 마찬가지로 nav.jsp에 있다.

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

 

'계정수정' 메뉴가 /user/member/modifyAccountForm에 링크되어 있으므로 UserMemberController 컨트롤러에 메서드를 만들고 매핑한다.

// 계정수정
@GetMapping("/modifyAccountForm")
public String modifyAccountForm(HttpSession session) {
    System.out.println("[UserMemberController] modifyAccountForm()");

    String nextPage = "user/member/modify_account_form";

    UserMemberVo loginedUserMemberVo = (UserMemberVo) session.getAttribute("loginedUserMemberVo");

    if (loginedUserMemberVo == null)
        nextPage = "redirect:/user/member/loginForm";

    return nextPage;
}

 

계정수정 처리하기

계정수정 화면은 modify_account_form.jsp로 정보 수정 양식과 관련된 코드는 다음과 같다.

· 로그인 정보가 전달되는 서버 주소는 /user/member/modifyAccountConfirm이고, 전송방식은 post이다.

<form action="<c:url value='/user/member/modifyAccountConfirm' />" name="modify_account_form" method="post">

    <input type="hidden" name="u_m_no" value="${loginedUserMemberVo.u_m_no}">

    <input type="text" name="u_m_id" value="${loginedUserMemberVo.u_m_id}" readonly disabled> <br>
    <input type="password" name="u_m_pw" value="******" readonly disabled> <br>
    <input type="text" name="u_m_name" value="${loginedUserMemberVo.u_m_name}" placeholder="INPUT USER NAME."> <br>
    <select name="u_m_gender">
        <option value="">SELECET USER GENDER.</option>
        <option value="M" <c:if test="${loginedUserMemberVo.u_m_gender eq 'M'}"> selected </c:if>>Man</option>
        <option value="W" <c:if test="${loginedUserMemberVo.u_m_gender eq 'W'}"> selected </c:if>>Woman</option>

    </select> <br>
    <input type="email"	name="u_m_mail" value="${loginedUserMemberVo.u_m_mail}" placeholder="INPUT USER MAIL." ><br>
    <input type="text" name="u_m_phone"	value="${loginedUserMemberVo.u_m_phone}" placeholder="INPUT USER PHONE."> <br>
    <input type="button" value="modify account" onclick="modifyAccountForm();"> 
    <input type="reset" value="reset">

</form>

 

컨트롤러 기능 구현

서버에서 계정수정 요청을 처리하기 위해서 UserMemberController에 modifyAccountConfirm()을 선언한고 클라이언트 요청(/user/member/modifyAccountConfirm)을 매핑한다.

// 회원 정보 수정 확인
@PostMapping("/modifyAccountConfirm")
public String modifyAccountConfirm(UserMemberVo userMemberVo, HttpSession session) {
    System.out.println("[UserMemberController] modifyAccountConfirm()");

    String nextPage = "user/member/modify_account_ok";

    int result = userMemberService.modifyAccountConfirm(userMemberVo);

    if (result > 0) {
        UserMemberVo loginedUserMemberVo = userMemberService.getLoginedUserMemberVo(userMemberVo.getU_m_no());

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

 

서비스 기능 구현

컨트롤러에서 지시한 업무를 처리하기 위해서 UserMemberService 서비스에 modifyAccountConfirm()과 getLoginedUserMemberVo()를 다음과 같이 선언한다.

public int modifyAccountConfirm(UserMemberVo userMemberVo) {
    System.out.println("[UserMemberService] modifyAccountConfirm()");

    return userMemberDao.updateUserAccount(userMemberVo);
}

public UserMemberVo getLoginedUserMemberVo(int u_m_no) {
    System.out.println("[UserMemberService] getLoginedUserMemberVo()");

    return userMemberDao.selectUser(u_m_no);
}

 

DAO 기능 구현

서비스에서 지시한 업무를 처리하기 위해 DAO(UserMemberDao)에 updateUserAccount()와 selectUser()를 다음과 같이 코딩한다.

public int updateUserAccount(UserMemberVo userMemberVo) {
    System.out.println("[UserMemberDao] updateUserAccount()");

    String sql = "UPDATE tbl_user_member SET "
            + "u_m_name = ?, " + "u_m_gender = ?, " + "u_m_mail = ?, "
            + "u_m_phone = ?, " + "u_m_mod_date = NOW() "
            + "WHERE u_m_no = ?";

    int result = -1;

    try {
        result = jdbcTemplate.update(sql,
                userMemberVo.getU_m_name(), userMemberVo.getU_m_gender(),
                userMemberVo.getU_m_mail(), userMemberVo.getU_m_phone(),
                userMemberVo.getU_m_no());
    } catch (Exception e) {
        e.printStackTrace();
    }
    return result;
}

public UserMemberVo selectUser(int u_m_no) {
    System.out.println("[UserMemberDao] selectUser()");

    String sql = "SELECT * FROM tbl_user_member "
            + "WHERE u_m_no = ?";

    List<UserMemberVo> userMemberVos = new ArrayList<UserMemberVo>();

    try {
        userMemberVos = jdbcTemplate.query(sql, new RowMapper<UserMemberVo>() {
            @Override
            public UserMemberVo mapRow(ResultSet rs, int rowNum) throws SQLException {

                UserMemberVo userMemberVo = new UserMemberVo();

                userMemberVo.setU_m_no(rs.getInt("u_m_no"));
                userMemberVo.setU_m_id(rs.getString("u_m_id"));
                userMemberVo.setU_m_pw(rs.getString("u_m_pw"));
                userMemberVo.setU_m_name(rs.getString("u_m_name"));
                userMemberVo.setU_m_gender(rs.getString("u_m_gender"));
                userMemberVo.setU_m_mail(rs.getString("u_m_mail"));
                userMemberVo.setU_m_phone(rs.getString("u_m_phone"));
                userMemberVo.setU_m_reg_date(rs.getString("u_m_reg_date"));
                userMemberVo.setU_m_mod_date(rs.getString("u_m_mod_date"));

                return userMemberVo;
            }
        }, u_m_no);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return userMemberVos.size() > 0 ? userMemberVos.get(0) : null;
}

 

이제 프로젝트를 실행하여 user1로 로그인을 하고 <modify account>를 클릭한다. 그런 다음 user1의 이메일 정보를 수정하고 <modify account>버튼을 클릭한다. 화면에 MODIFY ACCOUNT SUCCESS!!가 뜬다면 정상적으로 정보가 수정된 것이다.



 

로그아웃 기능 구현

로그아웃 메뉴도 다른 메뉴와 마찬가지로 nav.jsp에 있다.

<li><a href="<c:url value='/user/member/logoutConfirm' />">로그아웃</a></li>

 

컨트롤러 기능 구현

서버에서 로그아웃 요청을 처리하기 위해서 UserMemberController에 loginConfirm()을 선언하고 클라이언트의 요청(/user/member/logoutConfirm)을 매핑한다.

· session.invalidate : 세션을 해제(무효화) 한다.

// 로그아웃 확인
@GetMapping("/logoutConfirm")
public String logoutConfirm(HttpSession session) {
    System.out.println("[UserMemberController] logoutConfirm()");

    String nextPage = "redirect:/";
    session.invalidate();
    return nextPage;
}