
Java Reousrces > user 에 UserDAO 클래스 생성하고, JDBC 연동을 해 줄 것이다.
DAO(Data Access Object) 클래스는 데이터베이스와 애플리케이션 간의 상호작용을 담당하는 객체. 주로 데이터베이스에 대한 CRUD(Create, Read, Update, Delete) 작업을 캡슐화하고, 데이터베이스 관련 코드를 분리하여 애플리케이션의 유지보수성을 높이는 데 사용됨.
1. MySQL 접속하기
먼저 데이터베이스 작업을 수행하기 위해 사용되는 주요 객체들 `Connection conn`, `PreparedStatement`, `ResultSet` 를 선언 해 주자.
package user;
public class UserDAO {
// MySQL 접속하기
private Connection conn;
private PreparedStatement psmt;
private ResultSet rs;
}

위 코드 써 주고
`Ctrl + Shift + O` 하면 자동 import 됨.
⚡ `Connection conn`
데이터베이스와의 연결을 열고, 이 연결을 통해 SQL 쿼리를 실행시킬 수 있게 도와주는 객체. 애플리케이션과 데이터베이스 간의 통신 채널을 제공한다.
`Connection conn`을 생성할 때는 아이디, 비밀번호, 경로(데이터베이스 URL)를 제공해야 한다.
`createStatement()` SQL 쿼리를 실행하기 위한 Statement 객체 생성.SQL 쿼리를 실행하기 위한 Statement 객체 생성.
`prepareStatement(String sql)` SQL 쿼리를 미리 컴파일하여 효율적으로 실행할 수 있는 PreparedStatement 생성.
⚡ `PreparedStatement psmt `
미리 컴파일된 SQL 쿼리를 나타내는 객체. 동적 파라미터가 포함된 SQL 문을 실행할 때 사용된다.
Statement와 달리 파라미터 바인딩 기능이 있어 SQL Injection 방지에 효과적이고, 성능도 더 좋다.
?로 동적 데이터를 바인딩하여 쿼리 작성.
같은 쿼리를 여러 번 실행할 경우 성능이 향상됨.
`setString(int parameterIndex, String value)` : SQL의 ?에 문자열 값 바인딩
`setInt(int parameterIndex, int value)` : 정수 값 바인딩
`executeQuery()` : SELECT 쿼리를 실행하여 ResultSet 반환
`executeUpdate()` : INSERT, UPDATE, DELETE 쿼리 실행
⚡ `ResultSet rs`
SQL 쿼리(주로 SELECT)의 결과를 나타내는 객체
데이터베이스에서 가져온 데이터를 행 단위로 순회하며 읽는다.
데이터베이스로부터 반환된 결과를 저장.
기본적으로 전방향(Forward-only)으로 탐색.
데이터를 한 행씩 읽으면서 열 값에 접근 가능.
`next()` : 다음 행으로 이동. 결과가 없으면 false 반환
`getInt(String columnLabel)` : 열 값을 정수로 반환
`getString(String columnLabel)` : 열 값을 문자열로 반환
`close()` : ResultSet 종료
여기까지 했으면 이제 MySQL 데이터베이스에 연결하기 위한 DAO 클래스의 생성자를 만들어 준다.
UserDAO는 데이터베이스 작업을 처리하는 객체로, 생성될 때 자동으로 MySQL 데이터베이스와의 연결을 설정한다.
package user;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class UserDAO {
// MySQL 접속하기
private Connection conn;
private PreparedStatement psmt;
private ResultSet rs;
// 생성자 만들기
public UserDAO() {
try {
String dbURL = "jdbc:mysql://localhost:3306/BBS";
String dbID = "root";
String dbPassword = "12341234";
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
} catch (Exception e) {
e.printStackTrace();
}
}
db URL, 루트, 비밀번호를 String 타입의 변수에 담아 준다.
⚡ `String dbURL = "jdbc:mysql://localhost:3306/BBS";`
- 데이터베이스 URL을 설정
`localhost` : 데이터베이스 서버가 현재 로컬 머신에서 실행 중임을 나타냄
`3306` : MySQL의 기본 포트 번호
`BBS` : 연결하려는 데이터베이스 이름
⚡ `String dbID = "root";`
- 데이터베이스 사용자 이름
여기서는 MySQL의 기본 사용자 root를 사용
⚡ `String dbPassword = "12341234";`
- 데이터베이스 사용자 비밀번호
데이터베이스에 로그인하기 위해 필요
⚡ `Class.forName("com.mysql.cj.jdbc.Driver");`
- MySQL JDBC 드라이버 로드
`JDBC` 드라이버는 데이터베이스와 Java 애플리케이션 간의 통신을 가능하게 하는 라이브러리
⚡ `conn = DriverManager.getConnection(dbURL, dbID, dbPassword);`
- `DriverManager`를 사용하여 데이터베이스와 연결
연결이 성공하면 Connection 객체가 conn 변수에 저장된다.
이 객체를 통해 데이터베이스 작업(SQL 실행)을 수행할 수 있다.
⚡ `catch (Exception e)`
드라이버 로드 실패, 데이터베이스 연결 실패, 또는 기타 오류 발생 시 예외를 잡아 처리
e.printStackTrace()로 오류 내용을 콘솔에 출력
2. 로그인 처리 로직 만들기
위에서는 이클립스랑 DB(MySQL)을 연결해 준 것이고, 여기서부터는 실제로 데이터베이스에서 데이터를 조회해서 이클립스로 가지고 오는 로직이다. 로그인 요청을 처리하는 login() 메서드는 `userID`와 `userPassword`를 매개변수로 받아서 일치 여부를 데이터베이스에서 확인하여 로그인 성공 여부를 int형 값으로 반환한다.
// 로그인 처리 로직
public int login(String userID, String userPassword) {
// SQL 쿼리문 담기
// 뭐가 들어올 지 모르는 부분은 ?로 처리해 준다
String SQL = "SELECT userPassword FROM USER WHERE userID = ?";
// 예외 처리 필수
try {
psmt = conn.prepareStatement(SQL);
psmt.setString(1, userID);
rs = psmt.executeQuery();
if (rs.next()) {
if(rs.getString(1).equals(userPassword))
return 1; // 로그인 성공
else
return 0; // 비밀번호 불일치
}
return -1; // 아이디가 없음
} catch (Exception e) {
e.printStackTrace();
}
return -2; // db 오류
}
SQL문을 준비한 뒤에 conn객체의 prepareStatement에 매개변수로 전달해서 psmt 객체에 담아준다. 쿼리문에서 어떤 값이 들어올 지 모르기 때문에 물음표 기호 `?`를 써 주 었다. 이 부분을 바인딩 해 준다.
⚡ `psmt.setString(1, userID);`
SQL 문의 첫 번째 바인딩 변수 (?)에 userID 값을 설정
⚡ `rs = psmt.executeQuery();`
준비된 SQL 문을 실행하여 결과를 ResultSet 객체 rs에 저장, 이 객체는 쿼리 결과를 행(row) 단위로 접근
⚡ `if (rs.next())`
첫 번째 결과 행이 존재하는지 확인.
- 존재한다면: 해당 ID가 데이터베이스에 있음
- 존재하지 않는다면: 데이터베이스에 없는 ID (return -1)
rs.next() 란?
ResultSet 객체에서 다음 행(row)이 있는지 확인하는 메서드
반환값은 boolean 타입
- true: ResultSet에 다음 행이 존재하면 true를 반환하고, 커서(cursor)가 다음 행으로 이동.
- false: 다음 행이 없으면 false를 반환
비밀번호 검증
⚡ `rs.getString(1)` : 결과 행의 첫 번째 열(비밀번호) 가져오기
`if (rs.getString(1).equals(userPassword))`
- 비밀번호가 일치하면 return 1 (로그인 성공)
-비밀번호가 일치하지 않으면 return 0 (비밀번호 불일치)
rs.next()가 거짓일 경우, ID가 데이터베이스에 없는 상태로 판단 return -1 (아이디 없음)
`catch (Exception e)` : 데이터베이스 작업 중 오류가 발생하면 예외를 출력
예외 발생 시 -2를 반환하여 데이터베이스 오류 보고 return -2 (데이터베이스 오류)
3. MySQL DJBC Driver 연결
이제 MySQL 에서 JDBC Driver를 다운로드 해서 이클립스에 추가 해 줄 차례!
아래 mysql 공홈에서 Platform Independent로 다운 받고 압축 풀어 주기
https://dev.mysql.com/downloads/connector/j/
MySQL :: Download Connector/J
MySQL Connector/J is the official JDBC driver for MySQL. MySQL Connector/J 8.0 and higher is compatible with all MySQL versions starting with MySQL 5.7. Additionally, MySQL Connector/J 8.0 and higher supports the new X DevAPI for development with MySQL Ser
dev.mysql.com

압축 풀면 `mysql-connector-j`라는 jar파일이 생긴다.
이 파일을 복사해서 BBS > src > webapp > WEB-INF > lib 에 붙여넣기


이렇게 jar 파일이 라이브러리로 추가 된 모습을 확인 할 수 있다.
추가된 드라이버를 Build Path에도 추가 해 주어야 한다.
BBS 우클릭 > Properties > Java Build Path > Libraries > ClassPath > Add JARs 에 `mysql-connector` jar파일 연결 > OK


여기까지 JDBC 연결이 완료되었다.
4. `loginAction.jsp` 만들기
이제 로그인 요청에 대한 결과를 반환하고 사용자에게 보여주는 `loginAction.jsp` 페이지를 만들어 보자. 이 JSP 페이지까지 만들고 나서 실제로 로그인을 해 보면서 Eclipse와 DB 연결이 잘 되었는지 확인 해 볼 것이다.
현재 src 에 `index.html`, `login.jsp`만 만들어져 있는 상태이다. 저번에 만든 `login.jsp`에 들어가보면 form 태그의 action 속성으로 이미 loginAction을 추가 해 주었다.

`loginAction.jsp`에서 이루어지는 작업
사용자 입력 값 받기 -> 데이터베이스 연결 및 확인 -> 결과에 따라 처리
로그인 폼에서 전달된 사용자 ID와 비밀번호를 요청 파라미터로 받는다.
userID와 userPassword를 데이터베이스에서 확인하여 로그인 성공 여부를 판단한다.
로그인 성공, 비밀번호 불일치, 또는 사용자 정보 없음과 같은 상태에 따라 적절한 응답을 사용자에게 제공한다.
webapp 폴더 우클릭해서 new > loginAction.jsp 파일 생성해 주자.

index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 게시판 웹사이트</title>
</head>
<body>
<script>
location.href = 'login.jsp';
</script>
</body>
</html>
login.jsp
<link rel="stylesheet" href="css/bootstrap.css">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary">
<div class="container-fluid">
<a class="navbar-brand" href="#">JSP 웹사이트</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Home</a></li>
<li class="nav-item"><a class="nav-link" href="#">게시판</a></li>
<li class="nav-item dropdown ms-auto">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
접속하기
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item active" href="login.jsp">로그인</a></li>
<li><a class="dropdown-item" href="join.jsp">회원가입</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<div class="container">
<div class="row justify-content-center">
<div class="col-lg-4">
<div class="jumbotron" style="padding-top: 20px;">
<form method="post" action="loginAction.jsp">
<h3 style="text-align: center;">로그인화면</h3>
<div class="form-group">
<input type="text" class="form-control" placeholder="아이디" name="userID" maxlength="20">
</div>
<div class="form-group">
<input type="password" class="form-control" placeholder="비밀번호" name="userPassword" maxlength="20">
</div>
<input type="submit" class="btn btn-primary form-control" value="로그인">
</form>
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
loginAction.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="user.UserDAO" %>
<%@ page import="java.io.PrintWriter" %>
<% request.setCharacterEncoding("UTF-8"); %>
<jsp:useBean id="user" class="user.User" scope="page" />
<jsp:setProperty name="user" property="userID" />
<jsp:setProperty name="user" property="userPassword" />
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP 게시판 웹 사이트</title>
</head>
<body>
<%
UserDAO userDAO = new UserDAO();
int result = userDAO.login(user.getUserID(), user.getUserPassword());
if (result == 1) { // 로그인 성공!
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("location.href = 'main.jsp'");
script.println("</script>");
}
else if (result == 0) { // 비밀번호가 틀릴때
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('비밀번호가 틀립니다.')");
script.println("history.back()");
script.println("</script>");
}
else if (result == -1) { // 아이디가 존재하지 않을 때
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('존재하지 않는 아이디입니다.')");
script.println("</script>");
}
else if (result == -2) { // db오류
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('데이터베이스 오류가 발생했습니다.')");
script.println("</script>");
}
%>
</body>
</html>
참고로 위 코드블럭 들여쓰기 안맞는건 티스토리 문제입니다.
`<%@ %>` : 페이지 지시자 (Page Directive)
- JSP 페이지의 설정을 정의
- 페이지가 실행될 때 영향을 미치는 정보들을 말함.
- 페이지 인코딩, 사용하는 클래스, 콘텐츠 타입 등을 설정
`<% %>` : 스크립트릿 (Scriptlet)
- Java 코드를 JSP 파일에 직접 삽입
- 코드는 서버에서 실행, 클라이언트에게 HTML 형태로 반환됨.
`<jsp: />` : 태그 라이브러리 태그 (JSP Tag)
- 태그립
- 보통 JSP에서 제공하는 내장 태그 (라이브러리)나 사용자 정의 태그를 사용할 때 씀.
- Java 코드를 명시적으로 삽입하는 대신, 간결하고 쉽게 기능을 구현
- 여기서는 JSP 내장 태그인 `<jsp:useBean>`과 `<jsp:setProperty>`라는 걸 써서 user라는 Java Bean 객체를 생성하고 속성 값을 설정해 주었다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- JSP 페이지의 설정:
- 'language="java"': JSP 페이지에서 사용할 언어는 Java
- 'contentType="text/html; charset=UTF-8"': 페이지의 컨텐츠 유형은 HTML, 문자 인코딩은 UTF-8
- 'pageEncoding="UTF-8"': JSP 파일 소스 코드 인코딩을 UTF-8로 설정-->
<%@ page import="user.UserDAO" %>
<!-- 'user.UserDAO' 클래스를 JSP 페이지에서 사용할 수 있도록 import -->
<%@ page import="java.io.PrintWriter" %>
<!-- 'java.io.PrintWriter' 클래스를 import하여 HTML 출력을 할 때 사용 -->
<% request.setCharacterEncoding("UTF-8"); %>
<!-- 요청(request)의 문자 인코딩을 UTF-8로 설정,
사용자가 입력한 데이터가 UTF-8로 처리되도록 하는 것 -->
<jsp:useBean id="user" class="user.User" scope="page" />
<!-- 'user'라는 이름의 Java Bean 객체를 생성해서 JSP 페이지에서 사용할 수 있도록 함.
- 'class="user.User"': 'user.User' 클래스 타입으로 객체 생성
- 'scope="page"': 해당 페이지 내에서만 객체 사용 가능 -->
<jsp:setProperty name="user" property="userID" />
<!-- 'user' Java Bean 객체의 'userID' 속성에, 클라이언트로부터 전달된 'userID' 값을 설정-->
<jsp:setProperty name="user" property="userPassword" />
<!-- 'user' Java Bean 객체의 'userPassword' 속성에, 클라이언트로부터 전달된 'userPassword' 값을 설정 -->
<%
UserDAO userDAO = new UserDAO();
int result = userDAO.login(user.getUserID(), user.getUserPassword());
if (result == 1) { // 로그인 성공!
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("location.href = 'main.jsp'");
script.println("</script>");
}
else if (result == 0) { // 비밀번호가 틀릴때
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('비밀번호가 틀립니다.')");
script.println("</script>");
}
else if (result == -1) { // 아이디가 존재하지 않을 때
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('존재하지 않는 아이디입니다.')");
script.println("</script>");
}
else if (result == -2) { // db오류
PrintWriter script = response.getWriter();
script.println("<script>");
script.println("alert('데이터베이스 오류가 발생했습니다.')");
script.println("</script>");
}
%>
1. userDAO 객체 생성
2. userDAO의 login 메서드에 getter메서드로 가져온 userID랑 userPassword를 매개변수로 넣어서 로직 수행
3. 결과값은 1(로그인 성공), 0(로그인 실패 - 비밀번호 불일치), -1(아이디없음), -2(DB 연결 오류)
여기까지 했으면 다 했다. 이제 값이 잘 넘어가는지 테스트 해 볼 차례
프로젝트명 BBS > 우클릭 > Run As > Run on Server

아이디나 비번 아무거나 입력하기


존재하지 않는 아이디로 나오면 성공!
만약 DB 오류라는 알람창이 뜨면 실패한것
(JDBC 연결이 제대로 안된 것이기 때문에 Driver 연결이나 DB url, 유저id, 비밀번호 맞는지 오타는 없는지 확인해 주자)


이번에는 DB에 회원 등록이 되어있는 gildong 아이디에 일부러 비밀번호만 틀리게 입력
비밀번호가 틀리다고 나오면 DB 잘 연결된 것.
마지막으로 DB에 등록된 아이디와 비밀번호를 입력 해 주었을 때 404 에러가 뜨면 대성공이다.
아직 로그인 성공 화면 안 만들었기 때문에 404 에러 가 뜨는 것이다.

TMI
이거 만드는 건 한시간이면 하는데 블로그에 글 쓰는게 너무 오래걸림;;;;
로그인 메서드만들고 JDBC연결하던 도중에
계엄령 선포됐다는 뉴스를 봤는데
게시글 다 쓰고 나니까 비상계엄 해제 요구안이 가결됬다구 함....
포스팅 작업이 생각보다 노가다이다. 3시간이 걸리네
요즘 블로그 커스텀에 포스팅까지 허리와 눈이 넘나 아푸다.
'Spring&JSP' 카테고리의 다른 글
[JSP] 게시판 만들기 6 _ 회원가입 처리하기 (69) | 2024.12.04 |
---|---|
[JSP] 게시판 만들기 5 _ form태그와 input태그로 간단한 join.jsp 회원가입창 만들기 (68) | 2024.12.04 |
[JSP] 게시판 만들기 3 _ MySQL user 테이블 만들고, 이클립스에서 자바빈 만들기 (62) | 2024.12.03 |
[JSP] 게시판 만들기 2 _ 로그인 페이지 + 부트스트랩 + mySQL 다운로드 (62) | 2024.12.02 |
[JSP] 게시판 만들기 1 _ 이클립스 자바 웹 프로젝트 환경설정 (6) | 2024.12.01 |

Java Reousrces > user 에 UserDAO 클래스 생성하고, JDBC 연동을 해 줄 것이다.
DAO(Data Access Object) 클래스는 데이터베이스와 애플리케이션 간의 상호작용을 담당하는 객체. 주로 데이터베이스에 대한 CRUD(Create, Read, Update, Delete) 작업을 캡슐화하고, 데이터베이스 관련 코드를 분리하여 애플리케이션의 유지보수성을 높이는 데 사용됨.
1. MySQL 접속하기
먼저 데이터베이스 작업을 수행하기 위해 사용되는 주요 객체들 Connection conn
, PreparedStatement
, ResultSet
를 선언 해 주자.
package user; public class UserDAO { // MySQL 접속하기 private Connection conn; private PreparedStatement psmt; private ResultSet rs; }

위 코드 써 주고 Ctrl + Shift + O
하면 자동 import 됨.
⚡ Connection conn
데이터베이스와의 연결을 열고, 이 연결을 통해 SQL 쿼리를 실행시킬 수 있게 도와주는 객체. 애플리케이션과 데이터베이스 간의 통신 채널을 제공한다.
Connection conn
을 생성할 때는 아이디, 비밀번호, 경로(데이터베이스 URL)를 제공해야 한다.createStatement()
SQL 쿼리를 실행하기 위한 Statement 객체 생성.SQL 쿼리를 실행하기 위한 Statement 객체 생성. prepareStatement(String sql)
SQL 쿼리를 미리 컴파일하여 효율적으로 실행할 수 있는 PreparedStatement 생성.
⚡ PreparedStatement psmt
미리 컴파일된 SQL 쿼리를 나타내는 객체. 동적 파라미터가 포함된 SQL 문을 실행할 때 사용된다.
Statement와 달리 파라미터 바인딩 기능이 있어 SQL Injection 방지에 효과적이고, 성능도 더 좋다.
?로 동적 데이터를 바인딩하여 쿼리 작성.
같은 쿼리를 여러 번 실행할 경우 성능이 향상됨.
setString(int parameterIndex, String value)
: SQL의 ?에 문자열 값 바인딩setInt(int parameterIndex, int value)
: 정수 값 바인딩executeQuery()
: SELECT 쿼리를 실행하여 ResultSet 반환executeUpdate()
: INSERT, UPDATE, DELETE 쿼리 실행
⚡ ResultSet rs
SQL 쿼리(주로 SELECT)의 결과를 나타내는 객체
데이터베이스에서 가져온 데이터를 행 단위로 순회하며 읽는다.
데이터베이스로부터 반환된 결과를 저장.
기본적으로 전방향(Forward-only)으로 탐색.
데이터를 한 행씩 읽으면서 열 값에 접근 가능.
next()
: 다음 행으로 이동. 결과가 없으면 false 반환getInt(String columnLabel)
: 열 값을 정수로 반환getString(String columnLabel)
: 열 값을 문자열로 반환close()
: ResultSet 종료
여기까지 했으면 이제 MySQL 데이터베이스에 연결하기 위한 DAO 클래스의 생성자를 만들어 준다.
UserDAO는 데이터베이스 작업을 처리하는 객체로, 생성될 때 자동으로 MySQL 데이터베이스와의 연결을 설정한다.
package user; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class UserDAO { // MySQL 접속하기 private Connection conn; private PreparedStatement psmt; private ResultSet rs; // 생성자 만들기 public UserDAO() { try { String dbURL = "jdbc:mysql://localhost:3306/BBS"; String dbID = "root"; String dbPassword = "12341234"; Class.forName("com.mysql.cj.jdbc.Driver"); conn = DriverManager.getConnection(dbURL, dbID, dbPassword); } catch (Exception e) { e.printStackTrace(); } }
db URL, 루트, 비밀번호를 String 타입의 변수에 담아 준다.
⚡ String dbURL = "jdbc:mysql://localhost:3306/BBS";
- 데이터베이스 URL을 설정localhost
: 데이터베이스 서버가 현재 로컬 머신에서 실행 중임을 나타냄3306
: MySQL의 기본 포트 번호BBS
: 연결하려는 데이터베이스 이름
⚡ String dbID = "root";
- 데이터베이스 사용자 이름
여기서는 MySQL의 기본 사용자 root를 사용
⚡ String dbPassword = "12341234";
- 데이터베이스 사용자 비밀번호
데이터베이스에 로그인하기 위해 필요
⚡ Class.forName("com.mysql.cj.jdbc.Driver");
- MySQL JDBC 드라이버 로드JDBC
드라이버는 데이터베이스와 Java 애플리케이션 간의 통신을 가능하게 하는 라이브러리
⚡ conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
- DriverManager
를 사용하여 데이터베이스와 연결
연결이 성공하면 Connection 객체가 conn 변수에 저장된다.
이 객체를 통해 데이터베이스 작업(SQL 실행)을 수행할 수 있다.
⚡ catch (Exception e)
드라이버 로드 실패, 데이터베이스 연결 실패, 또는 기타 오류 발생 시 예외를 잡아 처리
e.printStackTrace()로 오류 내용을 콘솔에 출력
2. 로그인 처리 로직 만들기
위에서는 이클립스랑 DB(MySQL)을 연결해 준 것이고, 여기서부터는 실제로 데이터베이스에서 데이터를 조회해서 이클립스로 가지고 오는 로직이다. 로그인 요청을 처리하는 login() 메서드는 userID
와 userPassword
를 매개변수로 받아서 일치 여부를 데이터베이스에서 확인하여 로그인 성공 여부를 int형 값으로 반환한다.
// 로그인 처리 로직 public int login(String userID, String userPassword) { // SQL 쿼리문 담기 // 뭐가 들어올 지 모르는 부분은 ?로 처리해 준다 String SQL = "SELECT userPassword FROM USER WHERE userID = ?"; // 예외 처리 필수 try { psmt = conn.prepareStatement(SQL); psmt.setString(1, userID); rs = psmt.executeQuery(); if (rs.next()) { if(rs.getString(1).equals(userPassword)) return 1; // 로그인 성공 else return 0; // 비밀번호 불일치 } return -1; // 아이디가 없음 } catch (Exception e) { e.printStackTrace(); } return -2; // db 오류 }
SQL문을 준비한 뒤에 conn객체의 prepareStatement에 매개변수로 전달해서 psmt 객체에 담아준다. 쿼리문에서 어떤 값이 들어올 지 모르기 때문에 물음표 기호 ?
를 써 주 었다. 이 부분을 바인딩 해 준다.
⚡ psmt.setString(1, userID);
SQL 문의 첫 번째 바인딩 변수 (?)에 userID 값을 설정
⚡ rs = psmt.executeQuery();
준비된 SQL 문을 실행하여 결과를 ResultSet 객체 rs에 저장, 이 객체는 쿼리 결과를 행(row) 단위로 접근
⚡ if (rs.next())
첫 번째 결과 행이 존재하는지 확인.
- 존재한다면: 해당 ID가 데이터베이스에 있음
- 존재하지 않는다면: 데이터베이스에 없는 ID (return -1)
rs.next() 란?
ResultSet 객체에서 다음 행(row)이 있는지 확인하는 메서드
반환값은 boolean 타입
- true: ResultSet에 다음 행이 존재하면 true를 반환하고, 커서(cursor)가 다음 행으로 이동.
- false: 다음 행이 없으면 false를 반환
비밀번호 검증
⚡ rs.getString(1)
: 결과 행의 첫 번째 열(비밀번호) 가져오기if (rs.getString(1).equals(userPassword))
- 비밀번호가 일치하면 return 1 (로그인 성공)
-비밀번호가 일치하지 않으면 return 0 (비밀번호 불일치)
rs.next()가 거짓일 경우, ID가 데이터베이스에 없는 상태로 판단 return -1 (아이디 없음)catch (Exception e)
: 데이터베이스 작업 중 오류가 발생하면 예외를 출력
예외 발생 시 -2를 반환하여 데이터베이스 오류 보고 return -2 (데이터베이스 오류)
3. MySQL DJBC Driver 연결
이제 MySQL 에서 JDBC Driver를 다운로드 해서 이클립스에 추가 해 줄 차례!
아래 mysql 공홈에서 Platform Independent로 다운 받고 압축 풀어 주기
https://dev.mysql.com/downloads/connector/j/
MySQL :: Download Connector/J
MySQL Connector/J is the official JDBC driver for MySQL. MySQL Connector/J 8.0 and higher is compatible with all MySQL versions starting with MySQL 5.7. Additionally, MySQL Connector/J 8.0 and higher supports the new X DevAPI for development with MySQL Ser
dev.mysql.com

압축 풀면 mysql-connector-j
라는 jar파일이 생긴다.
이 파일을 복사해서 BBS > src > webapp > WEB-INF > lib 에 붙여넣기


이렇게 jar 파일이 라이브러리로 추가 된 모습을 확인 할 수 있다.
추가된 드라이버를 Build Path에도 추가 해 주어야 한다.
BBS 우클릭 > Properties > Java Build Path > Libraries > ClassPath > Add JARs 에 mysql-connector
jar파일 연결 > OK


여기까지 JDBC 연결이 완료되었다.
4. loginAction.jsp
만들기
이제 로그인 요청에 대한 결과를 반환하고 사용자에게 보여주는 loginAction.jsp
페이지를 만들어 보자. 이 JSP 페이지까지 만들고 나서 실제로 로그인을 해 보면서 Eclipse와 DB 연결이 잘 되었는지 확인 해 볼 것이다.
현재 src 에 index.html
, login.jsp
만 만들어져 있는 상태이다. 저번에 만든 login.jsp
에 들어가보면 form 태그의 action 속성으로 이미 loginAction을 추가 해 주었다.

loginAction.jsp
에서 이루어지는 작업
사용자 입력 값 받기 -> 데이터베이스 연결 및 확인 -> 결과에 따라 처리
로그인 폼에서 전달된 사용자 ID와 비밀번호를 요청 파라미터로 받는다.
userID와 userPassword를 데이터베이스에서 확인하여 로그인 성공 여부를 판단한다.
로그인 성공, 비밀번호 불일치, 또는 사용자 정보 없음과 같은 상태에 따라 적절한 응답을 사용자에게 제공한다.
webapp 폴더 우클릭해서 new > loginAction.jsp 파일 생성해 주자.

index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>JSP 게시판 웹사이트</title> </head> <body> <script> location.href = 'login.jsp'; </script> </body> </html>
login.jsp
<link rel="stylesheet" href="css/bootstrap.css"> <title>JSP 게시판 웹 사이트</title> </head> <body> <nav class="navbar navbar-expand-lg bg-body-tertiary"> <div class="container-fluid"> <a class="navbar-brand" href="#">JSP 웹사이트</a> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav"> <li class="nav-item"><a class="nav-link active" aria-current="page" href="#">Home</a></li> <li class="nav-item"><a class="nav-link" href="#">게시판</a></li> <li class="nav-item dropdown ms-auto"> <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false"> 접속하기 </a> <ul class="dropdown-menu"> <li><a class="dropdown-item active" href="login.jsp">로그인</a></li> <li><a class="dropdown-item" href="join.jsp">회원가입</a></li> </ul> </li> </ul> </div> </div> </nav> <div class="container"> <div class="row justify-content-center"> <div class="col-lg-4"> <div class="jumbotron" style="padding-top: 20px;"> <form method="post" action="loginAction.jsp"> <h3 style="text-align: center;">로그인화면</h3> <div class="form-group"> <input type="text" class="form-control" placeholder="아이디" name="userID" maxlength="20"> </div> <div class="form-group"> <input type="password" class="form-control" placeholder="비밀번호" name="userPassword" maxlength="20"> </div> <input type="submit" class="btn btn-primary form-control" value="로그인"> </form> </div> </div> </div> </div> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js"></script> </body> </html>
loginAction.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="user.UserDAO" %> <%@ page import="java.io.PrintWriter" %> <% request.setCharacterEncoding("UTF-8"); %> <jsp:useBean id="user" class="user.User" scope="page" /> <jsp:setProperty name="user" property="userID" /> <jsp:setProperty name="user" property="userPassword" /> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP 게시판 웹 사이트</title> </head> <body> <% UserDAO userDAO = new UserDAO(); int result = userDAO.login(user.getUserID(), user.getUserPassword()); if (result == 1) { // 로그인 성공! PrintWriter script = response.getWriter(); script.println("<script>"); script.println("location.href = 'main.jsp'"); script.println("</script>"); } else if (result == 0) { // 비밀번호가 틀릴때 PrintWriter script = response.getWriter(); script.println("<script>"); script.println("alert('비밀번호가 틀립니다.')"); script.println("history.back()"); script.println("</script>"); } else if (result == -1) { // 아이디가 존재하지 않을 때 PrintWriter script = response.getWriter(); script.println("<script>"); script.println("alert('존재하지 않는 아이디입니다.')"); script.println("</script>"); } else if (result == -2) { // db오류 PrintWriter script = response.getWriter(); script.println("<script>"); script.println("alert('데이터베이스 오류가 발생했습니다.')"); script.println("</script>"); } %> </body> </html>
참고로 위 코드블럭 들여쓰기 안맞는건 티스토리 문제입니다.
<%@ %>
: 페이지 지시자 (Page Directive)
- JSP 페이지의 설정을 정의
- 페이지가 실행될 때 영향을 미치는 정보들을 말함.
- 페이지 인코딩, 사용하는 클래스, 콘텐츠 타입 등을 설정
<% %>
: 스크립트릿 (Scriptlet)
- Java 코드를 JSP 파일에 직접 삽입
- 코드는 서버에서 실행, 클라이언트에게 HTML 형태로 반환됨.
<jsp: />
: 태그 라이브러리 태그 (JSP Tag)
- 태그립
- 보통 JSP에서 제공하는 내장 태그 (라이브러리)나 사용자 정의 태그를 사용할 때 씀.
- Java 코드를 명시적으로 삽입하는 대신, 간결하고 쉽게 기능을 구현
- 여기서는 JSP 내장 태그인 <jsp:useBean>
과 <jsp:setProperty>
라는 걸 써서 user라는 Java Bean 객체를 생성하고 속성 값을 설정해 주었다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!-- JSP 페이지의 설정: - 'language="java"': JSP 페이지에서 사용할 언어는 Java - 'contentType="text/html; charset=UTF-8"': 페이지의 컨텐츠 유형은 HTML, 문자 인코딩은 UTF-8 - 'pageEncoding="UTF-8"': JSP 파일 소스 코드 인코딩을 UTF-8로 설정--> <%@ page import="user.UserDAO" %> <!-- 'user.UserDAO' 클래스를 JSP 페이지에서 사용할 수 있도록 import --> <%@ page import="java.io.PrintWriter" %> <!-- 'java.io.PrintWriter' 클래스를 import하여 HTML 출력을 할 때 사용 --> <% request.setCharacterEncoding("UTF-8"); %> <!-- 요청(request)의 문자 인코딩을 UTF-8로 설정, 사용자가 입력한 데이터가 UTF-8로 처리되도록 하는 것 --> <jsp:useBean id="user" class="user.User" scope="page" /> <!-- 'user'라는 이름의 Java Bean 객체를 생성해서 JSP 페이지에서 사용할 수 있도록 함. - 'class="user.User"': 'user.User' 클래스 타입으로 객체 생성 - 'scope="page"': 해당 페이지 내에서만 객체 사용 가능 --> <jsp:setProperty name="user" property="userID" /> <!-- 'user' Java Bean 객체의 'userID' 속성에, 클라이언트로부터 전달된 'userID' 값을 설정--> <jsp:setProperty name="user" property="userPassword" /> <!-- 'user' Java Bean 객체의 'userPassword' 속성에, 클라이언트로부터 전달된 'userPassword' 값을 설정 -->
<% UserDAO userDAO = new UserDAO(); int result = userDAO.login(user.getUserID(), user.getUserPassword()); if (result == 1) { // 로그인 성공! PrintWriter script = response.getWriter(); script.println("<script>"); script.println("location.href = 'main.jsp'"); script.println("</script>"); } else if (result == 0) { // 비밀번호가 틀릴때 PrintWriter script = response.getWriter(); script.println("<script>"); script.println("alert('비밀번호가 틀립니다.')"); script.println("</script>"); } else if (result == -1) { // 아이디가 존재하지 않을 때 PrintWriter script = response.getWriter(); script.println("<script>"); script.println("alert('존재하지 않는 아이디입니다.')"); script.println("</script>"); } else if (result == -2) { // db오류 PrintWriter script = response.getWriter(); script.println("<script>"); script.println("alert('데이터베이스 오류가 발생했습니다.')"); script.println("</script>"); } %>
1. userDAO 객체 생성
2. userDAO의 login 메서드에 getter메서드로 가져온 userID랑 userPassword를 매개변수로 넣어서 로직 수행
3. 결과값은 1(로그인 성공), 0(로그인 실패 - 비밀번호 불일치), -1(아이디없음), -2(DB 연결 오류)
여기까지 했으면 다 했다. 이제 값이 잘 넘어가는지 테스트 해 볼 차례
프로젝트명 BBS > 우클릭 > Run As > Run on Server

아이디나 비번 아무거나 입력하기


존재하지 않는 아이디로 나오면 성공!
만약 DB 오류라는 알람창이 뜨면 실패한것
(JDBC 연결이 제대로 안된 것이기 때문에 Driver 연결이나 DB url, 유저id, 비밀번호 맞는지 오타는 없는지 확인해 주자)


이번에는 DB에 회원 등록이 되어있는 gildong 아이디에 일부러 비밀번호만 틀리게 입력
비밀번호가 틀리다고 나오면 DB 잘 연결된 것.
마지막으로 DB에 등록된 아이디와 비밀번호를 입력 해 주었을 때 404 에러가 뜨면 대성공이다.
아직 로그인 성공 화면 안 만들었기 때문에 404 에러 가 뜨는 것이다.

TMI
이거 만드는 건 한시간이면 하는데 블로그에 글 쓰는게 너무 오래걸림;;;;
로그인 메서드만들고 JDBC연결하던 도중에
계엄령 선포됐다는 뉴스를 봤는데
게시글 다 쓰고 나니까 비상계엄 해제 요구안이 가결됬다구 함....
포스팅 작업이 생각보다 노가다이다. 3시간이 걸리네
요즘 블로그 커스텀에 포스팅까지 허리와 눈이 넘나 아푸다.
'Spring&JSP' 카테고리의 다른 글
[JSP] 게시판 만들기 6 _ 회원가입 처리하기 (69) | 2024.12.04 |
---|---|
[JSP] 게시판 만들기 5 _ form태그와 input태그로 간단한 join.jsp 회원가입창 만들기 (68) | 2024.12.04 |
[JSP] 게시판 만들기 3 _ MySQL user 테이블 만들고, 이클립스에서 자바빈 만들기 (62) | 2024.12.03 |
[JSP] 게시판 만들기 2 _ 로그인 페이지 + 부트스트랩 + mySQL 다운로드 (62) | 2024.12.02 |
[JSP] 게시판 만들기 1 _ 이클립스 자바 웹 프로젝트 환경설정 (6) | 2024.12.01 |