JSP - DB 연동

2022. 10. 7. 17:06Dev.Program/JSP & Javascript

728x90

지난시간 복습

< * SQL언어 구문 >

정의어 - 공간만들기(create), 수정(alter), 삭제(drop)

제어어 - 권한 부여 : 일을 할수 있게끔(grant), 권한 해제(revoke)

★ 조작어(실제로 프로그램에서 가장 많이 사용)

- 공간안에 내용 ★ 저장(insert), 수정(update), 삭제(delete), 조회(select) ★

< insert 기본 문법 : 데이터 저장 >

insert into 테이블이름(열이름1, 열이름2)

values(값1, ‘값2’);   //문자열은 작은따옴표(‘’) 안에 넣어주기

 

< where 기본 문법 : 조건 >

select 열이름, 열이름 from 테이블이름

where 조건열=값;

 

< order by 기본 문법 : 정렬 >

select 열이름, 열이름 from 테이블 이름

order by 기준열 desc/asc;

 

< update 기본 문법 : 데이터 수정 >

update 테이블이름 set 수정할 열이름 = 값, 수정할 열이름 = 값

where 조건열 = 값;

 

< delete 기본 문법 : 데이터 삭제 >

delete from 테이블이름

where 조건열 = 값;

 

< JSP - DB 연동 >

1단계 ) JDBC 프로그램 설치 - 설치한 JDBC 안에 있는 드라이버 불러오기

2단계 ) 불러온 드라이버를 이용해서 DB 주소, DB 아이디, DB 비밀번호를 가지고 DB에 접속

⇒ 접속했을 때 연결이 유지가 되어야 하기 때문에 접속 정보를 저장.

3단계 ) 연결정보를 이용해서 SQL 구문을 만들고 실행할 수 있는 객체 생성

⇒ 실행할 수 있는 java 파일이 있음.

4단계 ) 객체 실행

 ⇒ SQL 구문이 실행되어짐. (눈에는 안보이지만 내부적으로 동작이 되어짐)

 ⇒ insert, update, delete (4단계로 마무리)

 

 ⇒ select 는 결과값이 있기 때문에 5단계(결과 저장) 과정으로 넘어감.

 5단계 ) 결과를 처리하는 작업 (출력, 배열저장)

  ⇒ select

마무리 단계 ) 객체생성 기억장소 해제

- 지난시간에 한 설치

 

insertPro.jsp 파일 안

???

String sql=”sql구문”;

-------------------번호랑 이름 입력하라는 게 아니랗ㅎㅎㅎ

입력한 번호랑 이름 값이 나오도록ㅋㅋ

// String sql = "insert into student(num, name) values(num, 'name')";

String sql="insert into student(num, name) values(" + num + ",'" + name + "')";

→ 작은 따옴표도 묶어주기! String 타입이기 때문.

PreparedStatement pstmt = con.prepareStatement(sql);

⇒ 사실 이렇게 하는건 보안상 좋지 않음.

큰 따옴표 작은 따옴표가 섞여 있기 때문에 해커가 침입하기 딱 좋다...ㅎㅎ

 

pstmt.executeUpdate();

4단계 ) sql 구문을 만들고 실행하는 단계

 

  • 값이 잘 들어가는 것을 확인할 수 있다! (이미 값이 있는 번호를 넣으면 오류 뜸)



  • sql 구문이 이런식으로 동작했음을 알수 있다.

 

String sql="insert into student(num, name) values(" + num + ",'" + name + "')";

→ 작은 따옴표도 묶어주기! String 타입이기 때문.

⇒ 사실 이렇게 하는건 보안상 좋지 않음.

큰 따옴표 작은 따옴표가 섞여 있기 때문에 해커가 침입하기 딱 좋다...ㅎㅎ

 

다른방법으로 합니다.

String sql="insert into student(num, name) values(?,?)";

pstmt.setInt(1, num);

pstmt.setString(2, name);

물음표 자리에 값을 넣어주는거! (가장 많이 쓰임)

pstmt.setInt(parameterIndex, x)

Int : 넣어줄 값의 데이터타입

parameterIndex : 물음표 순서(1번부터 시작)

x : 값





updateForm.jsp / updatePro.jsp 새 문서 만들기

문제 ) 이름 수정하는 문서로 만들기

내가 푼 답 ) updateForm.jsp

내가 푼 답 ) updatePro.jsp

내가 푼 답 ) 학생수정 성공!



업데이트 구문이 이렇게 들어가는 것을 확인할 수 있다.

 

deleteForm.jsp / deletePro.jsp 새 문서 만들기

문제 ) 학번과 이름이 일치할 경우에만 삭제 (delete 만들기)

내가 푼 답 ) deleteForm.jsp 화면

내가 푼 답 ) deletePro.jsp

처음에 계속 오류가 났는데 and를 안적어줘서 계속 오류가 났던거!!!!!

둘 다 일치할 때만 넘기기 때문에 and를 적어줘야한다.

String sql = "delete from student where num = ? and name = ?";

삭제된 화면(cmd창)과 delete 구문이 잘 입력된 것을 확인할 수 있다.

select.jsp 새문서 만들기

디비에서 내용을 받아와서 여기에 값이 들어가도록!

 

4단계 ) ResultSet rs = pstmt.executeQuery();

select 문은 4단계부터 다름!! (결과를 저장)

 

ResultSet 은 커서가 제일 꼭대기(위)에 저장(?) 되어 있음(처음 rs에는 데이터 없음)

next() 다음행 preview() 이전행 first() 첫번째행 last() 마지막행 : 행의 위치 이동

→ next 를 제일 많이 씀! 데이터가 있으면 true 값을 리턴해줌.

(열 번호는 1번부터 시작됨)

 

반복문을 통해서 값을 뽑아내는데 true 값이 나오면 다음으로 계속 넘어가도록 만들거!

for문 ? while 문? - while 문!! 끝이 어딘지 모르기 때문에!

 

  • while 문으로 실행 -> 반복문 만들기
  • 첫번째 열, 두번째 열을 뽑아와야됨! => get 함수 씀.
  • rs.getInt(columnIndex) => columnIndex 에 열 번호 적기
  • rs.getInt(1); // rs.getInt("num"); 둘 다 가능하지만 일반적으로 rs.getInt("num"); 씀
  • num(열이름)을 적어야 모르는 사람이 봐도 직관적으로 확인 가능하기 때문

  • 데이터를 표 안에 넣어주기

 

  • 데이터 값이 잘 들어옴!






selectForm.jsp /selectPro.jsp 새 문서 만들기

  • 입력한 번호값만 들고오게끔 제어

  • 풀이 ) selectForm.jsp 



풀이 ) selectPro.jsp => 이 부분이 어려웠다ㅜㅜㅜㅜㅜ 수영이 도움받음

 

select.jsp --- 파일

풀이 ) if문을  사용하는것도 가능

if (rs.next()) {

         %><tr><td><%=rs.getInt("num") %></td><td><%=rs.getString("name") %></td></tr><%

}

rs.next()에 값이 있으면 계속 true를 출력. 이렇게도 가능하다!

 

쇼핑몰 프로젝트

1. 전체 프로젝트 데이터를 저장할 공간 만들기 - 데이터베이스 만들기

⇒ jspdb1

2. 데이터베이스를 관리할 사용자 만들고 역할 부여(권한부여)

⇒ root(모든 권한을 가지고 있음})     => 디비 관리할 사용자아이디 : jspid

=> 디비 비밀번호 jsppass

⇒ jspdb1을 관리할 권한 부여 create, alter, drop, insert, update, delete, select..

 

grant select,insert,update,delete,create,drop,alter

on jspdb1.* to 'jspid'@'localhost'

identified by 'jsppass';

 

grant select,insert,update,delete,create,drop,alter

on jspdb1.* to 'jspid'@'%'

identified by 'jsppass';

 

grant ⇒ 권한 부여

1 warnig 은 아이디랑 비번 설정 안해놔서 뜨는거 ㅎㅎ

on jspdb1.* to 'jspid'@'localhost'

- 로컬호스트로 접속했을 때 권한부여

on jspdb1.* to 'jspid'@'%'

- jspid로 접속했을 때 권한부여

cmd창 새로 열어서 다시 jspid로 로그인하기 (비번jsppass)

 

3. 주제별로 저장할 공간 만들기 - 테이블 만들기(회원,게시판,상품,..)

⇒ student ⇒ 회원테이블(member) : 아이디(-primary key) 비밀번호 이름 가입날짜 …

 

use jspdb1 // jspdb1 에 만들어줄거기때문에

 

create table member(

id varchar(20) primary key,

pass varchar(20),

name varchar(20),

reg_date datetime

);

register date(가입날짜) -> datetime

show tables; 테이블 만들어진 거 확인 가능

 

jsp4 폴더 새로 만들기

  • insertForm.jsp / insertPro.jsp 문서 새로 만들기

  • insertForm.jsp 화면
  • 비밀번호 : <input type="password" name="pass"> <br> =>수정

create table member(

id varchar(20) primary key.

pass varchar(20),

name varchar(20),

reg_date datetime

);

 

<form action="insertPro.jsp" method="get">

아이디 : <input type="text" name="id"> <br>

비밀번호 : <input type="text" name="pass"> <br>

이름 : <input type="text" name="name"> <br>

  • 가입날짜는 시스템에 있는거 가져올거임(시스템에 저장되어있기때문에)

<input type="submit" value="회원가입">

</form>

 

⇒ 만들어준 열이름과 동일하게 설정

 

문제 ) 이제 insertPro.jsp에 정보 가져오기

Timestamp reg_date = new Timestamp(System.currentTimeMillis());

현재 날짜 가져오기 (데이터베이스에 띄울 땐 setTimestamp)

  • insertPro.jsp 화면

vvvvvvvvvvvvvvvvv

  • 회원 등록 후

  • select * from member;
  • 데이터입력이 잘 된것을 확인.

 

insertPro.jsp 문제 풀이!

회원가입 후에는 로그인을 합니다! 로그인 화면 만들기.

loginForm.jsp /loginPro.jsp 새 문서 만들기

insertPro.jsp 밑에 스크립트로 loginForm.jsp 로 넘어가게끔

 

  • loginForm.jsp 화면

 

문제) loginPro.jsp 문서에서

id pass 파라미터 가져오기

폼 아이디와 디비 아이디 일치 & 폼 비밀번호와 디비 비밀번호 일치하면

로그인 처리 = 세션값 부여(생성) : 세션값 "id", id 생성 main.jsp 이동

main.jsp / info.jsp 새 문서 만들기



  • main.jsp 화면
  • 내부적으로 오브젝트형으로 바뀌어져 있음. 그래서 스트링형으로 형변환을 시켜줘야한다.
  • String id = (String)session.getAttribute("id");

 

문제) info.jsp 문서에서

// session 가져와서 변수에 저장

// 1단계 드라이버로더

// 2단계 디비연결

// 3단계 sql 만들고 실행할 수 있는 객체 만들기 select(로그인한 사람만 들고오게끔)

// 4단계 결과 <= 실행결과 저장

// 5단계 rs 내용 위치 첫행이동 데이터 있으면 출력

  • if(rs.getString("id") == id) 하면 안됨!! 잘 틀리는거!!

이거때문에 계속 오류 났다….ㅜㅜ

  • if(rs.getString("id").equals(id)) 로 적어줘야됨
  • 아직 아이디/비밀번호가 일치해야 로그인되었다고 넘어가는 건 안함ㅎㅎ
if(rs.next()){
%>
아이디:<%=rs.getString("id") %><br>
비밀번호:<%=rs.getString("pass") %><br>
이름:<%=rs.getString("name") %><br>
가입날짜:<%=rs.getTimestamp("reg_date") %><br>
<%
}
%>
<a href="main.jsp">메인화면</a>
  • 선생님 코드! while문 안쓰고 if 문으로 쓰심.

  • 로그인화면

  • 메인화면

  • 인포화면 : 회원정보 조회

 

문제 ) loginPro.jsp 문서에서

1단계 드라이버 불러오기

2단계 디비연결

3단계 sql 디비 member 테이블 안에 아이디 일치 한 회원 내용 가져오기

// 폼 아이디와 디비 아이디 일치

4단계 실행 => 결과 저장

5단계 rs 첫행 이동 결과 있으면 아이디 일치 ⇒ 비밀번호 비교

맞으면 세션값 생성 - main.jsp 이동

  틀리면 "비밀번호 틀림"

결과가 없으면 "아이디 없음"

폼 아이디와 디비 아이디 일치 & 폼 비밀번호와 디비 비밀번호 일치하면

로그인 처리 = 세션값 부여(생성) : 세션값 "id", id 생성 main.jsp 이동

푼 답 )

 

<script type="text/javascript">
alert("비밀번호가 틀립니다!");
history.back();
</script>
 

선생님 답) <a href=""></a> 대신 history.back(); 뒤로가기 사용



String sql = "select * from member where id = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);

⇒ 폼의 아이디와 디비 아이디를 미리 비교함

if(rs.next()) {
if(rs.getString("pass").equals(pass)) {
session.setAttribute("id", id);
response.sendRedirect("main.jsp");
} else {
out.println("비밀번호가 틀립니다."); %>
<a href="loginForm.jsp">로그인 화면으로 돌아가기</a>
<%}
} else {
out.println("아이디가 틀립니다.");
%><a href="loginForm.jsp">로그인 화면으로 돌아가기</a><%
}%>

⇒ 그래서 if 문으로 돌릴 수 있다! (아이디가 있으면 result 값이 있고 아니면 없기 때문)

 

logout.jsp 새 문서 만들기

문제 ) logout.jsp 문서에서 세션값 초기화(=로그아웃)

답 ) logout.jsp 창에서

 

선생님 답안 ) 풀이

  • 로그아웃 하면 null 님이 로그인하셨습니다. 라고 나옴. (출력창)
  • 그럼 이상하니까~~ 로그인 한 사람만 main.jsp 화면을 볼 수 있도록 설정해줄거!

 

문제 ) main.jsp 문서에서

세션값 null이면(세션값이 없으면)

loginForm.jsp 로 이동

if(id == null) {
response.sendRedirect("loginForm.jsp");
}

 

updateForm.jsp / updatePro.jsp 새 문서 만들기

<form action="insertPro.jsp" method="post">
아이디 : <input type="text" name="id"> <br>
비밀번호 : <input type="password" name="pass"> <br>
수정할 이름 : <input type="text" name="name"> <br>
<input type="submit" value="회원정보수정">
</form>

updateForm.jsp 화면. (insertForm.jsp 에서 긁어오기) => 이름만 수정할거

 

<h1>WebContent/jsp4/updateForm.jsp</h1>
<%

// 문제 )
// 세션값 가져오기
// 1단계 드라이버로더
// 2단계 디비연결
// 3단계 sql member 테이블에서 id에 해당하는 회원정보 가져오기
// 4단계 rs <= 실행
// 5단계 rs 첫행으로 이동 데이터 있으면(아이디 존재) :
if(rs.next()) {
%>
<form action="updatePro.jsp" method="post">
아이디 : <input type="text" name="id" value="<%= %>" readonly> <br>

// 아이디는 수정할 게 아니라 참고만 할 거라 readonly
비밀번호 : <input type="password" name="pass"> <br>
수정할 이름 : <input type="text" name="name" value="<%= %>"> <br>
<input type="submit" value="회원정보수정">
</form>
<%
}
%>

 

--------------

<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>WebContent/jsp4/updateForm.jsp</h1>
<%
request.setCharacterEncoding("utf-8");
// 세션값 가져오기
// 1단계 드라이버로더
String id = (String)session.getAttribute("id");

// 2단계 디비연결
Class.forName("com.mysql.jdbc.Driver");

String dburl = "jdbc:mysql://localhost:3306/jspdb1";
String dbuser = "jspid";
String dbpass = "jsppass";
Connection con = DriverManager.getConnection(dburl, dbuser, dbpass);
// 3단계 sql member 테이블에서 id에 해당하는 회원정보 가져오기
String sql = "select * from member where id = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
// 4단계 rs <= 실행
ResultSet rs = pstmt.executeQuery();
// 5단계 rs 첫행으로 이동 데이터 있으면(아이디 존재)
if(rs.next()) {
%>
<form action="updatePro.jsp" method="post">
아이디 : <input type="text" name="id" value="<%=rs.getString("id") %>" readonly> <br>
비밀번호 : <input type="password" name="pass"> <br>
수정할 이름 : <input type="text" name="name" value="<%=rs.getString("name") %>"> <br>
<input type="submit" value="회원정보수정">
</form>
<%
}
%>
</body>
</html>

푼 답 ) updateForm.jsp 화면.



<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>WebContent/jsp4/updatePro.jsp</h1>
<%
request.setCharacterEncoding("utf-8");

String id = request.getParameter("id");
String pass = request.getParameter("pass");
String name = request.getParameter("name");
%>
수정할 이름 : <%=name %>
<%
Class.forName("com.mysql.jdbc.Driver");

String dburl = "jdbc:mysql://localhost:3306/jspdb1";
String dbuser = "jspid";
String dbpass = "jsppass";

Connection con = DriverManager.getConnection(dburl, dbuser, dbpass);

String sql = "select * from member where id = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);

ResultSet rs = pstmt.executeQuery();

if(rs.next()) {
if(rs.getString("pass").equals(pass)) {
sql="update member set name = ? where id = ?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, id);
%>
<script type="text/javascript">
alert("회원정보수정");
location.href = "main.jsp";
</script>
<%

pstmt.executeUpdate();
} else {
%><script type="text/javascript">
alert("비밀번호가 틀립니다!");
history.back();
</script>
<%}
}
%>

</body>
</html>

푼 답 ) updatePro.jsp 화면.

문제 ) delete 도 혼자 해보기…………..

deleteForm.jsp / deletePro.jsp 새 문서 만들기

728x90

'Dev.Program > JSP & Javascript' 카테고리의 다른 글

자바빈(JavaBean)  (0) 2022.10.07
게시판(board)  (0) 2022.10.07
cookie / session / DB연동 - Mysql  (0) 2022.10.07
내장객체  (0) 2022.10.07
내장함수 / 객체지향  (0) 2022.10.07