22.02.22 Web에서 JDBC 연동하기

최고고·2022년 2월 22일
0
post-custom-banner
  • webapp 디렉토리는 view페이지인 html, jsp, 외부, 이미지파일 등이 들어감

  • HTML은 단순히 값을 보낼때, 내용을 출력하기만할때

  • 자바코드 위주(데이터를주고받고 처리) 할 때 서블릿 사용(.java)

  • 요청 페이지에서 데이터를 가져오거나, 자바 코드를 이용해서 출력할 때 jsp 사용(.jsp)

웹에서 정보를 저장하기 위한 데이터베이스를 사용하기 - JDBC 연동

  1. 동적드라이버 연결
    JDBC 드라이버는 오라클이 설치된 디렉토리에서 얻어옴 :C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
    webapp\web_inf\lib 에 ojdbc6.jar파일을 끌어다 복사한다.
    =>자바와 DB를 연결할 때 사용하는 API가 들어있음

  2. 데이터베이스 연결
    Class.forname("oracle.driver.jdbc.OracleDriver"); 를 입력하고 try - catch문 생성해주기(데이터베이스 연결 전 필요한것 : 예외 처리 try~catch)
    url은 실제 DB위치 를 지정해주는 역할, id-db사용자아이디, pw-사용자pw
    Connection conn 객체 생성 - >DriverManager의 getConnection()메소드를 호출해준다 -> getConnection에 (url,id,pw) 담아주기

  3. sql문 준비 및 실행
    데이터베이스 연결준비가 끝나고, sql문 실행하기 위해 PreparedStatement 객체 생성해 conn에 접근 -> prepareStatement메소드 호출
    쿼리 실행시키는 메소드 호출
    -executeUpdate: insert, update, delete 테이블에 변화가 있고, 리턴값이 int형
    바인드변수(?)로 지정된 값에 setInt(?의 순서, 입력데이터), setString(?의 순서, 입력데이터)를 입력함
    -executeQuery: select 테이블에 변화없이 여러개의 레코드를 가져오는 테이블형태를 가져옴, 리턴값이 ResultSet---> 결과 값으로 여러개의 행을 출력하기 위해서 레코드 단위로 이동하는 next()메소드를 사용해야됨. 모든행에 접근하는 while문과 함께 사용!
    next()->커서의 최초 위치는 Before The First Row
    원하는 컬럼 값을 위해 사용하는 메소드는 컬럼의 데이터타입에 따라 다름 ex) getInt("컬럼명"or "컬럼인덱스번호"), getString("컬럼명"or "컬럼인덱스번호") 인덱스번호는 1부터시작!

  4. 마지막으로 연결 끊기
    열었던 순서와 반대로 역순으로 객체 닫아줘야됨
    rs-psmt-conn


회원가입 페이지 만들고, 회원정보를 DB에 넘기기

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<h1>회원가입 페이지</h1>
	<form action="joinCon" method="post">
		ID<input type="text" name="id"><br>
		PW<input type="password" name="pw"><br>
		NICK<input type="text" name="nick"><br>
		<input type="submit" value="회원가입">
	</form>
</body>
</html>

joinCon.java로 회원정보 전송

package com.example;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/joinCon")
public class joinCon extends HttpServlet {

	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("euc-kr");// post방식의 인코딩
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String nick = request.getParameter("nick"); 	//가져온 회원정보들
        
        

		// finally에서 쓸 전역변수 선언( 닫을때)
		
        Connection conn = null;
		PreparedStatement psmt = null;
		// 데이터베이스 연결 전 필요한것 : 예외 처리 try~catch
        
		try {
			// DB연결
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
			String dbid = "hr";
			String dbpw = "hr";
			conn = DriverManager.getConnection(url, dbid, dbpw);
			if (conn != null) {
				System.out.println("데이터베이스 연결 성공");
			} else {
				System.out.println("연결 실패");
			} //콘솔창으로 DB연결 여부 확인
            
            
			// sql문 준비 및 실행
			String sql = "insert into web_member values(?,?,?)";
            
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			psmt.setString(2, pw);
			psmt.setString(3, nick);
			// executeUpdate();->insert, update, delete: 테이블에 변화O 리턴값이 int형
			// executeQuery();-> select : 테이블에 영향이없다.
			int cnt = psmt.executeUpdate(); // 처리된 row값이 1
			if (cnt > 0) {
				System.out.println("회원가입 성공");
			} else {
				System.out.println("회원가입 실패");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 항상 해야할 것 : 열었던 것 종료 (연결 끊기-close();)
			// 열었던 순서와 반대로 마지막에 열었던 것을 먼저 닫음
			// psmt -> conn 순서로 닫아주기
			try {
				if (psmt != null) {
					psmt.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

}

로그인 실패or성공 페이지 만들기

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<h1>로그인 페이지</h1>
	<form action="logincheck" method="post">
		ID<input type="text" name="id"><br>
		PW<input type="password" name="pw"><br>
		<input type="submit" value="로그인">
	</form>
</body>
</html>

로그인했을 때 회원정보가 있는지 확인하기 위해 logincheck(JDBC) 서블릿 생성

package com.example;

import java.io.IOException;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/logincheck")
public class logincheck extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// post방식 인코딩
		request.setCharacterEncoding("euc-kr");

		// 1. ID,PW파라미터 수집
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");

		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		String nick = null;

		// DB에 내가 입력받은 ID,PW있는지 확인
		try {
			// 2-1 DB연결
			Class.forName("oracle.jdbc.driver.OracleDriver");
			// 해당 클래스 찾아가는 경로
			String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe"; // DB주소
			String dbid = "hr";
			String dbpw = "hr";

			conn = DriverManager.getConnection(url, dbid, dbpw);

			if (conn != null) {
				System.out.println("DB연결 성공");
			} else {
				System.out.println("DB연결 실패");
			}
			// 2-2 : SQL문 통해 id, pw 조회
			String sql = "select * from web_member where id=? and pw=?";
			// 작성한 sql문DB로 전달, 제대로 전달이 된다면 PreparedStatement 객체로 변환됨!
			psmt = conn.prepareStatement(sql);
			// ?에 수집한 파라미터 채우기 : ?-바인드변수
			psmt.setString(1, id);
			psmt.setString(2, pw);
			// sql문실행
			// executeUpdate : select구문 제외 전부. DB변화O,int형태로 리턴
			rs = psmt.executeQuery(); // DB변화x, 테이블형태 ResultSet형태로 리턴

			if (rs.next()) {
				// .next() :값이 있는지 확인해줌
//				id = rs.getString(1); 	
//				pw = rs.getString(2);	//id와 pw는 DB에서 가져오지않아도됨-주석처리
				nick = rs.getString("nick");
				// 컬럼 순서로 가져오거나, 특정 컬럼명을 지정해서 가지고올수있음
			}

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (psmt != null) {
					psmt.close();
				}
				if (conn != null) {
					conn.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		// 로그인 성공시 loginS.jsp로 페이지 이동
		// 로그인 실패시 loginF.jsp로 페이지 이동

		if (nick!=null) {
			System.out.println("로그인성공");
			response.sendRedirect("loginS.jsp?nick="+ URLEncoder.encode(nick, "EUC-KR"));
			//get방식으로 보냄-쿼리스트링 :주소에 데이터 값 같이 보냄, 변수안에 있는 키값을 보냄, 닉네임이 한글이면 인코딩해주기
		} else {
			System.out.println("로그인실패");
			response.sendRedirect("loginF.jsp");
		}

	}

}

로그인 성공시 loginS.jsp로 페이지 이동
--> 페이지 바로 이동시키는 sendRedirect 메소드사용
사용자의 닉네임 데이터를 보낼 때 주소에 데이터 값을 같이보내는 쿼리스트링방식으로 보냄(get방식)
로그인 실패시 loginF.jsp로 페이지 이동 jsp파일 생성하기

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<%
	String nick = request.getParameter("nick");
	//loginCheck에서 nick값을 쿼리스트링으로 받아옴
	%>
	<h1><%= nick %>님, 로그인에 성공했습니다</h1>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	<h1>아이디와 비밀번호를 확인해주세요</h1>
	<a href="login.html">돌아가기</a>
	
</body>
</html>
post-custom-banner

0개의 댓글