본문 바로가기
Spring

[웹프로젝트] 5. 회원가입

by moca7 2024. 10. 28.

 

 

ㅁ member 폴더 우클릭 signup.jsp 생성

 

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

    <div class="container p-3">

        <!-- Header, Nav start -->
        <jsp:include page="/WEB-INF/views/common/header.jsp"/>
        <!-- Header, Nav end -->
   
        <!-- Section start -->
        <section class="row m-3" style="min-height: 500px">
   
          <div class="container border p-5 m-4 rounded">
            <h2 class="m-4">회원가입</h2>
            <br>

            <form action="" method="post" id="signup_form">
                <div class="form-group">
                    <label for="userId">* ID :</label>
                    <input type="text" class="form-control" id="userId" name="" placeholder="Please Enter ID" required><br>
                   
                    <label for="userPwd">* Password :</label>
                    <input type="password" class="form-control" id="userPwd" name="" placeholder="Please Enter Password" required><br>
                   
                    <label for="checkPwd">* Password Check :</label>
                    <input type="password" class="form-control" id="checkPwd" placeholder="Please Enter Password" required><br>
                   
                    <label for="userName">* Name :</label>
                    <input type="text" class="form-control" id="userName" name="" placeholder="Please Enter Name" required><br>
                   
                    <label for="email"> &nbsp; Email :</label>
                    <input type="email" class="form-control" id="email" name="" placeholder="Please Enter Email"><br>
                   
                    <label for="phone"> &nbsp; Phone :</label>
                    <input type="tel" class="form-control" id="phone" name="" placeholder="Please Enter Phone (-포함)"><br>
                   
                    <label for="address"> &nbsp; Address :</label>
                    <input type="text" class="form-control" id="address" name="" placeholder="Please Enter Address"><br>
                   
                    <label for=""> &nbsp; Gender : </label> &nbsp;&nbsp;
                    <input type="radio" name="" id="Male" value="M">
                    <label for="Male">남자</label> &nbsp;&nbsp;
                    <input type="radio" name="" id="Female" value="F">
                    <label for="Female">여자</label><br>
                   
                </div>
                <br>
                <div class="btns" align="center">
                    <button type="submit" class="btn btn-primary">회원가입</button>
                    <button type="reset" class="btn btn-danger"> 초기화</button>
                </div>
            </form>
         
          </div>
   
        </section>
        <!-- Section end -->
   
        <!-- Footer start -->
        <jsp:include page="/WEB-INF/views/common/footer.jsp"/>
        <!-- Footer end -->
   
    </div>


</body>
</html>
 

 

- 회원가입~.html의 바디 태그 ~ 바디태그를 복붙했다. 맞나 확인 필요.

 

 

 

 

 

ㅁ header.jsp

 

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
   

<!-- Bootstrap 사용을 위한 CDN -->
<!-- ------------------------- -->

<style>
    header{height: 50px}
    header a{color:black;}
    header .profile-img{width:30px;}
</style>

<header class="row m-3">
    <div class="col-3 d-flex justify-content-center align-items-center">
        <a href=""><img src="${ contextPath }/resources/images/goodee_logo.png" width="100px"></a>
    </div>
    <div class="col-5"></div>
    <div class="col-4 d-flex justify-content-center align-items-center">
   
       
        <c:choose>
            <c:when test="${ empty loginUser }">
            <!-- case1. 로그인전 -->
            <a href="${contextPath}/member/signup.do">회원가입</a> &nbsp;|&nbsp;
            <a href="#" data-toggle="modal" data-target="#loginModal">로그인</a>
        </c:when>
       
        <c:otherwise>
            <!-- case2. 로그인후 -->
            <div>
            <img class="profile-img" src="${ contextPath }<c:out value='${loginUser.profileURL}' default='/resources/images/defaultProfile.png' />">&nbsp;
            <a href="">${loginUser.userName}님</a> &nbsp;|&nbsp;
            <a href="${contextPath}/member/signout.do">로그아웃</a>
            </div>
        </c:otherwise>
      </c:choose>  
   
    </div>
</header>
<nav class="navbar m-3 navbar-expand-sm bg-dark navbar-dark d-flex justify-content-center">
<ul class="navbar-nav">
    <li class="nav-item">
    <a class="nav-link" href="#">Home</a>
    </li>
    <li class="nav-item">
    <a class="nav-link" href="#">공지사항</a>
    </li>
    <li class="nav-item">
    <a class="nav-link" href="#">일반게시판</a>
    </li>
    <li class="nav-item">
    <a class="nav-link" href="#">사진게시판</a>
    </li>
</ul>
</nav>

<!-- 로그인 클릭 시 뜨는 모달 (기존에는 안보이다가 위의 a 클릭시 보임) -->
<div class="modal fade" id="loginModal">
    <div class="modal-dialog modal-sm">
        <div class="modal-content">
        <!-- Modal Header -->
        <div class="modal-header">
            <h4 class="modal-title">Login</h4>
            <button type="button" class="close" data-dismiss="modal">&times;</button>
        </div>

        <form action="${contextPath}/member/signin.do" method="post">
            <!-- Modal Body -->
            <div class="modal-body">
                <label for="userId" class="mr-sm-2">ID :</label>
                <input type="text" class="form-control mb-2 mr-sm-2" placeholder="Enter ID" id="userId" name="userId" required> <br>
                <label for="userPwd" class="mr-sm-2">Password:</label>
                <input type="password" class="form-control mb-2 mr-sm-2" placeholder="Enter password" id="userPwd" name="userPwd" required>
            </div>
           
            <!-- Modal footer -->
            <div class="modal-footer">
                <button type="submit" class="btn btn-primary">로그인</button>
                <button type="button" class="btn btn-danger" data-dismiss="modal">취소</button>
            </div>
        </form>
        </div>
    </div>
</div>
 

 

 

 

 

 

ㅁ MemberController

 

 
package com.br.spring.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.br.spring.dto.MemberDto;
import com.br.spring.service.MemberService;

import lombok.RequiredArgsConstructor;

@RequestMapping("/member")
@RequiredArgsConstructor
@Controller
public class MemberController {

      private final MemberService memberService;
   
     
    @PostMapping("/signin.do")
    public void signin(MemberDto m, HttpServletResponse response, HttpSession session, HttpServletRequest request) throws IOException {
        MemberDto loginUser = memberService.selectMember(m);

        // 로그인 성공시 => 세션에 회원정보를 담고, alert와 함께 메인 페이지로 이동
        // 로그인 실패시 => alert와 함께 기존에 보던 페이지 유지(아이디, 비번 입력하는 로그인 폼 유지. 작성하던 입력데이터도 그대로.)

        // script문을 응답데이터로 돌려줘서 흐름제어
        response.setContentType("text/html; charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<script>");

        if(loginUser != null) { // 로그인 성공
            session.setAttribute("loginUser", loginUser);
            out.println("alert('" + loginUser.getUserName() + "님 환영합니다~');");
            out.println("location.href = '" + request.getHeader("referer") + "';"); // 메인페이지가 아닌 이전에 보던 페이지로 이동
        }else { // 로그인 실패
            out.println("alert('로그인에 실패하였습니다. 아이디 및 비밀번호를 다시 확인해주세요.');");
            out.println("history.back();"); // modal이 띄워진 상태였으면 modal도 유지된다.
        }

        out.println("</script>");
    }
   
   
    @GetMapping("/singout.do")
    public String signout(HttpSession session) {
        session.invalidate();
        return "redirect:/";
    }
   
   
    @GetMapping("/signup.do")
    public void signupPage() { } //WEB-INF/views/member/signup.jsp
       
   
   
   
   
}

 

- void로 두면 ~

 

 

 

 

 

 

 

- 우상단의 '회원가입'이라는 a태그를 클릭하면 회원가입 페이지로 이동한다.

 

 

 

 

==========================================================================================

 

 

 

 

ㅁ 유효성 체크를 한다.

- 코드가 복잡한데 나중에 참고해서 쓰라고.

 

 

 

 

ㅁ singup.jsp

 

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
    .smallfont {font-size: 0.8em;}
    .uncheck {display: none;} /* 유효성 검사 전일 경우 */
    .unusable {color: red;} /* 사용 불가능인 경우 */
    .usable {color: green;} /* 사용 가능인 경우 */
</style>
</head>
<body>

    <div class="container p-3">

        <!-- Header, Nav start -->
        <jsp:include page="/WEB-INF/views/common/header.jsp"/>
        <!-- Header, Nav end -->
   
        <!-- Section start -->
        <section class="row m-3" style="min-height: 500px">
   
          <div class="container border p-5 m-4 rounded">
            <h2 class="m-4">회원가입</h2>
            <br>

            <form action="" method="post" id="signup_form">
                <div class="form-group">
                    <label for="userId">* ID :</label>
                    <input type="text" class="form-control" id="userId" name="" placeholder="Please Enter ID" required>
                    <div id="idCheck_result" class="uncheck smallfont"></div>
                    <br>
                   
                    <label for="userPwd">* Password :</label>
                    <input type="password" class="form-control" id="userPwd" name="" placeholder="Please Enter Password" required>
                    <div id="pwdCheck_result" class="uncheck smallfont"></div>                  
                    <br>
                   
                    <label for="checkPwd">* Password Check :</label>
                    <input type="password" class="form-control" id="checkPwd" placeholder="Please Enter Password" required>
                    <div id="pwdEqualCheck_result" class="uncheck smallfont"></div>
                    <br>
                   
                    <label for="userName">* Name :</label>
                    <input type="text" class="form-control" id="userName" name="" placeholder="Please Enter Name" required>
                    <div id="nameEqualCheck_result" class="uncheck smallfont"></div>
                    <br>
                   
                    <label for="email"> &nbsp; Email :</label>
                    <input type="email" class="form-control" id="email" name="" placeholder="Please Enter Email"><br>
                   
                    <label for="phone"> &nbsp; Phone :</label>
                    <input type="tel" class="form-control" id="phone" name="" placeholder="Please Enter Phone (-포함)"><br>
                   
                    <label for="address"> &nbsp; Address :</label>
                    <input type="text" class="form-control" id="address" name="" placeholder="Please Enter Address"><br>
                   
                    <label for=""> &nbsp; Gender : </label> &nbsp;&nbsp;
                    <input type="radio" name="" id="Male" value="M">
                    <label for="Male">남자</label> &nbsp;&nbsp;
                    <input type="radio" name="" id="Female" value="F">
                    <label for="Female">여자</label><br>
                   
                </div>
                <br>
                <div class="btns" align="center">
                    <button type="submit" class="btn btn-primary" disabled>회원가입</button>
                    <button type="reset" class="btn btn-danger"> 초기화</button>
                </div>
            </form>
           
            <script>
           
                // 각 항목의 값들이 유효한 값으로 입력되면 true로 변경된다.
                let idResult = false;
                let pwdResult = false;
                let pwdEqualResult = false;
                let nameResult = false;
               
                // input 요소들 유효성검사때마다 회원가입 버튼을 활성화 또는 비활성화 처리하는 함수
                function validate(){
                    if(idResult && pwdResult && pwdEqualResult && nameResult){ // 각각이 true 또는 false이므로 조건으로 쓸 수도 있다. // 모든 값들이 다 유효한 값으로 입력되는 순간
                        $('#signup_form :submit').removeAttr('disabled'); // 회원가입버튼 활성화
                    }else {
                        $('#signup_form :submit').attr('disabled', true); // 회원가입버튼 비활성화
                    }
                }
               
                // input 요소에 작성된 값이 없는지 체크하는 함수
                function noValueCheck($input, $result){ // 비교할 input 요소 객체, 메세지 출력되는 div요소객체
                    if($input.val().trim().length == 0){ // 값이 비어있을 경우
                        $result.removeClass("usable unusable")
                                     .addClass("uncheck")
                                     .text(""); // uncheck활성화 (결과 영역 출력 숨기기)
                        return false; // 유효성 검사를 진행할 필요가 없기 때문에 false 반환
                    }
                    return true;        // 유효성 검사를 진행하도록 true 반환
                }
               
               
                // input 요소에 작성된 값이 정규식(유효한패턴)에 만족하는지 체크하는 함수
                function regExpCheck($input, $result, regExp, msg1, msg2){
                   
                    if(regExp.test($input.val())){ // 유효한 값으로 잘 입력됐을 경우
                        $result.removeClass("uncheck unusable")
                                     .addClass("usable")
                                     .text(msg1);
                        return true;
                    }else { // 유효하지 않은 값으로 입력됐을 경우
                        $result.removeClass("uncheck usable")
                                     .addClass("unusable")
                                     .text(msg2);
                        return false;
                    }
               
                }
               
               
               
                $(function(){
               
                    // 아이디 유효성검사
                                $('#signup_form #userId').on("keyup", function(){
                                    console.log('아이디 입력란 유효성 체크 진행')
                                })
                   
                    // 비밀번호 유효성검사
                    $('#signup_form #userPwd').on("keyup", function(){
                                    console.log('비번 입력란 유효성 체크 진행')        
                                })
                   
                    // 비밀번호확인 유효성검사
                    $('#signup_form #checkPwd').on("keyup", function(){
                                    console.log('비번 확인 입력란 유효성 체크 진행')
                                })
                   
                    // 이름 유효성검사
                    $('#signup_form #userName').on("keyup", function(){
                                    console.log('이름 입력란 유효성 체크 진행')
                                })
                               
                })
               
               
            </script>
         
          </div>
   
        </section>
        <!-- Section end -->
   
        <!-- Footer start -->
        <jsp:include page="/WEB-INF/views/common/footer.jsp"/>
        <!-- Footer end -->
   
    </div>


</body>
</html>
 

 

- 회원가입 요청을 하기 전에 이 페이지에서 유효성체크를 한다.

 

 

- <head> 태그 내에 <style> 태그를 작성했다.

- <div id="idCheck_result" class="uncheck smallfont">를 추가한다.

-<div id="pwdCheck_result" class="uncheck smallfont"></div>도 추가한다.

-<div id="pwdEqualCheck_result" class="uncheck smallfont"></div>도 추가한다.

- <div id="nameEqualCheck_result" class="uncheck smallfont"></div>도 추가한다.

 

- 회원가입 버튼 초반에는 disabled를 넣어두고, 다 유효한 값이면 활성화 시킨다.

 

 

- form 요소 하단에 script 구문을 작성한다.

인풋 요소 하나당 한번씩 유효성 검사를 한다.

사용자가 값을 입력할 때마다 실시간으로 유효성검사를 진행한다.

 

 

- 변수명 앞에 $를 붙이는 것은 일반적으로 특정 데이터 유형을 식별하기 위해 사용되는 관습일 뿐이다.

 

- 지금 함수 2개를 빼놨다. 원래대로라면 $(function(){}) 내의 각각의 유효성 검사 구문마다 함수로 모듈화한 구문을 다 작성 해야 한다.

 

- 유효성 검사는 정규식 패턴으로 한다. 

 

 

 

 

 

- keyup 이벤트가 잘 작동하는지 콘솔로 확인한다.

 

 

 

 

- 페이지 로드시 뜨는 경고. 이건 일단 무시.

- 이 문서 내에서 아이디가 중복되어 있다. input 요소와 modal내에도 있어서.

그래서 유효성 검사할때 #userId가 아닌 #signup_form #userId로 했다. 

 

 

 

====================================================================================

 

 

ㅁ console.log를 다 삭제한다.

- 확인했으니 필요없는 로그를 삭제한다.

- 콘솔에 찍히는건 사용자에게도 보여진다.

 

 

ㅁ 아이디 유효성검사는 ajax쓱 ㅗ복잡하다.

- 비밀번호 유효성 검사부터 작성한다.

 

 

 

ㅁ signup.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
   
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
   
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
    .smallfont {font-size: 0.8em;}
    .uncheck {display: none;} /* 유효성 검사 전일 경우 */
    .unusable {color: red;} /* 사용 불가능인 경우 */
    .usable {color: green;} /* 사용 가능인 경우 */
</style>
</head>
<body>

    <div class="container p-3">

        <!-- Header, Nav start -->
        <jsp:include page="/WEB-INF/views/common/header.jsp"/>
        <!-- Header, Nav end -->
   
        <!-- Section start -->
        <section class="row m-3" style="min-height: 500px">
   
          <div class="container border p-5 m-4 rounded">
            <h2 class="m-4">회원가입</h2>
            <br>

            <form action="" method="post" id="signup_form">
                <div class="form-group">
                    <label for="userId">* ID :</label>
                    <input type="text" class="form-control" id="userId" name="" placeholder="Please Enter ID" required>
                    <div id="idCheck_result" class="uncheck smallfont"></div>
                    <br>
                   
                    <label for="userPwd">* Password :</label>
                    <input type="password" class="form-control" id="userPwd" name="" placeholder="Please Enter Password" required>
                    <div id="pwdCheck_result" class="uncheck smallfont"></div>                  
                    <br>
                   
                    <label for="checkPwd">* Password Check :</label>
                    <input type="password" class="form-control" id="checkPwd" placeholder="Please Enter Password" required>
                    <div id="pwdEqualCheck_result" class="uncheck smallfont"></div>
                    <br>
                   
                    <label for="userName">* Name :</label>
                    <input type="text" class="form-control" id="userName" name="" placeholder="Please Enter Name" required>
                    <div id="nameEqualCheck_result" class="uncheck smallfont"></div>
                    <br>
                   
                    <label for="email"> &nbsp; Email :</label>
                    <input type="email" class="form-control" id="email" name="" placeholder="Please Enter Email"><br>
                   
                    <label for="phone"> &nbsp; Phone :</label>
                    <input type="tel" class="form-control" id="phone" name="" placeholder="Please Enter Phone (-포함)"><br>
                   
                    <label for="address"> &nbsp; Address :</label>
                    <input type="text" class="form-control" id="address" name="" placeholder="Please Enter Address"><br>
                   
                    <label for=""> &nbsp; Gender : </label> &nbsp;&nbsp;
                    <input type="radio" name="" id="Male" value="M">
                    <label for="Male">남자</label> &nbsp;&nbsp;
                    <input type="radio" name="" id="Female" value="F">
                    <label for="Female">여자</label><br>
                   
                </div>
                <br>
                <div class="btns" align="center">
                    <button type="submit" class="btn btn-primary" disabled>회원가입</button>
                    <button type="reset" class="btn btn-danger"> 초기화</button>
                </div>
            </form>
           
            <script>
           
                // 각 항목의 값들이 유효한 값으로 입력되면 true로 변경된다.
                let idResult = false;
                let pwdResult = false;
                let pwdEqualResult = false;
                let nameResult = false;
               
                // input 요소들 유효성검사때마다 회원가입 버튼을 활성화 또는 비활성화 처리하는 함수
                function validate(){
                    if(idResult && pwdResult && pwdEqualResult && nameResult){ // 각각이 true 또는 false이므로 조건으로 쓸 수도 있다. // 모든 값들이 다 유효한 값으로 입력되는 순간
                        $('#signup_form :submit').removeAttr('disabled'); // 회원가입버튼 활성화
                    }else {
                        $('#signup_form :submit').attr('disabled', true); // 회원가입버튼 비활성화
                    }
                }
               
                // input 요소에 작성된 값이 없는지 체크하는 함수
                function noValueCheck($input, $result){ // 비교할 input 요소 객체, 메세지 출력되는 div요소객체
                    if($input.val().trim().length == 0){ // 값이 비어있을 경우
                        $result.removeClass("usable unusable")
                                     .addClass("uncheck")
                                     .text(""); // uncheck활성화 (결과 영역 출력 숨기기)
                        return false; // 유효성 검사를 진행할 필요가 없기 때문에 false 반환
                    }
                    return true;        // 유효성 검사를 진행하도록 true 반환
                }
               
               
                // input 요소에 작성된 값이 정규식(유효한패턴)에 만족하는지 체크하는 함수
                function regExpCheck($input, $result, regExp, msg1, msg2){
                   
                    if(regExp.test($input.val())){ // 유효한 값으로 잘 입력됐을 경우
                        $result.removeClass("uncheck unusable")
                                     .addClass("usable")
                                     .text(msg1);
                        return true;
                    }else { // 유효하지 않은 값으로 입력됐을 경우
                        $result.removeClass("uncheck usable")
                                     .addClass("unusable")
                                     .text(msg2);
                        return false;
                    }
               
                }
               
               
               
                $(function(){
               
                    // 아이디 유효성검사
                                $('#signup_form #userId').on("keyup", function(){
                                   
                                })
                               
                   
                    // 비밀번호 유효성검사
                    $('#signup_form #userPwd').on("keyup", function(){
                        let regExp = /^[a-z\d!@#$%^&*]{8,15}$/i;
                       
                        pwdResult = noValueCheck( $(this), $("#pwdCheck_result") )           // true아니면 false가 돌아온다.
                                                    && regExpCheck( $(this), $("#pwdCheck_result")       // 자바스크립트의 short-circuit. 위의 조건이 true일 경우 실행할 내용을 뒤에 작성한다.
                                                                                                 , regExp, '사용가능한 비밀번호입니다.'
                                                                                                 , '영문, 숫자, 특수문자 포함 8~15자리로 작성해주세요.' )
                       
                                })
                               
                   
                    // 비밀번호확인 유효성검사
                    $('#signup_form #checkPwd').on("keyup", function(){
                               
                                })
                               
                   
                    // 이름 유효성검사
                    $('#signup_form #userName').on("keyup", function(){
                                   
                                })
                               
                               
                })
               
               
            </script>
         
          </div>
   
        </section>
        <!-- Section end -->
   
        <!-- Footer start -->
        <jsp:include page="/WEB-INF/views/common/footer.jsp"/>
        <!-- Footer end -->
   
    </div>


</body>
</html>

 

 

 

 

 

 

 

 

 

ㅁ 비밀번호 유효성 검사만 먼저 해본다.

 

 

- 실시간으로 반영된다.