JSP

JSP무작정 해보기 - 게시판 만들기 - DB 만들기, DB 연동, 로그인 함수

3년안에 내집 마련 2019. 11. 3. 18:43
반응형

저번 시간에 Login.jsp 페이지까지 만들었다.

이번 시간에는 회원가입 후 DB에 저장하기 위한 작업을 해보도록 하겠다.

우선 MYSQL을 키고 비밀번호를 입력한다.

 

그 후 회원가입 정보를 저장할 DB를 만든다.

CREATE DATABASE DB명;

다음과 같은 명령어를 입력하여 DB를 만든다. 나 같은 경우에는 JSP로 만들었다.

다음과 같이 만들고 SHOW DATABASES;를 입력하여 만들어진 DB를 확인한다.

 

SHOW DATABASES; 결과

다음과 같이 jsp라는 데이터 베이스가 생성된 걸 확인할 수 있다.

이제 jsp 파일을 사용하자

USE JSP;

use JSP; 라는 명령어를 이용하여 jsp를 사용한다.

다음으로는 jsp에 테이블을 생성하려고 한다.

create table USER(usrID varchar(20), userPassword varchar(20), userName varchar(20), userGender varchar(20), userEmail varchar(50), Primary key (userID));

 

create table이라는 명령어는 테이블을 만드는 명령어다.

테이블 안에는 회원가입으로 받을 값을 입력해주면 된다.

우선 user라는 테이블을 만든 뒤 user 테이블 안에 컬럼으로 사용할 것들을 적어준다.

˙ userID = 사용자로부터 받을 ID, 문자형으로 만들었음(20 글자)

˙ usePassword= 사용자로부터 받을 Password, 문자형으로 만들었음(20 글자)

˙ userName = 사용자로부터 받을 Name, 문자형으로 만들었음(20글자)

˙ userGender = 사용자로부터 받을 성별 문자형으로 만들었음(20글자)

˙ userEmail = 사용자로부터 받을 Email, 문자형으로 만들었음(50글자)

˙ Prumary key (userID) = ID가 겹치지 않게 하기 위해 userID에 Primary key 설정

 

다음과 같이 만들었다면 desc 명령어를 통해 한번 제대로 들어 갔는지 확인해 준다.

DESC user;

다음과 같이 만들어지면 된다.

이제 user라는 테이블 안에 값을 집어 넣어보자

INSERT INTO USER(userID, userPassword,userName,userGender, userEmail) VALUES('ID 값','비밀번호 값','이름 값','성별 값', 'Email 값');

다음과 같이 해서 값을 집어 넣은 후 SELECT * FROM USER; 를 입력해서 값이 제대로 들어갔는지 확인한다.

이렇게 되면 MYSQL의 기본 설정은 끝났다.

다음으로 eclipse에 들어가 Java Resources에 user라는 패키지를 만들어 준다.

user 패키지 만들기

Java Resources 오른쪽 마우스 클릭 -> new -> package 클릭 후 다음과 같이 user라는 패키지를 만들어 준다.

다음으로 User클래스를 만들어준다.

User 클래스 만들기

Java Resources 오른쪽 마우스 클릭 -> new -> class 클릭후 User라는 클래스를 만들어준다.

다음과 같이 클래스를 만든 후 DB에 만들었던 Field 명과 동일하게 변수를 만들어준다.

package user;

public class User {
	//db에 만들었던 Field 명과 변수명 그대로 만들기
	public String userID;
	public String userPassword;
	public String userName;
	public String userGender;
	public String userEmail;
	

만약 나와 동일하게 Field명을 입력하면 다음과 같이 작성하면 된다.

변수 초기화

다음으로 초기화를 위해 다음과 같이 작업을 해준다.

다음과 같이 select all을 선탤 후 Generate 버튼을 누르면

	public String getUserID() {
		return userID;
	}
	public void setUserID(String userID) {
		this.userID = userID;
	}
	public String getUserPassword() {
		return userPassword;
	}
	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserGender() {
		return userGender;
	}
	public void setUserGender(String userGender) {
		this.userGender = userGender;
	}
	public String getUserEmail() {
		return userEmail;
	}
	public void setUserEmail(String userEmail) {
		this.userEmail = userEmail;
	}

다음과 같은 코드가 작성된다.

DB 접근 객체 만들기

다음과 같이 작성하면 다음으로 DB 접근객체(DB 정보의 접근 및 정보를 집어 넣기 위한 객체)를 만들어보자

user package안에 userDAO라는 class를 만들어 주면 된다.

그 후 다음과 같이 코드를 입력해준다.

public class userDAO { 

	private Connection conn; 
	private PreparedStatement pstmt; 
	private ResultSet rs; 

 

˙ private Connection conn = DB 접속을 위해 만든 객체
˙ private PreparedStatement pstmt = sql injection 등 공격을 막기 위해 사용자에게 변수에 값만 받아서 구문을 실행함
˙ private ResultSet rs = SQL문 수행 후 그 결과를 담는 객체

DB에 연결하기 위한 코드 작성

다음과 같이 입력 후 DB 연결을 위한 코드를 작성해 준다.

public userDAO() {
		//try catch 문을 통해 예외 처리
		try {
			String dbURL = "jdbc:mysql://localhost:8181/JSP";
			String dbID = "DB ID";
			String dbPassword = "DB 비밀번호";
			Class.forName("com.mysql.jdbc.Driver");  
			conn = DriverManager.getConnection(dbURL,dbID,dbPassword);
		} catch(Exception e) {
			e.printStackTrace(); 
		}
	}
˙ try{} catch(Exception e){} = try catch문을 통해 예외 처리

˙ String dbURL = 연결할 DB, 만약 정확한 URL을 적어넣고도 에러가 발생한다면?serverTimezone=UTC를 입력해준다.
  (serverTimezone 사용 이유 : MySQL JDBC Driver 5.1.X 버전 이후 버전부터 ‘KST’ 타임존을 인식불가로 인한 오류 발생.)

˙ String dbID =  DB 처음 접속 시 만든 ID

˙ String dbPassword =  DB 처음 접속 시 만든 Password

˙ Class.forName("com.mysql.jdbc.Driver") = mysql driver를 찾기 위해 작성(mysql 접속을 위한 매개체)

˙ conn = DriverManager.getConnection(dbURL,dbID, dbPassword) =  DB의 접속하기 위한 코드

˙ e.printStackTrace = 만약 에러가 발생했을 시 무슨 에러가 발생했는지 알려줌

로그인 함수 만들기

다음과 같은 코드를 작성 한 후 로그인 함수를 만들어 준다.

public int login(String userID, String userPassword) {
		String sql = "SELECT userPassword FROM USER WHERE userID=?";
		try {
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, userID); 
			rs = pstmt.executeQuery();  
			if(rs.next()) {
				if(rs.getString(1).contentEquals(userPassword)) { 
					return 1; 
				}
				else 
					return 0; 
			}
			return -1; 
		} catch(Exception e) {
			e.printStackTrace();
		}
		return -2; 
	}
}
˙ String sql = "SELECT userPassword FROM USER WHERE userID = ?" = 로그인 함수 실행시 mysql에 입력할 sql문 입력
˙ pstmt = conn.prepareStatement(sql) = pstmt변수에 sql문을 집어 넣음
˙ pstmt.setString(1,userID) = sql문 중 첫번째 물음표에 userID를 집어 넣음
˙ rs = pstmt.executeQuery() = sql을 돌리고 그 결과를 rs라는 변수에 저장(executeQuery 같은 경우 결과 값을 숫자로 반환)
˙ if(rs.next()){ = 만약 아이디가 DB에 존재하는경우
˙ if(rs.getString(1).contentEqulas(userPassword)){ = 아이디에 해당하는 비밀번호가 일치하는 경우
˙ return 1 = 로그인 성공
˙ else return 0 = ID는 존재하지만 그에 맞는 패스워드가 틀림
˙ return -1 = 아이디도 DB에 존재하지 않는 경우
˙ return -2 = DB 오류

다음과 같이 입력하면 로그인 동작 함수까지 완성이 된다.

※ 전체적인 코드

package user;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

// db 접근 객체 실질적으로 db의 정보에 접근 or db에 정보를 집어넣기 위해 만듦
public class userDAO { 

	private Connection conn; // db에 접속을 위해 만든 객체
	private PreparedStatement pstmt; // sql injection 등 공격을 막기 위해 
	private ResultSet rs; // 어떠한 정보를 담기 위한 객체
	
	public userDAO() {
		//try catch 문을 통해 예외 처리
		try {
			String dbURL = "jdbc:mysql://localhost:3306/JSP?serverTimezone=UTC";
			String dbID = "DB ID";
			String dbPassword = "DB비밀번호";
			Class.forName("com.mysql.jdbc.Driver");  //mysql driver를 찾기 위해 작성(mysql 접속을 위한 매개체)
			conn = DriverManager.getConnection(dbURL,dbID,dbPassword);
		} catch(Exception e) {
			e.printStackTrace(); // 오류 발생시 오류가 무엇인지 알려줌
		}
	}
	public int login(String userID, String userPassword) {
		String sql = "SELECT userPassword FROM USER WHERE userID=?";
		try {
			pstmt = conn.prepareStatement(sql);  // pstmt변수에 sql문 집어넣기
			pstmt.setString(1, userID); // sql 문에서 ?에 해당하는 값에 userID를 집어넣음 첫번째 물음표일 경우 1 두번째 물음표이면 2이런식으로
			rs = pstmt.executeQuery();  // sql 수행결과를 rs에 저장(Boolean) 존재시 true 존재x = false
			if(rs.next()) {
				if(rs.getString(1).contentEquals(userPassword)) { // ?로 사용자에게 받은 ID와 비밀번호가 일치하는 경우
					return 1; // 로그인 성공
				}
				else 
					return 0; // Password 오류
			}// 만약 존재할시(true)
			return -1; // ID 오류
		} catch(Exception e) {
			e.printStackTrace();
		}
		return -2; // db 오류
	}
}
반응형