본문으로 바로가기

Database

category Java/java 2020. 9. 21. 15:48

데이터베이스 

 : 여러 사람이 공유해서 사용할 목적으로 체계적으로 정리된 정보를 효율적으로 관리하고 검색할 수 있는 정보의 집합

 

생활 속의 데이터베이스

 : 휴대폰의 전화번호 목록

 : ㄱ,ㄴ,ㄷ으로 정리된 수첩의 주소록

 : 거의 모든 프로그램은 어떠한 형태로든 데이터베이스와 연결됨

 

데이터베이스 관리 시스템 (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