4) 로그인, 로그아웃 기능 구현 - Spring Project (OTT 서비스)프로젝트/OTT2023. 2. 5. 15:12
Table of Contents
728x90
728x90
해당 프로젝트는 2023/01/25 ~ 2023/03/12 내에 진행되는
아카데미 내 수강생들끼리 팀을 나누어 진행한 모의 프로젝트입니다.
팀원은 5명이었으며, 프로젝트 리더를 맡았습니다.
이전 글 목록
1) 주어진 RFP를 바탕으로 주제 선정 - Spring MVC2 프로젝트
사용자가 로그인을 할 때, 세션에 유저의 정보를 담을 수 있게 설계했다.
UserController.java
로그인 시 ID(email)와 비밀번호가 같은지 조회하여 리턴받은 결과값이 null과 null이 아닐 때로 구분하여 로그인 처리를 구현했다.
우선 권한 부여를 고려하지 않았기 때문에, user_email과 nickname만 세션에 담고, 세션 유지기간은 30분으로 설정하였다.
여기서의 str값은 닉네임을 세션에 담기위해 DB 조회 시 nickname을 조회한 결과값이다.
로그아웃 시 기존 세션에 담고있던 정보를 초기화 해 주었다.
(...생략...)
@Controller
@RequestMapping("/user/**")
public class UserController {
@Autowired
UserService userService;
UserDao userDao;
(...생략...)
//로그인 페이지 이동
@RequestMapping("signin")
public String login() {
return "user/signin";
}
//로그인 시 사용된 email, password를 파라미터로 받고
//저장을 위한 session, view를 위한 mv, DB조회를 위한 Dto를 파라미터로 받음
@RequestMapping("signin_check")
public ModelAndView signin_check(@RequestParam String email, String password, UserDto userDto,
HttpSession session, ModelAndView mv) {
String str = userService.login(userDto);
if(str != null) {
session.setAttribute("user_email", userDto.getEmail());
session.setAttribute("nickname", str);
// 세션 유지기간 30분
session.setMaxInactiveInterval(60*30);
mv.setViewName("redirect:/");
}else {
mv.setViewName("user/signin");
}
return mv;
}
//로그아웃
@RequestMapping("signout")
public String logout(HttpSession session) {
session.invalidate();
return "redirect:/";
}
}
UserService.java / UserServiceImpl.java
로그아웃 시 단순 세션에 정보만 삭제하고, 세션을 조회하여 로그인 / 로그아웃 상태를 조회하여 사이트에 접근할 수 있는 권한을 부여할 수 있다고 생각하였다. 로그아웃 시 DB까지 접근하는 메서드는 필요 없을 것이다.
(...생략...)
public interface UserService {
(...생략...)
String login(UserDto userDto);
}
(...생략...)
@Service
public class UserServiceImpl implements UserService{
@Autowired
UserDao userDao;
@Override
public String login(UserDto userDto) {
return userDao.login(userDto);
}
}
UserDao.java
(...생략...)
@Repository
public class UserDao {
@Autowired
SqlSessionTemplate sqlSessionTemplate;
public String login(UserDto userDto) {
return sqlSessionTemplate.selectOne("user.login", userDto);
}
}
user.SQL.xml
세션에 닉네임 정보까지 담기 위해 NICKNAME을 조회하였으며, 차후 다른 사항들을 세션에 담아야 할 경우 해당 값만 추가로 들고 나와 세션에 담으면 될 것이다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="user">
<select id="login" resultType="String">
select NICKNAME
from USER
where EMAIL=#{email} and PASSWORD=#{password}
</select>
</mapper>
signin.jsp
로그인 페이지를 단순하게 만들었다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<form method="post" action="signin_check">
이메일 : <input type="email" name="email">
비밀번호 : <input type="password" name="password">
<input type="submit" value="로그인">
</form>
</body>
</html>
main.jsp
세션의 닉네임값을 조회하여 로그인 성공 시 화면에 출력되게끔 처리했다.
로그아웃 버튼의 action을 user/sign_out이 매핑된 곳에 전송하여 로그아웃을 처리하였으며, 해당 버튼들은 세션에 등록되어 있는 이메일을 조회하여 해당 값이 있을 때와 없을 때 버튼 출력 결과를 다르게 주었다.
(...생략...)
<c:if test="${sessionScope.nickname != null}">
<h1>
${sessionScope.nickname}님 환영합니다
</h1>
</c:if>
(...생략...)
<c:if test="${sessionScope.user_email == null}">
<!-- 회원가입 -->
<input type="button" value="회원가입" onclick="location.href='user/signup'">
<!-- 로그인 로그아웃 -->
<input type="button" value="로그인" onclick="location.href='user/signin'">
</c:if>
<c:if test="${sessionScope.user_email != null}">
<form action="/user/sign_out">
<input type="submit" value="로그아웃">
</form>
</c:if>
728x90
300x250
@mag1c :: 꾸준히 재밌게
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!