로그인 화면으로 이동
'로그인' 메뉴도 '회원가입' 메뉴와 마찬가지로 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;
}
'Spring & Springboot > 올인원 스프링 프레임워크' 카테고리의 다른 글
전자 도서관 프로젝트 - 도서 대출 관련 기능 구현을 위한 준비 (0) | 2023.12.03 |
---|---|
전자 도서관 프로젝트 - 비밀번호 분실 처리 구현 (0) | 2023.12.02 |
전자 도서관 프로젝트 - 회원가입 구현 (0) | 2023.12.02 |
전자 도서관 프로젝트 - 사용자 홈 구현 (0) | 2023.12.02 |
전자 도서관 프로젝트 - 사용자 관련 기능 구현 준비 (0) | 2023.12.02 |