오늘보다 더 나은 내일의 나에게_

스마트인재개발원 국비지원무료교육 JSP 본문

스마트인재개발원

스마트인재개발원 국비지원무료교육 JSP

chan_96 2022. 2. 5. 19:58
728x90

이번 주에 정리할 내용은 JSP수업 시간에 배운 JDBC연동과 로그인 및 회원가입 기능 구현이다!

자바 시간에도 한번 배웠었고 미니 프로젝트 때 활용을 해봐서 크게 어렵진 않았다. 큰 흐름 정도만 알고 코드 한줄한줄 자세히는 몰라서 다시 공부하는 좋은 계기가 된 듯하다.


메인페이지

먼저 메인 페이지 모습이다. 버튼을 클릭을 하면 클릭한 페이지로 이동된다. 회원가입, 회원 삭제, 회원 수정, 회원 전체 검색, 특정 회원 검색, 로그인 기능이 있다.

각 페이지별 모습

1. 회원가입
=> 회원가입이 정상적으로 실행되면 다시 메인 페이지로 돌아감

2. 회원 삭제
=> 입력된 ID가 DB에 있을 경우 바로 삭제하고 메인 페이지로 돌아감

3. 회원 수정
=> 입력된 ID가 DB에 존재 시 pw, nick 둘 중 하나를 선택해 수정하고 메인 페이지로 돌아감

4. 회원 전체 검색
=> DB에 있는 회원 전부를 출력해 보여줌

5. 회원 검색
=> 입력받은 ID의 정보를 출력해서 보여줌

6. 로그인
=> 로그인에 성공하면 로그인 성공 페이지, 실패 시 로그인 실패 페이지로 이동하게 된다.

 

 

회원가입 기능 

회원가입 html페이지를 만들고 form태그의 값을 받아 기능 구현을 할 servlet 파일을 생성해준다!
=> form태그의 값들을 servlet에서 받기 위해서는 form태그의 속성 중 action의 값을 servlet의 url 매핑 값으로 해준다.

1. ojdbc6 라이브러리 src/main/webapp/WEB-INF/lib에 추가
=> ojdbc6 경로(C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib)

2. 동적 로딩(java파일은 우리가 어떤 DBMS를 사용하는지 모르기 때문에) 
=> DB -> DBMS(oracle, mysql, mssql....)
=> Class.forName() 드라이브의 경로를 매개변수로 받아 해당 클래스의 인스턴스를 생성하고 초기화 

Class.forName("oracle.jdbc.driver.OracleDriver");​

3. oracle에 가서 id/pw를 인증받아야 한다
=> Connection 객체란?

: DB와 연결하기 위해 사용되는 객체, 매개변수로 URL, ID, PASSWORD
: DriverManager.getConnection()메소드를 호출하여 생성할 수 있다
String url = "jdbc:oracle:thin:@127.0.0.1:1521:xe";
String dbid = "hr";
String dbpw = "hr";

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

4. SQL준비
=> sql문에 들어갈 값을 ?(바인드 변수)로 채워준다
=> PreparedStatement는 SQL문을 미리 만들어 두고 변수를 따로 입력하는 방식, 효율성이나 유지 보수 측면에서 유리한 구조, Statement 클래스를 상속받기 때문에 Statement 메서드 모두 사용 가능

=> Statement는 데이터베이스의 연결로부터 SQL문을 실행할 수 있도록 해주는 클래스
String sql = "insert into web_member values(?,?,?)";

PreparedStatement psmt = conn.prepareStatement(sql);
psmt.setString(1, id);
psmt.setString(2, pw);
psmt.setString(3, nick);​


5. SQL 실행
=> Statement 주요 메서드 (executeQuery( ), executeUpdate( ))
executeQuery( ) : select문을 수행 후 Resultset 클래스 반환, select문의 결과에 해당하는 데이터에 접근할 수 있는 방법을 제공
executeUpdate( ) : update,delete,insert문을 수행 시 사용, 반환 값은 int

int cnt = psmt.executeUpdate();​


6. 실행 후 처리
=> sendRedirect : 웹 서버가 웹 브라우저에게 다른 페이지로 이동하라고 응답하는 기능

if(cnt>0) {
    response.sendRedirect("Main.html");
}​

 

이 모든 코드들은 try catch 블록 안에 들어가야 한다!!
=> 자바에는 크게 2가지 오류가 있다. 컴파일 오류, 런타임 오류! 컴파일 오류는 문법적인 오류이고 런타임 오류는 실행을 해야만 알 수 있는 오류(채팅, 파일...) 그래서 런타임 오류는 무조건 예외처리를 해줘야 한다!

 

회원 삭제 기능 

회원가입 코드와 다른건 크게 sql문 밖에 없다.
=> 테이블의 데이터를 삭제하기 위해서는 delete 문을 사용한다. where 절의 조건에 해당하는 모든 데이터가 삭제되고 where절 생략 시 모든 값이 삭제된다.
=> DELETE 문을 수행하기 전 SELETE 문으로 해당 조건을 미리 조회한 후 삭제 작업을 진행하면 실수를 줄일 수 있다.

String sql = "delete from web_member where id = ?";
			
psmt = conn.prepareStatement(sql);
psmt.setString(1, id);

 

회원 수정 기능 

회원 수정 기능은 pw나 nick 둘 중 하나를 수정할 수 있기 때문에 sql문을 조건문으로 처리해주면 간단하다. 마찬가지로 sql문 말고는 전체적인 코드는 동일하다.
=> update문은 테이블에 있는 기존 데이터를 수정할 때 사용한다. set절에 변경할 값과 칼럼이 오고, where절에는 변경할 값들의 조건이 온다. 
String sql = "";
			
if(select.equals("pw")) {
    sql ="update web_member set pw = ? where id = ?";
}else if(select.equals("nick")) {
    sql = "update web_member set nick = ? where id = ?";
}

psmt = conn.prepareStatement(sql);
psmt.setString(1, data);
psmt.setString(2, id);​

 

회원 전체 검색 기능

회원 목록을 출력만 하면 되므로 jsp로 처리해준다. 
쿼리에 변화가 없으므로 executeQuery()를 사용한다. 반환 타입은 ResultSet!
rs.next()는 select문의 결과값이 rs에 담겨있는데 rs에서 가져올 값이 있으면 true를 반환 그렇지 않으면 false를 반환한다. rs에서 가져온 칼럼의 값들을 각각의 변수에 담아주고 out내장 객체로 출력해 준다

코드
더보기
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@ 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>
	<table border="1">
		<tr>
			<th>ID</th>
			<th>PW</th>
			<th>NICK</th>
		</tr>
		<%
			Connection conn = null;
			PreparedStatement psmt = null;
			
			try {
				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);
				
				String sql = "select * from web_member";
				
				psmt = conn.prepareStatement(sql);
				
				ResultSet rs = psmt.executeQuery();
				
				while(rs.next()){
					String id = rs.getString(1);
					String pw = rs.getString(2);
					String nick = rs.getString(3);
					
					//1. Scritlet
					//2. out내장객체
									
					out.print("<tr>");
					out.print("<td>"+id+"</td>");
					out.print("<td>"+pw+"</td>");
					out.print("<td>"+nick+"</td>");
					out.print("</tr>");
				}
				
			}catch(Exception e) {
				e.printStackTrace();
			}finally {
				try {
					psmt.close();
					conn.close();			
				} catch (Exception e2) {
					e2.printStackTrace();
				}
			}
		%>
	</table>
	<a href="Main.html">메인페이지로 돌아가기</a>
</body>
</html>​

 

특정 회원 검색

ID를 입력할 html을 생성하고 출력할 jsp를 생성한다.
전체 회원 검색과의 차이점으로는 input 태그에서 id값을 받아와 DB에 있나 확인 후 회원정보를 출력해준다. sql문 where절에 사용자에게 입력받은 id를 db id칼럼과 비교하는 조건을 준다.

코드
더보기
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@ 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>
	<table border="1">
		<tr>
			<th>ID</th>
			<th>PW</th>
			<th>NICK</th>
		</tr>
		<%	
			// OneSelect.html에서 검색하는 id를 받아 해당 id의 정보를 출력하시오
			
			Connection conn = null;
			PreparedStatement psmt = null;
			String id = request.getParameter("id");
			
			try {
				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);
				
				String sql = "select * from web_member where id = ?";
				
				psmt = conn.prepareStatement(sql);
				psmt.setString(1, id);
				
				ResultSet rs = psmt.executeQuery();
				
				while(rs.next()){
					String getid = rs.getString(1);
					String pw = rs.getString(2);
					String nick = rs.getString(3);
					
					//1. Scritlet
					//2. out내장객체
									
					out.print("<tr>");
					out.print("<td>"+getid+"</td>");
					out.print("<td>"+pw+"</td>");
					out.print("<td>"+nick+"</td>");
					out.print("</tr>");
				}
				
			}catch(Exception e) {
				e.printStackTrace();
			}finally {
				try {
					psmt.close();
					conn.close();			
				} catch (Exception e2) {
					e2.printStackTrace();
				}
			}
		%>
	</table>
	<a href="Main.html">메인페이지로 돌아가기</a>
</body>
</html>​

 

로그인

사용자에게 ID와 PW를 입력받으면 입력받은 ID값을 DB의 ID와 일치하는 값을 조회하는 sql문을 작성한다. 일치하는 값을 가져와 ResultSet 객체에 담고 다시 조건문으로 DB의 PW와 입력받은 PW가 일치하는지 확인한다.
일치하면 로그인 성공 페이지, 실패하면 로그인 실패 페이지로 이동시켜준다.

=> 코드를 간략하게 하는 다른 방법으로 sql문에서 사용자에게 입력받은 ID, PW값을 where절에 조건으로 주고 가져오면 밑에 if(rs.next) 문이 훨씬 간략하게 작성이 가능할 것이다.

코드
더보기
package com.member;

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

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 {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		
		// 1.사용자가 입력한 ID/PW를 가져오시오.
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		Connection conn = null;
		PreparedStatement psmt = null;
		ResultSet rs = null;
		
		try {
			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);
			
			String sql = "select * from web_member where id = ?";
			
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, id);
			
			rs = psmt.executeQuery();
			
			if(rs.next()){
				String getId = rs.getString(1);
				String getPw = rs.getString(2);
				String nick = rs.getString(3);
				
				//사용자가 입력한 pw와 DB 가져온 pw가 일치하면 'LoginS.jsp'이동하고
				//							  일치하지않으면 'LoginF.jsp'이동
				
				if(pw.equals(getPw)) {
					response.sendRedirect("LoginS.jsp");
				}else {
					response.sendRedirect("LoginF.jsp");
				}
			}else {
				response.sendRedirect("LoginF.jsp");				
			}
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				rs.close();
				psmt.close();
				conn.close();			
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
	}// end of service
}​

 

 

위에 작성한 코드를 기반으로 직접 로그인 페이지를 구현해보면 좋을 듯하다. 디자인적 요소도 추가하고 아직 배우지 않은 게시판과 같은 기능을 스스로 찾아보며 구현하는 게 실력 향상에 큰 도움이 될 것 같다. 생각만 해도 너무 재밌을 것 같다. 배운 내용들을 복습을 좀 더한 후에 실습을 해봐야겠다.

 

 


현재 모집 중인 과정

 

스마트인재개발원 본점 남구 CGI센터

 

 

스마트인재개발원 분점 동구 아트센터

 

 

 

스마트 인재개발원이 궁금하다면 아래 링크! 

https://www.smhrd.or.kr/

 

스마트인재개발원

4차산업혁명시대를 선도하는 빅데이터, 인공지능, 사물인터넷 전문 '0원' 취업연계교육기관

www.smhrd.or.kr

728x90
Comments