TIL/넷마블문화재단

[TIL-26/230917][넷마블문화재단] 로그인 기능 구현

prao 2023. 9. 18. 00:00
반응형

금토일간 유튜브 강의를 통해 JSP, Servlet에 대한 공부를 보충했고, 오늘은 저녁부터 기존에 진행하던 미니프로젝트에 login 기능을 구현하였다.

 

구현을 최우선으로 생각했기에 MVC를 명확하게 구분하면서 설계하기보다 우선 JSP를 활용하여 구현하는 것을 목적으로 하였고, 구현했다.

 

로그인의 진행과정

회원가입
회원가입 성공시 자동 로그인
비밀번호 틀릴 시 팝업

login.jsp

  • 사용자가 입력한 id와 password를 입력
  • submit을 통해 loginAction.jsp으로 data 전달 
<div class = "container">
    <div class = "row justify-content-center">
        <div class = "col-lg-4">
            <div class = "jumbotron" style = "padding-top: 20px;">
                <form method = "post" action = "loginAction.jsp"> <!-- "loginAction.jsp" 오타 주의: "loginAction.jsp"로 수정 -->
                    <h3 style = "text-align: center">로그인 화면</h3>
                    <div class = "form-group">
                        <input type = "text" class = "form-control" placeholder = "아이디" name = "memberId" maxlength = "20"/>
                    </div>
                    <div class = "form-group">
                        <input type = "password" class = "form-control" placeholder = "비밀번호" name = "memberPassword"
                               maxlength = "20"/>
                    </div>
                    <input type = "submit" class = "btn btn-primary form-control" value = "로그인"/>
                </form>
            </div>
        </div>
    </div>
</div>

MemberDAO의 login 메서드 

public int login(String memberId, String memberPassword) {
    // SQL 쿼리문: memberId를 기반으로 회원의 비밀번호를 검색
    String SQL = "SELECT memberPassword FROM MEMBER WHERE memberId = ?";
    try {
        // SQL 쿼리를 실행하기 위한 PreparedStatement 객체 생성
        pstmt = conn.prepareStatement(SQL);
        // SQL 쿼리의 파라미터 값으로 memberId를 설정
        pstmt.setString(1, memberId);
        // SQL 쿼리 실행 후 결과를 ResultSet 객체에 저장
        rs = pstmt.executeQuery();

        // ResultSet에서 다음 레코드가 존재하고, 그 레코드의 비밀번호가 입력된 비밀번호와 일치하는 경우
        if (rs.next() && rs.getString(1).equals(memberPassword)) {
            return 1; // 로그인 성공
        }
        
        // ResultSet에서 다음 레코드가 존재하고, 그 레코드의 비밀번호가 입력된 비밀번호와 일치하지 않는 경우
        if (rs.next() && !rs.getString(1).equals(memberPassword)) {
            return 0; // 로그인 실패(비밀번호 불일치)
        }
        
        // ResultSet에서 일치하는 레코드가 없는 경우(아이디가 존재하지 않음)
        return -1; // 회원정보 없음(아이디 존재하지 않음)
        
    } catch (Exception e) {
        e.printStackTrace();
    }
    // 데이터베이스 오류가 발생한 경우
    return -2; // DB 오류
}

loginAction.jsp

  1. 세션 검사:
    • 코드의 첫 부분에서 세션(Session)을 사용하여 현재 사용자의 로그인 상태를 확인
    • session.getAttribute("memberId")를 통해 세션에서 "memberId"라는 속성을 가져옴.
    • 만약 세션에 "memberId" 속성이 이미 존재하고, 즉, 사용자가 이미 로그인한 상태라면 memberId 변수에 해당 값을 할당
  2. 이미 로그인한 경우 처리:
    • 만약 memberId 변수가 null이 아닌 경우, 이는 이미 로그인한 상태를 의미
    • 사용자에게 "이미 로그인이 되어있습니다." 라는 알림 메시지를 띄워주고, "main.jsp" 페이지로 리디렉션
    • 이로써 이미 로그인한 사용자가 다시 로그인 페이지로 접근하는 것을 방지
  3. 로그인 시도:
    • 로그인이 되어있지 않은 경우, 사용자가 입력한 아이디와 비밀번호를 데이터베이스로부터 검증하기 위해 MemberDAO 객체를 생성
  4. 데이터베이스 검증:
    • memberDAO.login(member.getMemberId(), member.getMemberPassword())를 호출하여 사용자가 입력한 아이디와 비밀번호를 데이터베이스에서 확인
    • login 메서드는 다양한 결과를 리턴하는데, 이 결과를 result 변수에 저장
    • 가능한 result 값:
      • 1: 로그인 성공
      • 0: 비밀번호가 틀림
      • 1: 존재하지 않는 아이디
      • 2: 데이터베이스 오류
  5. 로그인 결과 처리:
    • result 변수의 값에 따라 다음 동작을 수행
      • result가 1인 경우: 로그인 성공, 세션에 "memberId" 속성을 설정하여 사용자를 로그인 상태로 만들고 "main.jsp" 페이지로 리디렉션
      • result가 0인 경우: 비밀번호가 틀린 경우, 사용자에게 경고 메시지를 표시하고 이전 페이지로 되돌림
      • result가 -1인 경우: 존재하지 않는 아이디인 경우, 사용자에게 경고 메시지를 표시하고 이전 페이지로 되돌림
      • result가 -2인 경우: 데이터베이스 오류가 발생한 경우, 사용자에게 경고 메시지를 표시하고 이전 페이지로 되돌림
<%
  String memberId = null;
  if (session.getAttribute("memberId") != null) {
    memberId = (String) session.getAttribute("memberId");
  }
  if (memberId != null) {
    PrintWriter script = response.getWriter();
    script.println("<script>");
    script.println("alert('이미 로그인이 되어있습니다.')");
    script.println("location.href = 'main.jsp'");
    script.println("</script>");
  }

  MemberDAO memberDAO = new MemberDAO();
  int result = memberDAO.login(member.getMemberId(), member.getMemberPassword());
  if (result == 1) {
    session.setAttribute("memberId", member.getMemberId());
    PrintWriter script = response.getWriter();
    script.println("<script>");
    script.println("location.href = 'main.jsp'");
    script.println("</script>");
  } else if (result == 0) {
    PrintWriter script = response.getWriter();
    script.println("<script>");
    script.println("alert('비밀번호가 틀립니다.')");
    script.println("history.back()");
    script.println("</script>");
  } else if (result == -1) {
    PrintWriter script = response.getWriter();
    script.println("<script>");
    script.println("alert('존재하지 않는 아이디입니다.')");
    script.println("history.back()");
    script.println("</script>");
  } else if (result == -2) {
    PrintWriter script = response.getWriter();
    script.println("<script>");
    script.println("alert('데이터베이스 오류가 발생했습니다.')");
    script.println("history.back()");
    script.println("</script>");
  }
%>

곧 게시판 기능도 추가해볼 예정이고, 기능 구현을 마친 후 MVC 모델로 리팩토링도 생각하고 있다. 우선적으로 구현부터 하여 완성해보겠다.

반응형