본문 바로가기
공부/database

2022.01.23 - 로그인, 회원가입 구현

by 기묜몬 2022. 2. 15.

** 1월에 작성했던 글

(1) 로그인, 회원가입을 위한 userexp 테이블 생성 

 

CREATE TABLE userexp(

 id varchar2(30),

 pass varchar2(30),

 name varchar2(30),

 auth varchar2(30),

 point NUMBER 

);

INSERT INTO userexp VALUES ('himan','7777','홍길동','관리자',4000);

 SELECT * FROM userexp;

 

-- > 아이디, 비밀번호 찾는 조건문

--> dao sql 문 삽입시 ' ' 부분은 ?로 입력

SELECT * FROM userexp 

WHERE id = 'himan'

AND pass = '7777';

 

 

(2) vo 객체 생성 


public class Userexp {
	private String id;
	private String pass;
	private String name;
	private String auth;
	private int point;
	public Userexp() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Userexp(String id, String pass, String name, String auth, int point) {
		super();
		this.id = id;
		this.pass = pass;
		this.name = name;
		this.auth = auth;
		this.point = point;
	}
	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;
	}
	public String getAuth() {
		return auth;
	}
	public void setAuth(String auth) {
		this.auth = auth;
	}
	public int getPoint() {
		return point;
	}
	public void setPoint(int point) {
		this.point = point;
	}
	

}

 

(3) dao 작성

(Data Access Object)

 - 데이터베이스 접근 객체의 약어로써 DB와 Java파일을 연결해주는 jdbc 드라이버를 실행시켜 DB에서 회원 정보를 불러오거나 DB에 회원 정보를 넣고자 할 때 사용 

 - JSP에서 회원 DB 테이블에 접근할 수 있도록 DAO 클래스를 정의함

--> jdbc 연결 메서드 

public class A01_Dao2 {
	private Connection con;
	private Statement stmt;
	private PreparedStatement pstmt;
	private ResultSet rs; 
	// 2. 공통 메서드 선언(setConn())
	public void setConn() throws SQLException {
		// 1) 드라이버 연결
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			System.out.println("예외 처리:"+e.getMessage());
		}
		// 2) 특정 서버 연결
		String info = "jdbc:oracle:thin:@146.56.185.62:1521:xe";
		con = DriverManager.getConnection(info,"hydba","1111");
		System.out.println("접속 성공");
	}
	void closeRsc() {
		if(rs!=null) { 
			try {
				rs.close();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} 
		}
		if(pstmt!=null) { 
			try {
				pstmt.close();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} 
		}		
		if(stmt!=null) { 
			try {
				stmt.close();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} 
		}
		if(con!=null) { 
			try {
				con.close();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} 
		}		
	}

 

 

--> login 메서드생성 

public Userexp login(String id, String pass) {
		Userexp u = null;
		String sql = "select * \r\n"
				+ "from userexp \r\n"
				+ "where id=? and pass = ? ";
		try {
			setConn();
			pstmt=con.prepareStatement(sql);
			pstmt.setString(1,id);
			pstmt.setString(2, pass);
			rs=pstmt.executeQuery();
			if( rs.next() ) {
				u = new Userexp(rs.getString("id"),rs.getString("pass"),
						rs.getString("name"),rs.getString("auth"),rs.getInt("point"));
						
			}
			rs.close();
			pstmt.close();
			con.close();
			} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println(e.getMessage());
			closeRsc();
		}
		return u;
	}

- pstmt ~ : preparedstatement에 어떠한 정해진 SQL문장을 DB 삽입하는 형식으로 인스턴스를 가져온다.

- preparedstatement : DBMS의 캐시에 준비되어있는 쿼리를 사용한다는 의미, SQL injection 같은 해킹 기법을 방어하기 위해 사용.

- pstmt.setString(1, id) :  

하나의 sql 문장을 준비하고, 문장에 물음표를 넣고,

나중에 물음표에 해당하는 내용으로 id,pass를 넣어준다. 

즉, 매개변수로 넘어온 id,pass 를 물음표에 들어갈 수 있도록 하여 실제로 db에 접속을 시도하고자 하는 사용자의 id,pass를 입력받아

 존재 유무를 파악한다. 

- rs.getString("id") : 쿼리를 실행한 결과를 rs에 저장 

 

 

(4) jsp 작성 

<%
	String id = request.getParameter("id");
	String pass = request.getParameter("pass");
	//System.out.println("id:"+id);
	
	//db를 통해 login이 생성되어있는지 여부 확인을 위해 boolean 선언 .. 
	String call="init";
	if(id!=null){
		//id가 null이 아닐때, 아이디를 입력해서 로그인한 화면일때 db처리 
		call="login";
		//DB처리 할 수 있게 A01_Dao2 dao = new A01_Dao2(); 선언 
		A01_Dao2 dao = new A01_Dao2();
		//해당하는 데이터가 있으면 Userexp 객체를 할당. 
		Userexp u = dao.login(id,pass);
		if(u!=null){
			call="success";
			session.setAttribute("user",u);
			// 로그인 성공시 세션을 활용할 수 있다. 
		}else{
			call="fail";
		}
	}
%>
//
	$(document).ready(function(){
		//java의 변수를 js로 처리하기 
		var call="<%=call%>";
		if(call=="success"){
			alert("로그인 성공");
			location.href="userexp_main.jsp";
		}
		if (call=="fail"){
			alert("로그인 실패. \n 다시 로그인 하세요!!")
			$("[name=id]").focus();
		}
		$("#logBtn").click(function(){
			var id = $("[name=id]").val();
			var pass = $("[name=pass]").val();
			if(id!="" && pass!=""){
				$("form").submit();
			}else{
				alert("아이디나 비밀번호를 입력하세요.");
			}
		});
	});
</script>
</head>
<body>
	<h3>로그인</h3>
	<form method="post">
	<table>
		<tr><th>아이디</th><td><input type="text" name="id"/></td></tr>
		<tr><th>비밀번호</th><td><input type="password" name="pass"/></td></tr>
		<tr><td colspan="2"><input type="button" id="logBtn" value="로그인"/></td></tr>
		<tr><td colspan="2" onclick="location.href='userexp_reg.jsp'">회원가입</td></tr>
	</table>
	</form>
</body>
</html>

 

 

 

[기타 오류 점검]

$("#delBtn").click(function(){

if(confrim("삭제하시겠습니까?")){

$("[name=proc]").val("del");

$("form").submit();

}

});

 

와씨 이부부분에서 계속 "프로퍼티 [id]을(를) 찾을 수 없습니다." 오류가 났는데 알고보니 

delBtn앞에 아이디 선언해주는 #입력 안해서 오류뜸.. 진짜 ㅋㅋㅋㅋㅋ욕나옴