TIL 48 [ JPA 심화 ( 의존성, DB, SQL, Driver, JDBC ) ]

2025. 4. 30. 21:39·[내일배움캠프-Sparta]/Spring 6기
반응형

10:00 ~ 11:00 JPA 심화 과제 발제 

1️⃣ 의존성 

  1. compile 시점 의존성: 프로젝트를 컴파일할 때 사용됩니다. 즉, 해당 라이브러리의 API를 사용할 수 있음.
  2. runtime 시점 의존성: 애플리케이션을 실행할 때 사용됩니다. 즉, 실행 시에도 라이브러리가 필요
  3. 은닉성: 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는 해당 사이트 에서 다운로드 가능 
H2 DB 엔진 다운받기

🟡 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 { 조건 } 불필요한 재료를 제거하는 방법

🔵 트랜잭션

데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위

  1. 원자성 (All or Nothing)
    • 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것이다.
    • 트랜잭션은 사람이 설계한논리적인 작업 단위로서, 일처리는 작업단위 별로 이루어 져야 사람이 다루는데 무리가 없다.
    • 만약 트랜잭션 단위로 데이터가 처리되지 않는다면, 설계한 사람은 데이터 처리 시스템을 이해하기 힘들 뿐만 아니라, 오작동 했을시 원인을 찾기가 매우 힘들어질것이다.
  2. 일관성 (Keeps Data Correct)
    • 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것이다.
    • 트랜잭션이 진행되는 동안에 데이터베이스가 변경 되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는것이 아니라,처음에 트랜잭션을 진행 하기 위해 참조한 데이터베이스로 진행된다.
    • 이렇게 함으로써 각 사용자는 일관성 있는 데이터를 볼 수 있는 것이다.
  3. 독립성 (Independent)
    • 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 점을 가리킨다.

🟠 트랜잭션 관리와 보안 ( DCL )

  • 조리대 트랜잭션 관리: 조리대에서의 사고(다른 요리재료와 섞이거나, 잘못 버려지는것)를 방지하기 위해 BEGIN, COMMIT, ROLLBACK으로 트랜잭션을 관리하는 방법을 배웁니다.
  • 접근 권한 설정하기: GRANT와 REVOKE로 누가 주방에 들어와서 요리를 할 수 있는지를 관리하는 방법을 배웁니다.
  • BEGIN 이란?
    • START TRANSACTION 과 동일하며 새로운 트랜잭션을 생성 및 시작하는 연산이다.
  • COMMIT 이란?
    • 하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성있는 상태에 있을 때, 하나의 트랜잭션이 끝났다라는 것을알려주기위해 사용하는 연산이다. 이 연산을 사용하면 수행했던 트랜잭션이 로그에 저장되며, 후에 Rollback 연산을 수행했었던 트랜잭션단위로 하는것을 도와준다.
  • ROLLBACK 이란?
    • 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션의 원자성이 깨진경우, 트랜잭션을 처음부터 다시 시작하거나, 트랜잭션의 부분적으로만 연산된 결과를 다시 취소시킨다

✅ DB 연결 ( Driver )

1. 데이터베이스 Driver 역할 및 종류

  • 드라이버의 역할: 데이터베이스 드라이버는 애플리케이션과 데이터베이스 간의 통신을 중개하는 역할을 합니다. 마치 우체부가 편지를 전달하는 것처럼, 드라이버는 애플리케이션의 요청을 데이터베이스가 이해할 수 있는 언어로 변환합니다.
  • 드라이버의 종류: 다양한 데이터베이스 시스템마다 호환되는 드라이버가 있습니다. 예를 들어, Oracle, MySQL, PostgreSQL 등 각 데이터베이스 제품에 맞는 특정 드라이버가 필요합니다.

드라이버의 동작 방식

  1. 연결 초기화
    • 요청 수신: 애플리케이션은 데이터베이스 작업을 시작하기 위해 드라이버에 연결을 요청합니다. 이는 마치 항공편✈️ 이 이륙 허가를 받기 위해 관제탑에 요청하는 것과 유사합니다.
    • 연결 설정: 드라이버는 데이터베이스 서버에 로그인하고 필요한 설정을 수행하여 연결을 완료합니다. 이 과정은 네트워크 정보, 인증 자격 증명 등을 사용하여 이루어집니다.
  2. SQL 전송 및 실행
    • SQL 명령 변환: 애플리케이션에서 발송된 SQL 명령을 받은 드라이버는 해당 명령을 데이터베이스가 이해할 수 있는 형태로 변환합니다. 이는 외국어를 현지 언어로 번역하는 통역사의 역할과 같습니다.
    • 명령 처리: 변환된 명령은 데이터베이스 서버로 전송되어 실행됩니다. 데이터베이스는 쿼리를 처리하고, 요구된 데이터를 검색하거나 데이터에 변화
  3. 결과 처리
    • 결과 수신: 데이터베이스에서 작업의 결과를 보내면, 드라이버는 이 결과를 받아 애플리케이션에서 해석할 수 있는 형태로 변환합니다.
    • 결과 전달: 최종적으로, 드라이버는 이 결과를 애플리케이션에 전달합니다. 이는 관제탑이 항공기✈️에 착륙 지시를 내리는 과정과 유사하며, 애플리케이션은 이 정보를 사용자에게 표시하거나 다음 작업을 진행
  4. 연결 종료
    • 연결 해제: 작업이 완료되면, 드라이버는 데이터베이스 서버와의 연결을 종료합니다. 이는 비행이 끝난 후 항공기✈️가 공항 게이트에 도킹하는 것과 비슷하며, 자원을 정리하고 다음 세션을 위해 시스템을 초기화

💡 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를 통해 데이터베이스와 상호작용하기 위해 사용되는 스타터 패키지입니다.
    • 이 스타터 패키지는 데이터베이스 작업을 수행하는 데 필요한 주요 의존성과 자동 구성 기능을 제공합니다. 데이터베이스와의 연결을 쉽고 빠르게 구성할 수 있도록 도와주는 브릿지 역할을 합니다.
    • 주요 포함 내용
      1. JDBC API 지원: JDBC API를 통해 SQL 데이터베이스에 접근하고 작업을 수행할 수 있습니다.
      2. DataSource 구성: 데이터 소스 연결을 위한 기본적인 설정을 자동으로 구성합니다. 이는 데이터베이스 연결을 관리하는 데 필수적인 요소입니다.
      3. JdbcTemplate: JdbcTemplate은 Spring의 핵심 클래스 중 하나로, JDBC 작업의 많은 번거로움을 줄여 줍니다. SQL 쿼리 실행, 결과 세트 처리, 예외 처리 등을 단순화합니다.
    • 주요 장점 내용
      1. 간소화된 데이터베이스 연결: DataSource 설정과 JdbcTemplate 사용을 통해 복잡한 JDBC 코드를 간소화할 수 있습니다.
      2. 자동 구성: Spring Boot의 자동 구성 기능은 개발자가 데이터베이스 연결에 필요한 대부분의 구성을 자동으로 처리할 수 있도록 합니다.
      3. 효율적인 예외 처리: 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
'[내일배움캠프-Sparta]/Spring 6기' 카테고리의 다른 글
  • 🔒 JWT 인증/인가
  • TIL 49 [ JPA 심화 - ( MyBatis, ORM, 테이블 객체, Raw JPA 연관관계) ]
  • TIL 47 [ Spring 심화 프로젝트 ( D-day ) - 발표/마무리, 트러블 슈팅 ]
  • TIL 46 [ Spring 심화 프로젝트 ( Day 5 ) - 마무리 작업 ( ppt, 대본, ERD/API 명세서 리뉴얼) ]
dimenshun
dimenshun
한 소년의 개발 일기
    반응형
  • dimenshun
    Dev Life Notes
    dimenshun
  • 전체
    오늘
    어제
    • 분류 전체보기 (268)
      • CS (23)
        • 자료구조 (0)
        • 알고리즘 (0)
        • 컴퓨터 구조 (8)
        • 네트워크 (6)
        • 운영체제 (3)
        • DB ( + SQLD ) (5)
        • SW공학 (1)
      • 프로그래밍 (3)
        • Java (0)
        • Spring (0)
        • HTML,CSS (3)
        • JavaScript (0)
      • 개발 툴 (7)
        • Git(버전관리) (1)
        • Docker (3)
        • AWS (2)
        • JSP (1)
      • 코딩테스트(Algorithm) (125)
        • 백준 (6)
        • 프로그래머스 (119)
      • [내일배움캠프-Sparta] (110)
        • Spring 6기 (106)
        • KPT 회고 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    트랜잭션
    Python
    개발자
    Java
    운영체제
    세션
    spring
    db
    백엔드
    SQLD
    메모리
    AWS
    코딩테스트
    docker
    Testcode
    알고리즘
    웹
    network
    It
    내일배움캠프
    Til
    컴퓨터구조
    CPU
    배포
    OS
    SQL
    KPT
    cs
    web
    네트워크
  • hELLO· Designed By정상우.v4.10.3
dimenshun
TIL 48 [ JPA 심화 ( 의존성, DB, SQL, Driver, JDBC ) ]
상단으로

티스토리툴바