이 섹션에서는 내장형 H2 데이터베이스를 설치하고 설정하는 방법을 배웁니다. H2 데이터베이스의 주요 특징과 장점을 소개하며, 간단한 데이터베이스 생성 방법을 설명합니다.
SQL 기본 구문을 사용하여 데이터를 생성, 조회, 수정, 삭제하는 방법을 배웁니다. 이를 통해 데이터베이스 관리의 기본이 되는 SQL 문법에 대한 이해를 높입니다.
데이터베이스 드라이버의 역할과 중요성을 이해하고, 적절한 드라이버 선택 및 설정 방법을 배웁니다. JDBC 드라이버를 사용하여 애플리케이션과 데이터베이스 간의 연결을 구성하는 과정을 다룹니다.
JDBC를 통해 Java 애플리케이션에서 데이터베이스 데이터를 직접 다루는 방법을 소개합니다. Connection, Statement, ResultSet 객체의 사용법을 배우며, 간단한 CRUD 작업을 실습합니다.
1. 데이터베이스 생성 (H2)
DB(H2) 사용 방식 3가지
Server Mode
현업에서 사용하는 모드로 컴퓨터에 DB 엔진을 설치하고 엔진을 구동하여 사용하는 방식
애플리케이션과 DB가 분리되어 있기 때문에 여러 애플리케이션에서 동일한 DB를 사용하기에 적합하다.
경로 예: jdbc:h2:tcp://localhost/~/test
In-memory Mode
애플리케이션에 DB 엔진이 내장되어 애플리케이션과 함께 실행되고 종료되는 방식
데이터가 애플리케이션의 메모리에 저장되기 때문에 애플리케이션이 종료되면 모든 데이터가 사라지는 휘발성의 특징을 갖고 있다.
단위 테스트 등에서 많이 사용된다.
경로 예: jdbc:h2:mem:testdb
Embedded Mode
인메모리 모드와 동일하게 애플리케이션에 DB 엔진이 내장되어 애플리케이션과 함께 실행되고 종료되는 방식이나, 데이터를 로컬에 저장하기 때문에 데이터 휘발에서 자유롭다.
경로 예: jdbc:h2:~/test
Mode
H2 다운로드 여부
실행 주체
DB 저장 위치
사용 용도
Server Mode
O
외부
로컬(파일 시스템)
배포 용도
In-Memory Mode
X
스프링
메모리
테스트 용도
Embedded Mode
X
스프링
로컬(파일 시스템)
개발 용도
2. 데이터베이스에서 테이터 다루기 (SQL)
SQL 기본 개념
SQL (Structured Query Language): 데이터베이스를 정의하고 조작하는 표준 언어
SQL의 주요 분류
DDL (Data Definition Language): 데이터 구조 정의 (CREATE, ALTER, DROP)
DML (Data Manipulation Language): 데이터 조작 (SELECT, INSERT, UPDATE, DELETE)
DCL (Data Control Language): 트랜잭션 및 권한 제어 (COMMIT, ROLLBACK, GRANT, REVOKE)
DDL - 데이터 정의
CREATE TABLE: 테이블 생성
ALTER TABLE: 테이블 구조 변경 (컬럼 추가/삭제 등)
DROP TABLE: 테이블 삭제
CREATE TABLE users (id SERIAL, name VARCHAR(255));
DROP TABLE users;
DML - 데이터 조회 및 조작
SELECT: 데이터 조회
WHERE: 조건 검색
ORDER BY: 정렬
GROUP BY: 그룹화
JOIN: 테이블 연결
INSERT INTO: 데이터 삽입
UPDATE: 데이터 수정
DELETE FROM: 데이터 삭제
-- INSERT
INSERT INTO users (name) VALUES ('Alice');
-- SELECT
SELECT name FROM users WHERE id = 1;
-- UPDATE
UPDATE users SET name = 'Bob' WHERE id = 1;
-- DELETE
DELETE FROM users WHERE id = 1;
트랜잭션 (Transaction)
데이터 변경 작업의 논리적 단위. 하나의 트랜잭션은 모두 성공하거나 모두 실패해야 함.
트랜잭션 제어 명령
BEGIN 또는 START TRANSACTION: 트랜잭션 시작
COMMIT: 트랜잭션 완료 및 반영
ROLLBACK: 트랜잭션 취소 및 원상복구
트랜잭션의 특징 (ACID)
원자성 (Atomicity): 전부 실행되거나 전부 실행되지 않음
일관성 (Consistency): 데이터 무결성 보장
독립성 (Isolation): 동시에 실행 중인 트랜잭션 간 간섭 없음
지속성 (Durability): 트랜잭션이 커밋된 후의 변경 내용은 시스템 장애가 발생해도 유지됨
ALTER TABLE users ADD COLUMN email VARCHAR(255);
ALTER TABLE users ADD COLUMN created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
ALTER TABLE users ADD COLUMN status ENUM('active', 'inactive') DEFAULT 'active';
CREATE TABLE products (
id SERIAL,
name VARCHAR(255),
price DECIMAL(10, 2),
PRIMARY KEY (id)
);
CREATE TABLE orders (
id SERIAL,
user_id BIGINT,
product_id BIGINT,
quantity INT,
order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
데이터 삽입
INSERT INTO users (name, email, status) VALUES ('Alice', 'alice@example.com', 'active');
INSERT INTO products (name, price) VALUES ('Laptop', 1000.00);
INSERT INTO orders (user_id, product_id, quantity) VALUES (1, 1, 2);
복잡한 쿼리 예시
-- 활성 사용자 조회
SELECT * FROM users WHERE status = 'active';
-- 사용자별 주문 정보 조회 (JOIN)
SELECT users.name, products.name AS product_name, orders.quantity
FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id;
-- 사용자별 주문 수 (GROUP BY)
SELECT users.name, COUNT(*) AS order_count
FROM orders
JOIN users ON orders.user_id = users.id
GROUP BY users.name;
-- 사용자별 총 주문 금액
SELECT users.name, SUM(products.price * orders.quantity) AS total_spent
FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
GROUP BY users.name;