JSP day22
MyBatis 회원가입 로직 구현
MyBatis 회원가입 로직 구현
저번 시간 로그인 기능 구현에 이어 회원가입 로직을 마이바티스로 구현해보자.
MemberDTO.java
package com.koreait.member;
import java.util.Arrays;
public class MemberDTO {
private int idx;
private String userid;
private String userpw;
private String username;
private String email;
private String hp;
private String[] hobby = new String[5];
private String ssn1;
private String ssn2;
private String zipcode;
private String address1;
private String address2;
private String address3;
private String regdate;
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getUserpw() {
return userpw;
}
public void setUserpw(String userpw) {
this.userpw = userpw;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getHp() {
return hp;
}
public void setHp(String hp) {
this.hp = hp;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
public String getSsn1() {
return ssn1;
}
public void setSsn1(String ssn1) {
this.ssn1 = ssn1;
}
public String getSsn2() {
return ssn2;
}
public void setSsn2(String ssn2) {
this.ssn2 = ssn2;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
public String getAddress3() {
return address3;
}
public void setAddress3(String address3) {
this.address3 = address3;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
@Override
public String toString() {
return "MemberDTO [idx=" + idx + ", useid=" + userid + ", userpw=" + userpw + ", username=" + username
+ ", email=" + email + ", hp=" + hp + ", hobby=" + Arrays.toString(hobby) + ", ssn1=" + ssn1 + ", ssn2="
+ ssn2 + ", zipcode=" + zipcode + ", address1=" + address1 + ", address2=" + address2 + ", address3="
+ address3 + ", regdate=" + regdate + "]";
}
}
MemberDAO.java
package com.koreait.member;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Scanner;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import com.koreait.db.Dbconn;
import com.koreait.db.SqlMapConfig;
public class MemberDAO {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs;
String sql = "";
SqlSessionFactory ssf = SqlMapConfig.getSqlMapInstance();
SqlSession sqlsession;
public MemberDAO() {
sqlsession = ssf.openSession(true);
System.out.println("마이바티스 설정 성공!");
}
public int join(MemberDTO member){
HashMap<String, String> dataMap = new HashMap();
dataMap.put("mem_userid", member.getUserid());
dataMap.put("mem_userpw", member.getUserpw());
dataMap.put("mem_name", member.getUsername());
dataMap.put("mem_hp", member.getHp());
dataMap.put("mem_email", member.getEmail());
String hobbystr = "";
for(String str : member.getHobby()) {
hobbystr = hobbystr + str + " ";
}
dataMap.put("mem_hobby", hobbystr);
dataMap.put("mem_ssn1", member.getSsn1());
dataMap.put("mem_ssn2", member.getSsn2());
dataMap.put("mem_zipcode", member.getZipcode());
dataMap.put("mem_address1", member.getAddress1());
dataMap.put("mem_address2", member.getAddress2());
dataMap.put("mem_address3", member.getAddress3());
return sqlsession.insert("Member.join", dataMap);
}
public MemberDTO login(MemberDTO member) {
HashMap<String, String> dataMap = new HashMap();
dataMap.put("mem_userid", member.getUserid());
dataMap.put("mem_userpw", member.getUserpw());
dataMap = sqlsession.selectOne("Member.login", dataMap);
if(dataMap != null) {
member.setIdx(Integer.parseInt(String.valueOf(dataMap.get("mem_idx"))));
member.setUserid(dataMap.get("mem_userid"));
member.setUsername(dataMap.get("mem_name"));
return member;
}
return null;
}
}
member.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Member">
<select id="login" parameterType="map" resultType="map">
select mem_idx, mem_userid, mem_name from tb_member where mem_userid=#{mem_userid} and mem_userpw=#{mem_userpw};
</select>
<insert id="join" parameterType="map">
insert into tb_member (mem_userid, mem_userpw, mem_name, mem_hp, mem_email, mem_hobby, mem_ssn1, mem_ssn2, mem_zipcode, mem_address1, mem_address2, mem_address3) values (#{mem_userid}, #{mem_userpw}, #{mem_name}, #{mem_hp}, #{mem_email} ,#{mem_hobby} ,#{mem_ssn1} ,#{mem_ssn2} ,#{mem_zipcode} ,#{mem_address1} ,#{mem_address2} ,#{mem_address3});
</insert>
</mapper>
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회원가입</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="./js/regist.js"></script>
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
function sample6_execDaumPostcode() {
new daum.Postcode({
oncomplete: function(data) {
// 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
// 각 주소의 노출 규칙에 따라 주소를 조합한다.
// 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
var addr = ''; // 주소 변수
var extraAddr = ''; // 참고항목 변수
//사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
addr = data.roadAddress;
} else { // 사용자가 지번 주소를 선택했을 경우(J)
addr = data.jibunAddress;
}
// 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
if(data.userSelectedType === 'R'){
// 법정동명이 있을 경우 추가한다. (법정리는 제외)
// 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
extraAddr += data.bname;
}
// 건물명이 있고, 공동주택일 경우 추가한다.
if(data.buildingName !== '' && data.apartment === 'Y'){
extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
}
// 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
if(extraAddr !== ''){
extraAddr = ' (' + extraAddr + ')';
}
// 조합된 참고항목을 해당 필드에 넣는다.
document.getElementById("sample6_extraAddress").value = extraAddr;
} else {
document.getElementById("sample6_extraAddress").value = '';
}
// 우편번호와 주소 정보를 해당 필드에 넣는다.
document.getElementById('sample6_postcode').value = data.zonecode;
document.getElementById("sample6_address").value = addr;
// 커서를 상세주소 필드로 이동한다.
document.getElementById("sample6_detailAddress").focus();
}
}).open();
}
</script>
</head>
<body>
<h2>회원가입</h2>
<form action="./regist_ok.jsp" method="post" name="regform" id="regform" onsubmit="return sendit()">
<input type="hidden" name="isidcheck" id="isidcheck" value="n">
<input type="hidden" name="isssn" id="isssn" value="n">
<p>아이디 : <input type="text" name="userid" id="userid" maxlength="20">
<input type="button" id="btnIdCheck" value="아이디 중복제거"></p>
<p id="idcheckmsg"></p>
<p>비밀번호 : <input type="password" name="userpw" id="userpw" maxlength="20"></p>
<p>비밀번호 확인 : <input type="password" name="userpw_re" id="userpw_re" maxlength="20"></p>
<p>이름 : <input type="text" name="name" id="name"></p>
<p>휴대폰 번호 : <input type="text" name="hp" id="hp"></p>
<p>이메일 : <input type="text" name="email" id="email"></p>
<p>취미 :
<label>드라이브<input type="checkbox" name="hobby" value="드라이브"></label>
<label>영화감상<input type="checkbox" name="hobby" value="영화감상"></label>
<label>쇼핑<input type="checkbox" name="hobby" value="쇼핑"></label>
<label>게임<input type="checkbox" name="hobby" value="게임"></label>
<label>운동<input type="checkbox" name="hobby" value="운동"></label>
</p>
<p>주민등록번호 : <input type="text" name="ssn1" id="ssn1" maxlength="6" onkeyup="moveFocus()" onkeydown="ssnChange()"> - <input type="text" name="ssn2" id="ssn2" maxlength="7" onkeydown="ssnChange()"> <input type="button" value="주민등록번호 검증" onclick="ssnCheck()"></p>
<p>우편번호 : <input type="text" name="zipcode" id="sample6_postcode"> <input type="button" value="우편번호 검색" onclick="sample6_execDaumPostcode()"></p>
<p>주소 : <input type="text" name="address1" id="sample6_address"></p>
<p>상세주소 : <input type="text" name="address2" id="sample6_detailAddress"></p>
<p>참고항목 : <input type="text" name="address3" id="sample6_extraAddress"></p>
<p><input type="submit" value="가입완료"> <input type="reset" value="다시작성"> <input type="button" value="로그인" onclick="location.href='./2_login.jsp'"></p>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean class="com.koreait.member.MemberDTO" id="member"/>
<jsp:setProperty property="*" name="member"/>
<jsp:setProperty property="username" param="name" name="member"/>
<jsp:useBean class="com.koreait.member.MemberDAO" id="memberDAO"/>
<%
if(memberDAO.join(member) == 1){
%>
<script>
alert('회원가입 완료 되었습니다.');
location.href='login.jsp';
</script>
<%
}else{
%>
<script>
alert('회원가입 실패 되었습니다.');
history.back();
</script>
<%
}
%>
MemberDAO에서 join() 함수를 호출하여 DTO에서 받은 member을 매개변수로 넣어준다.
MemberDAO의 join에서는 map 형식으로 데이터를 받은 전부를 member.xml의 쿼리문에 넣어주어 쿼리 결과를 리턴받게된다. insert, update, delete이 성공했을때 리턴값으로 1을 리턴하게된다. 따라서 register_ok.jsp에서 memberDAO.join(member)가 1일 경우 회원가입 성공 alert문이 작동하게되는 것이다.