HTML 코드와 브라우저에 출력되는 화면은 아래와 같다.
<!DOCTYPE html>
<html lang="kr">
<head>
<meta charset="UTF-8">
<title>회원가입</title>
<!-- 부트스트랩 CDN 추가 -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<h2>회원가입</h2>
<form action="/hackthebox/signup" method="post">
<div class="form-group">
<label for="username">아이디:</label>
<input type="text" class="form-control" id="username" placeholder="아이디를 입력하세요" name="user_id" required>
</div>
<div class="form-group">
<label for="name">이름:</label>
<input type="text" class="form-control" id="name" placeholder="이름을 입력하세요" name="name" required>
</div>
<div class="form-group">
<label for="password">비밀번호:</label>
<input type="password" class="form-control" id="password" placeholder="비밀번호를 입력하세요" name="password" required>
</div>
<div class="form-group">
<label for="address">주소:</label>
<input type="text" class="form-control" id="address" placeholder="주소를 입력하세요 (ex.경기도 파주시)" name="address" required>
</div>
<button type="submit" class="btn btn-primary">회원가입</button>
</form>
</div>
<!-- 부트스트랩 JS CDN 추가 -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
</body>
</html>
회원가입 컨트롤러 코드, 그리고 코드 흐름 설명은 아래와 같다.
한글 데이터 Insert
할 때 글자가 깨지는 것을 방지하고 req.setCharacterEncoding("utf-8");
메서드를 사용했다. 회원가입 form
에서 받아온 파라미터들을 getParameter
메서드로 각각의 변수에 담는다. 이후 UserVO
객체에 데이터를 다믄 후 UserDAO
객체의 UserInsert
메서드를 사용해 DB에 데이터를 Insert
한다. 성공적으로 데이터가 Insert
되었으면 UserInsert
메서드는 1을 리턴하고 그렇지 않다면 0을 리턴한다. 따라서 리턴 결과에 따라 board.html
페이지로 리다이렉션 되거나 Insert Error
를 발생시킨다. 이 에러는 후에 자바스크립트를 사용해 alert
을 띄울 것이다.
@WebServlet("/signup")
public class UserInsertController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String user_id = req.getParameter("user_id");
String name = req.getParameter("name");
String password = req.getParameter("password");
String address = req.getParameter("address");
UserVO uservo = new UserVO();
uservo.setUser_id(user_id);
uservo.setName(name);
uservo.setPassword(password);
uservo.setAddress(address);
UserDAO userdao = new UserDAO();
int result = userdao.UserInsert(uservo);
if (result > 0) {
resp.sendRedirect("/hackthebox/board.html");
} else {
throw new ServletException("Insert Error");
}
}
}
UserInsert
코드는 아래와 같고 코드 흐름은 주석을 참고한다.
public class UserDAO {
private Connection conn; // DB Connection 객체
private PreparedStatement ps; // SQL문 질의 객체
private ResultSet rs; // DB에서 리턴받는 데이터 객체
// 데이터베이스 연결 객체 생성 (Connection)
public void getConnect() {
// 데이터베이스 접속 URL
String URL = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "inmo";
String password = "inmo";
// Driver Loading
try {
// 동적로딩 (실행지점에서 객체를 생성하는 방법)
// 동적로딩 방법 -> 드라이버 클래스를 메모리에 로딩한다.
Class.forName("oracle.jdbc.driver.OracleDriver");
// Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(URL, user, password); // 커넥션 연결
/*
1. 빌드 후 실행하면 com.mysql.jdbc.Driver or oracle.jdbc.driver.OracleDriver class 찾아 메모리에 클래스를 로딩한다.
2. DriverManager와 Driver가 내부적으로 연결된다.
3. getConnection() 실행하여 DB에 접속을 시도한다.
4. 접속이 완료되면 Connection 객체를 conn (Connection Type) 변수에 담는다.
*/
} catch (Exception e) {
e.printStackTrace();
}
} // getConnect()
// 회원저장 동작 (Insert)
public int UserInsert(UserVO vo) {
String SQL = "INSERT INTO users(user_id, name, password, address) VALUES(?, ?, ?, ?)"; // Oracle query
getConnect(); // Connecrtion 객체 생성
int cnt = -1;
try {
ps = conn.prepareStatement(SQL); // 불완전한 SQL문을 전송해 미리 컴파일을 시킨다. (미리 컴파일을 시켰기에 속도가 빠르다)
ps.setString(1, vo.getUser_id());
ps.setString(2, vo.getName());
ps.setString(3, vo.getPassword());
ps.setString(4, vo.getAddress());
cnt = ps.executeUpdate();// 전송(SQL 실행) -> // 정상적으로 Insert 되었다면 성공한 행은 1개이므로 1이 리턴된다. Insert 실패하면 0을 리턴한다.
} catch (Exception e) {
e.printStackTrace();
} finally {
dbClose();
}
return cnt; // 1 or 0
} // UserInsert()
public void dbClose() {
try {
// if (rs != null) rs.close();
if (ps != null) ps.close();
if (conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}