📝 회원 가입 기능 구현
💡VS Code
🔎 index.jsp
.
.
.
<article id="signup-find-area">
<a href="/community/member/signUp">회원가입</a>
.
.
.
</footer>
<%-- session에 message 속성이 존재하는 경우 alert창으로 해당 내용을 출력 --%>
<c:if test="${ !empty sessionScope.message }">
<script>
alert("${message}");
</script>
<%-- message 1회 출력 후 session에서 제거 --%>
<c:remove var="message" scope="session"/>
</c:if>
</body>
</html>
🔎 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" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>KH 커뮤니티</title>
<link rel="stylesheet" href="../resources/css/main-style.css">
<link rel="stylesheet" href="../resources/css/signUp-style.css">
<script src="https://kit.fontawesome.com/4dca1921b4.js" crossorigin="anonymous"></script>
</head>
<body>
<main>
<header>
<section>
<a href="#">
<img src="../resources/images/logo.jpg" id="home-logo">
</a>
</section>
<section>
<article class="search-area">
<form action="#" name="search form">
<fieldset>
<input type="search" id="query" name="query"
placeholder="검색어를 입력해주세요" autocomplete="off">
<button type="submit" id="search-btn" class="fa-solid fa-magnifying-glass"></button>
</fieldset>
</form>
</article>
</section>
<section></section>
</header>
<nav>
<ul>
<li><a href=#>공지사항</a></li>
<li><a href=#>자유 게시판</a></li>
<li><a href=#>질문 게시판</a></li>
<li><a href=#>FAQ</a></li>
<li><a href=#>1:1문의</a></li>
</ul>
</nav>
<section class="signUp-content">
<form action="signUp" method="post" name="signUp-form">
<label for="memberEmail">
<span class="required">*</span> 아이디(이메일)
</label>
<div class="signUp-input-area">
<input type="text" id="memberEmail" name="memberEmail"
placeholder="아이디(이메일)" maxlength="30"
autocomplete="off" required>
<button type="button">인증번호 받기</button>
</div>
<span class="signUp-message">메일을 받을 수 있는 이메일을 입력해 주세요.</span>
<label for="emailCheck">
<span class="required">*</span> 인증번호
</label>
<div class="signUp-input-area">
<input type="text" id="emailCheck"
placeholder="인증번호 입력" maxlength="6"
autocomplete="off">
<button type="button">인증하기</button>
</div>
<span class="signUp-message confirm">인증되었습니다.</span>
<label for="memberPw">
<span class="required">*</span> 비밀번호
</label>
<div class="signUp-input-area">
<input type="password" id="memberPw" name="memberPw"
placeholder="비밀번호" maxlength="30">
</div>
<div class="signUp-input-area">
<input type="password" id="memberPwConfirm"
placeholder="비밀번호 확인" maxlength="30">
</div>
<span class="signUp-message error">비밀번호가 일치하지 않습니다.</span>
<label for="memberNickname">
<span class="required">*</span> 닉네임
</label>
<div class="signUp-input-area">
<input type="text" id="memberNickname" name="memberNickname"
placeholder="닉네임" maxlength="10">
</div>
<span class="signUp-message confirm">사용 가능한 닉네임입니다.</span>
<label for="memberTel">
<span class="required">*</span> 전화번호
</label>
<div class="signUp-input-area">
<input type="text" id="memberTel" name="memberTel"
placeholder="(- 없이 숫자만 입력)" maxlength="11">
</div>
<span class="signUp-message error">전화번호 형식이 올바르지 않습니다.</span>
<label for="memberAddress">
주소
</label>
<div class="signUp-input-area">
<input type="text" id="memberAddress" name="memberAddress"
placeholder="우편번호" maxlength="6">
<button type="button">검색</button>
</div>
<div class="signUp-input-area">
<input type="text" name="memberAddress" placeholder="도로명주소">
</div>
<div class="signUp-input-area">
<input type="text" name="memberAddress" placeholder="상세주소">
</div>
<button type="submit" id="signUp-btn">가입하기</button>
</form>
</section>
</main>
<footer>
<p>Copyright © KH Information Educational Institute M-Class</p>
<article>
<a href="#">프로젝트 소개</a>
<span>|</span>
<a href="#">이용약관</a>
<span>|</span>
<a href="#">개인정보처리방침</a>
<span>|</span>
<a href="#">고객센터</a>
</article>
</footer>
</body>
</html>
🔎 signUp-style.css
.signUp-content{
display: flex;
justify-content: center;
}
.required{
color: red;
padding: 0 5px;
}
form[name="signUp-form"]{
margin-top: 30px;
}
form[name="signUp-form"] > label{
display: block;
margin-top: 40px;
font-size: 18px;
}
.signUp-input-area{
width: 500px;
height: 50px;
margin-bottom: 10px;
border-bottom: 2px solid #ddd;
display: flex;
align-items: center;
}
.signUp-input-area:focus-within{
border-bottom: 2px solid #455ba8;
}
.signUp-input-area > input{
width: 70%;
height: 100%;
padding: 15px 10px 5px;
font-size: 16px;
font-weight: bold;
border: 0;
outline: 0;
}
.signUp-input-area > button{
width: 30%;
height: 70%;
background-color: white;
border: 1px solid gray;
cursor: pointer;
}
.signUp-messsage{
font-size: 14px;
letter-spacing: -1px;
}
.confirm{ color: green;}
.error{ color: red;}
#signUp-btn{
width: 100%;
padding: 10px;
margin: 50px 0;
border: 0;
font-size: 20px;
font-weight: bold;
color: white;
background-color: #455ba8;
cursor: pointer;
}
💡 Eclipse
🔎 SignUpServlet.java
package edu.kh.community.member.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.catalina.connector.Response;
import org.apache.catalina.tribes.util.Arrays;
import edu.kh.community.member.model.service.MemberService;
import edu.kh.community.member.model.vo.Member;
@WebServlet("/member/signUp")
public class SignUpServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String path = "/WEB-INF/views/member/signUp.jsp";
req.getRequestDispatcher(path).forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String memberEmail = req.getParameter("memberEmail");
String memberPw = req.getParameter("memberPw");
String memberNickname = req.getParameter("memberNickname");
String memberTel = req.getParameter("memberTel");
String[] address = req.getParameterValues("memberAddress");
String memberAddress = null;
if(!address[0].equals("")) {
memberAddress = String.join(",,", address);
}
Member mem = new Member();
mem.setMemberEmail(memberEmail);
mem.setMemberPw(memberPw);
mem.setMemberNickname(memberNickname);
mem.setMemberTel(memberTel);
mem.setMemberAddress(memberAddress);
try {
MemberService service = new MemberService();
int result = service.signUp(mem);
HttpSession session = req.getSession();
if(result > 0) {
session.setAttribute("message", "회원 가입 성공!!");
} else {
session.setAttribute("message", "회원 가입 실패...");
}
resp.sendRedirect( req.getContextPath() );
} catch(Exception e) {
e.printStackTrace();
}
}
}
🔎 memberService.java
.
.
.
public int signUp(Member mem) throws Exception {
Connection conn = getConnection();
int result = dao.signUp(conn, mem);
if(result > 0) conn.commit();
else conn.rollback();
close(conn);
return result;
}
.
.
.
🔎 memberDAO.java
.
.
.
public int signUp(Connection conn, Member mem) throws Exception{
int result = 0;
try {
String sql = prop.getProperty("signUp");
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, mem.getMemberEmail());
pstmt.setString(2, mem.getMemberPw());
pstmt.setString(3, mem.getMemberNickname());
pstmt.setString(4, mem.getMemberTel());
pstmt.setString(5, mem.getMemberAddress());
result = pstmt.executeUpdate();
} finally {
close(pstmt);
}
return result;
}
.
.
.
🔎 member-sql.xml
.
.
.
<entry key="signUp">
INSERT INTO MEMBER
VALUES(SEQ_MEMBER_NO.NEXTVAL, ?, ?, ?, ?, ?, DEFAULT, DEFAULT, DEFAULT)
</entry>
.
.
.