데이터베이스
: 여러 사람이 공유해서 사용할 목적으로 체계적으로 정리된 정보를 효율적으로 관리하고 검색할 수 있는 정보의 집합
생활 속의 데이터베이스
: 휴대폰의 전화번호 목록
: ㄱ,ㄴ,ㄷ으로 정리된 수첩의 주소록
: 거의 모든 프로그램은 어떠한 형태로든 데이터베이스와 연결됨
데이터베이스 관리 시스템 (DBMS)
: Database Mangement System
: 데이터베이스를 구성하고 운영하기 위해 구성된 소프트웨어 시스템
: 오라클, SQL서버등 일반적으로 알고 있는 데이터베이스 제품이 DBMS이다
오라클 데이터베이스와 MySQL
: 오라클은 전세계에서 가장 많이 사용되는 상용 DBMS
: MySQL은 무료로 중소규모 웹사이트 개발에 많이 사용됨
파일 시스템
: 데이터를 저장한 파일을 데이터 파일이라고 함
: 파일시스템은 데이터를 관리하는 기본임
: 경우에 따라서 파일 시스템을
파일 시스템의 문제점
: 데이터의 중복
: 데이터의 불일치
: 데이터의 공유가 어려움
: 데이터 용량증에 따른 검색 효율 저하
: 데이터에 대한 보안성 미비
: 텍스트 위주의 데이터 관리
데이터베이스 도입 장점
: 중복성 최소화
: 데이터 불일치성 해결
: 데이터 공유 편의성
: 정보 표준화 류리
: 데이터 보안성 제공
: 데이터 무결성 유지
: 대량 데이터의 빠른 검색
: 다양한 데이터 관리 가능(이미지 파일 등)
: 응용 프로그램 개발이 쉽다
관계형 데이터베이스
: 데이터에 관계 개념 부여
: 대부분 데이터베이스가 관계형 데이터베이스
객체지향형 데이터베이스
: 객체지향 개념을 데이터베이스에 부여
: 객체지향 도입 확대로 도입 → 관계형의 완전한 대체는 아님
: 관계형 데이터베이스 + 객체지향형 데이터베이스 = ORDB
테이블 구성요소
: 테이블은 데이터베이스 관리의 기본단위
: 정리되지 않은 데이터를 표 형태로 정리할 수 있음
컬럼명 컬럼 로우(가로)
테이블블 구성요소가 가지는 특징
: 로우는 하나의 데이터만 표시할 수 있다
: 그룹이나 배열의 형태는 허용하지 않는다
: 각각의 컬럼에는 특정한 형태의 값만 가질 수 있다
: 모두 로우의 데이터는 해당 컬럼에서 요구하는 형태의 값만을 포함
데이터베이스 키
: 서로 다른 로우를 구분하기위한 특징을 가진 필드
: 관계형 데이터베이스의 특징
: Primary Key, Foreign Key
SQL
: Structured Query Language
: 표준화된 데이터베이스 질의어 DML과 DDL
: DDL - CREATE, ALTER, DROP (테이블)
: DML - Select, Insert, Delete, Update (데이터)
데이터베이스 자료형
: 데이터베이스에 저장되는 데이터의 유형 정의
: 데이터베이스 종류마다 자료형 이름에 차이가 있음
: 기본적으로 숫자형, 문자형, 바이너리형, 날짜형
: 가변형 문자열은 길이를 고정하지 않기 때문에 관리에 유리
: 이미지화일등의 저장에는 바이너리형에 필요함
: 날짜 기간 검색 등을 위해서는 날짜형을 반드시 사용해야 함
: 숫자를 문자형으로 저장한 경우에는 +, - 등 연산이 되지 않음
: 사용 목적에 따라 신중히 결정해야 함
종류 | 설명 | 크기 |
CHAR(길이) | 고정길이 문자열 | 최대 255문자 |
DATE | 날짜형 | |
LONG | 가변 길이 문자열 | 최대 2GB |
LONG RAW | 바이너리 데이터 | |
NUMBER NUMBER() NUMBER(, ) |
숫자 데이터 | |
VARCHAR2 | 가변 길이 문자열 데이터 | |
CLOB | 1바이트 문자를 처리하는 대용량 자료형 | |
NCLOB | 2바이트 | |
BLOB |
JDBC
: Java Database Connectivity
: 자바 애플리케이션에서 표준화된 데이터베이스 접근 제공
: 각 데이터베이스 접속에 대한 상세한 정보를 알 필요 없음
: 이론적으로는 개발된 애플리케이션에서 DB 변경시 JDBC 드라이버만 교체하면 됨
JDBC 구조
: 자바에서 데이터베이스를 표준화 된 방법으로 접속할 수 있도록 만든 API 규격
: 데이터베이스 벤더와 상관없이 동일한 개발이 가능함
설치 디렉터리
: ojdbc?.jar (저는 ojdbc6.jar + ojdbc6_g.jar)
: JRE경로 - C:\Program Files\Java\jre1.8.0_261\lib\ext
(JRE없을 경우 JDK - C:\Program Files\Java\jdk1.8.0_261\lib)
: 톰캣 경로 - C:\Program Files\Apache Software Foundation\Tomcat 9.0\lib
: 이클립스 경로 - Dynamic Web Project → WebContent → WEB-INF → lib
JDBC 프로그래밍 단계
: JDBC 드라이버 로딩 ( System.setProperty() or Class.forName())
→ 데이터베이스 연결 (java.sql.Connection)
→ Statement 생성 (java.sql.Statement or java.sql.PreparedStatement) executeQuery() executeUpdate
→ SQL문 전송 (java.sql.Statement)
→ 결과 받기 (java.sql.ResultSet)
→ 연결 해제 (java.sql.Connection) close()
데이터베이스 드라이버 로드
: Class.forName("oracle.jdbc.driver.OracleDriver");
: 엑세스 DB인 경우 - sun.jdbc.odbc.JdbcOdbcDriver
데이터베이스 연결
: Connection conn = DriverManager.getConnection(JDBC_url,"아이디","비밀번호");
: JDBC_URL 구성 = JDBC:oracle:thin:@IP주소(localhost):포트:SID
: 엑세스 DB인 경우 = jdbc:odbc:song
<%@page import="java.sql.*"%> <!-- java.sql Import -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Connection conn = null;
String driver = "oracle.jdbc.driver.OracleDriver"; // 드라이버 주소
String url = "jdbc:oracle:thin:@localhost:1521:xe"; // URL 주소
Boolean connect = false; // 확인을 위한 ture/false
try {
Class.forName(driver); // 드라이버 로드
conn = DriverManager.getConnection(url, "hr", "hr"); // 데이터베이스 연결
connect = true;
conn.close(); // 연결 해제
} catch (Exception e) {
connect = false;
e.printStackTrace();
}%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%if (connect == true) {%>
연결되었습니다.
<%}else {%>
연결에 실패하였습니다.
<%}%>
</body>
</html>
: 아이디 비밀번호가 보이기때문에 보안상 문제가 생길 수 있음
커넥션 풀 설정
: Servers → Tomcat v9.0 Server at localhost-config → context.xml 복사
: Web Dynamic Project → WebContent → META-INF 붙여넣기 후 편집
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name = "jdbc/OracleDB"
auth = "Container"
driverClassName = "oracle.jdbc.driver.OracleDriver"
type = "javax.sql.DataSource"
url = "jdbc:oracle:thin:@localhost:1521:xe"
username = "hr"
password = "hr"
maxActive = "20"
maxIdle = "10"
maxWait = "-1" />
</Context>
: web.xml 설정(추가)
<resource-ref> <!-- 리소스를 참조 -->
<description>Connection</description>
<res-ref-name>jdbc/OracleDB</res-ref-name> <!-- context.xml에 설정한 이름 : 가장 중요함 -->
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
: 커넥션 풀 사용
- 톰캣 6버전 이하면 설정이 더 필요함(커넥션 풀 라이브러리 설정, 7부터는 포함되어있음)
<%@page import="java.sql.*"%>
<%@page import="javax.sql.*"%>
<%@page import="javax.naming.*"%>
<%
Connection conn = null;
try{
Context init = new InitialContext();
DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
conn = ds.getConnection();
out.println("<h2>연결되었습니다.</h2>");
}catch(Exception e){
out.println("<h2>연결이 실패하었습니다.</h2>");
e.printStackTrace();
}
%>
Statement 생성 및 쿼리 실행
: Statement 객체 생성 후 SQL 문장을 변수 처리부와 함께 문자열로 구현
: 쿼리가 복잡해질수록 성능저하 및 관리에 어려움이 있음
<%@page import="java.sql.*"%>
<%@page import="javax.sql.*"%>
<%@page import="javax.naming.*"%>
<%
Connection conn = null;
String sql = "INSERT INTO stu(num, name) VALUES(7, '홍길동')";
try{
Context init = new InitialContext();
DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
conn = ds.getConnection();
// 객체 생성
Statement stmt = conn.createStatement();
int result = stmt.executeUpdate(sql);
if(result != 0){
out.println("<h2>레코드가 등록되었습니다.</h2>");
}
}catch(Exception e){
out.println("<h2>레코드 등록에 실패하였습니다.</h2>");
e.printStackTrace();
}
%> <!-- SELECT * FROM student로 등록된것을 확인 -->
PreparedStatement 생성 및 쿼리 실행
: PreparedStatement 객체 생성시 SQL 문장을 미리 생성하고 변수부는 별도의 메서드로 대입하는 방식으로
성능과 관리 면에서 모두 권장되는 방식
<%@page import="java.util.Scanner"%>
<%@page import="java.sql.*"%>
<%@page import="javax.sql.*"%>
<%@page import="javax.naming.*"%>
<%
Connection conn = null;
String sql = "INSERT INTO stu VALUES(?, ?)";
Scanner sc = new Scanner(System.in);
try{
Context init = new InitialContext();
DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
conn = ds.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
for(int i=7; i<10; i++){
pstmt.setInt(1, i);
pstmt.setString(2, sc.next());
if(pstmt.executeUpdate() != 0){
out.write("<h2>"+i+"번 레코드를 등록하였습니다.</h2><br>");
}
}
}catch(Exception e){
out.println("<h2>레코드 등록에 실패하었습니다.</h2>");
e.printStackTrace();
}
%>
ResultSet 사용 (SELECT)
<%@page import="java.sql.*"%>
<%@page import="javax.sql.*"%>
<%@page import="javax.naming.*"%>
<%
Connection conn = null;
String sql = "SELECT * FROM stu";
try{
Context init = new InitialContext();
DataSource ds = (DataSource)init.lookup("java:comp/env/jdbc/OracleDB");
conn = ds.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
out.println("<h3>"+rs.getInt(1)+". "+rs.getString(2)+"</h3>");
}
rs.close();
}catch(Exception e){
out.println("<h2>데이터 가져오기에 실패하었습니다.</h2>");
e.printStackTrace();
}
%>
'Java > java' 카테고리의 다른 글
Model2 (MVC2) (0) | 2020.09.23 |
---|---|
파일 업로드 (0) | 2020.09.23 |
빈즈 (Beans) (0) | 2020.08.28 |
JSP 문법 (0) | 2020.08.26 |
서블릿 (Servlet) (0) | 2020.08.25 |