58일: 데이터베이스 복습, Spring Boot Project, JDBC 및 ODBC 드라이버, Pool

Jiwontwopunch·2022년 2월 7일
0

국비기록

목록 보기
58/121
post-thumbnail

2022.02.07.Mon.

✍ 복습

데이터 베이스

  1. 데이터 무결성 보장
  2. 데이터 일관성 보장
    CONSTRAINT_TYPE
  • 개체 무결성 제약조건 : 기본키(주민번호 등)는 필수입력, 중복불가능(not null, unique)
  • 참조 무결성 제약조건 : 외래키는 null 또는 참조하는 기본키의 값만 가능 dept의 deptno는 10,20,30,40 → emp에 사원을 추가할 때 부서번호는 입력하지 않거나 입력한다면 dept의 deptno값이어야 한다.
  • 도메인 무결성 제약조건 : 도메인은 필드가 가질 수 있는 범위

관계형(relational)데이터베이스 RDB

  • 행: 하나의 데이터 → 자바에서 읽어가면 하나의 객체
  • 컬럼: 하나의 필드
  • 기본키: 행을 식별하는 기준(주민번호, 휴대폰 번호, 학번,,,)
    자동으로 인덱스가 된다. 즉 주민번호, 휴대폰, 학번이 모두 있는 경우 가장 많이 사용할 컬럼으로 기본키를 결정
  • 외래키: emp 테이블은 dept 테이블을 참조한다. 사원을 추가할 때 우리 회사의 부서들 중에서 사원의 부설르 선택해야 한다
    참조하는 테이블의 기본키
  • null: 현재 알 수 없는 값, 선택입력으로 empty와는 다르다.

두 테이블 사이의 관계(relationship)

  • 기본키는 다른 컬럼을 함수 종속시켜야한다. (하나만 나와야 한다)
  • 테이블에 속한 컬럼들은 모두 1:1 관계 → 1:N 관계를 만들기위해서는 테이블을 분리
  • 1:1, 1:N, N:N(RDB에서는 표현이 불가능, 테이블을 교차intersection해서 두 개의 1:N으로)

SQL

데이터베이스와 프로그래머가 대화하는 언어

  • 데이터 정의DDL : create, alter, drop → auto commit
  • 데이터 조작DML : insert, select, update, delete
    insert, update, delete → 정수, commit/rollback 필요
    select → Emp 또는 List<Emp>
  • 데이터 제어DCL : commit, rollback, grant, revoke
    작업이 실패 → rollback
    transaction: 여러 개의 명령어의 집합이 정상적으로 처리되면 정상 종료, 하나의 명령어라도 잘못되면 전체 취소된다. 트랜잭션을 쓰는 이유는 데이터의 일관성을 유지하면서 안정적으로 데이터를 복구하기 위함이다.

select문

select 열이름 from 테이블이름 where 조건 order by 정렬;

-- public List<EMP> read() {  }
select empno, ename, job, sal from emp where sal>=3000;
-- JPA 같은 경우 기본적으로 컬럼을 지정못한다.
select * from emp where sal>=3000;

-- 조건절where의 ?는 사용자에게 값을 받아오는 것
--List<EMP> read1(int sal) Java의 sal 값이 아래에
--인덱스 없는 검색 → table access full
select * from emp where sal>=?;
-- EMP read2()
--기본키를 이용한 검색 → 기본키니까 결과는 1개 → 검색이 종료
select * from emp where empno=?;
-- 이름으로 검색한다면
-- rownum=1 하나를 찾고 검색 종료
select * from emp where ename='SMITH' and rownum=1;
  • 테이블에 기본키를 작성하면 제약조건(not null, unique)이 만들어진다. 그리고 그 제약조건이 인덱스가 된다.
  • emp 테이블의 기본키 제약조건 이름이자 인덱스 이름
    : PK_EMP

DB정규화 - 도메인 무결성 체크

테이블의 각 컬럼은 도메인(값의 범위)을 정의할 수 있어야 한다. 예를 들어 emp의 deptno의 경우는 외래키이므로 null 또는 dept 테이블의 deptno만 입력가능. 토정비결에서 년, 월, 일, 시를 도메인을 정의해서 <select>로 입력받는 것이 바람직하다. 컬럼은 원자값(분리 불가능한 값)을 가져야 한다.

오라클의 타입

문자열, 숫자, 날짜. 날짜는 형식을 갖춘 문자열이다.

select * from where hiredate>='1981-07-01';
select * from where hiredate>='81-07-01';
select * from where hiredate>='81/07/01';

실행 순서

from → where → select → order by(는 매우 느린 작업이므로 꼭 필요한 경우가 아니라면 사용하지 말자)

nvl(식, 식이 null일 때의 값)

계산식에 null이 포함되면 결과는 무조건 null
select emp.*, nvl(sal+comm, sal) from emp;
=select emp.*, sal+nvl(comm,0) from emp;

like '문자열'

문자열을 포함하는 상위카테고리에 속하는 모든 하위를 지정하는 정도. 인덱스를 사용할 수 없는 매우 느린 연산.

테이블 만들기

create table em01 (
	empno number(4),
    ename varchar2(20),
    sal number(7,2)
);
--숫자는 number(자리수, 소수점이하 자리수)
--문자열은 고정길이 문자열char(10), 가변길이 문자열varchar2(10)
--char(10)      'hello     ' → 즉시 10바이트
--varchar(10)   'hello'      → 최대 10바이트

create table em02 (
	--컬럼 레벨로 제약조건 지정하기
	empno number(4) constraint em03_pk_empno primary key,
    ename varchar2(10 char) not null,
    gender char(3) default '여',
    hiredate date default sysdate
);
--varchar2(10 char) → 최소 10바이트에서 최대 30바이트
--한글 1글자는 3바이트
--LOB: 대용량 데이터 컬럼 
	--BLOB: 최대 4GB 바이너리(이진) 데이터
      파일을 직접 저장하면 테이블 크기가 매우 커질 수 있다.
      → 보통 파일은 디스크에 저장하고 파일명을 문자열로 저장한다.
    --CLOB: 최대 4GB 문자열 데이터
--컬럼 뒤에 기본키나 not null등을 지정하는 것 → 컬럼 레벨
--empno number(4) primary key; 
	--SYS_일련번호 형식으로 제약조건 이름이 생성된다.
--not null 제약조건은 컬럼 레벨로만 지정가능

create table em03 (
	--테이블 레벨로 제약조건 지정하기
    empno number(4),
    ename varchar2(10 char) not null,
    constraint em03_pk_empno primary key (empno),
    --테이블 레벨로 deptno를 dept.deptno로 참조하는 외래키로 지정
    constraint em03_fk_emp foreign key(deptno) REFERENCES dept(deptno)
);

create table em04 (
	empno number(4),
    deptno number(2),
    info clob,
    --기본키가 복합 컬럼인 경우 컬럼 레벨로는 생성을 못한다.
    --복합 컬럼 기본키에 대한 인덱스는 컬럼을 적은 순서대로 만들어진다.
    --empno가 있어야만 deptno에 대해 인덱스를 탈 수 있다.
    constraint em04_pk primary key(empno, deptno)
);

sequence

실패여부를 떠나서 무조건 1씩 증가 → 일련번호로 자주 활용

create sequence board_seq minvalue 0;
--시퀀스의 값을 읽어와야 사용할 수 있다.
select board_seq.nextval from dual; // 0 

create table bb (
	bno number(4) primary key,
    content varchar(100 char)
);

indert into bb vlues(board_seq.nextval, 'hello');
commit;
select * from bb;

Spring Boot Project 생성

JDBC(Java DataBase Connectivity) 데이터베이스 프로그래밍

JDBC는 자바와 데이터베이스를 연결하는 표준

  • 표준: 추상 메소드와 순서
  • 구현: 자바와 연동하기를 원하는 데이터베이스 벤더. 벤더가 구현한 JDBC 표준을 드라이버라고 한다.
    처음에는 마이크로소프트가 ODBC(Open Databace 커넥티비티) 드라이버가 호환가능했다.

JDBC 드라이버, ODBC 드라이버

주요객체

  • 자바와 데이터베이스를 연결하는 객체 : Connection 객체
  • SQL문을 저장하고 있는 객체: PreparedStatement 객체
    이전에 Statement 객체가 있었다 → SQL injection 공격에 털려나간다.
  • SQL문을 실행한 결과 : ResultSet 객체

Pool

미리 만들어 놓고 사용하는 것

  • Connection은 사용자와 데이터베이스를 연결한다. 데이터베이스는 연결 10개에 얼마.. 이런 식으로 요금이 책정된다. 또 연결을 만들고 연결을 해제하는 것이 비용이 비싸다. 그래서 연결을 미리 만들어 놓고 사용자들이 빌려서 사용한 다음에 반납하자 → Connection Pool은 필수! 그런데 Connection 객체는 close하면 연결을 종료하게 만들어져 있다.
  • 어떤 객체에 내가 원하는 기능을 조합한 프랑켄슈타인 객체→proxy
  • Connection에 대한 프록시 객체는 DataSource객체
    (javax.sql.DataSource)
  • 연결 풀을 DataSource 기반으로 동작

Connection Pool의 종류

  • 보통 널리 사용하는 것은 apache DBCP
  • 스프링 부트는 Hikari CP를 사용

Spring Boot 자동 설정 지원 기능

자바, 서블릿, 스프링MVC에서 어떤 라이브러리를 추가하면 추가하고 끝(동작은 안한다). 하지만 스프링부트는 자동 설정을 지원한다. 예를 들어 스프링 시큐리티를 추가하면 보안기능이 바로 동작한다. 마찬가지로 MyBatis를 추가했다 → DB 연결이 필요하겠네. 연결하자 → 어 근데 설정이 없네 → 에러..

0개의 댓글