서블릿과 DB를 연동해서 ID 체크를 하고,
로그인 상태를 유지하는 예제다.
순서는 이렇다.
VO
public class MemberVO {
private String id;
private String pwd;
private String name;
private String email;
private Date regdate;
//Getter Setter 생략...
...
...
}
DAO
public class MemberDAO {
private Connection con;
private PreparedStatement pstmt;
private DataSource ds;
public boolean isExisted(MemberVO vo) {
boolean result = false;
String id = vo.getId();
String pwd = vo.getPwd();
try {
//db - servlet 연결
con = ds.getConnection();
//조회하는 ID가 있으면 'true', 없으면 'false' (as result는 레코드 이름)
String sql = "SELECT IF(COUNT(*) = 1 , 'true', 'false') AS RESULT"
+ " FROM t_member"
+" WHERE id = ? AND pwd = ?";
//SQL문을 PrepareStatement에 등록하고 각각의 자리(?)를 채운다.
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
//DB에 쿼리를 전송하고, 결과 값을 받는다.
ResultSet rs = pstmt.executeQuery();
rs.next(); //커서를 첫 번째 레코드에 위치한다.
//'result'라는 레코드의 값을 boolean으로 변환
result = Boolean.parseBoolean(rs.getString("result"));
System.out.println("result : " + result);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
LoginServlet
WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//로그인한 아이디와 비밀번호 정보를 가져온다.
String id = request.getParameter("id");
String pwd = request.getParameter("password");
MemberVO vo = new MemberVO();
MemberDAO dao = new MemberDAO();
boolean result = false;
//vo객체에 id, pw를 저장
vo.setId(id);
vo.setPwd(pwd);
//해당 id가 있으면 ture를, 없으면 false를 반환한다.
result = dao.isExisted(vo);
if(result) {
HttpSession session = request.getSession();
session.setAttribute("isLogOn", true); //세션에 isLogOn이라는 이름으로 true를 저장
session.setAttribute("login.id", id); //id와 pw를 세션에 저장.
session.setAttribute("login.pwd", pwd);
out.print("<html><body><h1>안녕하세요 "+id+"님!</h1><br><h3><a href='/show'>회원정보</a></h3></body></html>");
} else {
out.print("<html><body><h1>아이디가 틀립니다.</h1><br><h3><a href='/login.html'>다시</a></h3></body></html>");
}
}
}
ShowMember.java
@WebServlet("/show")
public class ShowMember extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String id = "", pwd = "";
Boolean isLogOn = false;
//이미 세션이 존재하면 세션을 반환, 없으면 null.
HttpSession session = request.getSession(false);
if(session != null) { //세션이 생성 됐는지 확인
//LogOn속성을 가져와 로그인상태 확인
isLogOn = (Boolean)session.getAttribute("isLogOn");
if(isLogOn) {
//Session에서 id와 pwd값을 가져온다.
id = (String)session.getAttribute("login.id");
pwd = (String)session.getAttribute("login.pwd");
out.print("<html><body>아이디 : "+id+"<br>비밀번호 : "+pwd+"</body></html>");
} else {
response.sendRedirect("/login.html");
}
} else {
response.sendRedirect("/login.html");
}
}
}
책 예제에서는 DB가 ORACLE이어서 DECODE()함수를 썼다.
MYSQL에서는 IF()로 비슷한 결과물을 얻을 수 있었다.
우선 책 예제에는 oracle의 decode()를 썼따.
-- ORACLE
SELECT DECODE(COUNT(*), 1, 'true', 'false') as result
from t_member
where id = 'hong'
and pwd = '1234';
where조건절에서 검색한 결과의 개수가 1이라면 'true'를 아니면 'false'를 result라는 레코드에 담아서 반환하는 쿼리문이다.
MySQL IF()함수로 써서 바꿔보면 이렇다.
-- MySQL
SELECT IF(COUNT(*) = 1, 'true', 'false') as result
from t_member
where id ='hong';
result라는 레코드로 true를 반환했다.
우선 '=='가 아니라 '='라는 것에 주의해야 한다.
이 쿼리의 결과물은 decode()를 이용한 결과와 같다.
id가 pk이므로 pwd까지 굳이 조회할 필요가 없어서 pwd를 조건 검사하는 절은 뺐다.