회원가입 기능
Create table users(
id varchar2(20) primary key,
password varchar2(20),
name varchar2(10)
);
<user.sql>
사용자 정보를 저장하는 테이블을 생성하였다. 세부 기능을 만들기 전이라 일단 간단하게 id, password, 이름 정도만 저장하도록 하였다.
package vo;
public class User {
private String id;
private String pass;
private String name;
public User(String id, String pass, String name){this.id = id; this.pass = pass; this.name = name;}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<user.java>
User class를 만들어 각 항목에 대해 getter와 setter를 생성하였다.
package dao;
import static com.smc.db.JdbcUtil.*;
import java.sql.*;
import org.springframework.stereotype.Repository;
import vo.User;
@Repository
public class UserDAO {
Connection con;
private static UserDAO uDAO;
public void setConnection(Connection con) { this.con = con;}
public static UserDAO getInstance() {
if(uDAO==null) uDAO = new UserDAO();
return uDAO;
}
public int sign_up(User user) {
PreparedStatement pstmt = null;
int insertCount = 0;
String Sql = "";
try {
Sql = "INSERT INTO Users values(?,?,?)";
pstmt = con.prepareStatement(Sql);
pstmt.setString(1, user.getId());
pstmt.setString(2,user.getPass());
pstmt.setString(3, user.getName());
insertCount = pstmt.executeUpdate();
}catch(SQLIntegrityConstraintViolationException e){
System.out.println("중복된 아이디가 있습니다");
e.printStackTrace();
return -1;
}catch(SQLException e) {
e.printStackTrace();
}finally {close(pstmt);}
return insertCount;
}
public boolean sign_in(User user){
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = con.prepareStatement("SELECT id,password FROM users where id = ?");
pstmt.setString(1, user.getId());
rs = pstmt.executeQuery();
if(rs.next()) {
if(rs.getString("password").equals(user.getPass())) {
return true;
}
else {
System.out.println("비밀번호가 일치하지 않습니다.");
return false;
}
}
else {System.out.println("등록된 아이디가 없습니다.");
return false;
}
} catch(SQLException e) {
e.printStackTrace();
}finally {close(rs); close(pstmt);}
return true;
}
public User getInformation(String id) {
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = con.prepareStatement("SELECT id,password,name FROM users where id = ?");
pstmt.setString(1, id);
rs = pstmt.executeQuery();
if(rs.next()) {
return new User(rs.getString("id"),rs.getString("password"),rs.getString("name"));
}
else {System.out.println("등록된 아이디가 없습니다.");
return new User(rs.getString("0000"),rs.getString("0000"),rs.getString("0000"));
}
} catch(SQLException e) {
e.printStackTrace();
}finally {close(rs); close(pstmt);}
return new User("0000","0000","0000");
}
}
<UserDAO.java>
회원가입을 담당하는 sign_up함수를 작성하였다. Insert문을 수행하는데, SQLIntegrityConstraintViolationException이 발생할 경우 차이점을 두기 위해 예외처리를 따로 하도록 작성하였다.
package service;
import static com.smc.db.JdbcUtil.*;
import org.springframework.stereotype.Service;
import java.sql.Connection;
import vo.User;
import dao.UserDAO;
@Service
public class SignUpService {
public UserDAO uDAO;
public int signup(User user) {
uDAO = UserDAO.getInstance();
Connection con = getConnection();
uDAO.setConnection(con);
int cnt = uDAO.sign_up(user);
int isSuccess = 0;
if(cnt>0) {commit(con); isSuccess = 1;}
else if(cnt==-1) {return -1;}
else rollback(con);
close(con);
return isSuccess;
}
}
<SignUpService.java>
connection을 DAO 객체에 할당하고, commit을 수행하는 서비스 함수를 작성하였다. 호출된 곳에 SQLIntegrityConstraintViolationException이 발생함을 알리기 위해서 여기도 기본 SQLException과는 차이점을 두었다.
package com.smc.test;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class UserSignUpController {
@RequestMapping(value = "/SignUp.chic" , method = {RequestMethod.GET, RequestMethod.POST})
public String view(HttpServletRequest request ,Model model) {
String result = "SignUp";
return result;
}
}
<UserSignUpController.java>
RequestMapping을 수행할 때 RequestMethod.POST만 사용하였는데도 불구하고 GET을 사용할 수 없다는 에러가 떠서 method에 두 개 다 명시하였다. 공부가 부족한 탓인 것 같다.
<%@ page import = "vo.User" %>
<%@ page import = "service.SignUpService" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입</title>
</head>
<body>
<form class = "User" action = "/test/SignUp.chic" method = "post">
<h3>회원가입</h3>
이름 : <input type = "text" name = "name" required = "required">
아이디 : <input type = "text" name = "id" required = "required">
비밀번호 : <input type = "text" name = "pass" required = "required">
<button class = "btn" type = "submit">회원가입</button>
<%
String name = request.getParameter("name");
String id = request.getParameter("id");
String pass = request.getParameter("pass");
SignUpService sus = new SignUpService();
if(id!=null){
int s = sus.signup(new User(id,pass,name));
if(s==1){
out.println("<script>");
out.println("alert('회원가입이 완료되었습니다.')");
out.println("location.href = '/test'");
out.println("</script>");
}
else if(s==-1){
out.println("<script>");
out.println("alert('동일한 아이디가 존재합니다.')");
out.println("location.href = 'SignUp.chic'");
out.println("</script>");
}
else{
out.println("<script>");
out.println("alert('회원가입에 실패하였습니다.')");
out.println("location.href = 'SignUp.chic'");
out.println("</script>");
}
}
%>
</form>
</body>
</html>
<SignUp.jsp>
input에 id, password, 이름을 입력하고 회원가입을 누르면 SignUpService에서 해당 정보를 가지고 DB에 삽입하는데, return 값에 따라 alert를 다르게하도록 하였다.
위와 같이 정보를 입력하고 회원가입을 누르면 DB에 값이 저장된다.
Select 문을 통해서 확인해볼 수 있다.