2주차 - 데이터베이스 다루기
- DB 생성 (H2)
- 내장형 H2 DB설치 및 사용 방법 배움
- DB 데이터 다루기 (SQL)
- 기본 SQL 명령어 사용하여 데이터 조작 방법 익힘
H2는 Server Mode, In-memory Mode, Embeded Mode라는 세가지 방식으로 사용할 수 있다.
- Server Mode
- 직접 엔진을 설치하여 사용하는 방식.
- 애플리케이션과 상관 없는 외부에서 DB 엔진이 구동된다.
- 데이터가 애플리케이션 외부에 저장되므로 애플리케이션을 종료해도 데이터가 사라지지 않는다.
- In-memory Mode
- 엔진을 설치하지 않고 애플리케이션 내부의 엔진을 사용하는 방식.
- build.gradle 및 application.properties 설정을 통해 실행 가능하다.
- 애플리케이션을 실행하면 DB 엔진이 함께 실행되고 애플리케이션을 종료하면 DB 엔진이 함께 종료된다.
- 데이터가 애플리케이션의 메모리에 저장되기 때문에 애플리케이션을 종료하면 데이터가 사라진다.
- 엔진을 설치하지 않고 애플리케이션 내부의 엔진을 사용하는 방식.
- Embedded Mode - (주 실무로 쓰일 예정)
- 엔진을 설치하지 않고 애플리케이션 내부의 엔진을 사용하는 방식.
- build.gradle 및 application.properties 설정을 통해 실행 가능하다.
- 애플리케이션을 실행하면 DB 엔진이 함께 실행되고 애플리케이션을 종료하면 DB 엔진이 함께 종료된다.
- 데이터가 애플리케이션 외부에 저장되므로 애플리케이션을 종료해도 데이터가 사라지지 않는다.
- 엔진을 설치하지 않고 애플리케이션 내부의 엔진을 사용하는 방식.
| Mode | H2 다운로드 여부 | 실행 주체 | DB 저장 위치 | 사용 용도 |
| Server Mode | O | 외부 | 로컬(파일 시스템) | 배포 용도 |
| In-Memory Mode | X | 스프링 | 메모리 | 테스트 용도 |
| Embedded Mode | X | 스프링 | 로컬(파일 시스템) | 개발 용도 |
01. 데이터베이스 생성
1. H2 설치(MAC) - Platform-Independent Zip
https://www.h2database.com/html/download.html
Downloads
Downloads Version 2.3.232 (2024-08-11) Windows Installer (SHA1 checksum: 58e6993a0440ffb2c6d6864ba81931c495bdb993) Platform-Independent Zip (SHA1 checksum: 3723f1c0cd4eae43780c7302bbbc8064a547a11e) Archive Downloads Archive Downloads Maven (Binary JAR, Jav
www.h2database.com
2. H2 폴더 경로 지정
3. 권한 부여 - chmod +x bin/h2.sh
4. H2실행 - sh bin/h2.sh
5. URL 경로 - http://localhost:8082/
Project 파일에서
#application.yml
# H2 Database 설정
datasource:
driver-class-name: org.h2.Driver
# url: 'jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE' # H2 DB 연결 주소 (In-Memory Mode)
url: 'jdbc:h2:~/test' # H2 DB 연결 주소 (Embedded Mode)
username: username # H2 DB 접속 ID (사용자 지정)
password: password # H2 DB 접속 PW (사용자 지정)
# H2 Console 설정
h2:
console: # H2 DB를 웹에서 관리할 수 있는 기능
enabled: true # H2 Console 사용 여부
path: /h2-console # H2 Console 접속 주소
H2 Database 설정
실행시, /h2-console
H2 콘솔 실행(GUI 모드)
sh h2.sh
02. 데이터 다루기 (SQL)
SQL - 데이터베이스 시스템을 조작하는 언어
SQL의 종류 : DDL(데이터 정의 언어), DML(데이터 조작 언어), DCL(데이터 제어 언어)
- 데이터 조리 시작(DDL)
- CREATE TABLE (테이블명)
- ALTER TABLE (테이블명)
- DROP TABLE (테이블명)
- 데이터 찾기(DML)
- SELECT * WHERE (조건)
- ORDER BY (재료 순서대로 정렬), GROUP BY (그룹)
- UPDATE (테이블명)
- JOIN * FROM (테이블명) T JOIN U ON U.ID
- 데이터 조리 및 제거(DML)
- INSERT INTO
- UPDATE
- DELETE FROM
- 트랜잭션 관리와 보안(DCL)
- 트랜잭션 관리
- BEGIN - START TRANSACTION과 동일하여 새로운 트랜잭션을 생성 및 시작하는 연산
- COMMIT
- 하나의 트랜잭션이 끝났다를 알려주는 연산, 트랜잭션이 로그에 저장되며, 후에 Rollback연산을 수행했었던 트랜잭션단위로 하는 것을 도와준다.
- ROLLBACK
- 하나의 트랜잭션이 비정상적으로 종료되어 트랜잭션의 원자성이 깨진 경우, 처음부터 다시 실행하거나 취소시킨다.
- 접근 권한 설정 : GRANT, REVOKE
- 트랜잭션 관리
- 트랜잭션 입문
- 데이터베이스의 상태 변화시키기 위해 수행하는 작업의 단위
- 생성, 수정, 삭제 후 최종 결과물을 만들때까지 하나의 작업을 트랜잭션으로 관리할 수 있다.
- 즉, 데이터 처리 중에 문제가 발생하면 그 전으로 돌아가 아무일도 없던 것처럼 모두 되돌리게 된다.
- 트랜잭션 3가지 특징
- 원자성(All or Nothing) - 트랜잭션이 데이터베이스에 모두 반영 되던가, 아니면 전혀 반영되지 않아야 한다.
- 일관성(Keeps Data Correct) - 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다. (도중 변경된 데이터 X)
- 독립성(Independent) - 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우, 다른 트랜잭션의 연산에 끼어들 수 없다.
- SQL Query 문법
SQL Query 문법
SQL(Structured Query Language)은 관계형 데이터베이스에서 데이터를 관리하고 조작하는 데 사용되는 표준 언어이다.SQL을 사용하면 데이터베이스에 데이터를 삽입, 조회, 수정, 삭제가 가능하며 DDL, DML,
dev99-tale.tistory.com
복잡한 쿼리 실습
1. 테이블 확장
기존 테이블
CREATE TABLE users (
id SERIAL,
name VARCHAR(255)
);
컬럼 추가
- email: 사용자의 이메일 주소
- created_at: 계정 생성 날짜
- status: 계정 상태 (활성/비활성)
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';
추가 테이블 생성
- orders: 사용자 주문 정보 저장 테이블
- products: 상품 정보 저장 테이블
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
);
2. 데이터 삽입
users 테이블에 데이터 삽입
INSERT INTO users (name, email, status) VALUES
('Alice', 'alice@example.com', 'active'),
('Bob', 'bob@example.com', 'inactive'),
('Charlie', 'charlie@example.com', 'active');
products 테이블에 데이터 삽입
INSERT INTO products (name, price) VALUES
('Laptop', 1000.00),
('Phone', 500.00),
('Tablet', 300.00);
orders 테이블에 데이터 삽입
INSERT INTO orders (user_id, product_id, quantity) VALUES
(1, 1, 1),
(1, 2, 2),
(2, 3, 1),
(3, 1, 3);
3. 쿼리 실습
- WHERE 절
- 활성 상태(active)인 사용자만 조회
SELECT * FROM users
WHERE status = 'active';
- JOIN
- 사용자와 주문 내역을 함께 조회
SELECT users.name, orders.id AS order_id, products.name AS product_name, orders.quantity, orders.order_date
FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id;
GROUP BY
- 사용자별 주문 개수 집계
SELECT users.name, COUNT(orders.id) AS total_orders
FROM orders
JOIN users ON orders.user_id = users.id
GROUP BY users.name;
ORDER BY
- 사용자 이름으로 정렬하여 조회
SELECT * FROM users
ORDER BY name;
- 주문 내역을 주문 날짜 순으로 내림차순 정렬하여 조회
SELECT users.name, products.name AS product_name, orders.quantity, orders.order_date
FROM orders
JOIN users ON orders.user_id = users.id
JOIN products ON orders.product_id = products.id
ORDER BY orders.order_date DESC;
4. 실습을 위한 데이터 리셋 (선택사항)
- 데이터 초기화를 원할 경우, 다음 쿼리로 테이블 내용을 지울 수 있습니다.
TRUNCATE TABLE orders;
TRUNCATE TABLE products;
TRUNCATE TABLE users;
5. 추가 연습 문제
- 특정 날짜 이후에 생성된 계정을 가진 사용자 조회
SELECT * FROM users
WHERE created_at > '2023-01-01';
- 각 사용자별 총 주문 금액 조회
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;
JPA는 SQL을 많이 다뤄보아야 한다. 데이터를 다루는데 있어서 많이 필요하므로 익힐 필요가 있다. JPA 프로젝트를 하는데 있어서
필수로 쓰일거다.
이 자료를 통해 MySQL의 기본적인 테이블 생성, 수정, 데이터 삽입 및 다양한 쿼리 작성을 연습할 수 있다. 실습을 통해 SQL 쿼리에 익숙해지고 데이터를 효율적으로 관리할 수 있도록 많이 연습해보자!
'Sparta(JAVA심화3기) - TIL > 스파르타 강의 - JPA, Docker, 입문, 숙련, 심화' 카테고리의 다른 글
| JPA(JAVA Persistence API) - 3-3 주차 (TIL) ⭐️ (0) | 2025.02.14 |
|---|---|
| JPA(JAVA Persistence API) - 3-2주차 (TIL) (1) | 2025.02.11 |
| JPA(JAVA Persistence API) - 3-1 주차 (TIL) (2) | 2025.02.11 |
| JPA(Java Persistence API) - 2-2주차 (TIL) (1) | 2025.02.11 |
| JPA (Java Persistence API) - 1주차 (1) | 2025.02.11 |