64일 차 - 예외처리, JDBC, [SQL] 트랜잭션, 데이터 무결성 제약 조건 (23.03.29)

yvonne·2023년 3월 29일
0

📂JSP

목록 보기
4/7
post-thumbnail

1. JSP

📝 예외 처리

  • ✔ info.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	<%@ page errorPage="errorPage.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		int i = 40 / 0;
	%>
</body>
</html>
  • ✔ errorPage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page isErrorPage="true"%>
<%
	response.setStatus(200); // 📌 응답 상태 코드별로 지정하는 것 
%> 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	죄송합니다. 당신의 신뢰를 지키겠습니다.
	<br />
	<%=exception.getMessage()%>
</body>
</html>
  • 결과



📌 HTTP 응답 상태 코드별로 처리할 JSP 지정하기

  • HTTP 프로토콜은 클라이언트가 웹서버에게 요청할 때 보내는 Request 메시지와 웹서버가 결과를 처리하고 응답하는 Response 메시지가 쌍으로 동작한다. 이때 HTTP 프로토콜에는 Response 메시지에 웹서버에 처리 결과에 따른 상태코드를 포함하도록 규정하고 있다.

  • 코드내용
    2xx클라이언트의 요청을 정상 처리
    3xx리다이렉트
    4xx클라이언트측 요청 오류
    5xx서버 내부 오류
    * 참고: https://dololak.tistory.com/488



🔎 web.xml파일을 이용한 예외 처리

  • ✔ web.xml
<?xml version="1.0" encoding="UTF-8"?>
<;web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
	id="WebApp_ID" version="4.0">
	<display-name>servlet_example</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	
	  <error-page>
     <error-code>404</error-code>
     <location>/error404.jsp</location>
  </error-page>
  <error-page>
     <error-code>500</error-code>
     <location>/error500.jsp</location>
  </error-page>
	
</web-app> 
  • ✔ error500.jsp
<%@ 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>
	Error 500입니다. 반성합니다. 다시는 이런 에러없도록 하겠습니다.
	</body>
</html>
  • ✔ error400.jsp
<%@ 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>
	Error 404입니다. 반성합니다. 다시는 이런 에러없도록 하겠습니다.
	</body>
</html>
  • 결과 (info.jsp)



📌 내장 객체

  • New로 객체 생성하지 않고 사용하는 객체
  • out / request / response / session / exception




📝 데이터 베이스

🔎 JDBC (Java Database Connectivity)

  • 자바에서 데이터베이스와의 연결을 하고 SQL을 실행하기 위해 필요한 API이자 드라이버
  • 자바 언어로 작성되고 플랫폼에 독립적

  • JDBC API : 데이터베이스 연동을 가능하게하는 JDBC 클래스는 자바 패키지 java.sql과 javax.sql에 포함되어 있다.
    자바 애플리케이션에서 DB를 연결하고 데이터를 제어하기 위한 인터페이스와 클래스를 제공한다.

  • JDBC Driver Manager : 애플리케이션이 요구하는 데이터베이스에 접근하기 위한 적절한 드라이버를 선택하여 데이터베이스와 연결하도록 해준다.



🔎 JDBC 구조와 역할

  • JDBC는 크게 JDBC 인터페이스와 드라이버로 구성

  • 애플리케이션에서는 SQL문을 만들어 JDBC 인터페이스에 전송하고 실제 구현 클래스인 JDBC 드라이버에서는 DBMS와 접속을 시도하고 SQL을 전송하는 구조를 가진다.

  • 또한, DBMS에서 나온 결과를 역으로 거쳐 애플리케이션으로 가져오는 역할을 JDBC가 하기 때문에
    애플리케이션과 DBMS의 다리 역할을 한다고 생각하면 된다.


📌 JDBC 객체

  • DriverManager 클래스: 데이터 원본에 JDBC 드라이버를 통해 커넥션을 만드는 역할

    • Class.forName() 메소드를 통해 생성되며, 이 메소드는 인터페이스 드라이버를 구현하는 작업으로 자동으로 객체가 생성되어 DriverManager에 등록
  • Connection 인터페이스: 특정 데이터 원본과 연결된 커넥션

    • 어떤 SQL 문장을 실행시키기 전에 우선 Connection 객체가 있어야 한다.
  • Statement 인터페이스: 특정한 SQL 문장을 정의하고 실행시킬 수 있는 Statement 객체를 구현하는 인터페이스

    • Connection.createStatement() 메소드를 호출함으로써 생성
    • 단순한 질의문을 사용할 경우에 좋음
  • ResultSet 인터페이스: SQL문에서 SELECT문을 사용한 질의에 의해 생성된 테이블을 반환하는 ResultSet 객체를 구현하는 인터페이스

    	*참조: https://programmingyoon.tistory.com/53



  • ✔ servlet_mj_db 구성
  • ✔ dept.jsp
<%@page import="java.sql.DriverManager"%> // 🔎 sql에서 import
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@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>
	<%
	String url = "jdbc:oracle:thin:@localhost:1521/xe";
		// 🔎 new oracle.jdbc.driver.OracleDriver와 같이 객체를 생성하는 과정
   Class.forName("oracle.jdbc.driver.OracleDriver"); // 🔎 제조사마다 다른 드라이버명을 가진다

		String sql = "SELECT * FROM dept";

		Connection con = DriverManager.getConnection(url, "scott", "tiger");
		Statement st = con.createStatement();
		ResultSet rs = st.executeQuery(sql); 
      // 🔎 오라클에서 자바(서버)로 데이터를 가져오기 위해 
      필요한 객체 3종 (인터페이스로 구현)

		while (rs.next()) {
			out.print("부서번호 : "+rs.getString("deptno")+"<br>");
			out.print("부서이름 : "+rs.getString("dname")+"<br>");
			out.print("위치 : "+rs.getString("loc")+"<br>");
			out.print("<hr>");
			
		} 

		rs.close(); // 🔎 오라클을 다 사용하고나면 
      close하여 메모리 정리 
      (가장 마지막에 사용한 것을 먼저 닫아줘야함 - FILO)
		st.close();
		con.close();
	%>

</body>
</html>
  • 결과



🔎 각 사원의 급여가 몇 등급인지 salgrade.jsp을 생성하여 출력

  • ✔ salgrade.jsp
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@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>
<%
		String url = "jdbc:oracle:thin:@localhost:1521/xe";
		Class.forName("oracle.jdbc.driver.OracleDriver");

		String sql = "SELECT * FROM emp, salgrade where sal >= losal and sal <=hisal";

		Connection con = DriverManager.getConnection(url, "scott", "tiger"); 
          // 📌 연결 객체
		Statement st = con.createStatement(); 
          // 📌 쿼리 실행 객체
		ResultSet rs = st.executeQuery(sql); 
          // 📌 결과 객체

		String table = "<table border = '1'>";
		table += "<tr>";
		table += "<th>grade</th>";
		table += "<th>sal</th>";
		table += "<th>ename</th>";
		table += "</tr>";
			
		while (rs.next()) {
			table += "<tr>";
			table += "<td>" + rs.getString("grade")+"</td>";
			table += "<td>"+ rs.getString("sal")+"</td>";
			table += "<td>" + rs.getString("ename")+"</td>";
		} 

		rs.close();
		st.close();
		con.close();
		table +="</table>";
		out.print(table);
	%>

</body>
</html>
  • 결과







2. SQL

📝 트랜잭션

  • 데이터베이스 내에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 일련의 작업 단위

  • 트랜잭션의 정의는 개발자의 책임이다.

  • 데이터의 일관성과 무결성을 보장하기 위해서는 반드시 트랜잭션 관리가 필요하다.

🔎 COMMIT

  • 모든 작업을 정상적으로 처리하겠다고 확정하는 명령어
  • 변경된 내용을 모두 영구 저장하며 하나의 트랜젝션 과정을 종료하게 된다.

🔎 ROLLBACK

  • 작업 중 문제가 발생했을 때, 트랜젝션의 처리 과정에서 발생한 변경 사항을 취소하고, 트랜젝션 과정을 종료
  • 하나의 묶음 처리가 시작되기 이전의 상태로 되돌린다.
  • 이전 COMMIT한 시점까지만 복구




📝 데이터 무결성 제약 조건(Data integrity Constraint Rule)

  • 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해 테이블을 생성할 때, 각 컬럼에 대해서 정의하는 여러 가지 규칙

  • 무결성 : 데이터베이스 내에 있는 데이터의 정확성 유지

  • 제약 조건 : 바람직하지 않은 데이터가 저장되는 것을 방지하는 것

무결성 제약 조건역할
NOT NULLNULL을 허용하지 않음
UNIQUE중복된 값을 허용하지 않고 항상 유일한 값을 갖도록 함
PRIMARY KEYNULL을 허용하지 않고 중복된 값도 허용하지 않음
NOT NULL조건과 UNIQUE 조건을 결합한 형태
FOREIGN KEY참조되는 테이블의 컬럼의 값이 존재하면 허용
CHECK저장 가능한 데이터 값에 범위나 조건을 지정하며, 설정한 값만 허용
profile
개발 연습장

0개의 댓글