Sparta(JAVA심화3기) - TIL/스파르타 강의 - JPA, Docker, 입문, 숙련, 심화

JPA (Java Persistence API) - 2-1주차 (TIL)

Dev.99_tale 2025. 2. 11. 10:40

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(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. 쿼리 실습

  1. WHERE 절
  • 활성 상태(active)인 사용자만 조회
SELECT * FROM users
WHERE status = 'active';

  1. 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. 추가 연습 문제

  1. 특정 날짜 이후에 생성된 계정을 가진 사용자 조회
SELECT * FROM users
WHERE created_at > '2023-01-01';

  1. 각 사용자별 총 주문 금액 조회
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 쿼리에 익숙해지고 데이터를 효율적으로 관리할 수 있도록 많이 연습해보자!