1. 로그인 기능
순서는 다음과 같다.
1) 로그인 페이지인 login.jsp에 <input> 태그로 사용자에게서 입력받은 정보를 서버(컨트롤러 서블릿)으로 보낸다.
- method : 웹 브라우저에서 서블릿으로 정보를 전송하는 방법. GET과 POST 방식이 있다.
- action : 사용자에게서 입력받은 정보를 보낼 서블릿이다(구체적으로는 서블릿에 매핑된 이름을 작성한다).
- name : input 태그의 name 속성은 DB에서 가져온 데이터와 매칭할 수 있도록 DB의 컬럼명, 그리고 VO의 멤버변수명과 동일한 값으로 지정해야 한다.
- submit : 최종적으로 form에서 입력받은 정보를 서블릿으로 전송하는 속성이다.
<form name="login" method="post" action="login">
아이디 : <input type="text" id="user_id" name="id" required autofocus required><br>
비밀번호 : <input type="password" id="user_pw" name="pw" required><br>
<input type="submit" value="로그인">
</form>
2) 정보를 전달받은 Controller는 Service의 객체를 주입한 후, Service의 메서드를 호출한다. 메서드를 통해 사용자에게서 입력받은 로그인 정보가 DB에 존재하는 회원정보와 일치하는지 확인하고, VO 객체에 담는다. VO 객체의 값이 null이 아닌지 다시 한 번 확인하고, session 객체에 담아 main 페이지로 리다이렉트한다.
- 주의 : 리다이렉트를 하지 않으면, Controller를 통해 main 페이지로 돌려받았을 때 url이 변경되어있지 않아 나중에 서블릿, jsp의 흐름이 잘못될 수 있다. 따라서 url 변경이 필요한 이번 경우는 꼭 리다이렉트를 사용할 것!
@Controller
@RequestMapping("/member/**")
public class MemberController {
@Autowired
private MemberService memberService;
@GetMapping("login")
public void getSelectOne() throws Exception{}
@PostMapping("login")
public String getSelectOne(MemberVO memberVO, HttpSession session) throws Exception{
memberVO = memberService.getSelectOne(memberVO);
if(memberVO != null) {
session.setAttribute("member", memberVO);
}
return "redirect:../common/main";
}
3) Controller를 통해 메서드를 호출받은 Service는 Repository 객체를 주입한 후, 다시 Repository(구 DAO)의 메서드를 호출한다. 그리고 Repository를 통해 VO 객체 값을 받았다면 Service 메서드를 호출했던 Controller에게 이 VO 객체를 다시 리턴한다.
@Service
public class MemberService {
@Autowired
private MemberRepository memberRepository;
public MemberVO getSelectOne(MemberVO memberVO) throws Exception{
return memberRepository.getSelectOne(memberVO);
}
}
4) Service에게 호출받은 Repository 인터페이스는 VO 객체를 담는다. VO 객체에 DB 데이터를 담는 구체적인 작업은 mapper.xml에서 이루어진다.
@Mapper
public interface MemberRepository {
public MemberVO getSelectOne(MemberVO memberVO)throws Exception;
}
5) Repository를 통해 호출받은 mapper.xml에서는 DB 작업을 처리한다. sql 구문을 통해 받아온 로그인 정보의 아이디와 비밀번호를 이용하여 DB에서 일치하는 데이터가 있는지 찾고, 일치하는 데이터가 있다면 VO 객체에 담는다.
<mapper namespace="com.example.demo.member.MemberRepository">
<select id="getSelectOne" parameterType="MemberVO" resultType="MemberVO">
select * from destudymember where id=#{id} and pw=#{pw}
</select>
</mapper>
6) 이렇게 해서 다시 앞서 설명한 과정이 역순으로 이루어진다.
mapper.xml에서 DB 조회 후 VO 객체에 데이터를 담음 -> Repository도 인식 -> Service가 Repository의 메서드를 통해 이를 참고하여 Controller로 전송 -> Controller는 받아온 정보를 VO에 담고 Session에 다시 담아 main 페이지로 리다이렉트
7) 마지막으로 main 페이지는 받아온 정보를 토대로 로그인이 완료되었음을 확인할 수 있는 페이지를 보여준다.
//Header 예시
<ul>
<c:choose>
<c:when test="${not empty member}">
<li><a href="../member/logout">로그아웃</a></li>
</c:when>
<c:otherwise>
<li><a href="../member/login">로그인</a></li>
</c:otherwise>
</ul>
2. 로그아웃 기능
로그아웃 기능 구현방법에는 여러가지가 있다. 아래 방법은 jsp에서 링크를 통해 다시 넘겨주는 방식을 활용한 방법이다.
1) 앞의 Controller에서, logout 매핑과 함께 logout 링크 접속 시 실행할 메서드를 만든다.
@GetMapping("logout")
public void logout() throws Exception{}
@PostMapping("logout")
public String logout(MemberVO memberVO, HttpSession session) throws Exception{
return "member/logout";
}
2) logout.jsp를 만든다. 그리고 로그인 이후에 생성된 session 객체의 로그인 정보 데이터를 초기화시킨다(일종의 삭제). 이후 바로 main 페이지로 넘긴다. main 페이지에는 앞서 로그인이 되었을 때, 안되었을 때의 조건 설정을 통해 페이지를 구성해두었으므로 별도의 설정은 더 필요하지 않다.
<script type="text/javascript">
window.location.href="../common/main";
</script>
</head>
<body>
<% session.removeAttribute("member"); %>
</body>
</html>
'TIL' 카테고리의 다른 글
<스프링 Spring> 회원가입 시 이메일 주소 가져오기 (0) | 2021.11.25 |
---|---|
<스프링 부트 Spring boot> 회원가입 기능 구현 (0) | 2021.11.24 |
<CSS> 레이아웃 (3) - 포지셔닝 (0) | 2021.11.22 |
<CSS> 레이아웃 (2) - 박스 구성 요소 (0) | 2021.11.21 |
<자바 Java> 컬렉션 프레임워크(Collection Framework) (2) - Set (0) | 2021.11.20 |