반응형
10:00 ~ 11:00 JPA 심화 과제 발제
1️⃣ 의존성
- compile 시점 의존성: 프로젝트를 컴파일할 때 사용됩니다. 즉, 해당 라이브러리의 API를 사용할 수 있음.
- runtime 시점 의존성: 애플리케이션을 실행할 때 사용됩니다. 즉, 실행 시에도 라이브러리가 필요
- 은닉성: implementation으로 추가된 의존성은 다른 프로젝트 모듈에서 직접 접근할 수 없습니다. 이는 모듈 간의 캡슐화를 도와줌
✅ 의존성 옵션 (build.gradle > dependencies)
- implemenataion 옵션
- 직접적인 의존성을 추가할 때 사용
- 이는 특정 라이브러리나 모듈이 프로젝트 컴파일 시 필요하지만, 해당 라이브러리가 프로젝트 외부로 공개될 필요가 없다는 것을 의미
- runtimeOnly 옵션
- runtime 시점에만 필요한 라이브러리를 추가할 때 사용
- 대표적으로 Logging 관련 라이브러리, DB 관련 라이브러리 등이 있음
- testImplementation 옵션
- 테스트 코드를 수행할 때 적용할 라이브러리를 추가할 때 사용
- 테스트 용도로만 라이브러리나 빌트인 DB 사용하고 싶다면 해당 옵션을 사용
2️⃣ DB 다루기
✅ DB 생성 (H2)

| Mode | H2 다운로드 여부 | 실행 주체 | DB 저장 위치 | 사용 용도 |
| Server Mode | O | 외부 | 로컬 (파일 시스템) | 배포 용도 |
| In-Memory Mode | X | 스프링 | 메모리 | 테스트 용도 |
| Embedded Mode | X | 스프링 | 로컬 (파일 시스템) | 개발 용도 |
🔴 Server Mode
- 현업에서 사용하는 모드, 컴퓨터에 DB 엔진을 설치하고 엔진을 구동해 사용하는 방식
- 애플리케이션과 DB가 분리되어 있기 때문에 여러 애플리케이션에서 동일한 DB를 사용하기에 적합
- H2 DBMS는 해당 사이트 에서 다운로드 가능
🟡 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=
datasource의 url에는 일반적으로 DB 서버의 호스트와 포트 번호, DB 이름 등의 접속 정보를 기재하는데, H2에서는 여기에 mem을 기재하여 애플리케이션이 실행되는 메모리 자체에서 DB를 사용하겠다는 것을 선언.
🟢 Embedded 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=
- 위의 인메모리 모드와 차이점이라면 mem이 사라지고, jdbc:h2: 이후에 바로 DB가 저장될 경로를 입력하는 것
✅ DB에서 데이터 다루기 ( SQL )
🔴 SQL 입문
- SQL 소개: SQL은 마치 주방의 요리사처럼 데이터베이스 시스템을 조작하는 데 사용하는 특별한 언어
🟡 데이터 조리 시작하기 ( DDL )
- 테이블 만들기: CREATE TABLE로 새로운 재료함을 마련하는 방법을 배웁니다.
- 테이블 개조하기: ALTER TABLE로 이미 만든 재료함에 변화를 주는 방법입니다.
- 테이블 철거하기: 사용하지 않는 재료함를 DROP TABLE로 철거하는 방법
🟢 데이터 찾기, 데이터 조리 및 제거 ( DML )
- 재료 선택하기: SELECT 문을 사용해 필요한 재료(데이터 조회)를 찾아보는 방법을 배웁니다. WHERE 절로 특정 조건을 만족하는 재료만 골라봅시다.
- 정렬하여 진열하기: ORDER BY로 재료를 순서대로 정렬하고, GROUP BY로 비슷한 재료들을 그룹화하여 관리하는 방법을 배웁니다.
- 재료 합치기: 여러 장소에서 가져온 재료를 JOIN으로 합치는 방법
- 재료 추가하기: INSERT INTO { 테이블명 } ( 컬럼명 ) VALUES { 값1, 값2 .. } 새로운 재료를 추가하는 방법
- 재료 업데이트하기: UPDATE {테이블명} SET {수정컬럼} WHERE { 조건 } 기존의 재료를 새로 고치는 방법
- 재료 버리기: DELETE FROM {테이블명} WHERE { 조건 } 불필요한 재료를 제거하는 방법
🔵 트랜잭션
데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위

- 원자성 (All or Nothing)
- 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것이다.
- 트랜잭션은 사람이 설계한논리적인 작업 단위로서, 일처리는 작업단위 별로 이루어 져야 사람이 다루는데 무리가 없다.
- 만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동 했을시 원인을 찾기가 매우 힘들어질것이다.
- 일관성 (Keeps Data Correct)
- 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것이다.
- 트랜잭션이 진행되는 동안에 데이터베이스가 변경 되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는것이 아니라,처음에 트랜잭션을 진행 하기 위해 참조한 데이터베이스로 진행된다.
- 이렇게 함으로써 각 사용자는 일관성 있는 데이터를 볼 수 있는 것이다.
- 독립성 (Independent)
- 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 점을 가리킨다.
🟠 트랜잭션 관리와 보안 ( DCL )
- 조리대 트랜잭션 관리: 조리대에서의 사고(다른 요리재료와 섞이거나, 잘못 버려지는것)를 방지하기 위해 BEGIN, COMMIT, ROLLBACK으로 트랜잭션을 관리하는 방법을 배웁니다.
- 접근 권한 설정하기: GRANT와 REVOKE로 누가 주방에 들어와서 요리를 할 수 있는지를 관리하는 방법을 배웁니다.
- BEGIN 이란?
- START TRANSACTION 과 동일하며 새로운 트랜잭션을 생성 및 시작하는 연산이다.
- COMMIT 이란?
- 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성있는 상태에 있을 때, 하나의 트랜잭션이 끝났다라는 것을알려주기위해 사용하는 연산이다. 이 연산을 사용하면 수행했던 트랜잭션이 로그에 저장되며, 후에 Rollback 연산을 수행했었던 트랜잭션단위로 하는것을 도와준다.
- ROLLBACK 이란?
- 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시킨다
✅ DB 연결 ( Driver )
1. 데이터베이스 Driver 역할 및 종류
- 드라이버의 역할: 데이터베이스 드라이버는 애플리케이션과 데이터베이스 간의 통신을 중개하는 역할을 합니다. 마치 우체부가 편지를 전달하는 것처럼, 드라이버는 애플리케이션의 요청을 데이터베이스가 이해할 수 있는 언어로 변환합니다.
- 드라이버의 종류: 다양한 데이터베이스 시스템마다 호환되는 드라이버가 있습니다. 예를 들어, Oracle, MySQL, PostgreSQL 등 각 데이터베이스 제품에 맞는 특정 드라이버가 필요합니다.

드라이버의 동작 방식
- 연결 초기화
- 요청 수신: 애플리케이션은 데이터베이스 작업을 시작하기 위해 드라이버에 연결을 요청합니다. 이는 마치 항공편✈️ 이 이륙 허가를 받기 위해 관제탑에 요청하는 것과 유사합니다.
- 연결 설정: 드라이버는 데이터베이스 서버에 로그인하고 필요한 설정을 수행하여 연결을 완료합니다. 이 과정은 네트워크 정보, 인증 자격 증명 등을 사용하여 이루어집니다.
- SQL 전송 및 실행
- SQL 명령 변환: 애플리케이션에서 발송된 SQL 명령을 받은 드라이버는 해당 명령을 데이터베이스가 이해할 수 있는 형태로 변환합니다. 이는 외국어를 현지 언어로 번역하는 통역사의 역할과 같습니다.
- 명령 처리: 변환된 명령은 데이터베이스 서버로 전송되어 실행됩니다. 데이터베이스는 쿼리를 처리하고, 요구된 데이터를 검색하거나 데이터에 변화
- 결과 처리
- 결과 수신: 데이터베이스에서 작업의 결과를 보내면, 드라이버는 이 결과를 받아 애플리케이션에서 해석할 수 있는 형태로 변환합니다.
- 결과 전달: 최종적으로, 드라이버는 이 결과를 애플리케이션에 전달합니다. 이는 관제탑이 항공기✈️에 착륙 지시를 내리는 과정과 유사하며, 애플리케이션은 이 정보를 사용자에게 표시하거나 다음 작업을 진행
- 연결 종료
- 연결 해제: 작업이 완료되면, 드라이버는 데이터베이스 서버와의 연결을 종료합니다. 이는 비행이 끝난 후 항공기✈️가 공항 게이트에 도킹하는 것과 비슷하며, 자원을 정리하고 다음 세션을 위해 시스템을 초기화
💡 JDBC Driver Manager 는 애플리케이션이 실행되고 있는 런타임 시점에
- Connection(연결) 을 생성하여 쿼리를 요청할 수 있는 상태를 만들어주고
- Statement(상태) 를 생성하여 쿼리를 요청하게 해주고
- ResultSet(결과셋) 을 생성해 쿼리 결과를 받아올 수 있게 해줍니다
✅ DB 데이터를 외부에서 다루기 ( JDBC )
1. Spring Boot 의 JDBC 라이브러리
- Spring Boot와 JDBC: Spring Boot는 데이터베이스 연결을 쉽게 구성할 수 있도록 다양한 JDBC 드라이버를 지원합니다. 이를 통해 개발자는 복잡한 설정 없이 데이터베이스와의 연결을 쉽게 구성할 수 있습니다.
- spring-boot-starter-jdbc는 Spring Boot 프로젝트에서 JDBC를 통해 데이터베이스와 상호작용하기 위해 사용되는 스타터 패키지입니다.
- 이 스타터 패키지는 데이터베이스 작업을 수행하는 데 필요한 주요 의존성과 자동 구성 기능을 제공합니다. 데이터베이스와의 연결을 쉽고 빠르게 구성할 수 있도록 도와주는 브릿지 역할을 합니다.
- 주요 포함 내용
- JDBC API 지원: JDBC API를 통해 SQL 데이터베이스에 접근하고 작업을 수행할 수 있습니다.
- DataSource 구성: 데이터 소스 연결을 위한 기본적인 설정을 자동으로 구성합니다. 이는 데이터베이스 연결을 관리하는 데 필수적인 요소입니다.
- JdbcTemplate: JdbcTemplate은 Spring의 핵심 클래스 중 하나로, JDBC 작업의 많은 번거로움을 줄여 줍니다. SQL 쿼리 실행, 결과 세트 처리, 예외 처리 등을 단순화합니다.
- 주요 장점 내용
- 간소화된 데이터베이스 연결: DataSource 설정과 JdbcTemplate 사용을 통해 복잡한 JDBC 코드를 간소화할 수 있습니다.
- 자동 구성: Spring Boot의 자동 구성 기능은 개발자가 데이터베이스 연결에 필요한 대부분의 구성을 자동으로 처리할 수 있도록 합니다.
- 효율적인 예외 처리: Spring의 DataAccessException을 통해 JDBC에서 발생하는 예외를 Spring의 일관된 예외 체계로 변환
반응형
'[내일배움캠프-Sparta] > Spring 6기' 카테고리의 다른 글
| 🔒 JWT 인증/인가 (0) | 2025.05.01 |
|---|---|
| TIL 49 [ JPA 심화 - ( MyBatis, ORM, 테이블 객체, Raw JPA 연관관계) ] (0) | 2025.05.01 |
| TIL 47 [ Spring 심화 프로젝트 ( D-day ) - 발표/마무리, 트러블 슈팅 ] (0) | 2025.04.29 |
| TIL 46 [ Spring 심화 프로젝트 ( Day 5 ) - 마무리 작업 ( ppt, 대본, ERD/API 명세서 리뉴얼) ] (0) | 2025.04.28 |
| TIL 45 [ Spring 심화 프로젝트 ( Day 4 ) - 구현 ( JWT 로그인 필터 기능 ), PR 리뷰/병합 ] (0) | 2025.04.25 |