- ✔ 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 프로토콜은 클라이언트가 웹서버에게 요청할 때 보내는 Request 메시지와 웹서버가 결과를 처리하고 응답하는 Response 메시지가 쌍으로 동작한다. 이때 HTTP 프로토콜에는 Response 메시지에 웹서버에 처리 결과에 따른 상태코드를 포함하도록 규정하고 있다.
코드 | 내용 |
---|---|
2xx | 클라이언트의 요청을 정상 처리 |
3xx | 리다이렉트 |
4xx | 클라이언트측 요청 오류 |
5xx | 서버 내부 오류 |
* 참고: https://dololak.tistory.com/488
- ✔ 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)
JDBC API : 데이터베이스 연동을 가능하게하는 JDBC 클래스는 자바 패키지 java.sql과 javax.sql에 포함되어 있다.
자바 애플리케이션에서 DB를 연결하고 데이터를 제어하기 위한 인터페이스와 클래스를 제공한다.
JDBC Driver Manager : 애플리케이션이 요구하는 데이터베이스에 접근하기 위한 적절한 드라이버를 선택하여 데이터베이스와 연결하도록 해준다.
JDBC는 크게 JDBC 인터페이스와 드라이버로 구성
애플리케이션에서는 SQL문을 만들어 JDBC 인터페이스에 전송하고 실제 구현 클래스인 JDBC 드라이버에서는 DBMS와 접속을 시도하고 SQL을 전송하는 구조를 가진다.
또한, DBMS에서 나온 결과를 역으로 거쳐 애플리케이션으로 가져오는 역할을 JDBC가 하기 때문에
애플리케이션과 DBMS의 다리 역할을 한다고 생각하면 된다.
DriverManager 클래스: 데이터 원본에 JDBC 드라이버를 통해 커넥션을 만드는 역할
Connection 인터페이스: 특정 데이터 원본과 연결된 커넥션
Statement 인터페이스: 특정한 SQL 문장을 정의하고 실행시킬 수 있는 Statement 객체를 구현하는 인터페이스
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>
- 결과
데이터베이스 내에서 하나의 그룹으로 처리되어야 하는 명령문들을 모아 놓은 일련의 작업 단위
트랜잭션의 정의는 개발자의 책임이다.
데이터의 일관성과 무결성을 보장하기 위해서는 반드시 트랜잭션 관리가 필요하다.
테이블에 부적절한 자료가 입력되는 것을 방지하기 위해 테이블을 생성할 때, 각 컬럼에 대해서 정의하는 여러 가지 규칙
무결성 : 데이터베이스 내에 있는 데이터의 정확성 유지
제약 조건 : 바람직하지 않은 데이터가 저장되는 것을 방지하는 것
무결성 제약 조건 | 역할 |
---|---|
NOT NULL | NULL을 허용하지 않음 |
UNIQUE | 중복된 값을 허용하지 않고 항상 유일한 값을 갖도록 함 |
PRIMARY KEY | NULL을 허용하지 않고 중복된 값도 허용하지 않음 NOT NULL조건과 UNIQUE 조건을 결합한 형태 |
FOREIGN KEY | 참조되는 테이블의 컬럼의 값이 존재하면 허용 |
CHECK | 저장 가능한 데이터 값에 범위나 조건을 지정하며, 설정한 값만 허용 |