데이터베이스란?
- 데이터베이스(DB: Database)는 통합하여 관리되는 데이터의 집합체를 의미합니다.
- 이는 중복된 데이터를 없애고, 자료를 구조화하여, 효율적인 처리를 할 수 있도록 관리됩니다.
- 이러한 데이터베이스는 응용 프로그램과는 다른 별도의 미들웨어에 의해 관리됩니다.
- 데이터베이스를 관리하는 이러한 미들웨어를 데이터베이스 관리 시스템(DBMS: Database Management System)이라고 부릅니다.
다수의 웹 어플리케이션이 회원정보, 게시글, 컨텐츠 등을 저장하기 위해 데이터베이스를 사용한다.
데이터의 손실이 발생하면 안되기 때문에 트랜잭션을 보장하여 데이터의 신뢰성을 높여주기도 한다.
테이블과 레코드
RDBMS에서 데이터를 저장하는 장소를 테이블이라고 한다.
테이블은 어떤 데이터를 저장하여 그 데이터의 길이는 최대 몇 글자 인지등의 정보를 갖고 있는데 이처럼 테이블 구조와 관련된 정보를테이블 스키마 라고 부른다
스키마는 하나의 데이터에 대한 구조를 나타낸다.
주요키와 인덱스
테이블에 저장한 레코드를 사용하렴녀 각 레코드를 구별하는 방법이 필요하다.
레코드를 미리 특정 값을 이용해서 정렬해 놓음녀 좀더 빠르게 레코드를 찾을 수 있다
이러한 목적의 키는 프라이머리키 이다
하나의 테이블에 저장된 모든 레코드가 서로 다른 값을 갖는 칼럼을 의미한다.
회원 아이디와 같이 서로 다른 값을 가져야 하는 칼럼이 주요키로 사용한다.
PK와 더불어 레코드를 분류할 때 사용되는 것이 인덱스이다
인덱스는 데이터의 순서를 미리 정렬해서 저장할 때 사용된다.
디비도 레코드의 특정 칼럼을 사용해서 레콛르르 쉽게 찾을 수 있도록 미리 정리된 표를 만ㄷ르어 둔다.
인덱스는 중복된 값에 대한 정렬이 가능하지만
피케이는 중복된 값을 가질 수 없다는 차이가 있다.
데이터베이스 프로그래밍의 일반적 순서
쿼리
LIKE 검색은 편리하지만, 검색 속도가 매우 느리다.
레코드가 수백만이나 수천만개라면 검색 속도가 매우 느려진다
별도의 검색 엔진을 사용해야 한다
정렬 orderBy
집합
sum, max, min count
총합, 최대, 최소, 갯수
조인
두 개 이상의 테이블에서 관련 있는 데이터를 함께 읽어올 때 사용된다
공통된 조건으로 데이터를 합쳐 표현하는것
관련된 테이블로부터 필요한 칼럼을 모아서 한꺼번에 읽어올 수 있기 때문에 여러 테이블에 분산해서 저장된 정보를 읽어올 때 유리하다
크게 INNER, OUTER가 있다
공통된 정보를 통해서
OUTER JOIN (LEFT, RIGHT, FULL OUTER JOIN)
JDBC
자바 애플리케이션에서 데이터베이스를 사용할 때 데이터베이스 종류에 상관 ㅇ벗이 JDBC API를 이용해서 데이터베이스에 접근한다.
각각의 DBMS는 JDBC 드라이버를 제공한다.
전형적인 실행 순서
JDBC 드라이버 로딩
데이터베이스 커넥션 구함
쿼리 실행을 위한 Statement 객체 생성
쿼리 실행
쿼리 실행 결과 사용
Statement 종료
데이터베이스 커넥션 종료
MySQL JDBC 드라이버가 MYSQL 서버와 데이터를 주고받을 때 사용되는 캐릭터 셋을 올바르게 지정하지 않으면 한글이나 한자와 같은 글자가 잘못된 값으로 데이터베이스에 저장될 수 있다.
오라클 드라이버에는 Thin, OCI드라이버가 있다. Thin은 자바로만 구현되어 있어서 JDK만 있음녀 된다.
반면에 OCI 드라이버는 네이티브 모듈을 사용하는 JDBC 드라이버로서 해당 모듈을 설치해줘야만 한다.
데이터베이스 커넥션
Statement 객체를 사용하면 쿼리를 실행할 수 있다
executeQuery -> SELECT 쿼리의 결과값을 객체에 저장하여 리턴해준다.
executeUpdate -> INSERT, UPDATE, DELETE, 그 결과로 변경된 레코드의 갯수를 리턴함
ResultSet에서 값 읽어오기
executeQuery 메소드는 셀렉트 쿼리를 실행할 때 사용되고 이 객체에 담아서 리턴함
next 메서드를 통해서 셀렉트 결과의 존재 여부를 알 수 있다.
ResultSet은 셀렉트 쿼리 결과를 같은 행으로 젖아하여 커서를 통해 각 행의 데이터에 접근한다 .
ResultSet에서 LONG VARCHAR(대량의 텍스트 데이터)
이 타입의 데이터를 읽어오려면 getCharacterStream() 메서드를 이용해야 한다.
리턴타입이 java.io.Reader 이기다.
buffer에 담아서 string으로 변경해야 한다.
PreparedStatement -> java.sql.Statement와 동일한 기능을 제공하짐나 차이점은 쿼리의 틀을 미리 생성해놓고 값을 나중에 지정한다는 것이다.
PreparedStatement를 생성할 때 에 실행할 쿼리를 지정하기 떄문에 이 메서드는 쿼리를 인자로 입력받지 않는다.
PreparedStatement에서 LONG VARCHAR 타입의 값을 지정할 때에는 REader로부터 length 글자 수 만큼 데이터를 읽어와 저장한다.
Reader에는 STring으로부터 데이터를 읽어오는 리더와 파일로부터 읽어오는 리더등이 있따.
PreparedStatement 쿼리를 사용하는 경우
값 변환을 자동으로 하기 위해
코드 간결화를 위해
JDBC에서 트랜젝션 처리
두 쿼리를 모두 정상적으로 실행해야 데이터가 올바르게 유지된다. 이렇게 두 개 이상의 쿼리를 모두 성공적으로 실행해야 데이터가 정상적으로 처리되는 경우 DBMS는 트랜잭션을 이용해서 두 개 이상의 쿼리를 마치 한개의 쿼리 처럼 처리할 수 있도록 하는 것
시작과 종료를 갖고 있고
시작되면 이후로 실행되는 쿼리 결과는 DBMS에 곧바로 반영되지 않고 임시로 보관된다.
이후 트랙잭션을 커밋하면 임시 보관된 모든 쿼리 결과를 실제 데이터에 반영한다.
커밋하기 전에 에러가 발생하면 임시로 보관한 모든 쿼리 겨로가를실제 데이터에 반영하지 않고 처리한다.
트랜잭션 구현하는 방법
오토커밋모드는 false
JTA를 이용하는 방법
단일 디비에 접근하는 경우 JDBC 기반의 트랜잭션을 이용해서 구현
두 개 이상의 디비를 트랜잭션으로 처리하려면 JTA 이용 해야 함
conn.setAutoComit(false)
// 쿼리 실행
// 쿼리 실행 2
//
conn.commit()
커넥션 풀
JSP 페이지를 실행할 때 마다 커넥션을 생성하고 닫는 데 시간이 소모되어 동접자가 많으면 성능이 낮아진다.
이를 해결하기 위한것이 커넥션 풀이다
데이터베이스와 연결된 커넥션을 미리 만들어서 풀 속에 저장해놓고 필요할 때 커넥션을 풀에서 가쟈다 쓰고 다시반환하는 기법
커넥션 생성에 드는 연결 시간을 줄일 수 있다.
재사용 하기 때문에 생성되는 커넥션 수가 일정하게 유지도니다.
실제 커넥션을 생성할 ConnectionFactory 생성
커넥션 풀로사용할 PoolableConnection을 생성하는 PoolableConnectionFactory를 생성한다
커넥션 풀의 설정 정보를 생성한다
커넥션 풀을 사용할 JDBC 드라이버를 등록한다.
커넥션 풀에 있는 커넥션 중 오랜 시간 동안 사용 되지 않는 커넥션은 연결이 끊길 가능성이 높다
실행 도중 오류가 발생하기 떄문에 주기적으로 커넥션을 검사해서 사전에 제거해주는 것이 좋다.
커넥션이 최소 유휴 시간보다 오래 있는경우
커넥션이 유효한지 여부
검사 주기가 양수일 때 적용된다
양수가 아니면 유휴 커넥션 제거 처리 자체를 하기
'개발 > Spring' 카테고리의 다른 글
MVC 패턴 구현 (0) | 2021.04.11 |
---|---|
서블릿이란 (0) | 2021.04.11 |
자바 ConcurrentHashmap (0) | 2021.04.11 |
자바 Hashtable, HashMap (0) | 2021.04.11 |
JSP의 동작 원리 (0) | 2021.04.11 |