DB 사용방식 3가지
1. Server Mode
DB 엔진을 서버에 직접 설치하여 사용하는 방식이다. 외부에서 DB 엔진이 구동되므로 애플리케이션 종료 시에도 데이터가 유지된다. 주로 배포 환경에서 많이 사용된다.
2. In-memory Mode
DB 엔진을 따로 설치하지 않고, 애플리케이션과 함께 메모리 내에서 실행되는 방식이다. 애플리케이션 메모리에 데이터가 저장되어 종료 시 데이터가 사라지며, 주로 테스트 용도로 사용된다.
스프링부트 설정 예시
# application.yml
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:{DB 이름}
username: sa
password:
# application.properties
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:{DB 이름}
spring.datasource.username=sa
spring.datasource.password=
3. Embeded Mode
DB 엔진을 따로 설치하지 않고 애플리케이션 내에서 구동하되, 데이터가 외부에 저장되어 애플리케이션 종료 시에도 유지된다. 주로 개발 환경에서 많이 사용된다.
스프링부트 프로젝트에서 설정
# application.yml
spring:
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:{DB 이름}
username: sa
password:
# application.properties
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:{DB 이름}
spring.datasource.username=sa
spring.datasource.password=
SQL
SQL은 데이터베이스를 조작하기 위한 언어로, 크게 DDL, DML, DCL로 나뉜다.
데이터 정의 언어(DDL)
- 테이블 생성:
CREATE TABLE
- 테이블 수정:
ALTER TABLE
- 테이블 삭제:
DROP TABLE
데이터 조작 언어(DML)
- 데이터 조회:
SELECT
- 조건 조회:
WHERE
- 정렬:
ORDER BY
- 그룹화:
GROUP BY
- 조인:
JOIN
- 조건 조회:
- 데이터 추가하기:
INSERT INTO
- 데이터 수정하기:
UPDATE
- 데이터 삭제하기:
DELETE FROM
트랜젝션
트랜잭션은 데이터베이스 상태를 변경하는 작업 단위로, 작업 중 문제가 발생할 경우 이전 상태로 되돌릴 수 있다.
트랜잭션의 4가지 특징
- Atomicity (원자성): 작업이 모두 실행되거나 전혀 실행되지 않는 것을 보장한다.
- Consistency (일관성): 사전 정의된 규칙을 만족하며 데이터가 수정된다.
- Isolation (독립성): 다른 작업의 영향을 받지 않도록 보장한다.
- Durability (영구성): 트랜잭션 성공 시 로그를 남겨 그 결과가 지속되도록 보장한다.
데이터 제어언어
- 트랜잭션 관리:
begin
,commit
,rollback
- 접근권한 관리:
grant
,revoke
데이터베이스 연결 및 드라이버
데이터베이스 드라이버
애플리케이션의 요청을 데이터베이스가 이해할 수 있는 언어로 변환하는 역할을 한다. 각 데이터베이스 시스템마다 호환되는 드라이버가 있다 (예: Oracle, MySQL, PostgreSQL).
데이터베이스 드라이버 동작
애플리케이션과 데이터베이스간의 데이터 교환을 조절하고 관리한다.
드라이버의 동작방식
- 연결초기화
- 요청 수신
- 연결 설정
- SQL 전송 및 실행
- SQL 명령 변환
- 명령 처리
- 결과 처리
- 결과 수신
- 결과 전달
- 연결 종료
- 연결 해제
JDBC Driver Manager 역할
- Connection(연결) 을 생성하여 쿼리를 요청할 수 있는 상태를 만들어주고
- Statement(상태) 를 생성하여 쿼리를 요청하게 해주고
- ResultSet(결과셋) 을 생성해 쿼리 결과를 받아올 수 있게 해줍니다.
데이터를 외부에서 다루기
Spring Boot의 JDBC 라이브러리
srping-boot-starter-jdbc
스타터 패키지
- JDBC API 지원: SQL로 데이터베이스에 접근하고 작업을 수행한다.
- DataSource 구성: 연결 설정을 자동으로 구성한다.
- JdbcTemplate: SQL 실행, 결과 처리, 예외 처리 등을 단순화한다.
JDBC
JDBC 드라이버: 자바 애플리케이션이 데이터베이스에 접근할 수 있도록 하는 API이다. JDBC 드라이버 타입: 네 가지 유형(Type 1, 2, 3, 4)이 있으며, Type 4 드라이버(순수 자바 드라이버)가 가장 일반적으로 사용된다. Statement vs PreparedStatement: PreparedStatement는 SQL 캐싱과 SQL Injection 방어가 가능하여 더 안전하고 성능이 좋다.
Statement vs PreparedStatement
PreparedStatement는 Statement를 상속하고 있는 interface이다. Statement는 executeQuery() 나 executeUpdate()를 실행하는 시점에 파라미터로 sql문을 전달하는데, 전달하는 sql문은 완성된 형태로 파악하기 쉽지만 구문 분석을 수행하는 과정에서 하기때문에 효율성이 떨어진다.
Prepared Statement는 내부적으로 4단계(구문분석, 치환, 실행, 인출) 과정 중 첫번째 parse 과정의 결과를 캐싱하고 나머지 3가지 단계만 거쳐서 SQL문이 실행될수 있게되어 성능이 향상된다. 부가적으로 SQL Injection도 방어할 수 있다.
JDBC Template(QueryMapper)
SQL 쿼리 요청 시 반복되는 코드 최소화, 자원 관리 자동화 등의 문제를 해결하기 위해 등장했다. SQL Mapper: SQL과 객체 필드를 매핑하여 데이터를 객체화한다 (MyBatis 등).
JDBC Template(RowMapper)
쿼리 결과와 객체 필드를 매핑하며, 자원 관리 및 반복 코드를 최소화한다. RowMapper의 mapRow
메서드는 쿼리 응답을 쉽게 객체로 변환한다.