JSP

[JSP] MVC, alert()

yn98 2024. 9. 4. 10:58

웹개발에서 알랏창은 매우 유용하다.

예를 들어, 어떤 사이트에서 로그인을 하는 도중에 아이디 혹은 비밀번호가 틀렸을 때, 아이디 혹은 비밀번호가 틀렸다는 안내창을 본 적이 있을 것이다. 이게 바로 알랏창의 대표적인 예시이다.

 

MVC 로 나눠서 로그인 페이지를 만드는 경우,

더보기

V(사용자가 아이디와 비밀번호를 입력)->

C(V에서 아이디와 비밀번호 값을 받아옴) ->

M(C에서 받아온 데이터를 DB에서 찾아봄) ->

C( DB에 일치하는 값이 있는지에 따라  로그인 성공/실패 에 따라 V 페이지 이동) -> 

V(C에서 이동하라는 페이지 보여줌)

 

이런 식일 것이다.

 

그러면 C에서 로그인 성공/ 실패 알랏창을 띄워야하는가 ?

아래는 예시의 LoginAction.java 이다.

package controller.member;

import java.io.IOException;

import controller.common.Action;
import controller.common.ActionForward;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import model.dao.MemberDAO;
import model.dto.MemberDTO;


public class LoginAction implements Action {

	// Action 인터페이스에 의한 강제 오버라이딩
	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
		// M으로 보낼 객체 생성
		MemberDAO memberDAO=new MemberDAO();
		MemberDTO memberDTO=new MemberDTO();
		// V에서 가져온 아이디와 비밀번호 값 가져옴
		memberDTO.setMid(request.getParameter("mid"));
		memberDTO.setPassword(request.getParameter("password"));
		// M에서 임의로 만든 아이디 중복검사를 위한 컨디션 값, CHECKMID 
		memberDTO.setCondition("CHECKMID");
		memberDTO = memberDAO.selectOne(memberDTO);
		
		if(memberDTO != null) { // 로그인에 성공했다면
			HttpSession session=request.getSession();
			session.setAttribute("loginInfo", memberDTO.getMid());
			
		}
		else { // 로그인에 실패했다면( 아이디/비밀번호가 DB의 값과 일치하지 않는다면)
				try {
					// 로그인 실패 알랏창 띄우기
					response.getWriter().println("<script>alert('로그인 실패...';</script>");
					System.out.println("로그");
				} catch (IOException e) {
					e.printStackTrace();
				}		
		}		
		ActionForward forward=new ActionForward();
		forward.setRedirect(true);
		forward.setPath("main.do");
		return forward;
	}

}

 

위 코드를 실행하면, (response.getWriter().println("<script>alert('로그인 실패...';</script>");) 부분의 로그인 실패 알랏창은 뜨지 않지만, 그 아래줄의 로그는 보이게 된다. 

실행이 안 된 것인가? 절대 그런 것이 아니다. 직접적으로 있는 단어는 아니지만, "페이지 주도권"이 없어서 그렇다.

스크립트의 동작 방식대로라면, main.do로 바로 이동하기 때문이다.

그렇다면, 코드를 어떻게 수정하면 로그인 실패 알랏창이 뜨게될까..?

일단, 스크립트 알랏창을 C에서 하면 안 된다는 생각이 든다.

 

위 LoginAction.java 를 조금 수정해서 실패시 V의 안내메시지 페이지로 이동하게 하게 하면 된다.

아래는 수정된 LoginAction.java이다.

package controller.member;

import controller.common.Action;
import controller.common.ActionForward;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import model.dao.MemberDAO;
import model.dto.MemberDTO;

public class LoginAction implements Action {

	// Action 인터페이스에 의한 강제 오버라이딩
	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
		// M으로 보낼 객체 생성
		MemberDAO memberDAO=new MemberDAO();
		MemberDTO memberDTO=new MemberDTO();
		// V에서 가져온 아이디와 비밀번호 값 가져오기
		memberDTO.setMid(request.getParameter("mid"));
		memberDTO.setPassword(request.getParameter("password"));
		// M에서 임의로 만든 아이디 중복검사를 위한 컨디션 값, CHECKMID
		memberDTO.setCondition("CHECKMID");
		memberDTO = memberDAO.selectOne(memberDTO);
		
		ActionForward forward=new ActionForward();
		if(memberDTO != null) { // 로그인에 성공했다면
			HttpSession session=request.getSession();
			session.setAttribute("loginInfo", memberDTO.getMid());
			
			// 메인 페이지로 이동
			forward.setPath("main.do");
			forward.setRedirect(true);
		}
		else { // 로그인에 실패했다면,
			// 로그인 실패 알랏창 띄우기
			request.setAttribute("msg", "로그인 실패...");
			// 다시 로그인 페이지로 이동
			request.setAttribute("path", "loginPage.do");
			// info.jsp ->> 안내메시지(실패, 성공, 등등..)
			forward.setPath("info.jsp");
			forward.setRedirect(false);
		}		
		return forward;
	}

}

 

아래는 위 알랏창을 띄우기 위해 만들어진, V의 info.jsp 이다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>안내 페이지</title>
</head>
<body>

<script>
	alert('${msg}');
	location.href='${path}';
</script>

</body>
</html>

 

만약, 

로그인 실패 페이지를 만들게 된다면, 코드 재사용성이 용이하지 않을 것이다.

예시 )

더보기

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>안내 페이지</title>

</head>

<body>

 

<script>

alert('로그인 실패...');

location.href='loginPage.do';

</script>

 

</body>

</html>

 

나중에 또 안내메시지(알랏창)을 띄우도록 만들고 싶어질 수도 있다.

위 info.jsp를 재사용하면 유지보수가 용이해지고, 코드 재사용성이 증가할 것이기 때문에, info.jsp를 만들어보았다.