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

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

Dev.99_tale 2025. 2. 11. 14:02

2주차 - 데이터베이스 다루기

  • DB 연결 (Driver)
    • 적절한 JDBC 드라이버를 선택하고 설정
  • DB 데이터를 외부에서 다루기 (JDBC)
    • JDBC를 이용해 애플리케이션에서 DB 데이터 직접 다루는 실습

03. 데이터베이스 연결(Driver)

 - 데이터베이스 드라이버의 역할과 중요성을 이해하고, 적절한 드라이버 선택 및 설정 방법을 배운다.

 - JDBC드라이버를 사용하여 애플리케이션과 데이터베이스 간의 연결을 구성하는 과정을 다룬다.

 

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

드라이버의 역할

  • 데이터베이스 드라이버는 애플리케이션과 데이터베이스의 간의 통신을 중개하는 역할
  • 애플리케이션의 요청을 데이터베이스가 이해할 수 있는 언어로 변환

드라이버의 종류

  • Oracle, MySQL, PostgreSQL등 각 데이터베이스 제품에 맞는 특정 드라이버가 필요하다.

Java의 데이터베이스 별 Driver

 

2. 데이터베이스 Driver 동작

 - 데이터베이스 드라이버는 애플리케이션과 데이터베이스 간의 데이터 교환을 조절하고 관리하는 역할

드라이버의 동작 방식

  1. 연결 초기화
    • 요청 수신 : 애플리케이션은 DB 작업을 시작하기 위해 드라이버에 요청한다.
    • 연결 설정 : 드라이버는 DB서버에 로그인하고 네트워크 정보, 인증 자격 증명 등을 사용해 필요한 설정을 수행하여 연결 완료
  2. SQL 전송 및 실행
    • SQL 명령 변환 : 애플리케이션에서 발송된 SQL명령을 DB가 이해할 수 있게 해당 명령을 드라이버가 변환한다.
    • 명령 처리 :  변환된 명령은 DB 서버로 전송되어 실행, DB는 Query를 처리하고, 요구된 데이터를 검색하거나 데이터에 변화를 준다.
  3. 결과 처리
    • 결과 수신 : DB에서 작업의 결과를 보내면, 드라이버는 이 결과를 받아 애플리케이션에 해석할 수 있게 형태 변환한다.
    • 결과 전달 : 드라이버는 최종적으로 애플리케이션에 전달
  4. 연결 종료
    • 연결 해제 :  작업이 완료되면, 드라이버는 DB Server와 연결 종료, 자원을 정리하고 다음 세션을 위해 시스템 초기화

💡 JDBC Driver Manager 는 애플리케이션이 실행되고 있는 런타임 시점에

  • Connection(연결 객체) 을 생성하여 쿼리를 요청할 수 있는 상태를 만들어주고
  • Statement(상태) 를 생성하여 쿼리를 요청하게 해주고
  • ResultSet(결과셋) 을 생성해 쿼리 결과를 받아올 수 있게 해준다. (응답 값 조회)

 

04. 데이터베이스 데이터를 외부에서 다루기(JDBC)

- JDBC를 통해 JAVA 애플리케이션에서 데이터베이스 데이터를 직접 다루는 방법을 소개한다.

- Connection, Statement, ResultSet 객체의 사용법을 배우며, 간단한 CRUD작업을 실습한다.

1. Spring Boot 의 JDBC 라이브러리

  • Spring Boot와 JDBC : Spring Boot는 데이터베이스 연결을 쉽게 구성할 수 있도록 다양한 JDBC 드라이버를 지원한다. 

**spring-boot-starter-jdbc** 

 - Spring Boot 프로젝트에서 JDBC를 통해 데이터베이스와 상호작용하기 위해 사용되는 스타터 패키지

 - 주요 의존성과 자동 구성 기능을 제공

- DB와의 연결을 쉽고 빠르게 구성할 수 있도록 도와주는 브릿지 역할

  • 주요 포함 내용
    1. JDBC API 지원: JDBC API를 통해 SQL 데이터베이스에 접근하고 작업을 수행할 수 있다.
    2. DataSource 구성: 데이터 소스 연결을 위한 기본적인 설정을 자동으로 구성한다. 이는 DB연결을 관리하는 데 필수적인 요소
    3. JdbcTemplate: **JdbcTemplate**은 Spring의 핵심 클래스 중 하나로. SQL 쿼리 실행, 결과 세트 처리, 예외 처리 등을 단순화
  • 주요 장점 내용
    1. 간소화된 데이터베이스 연결: DataSource 설정과 JdbcTemplate 사용을 통해 복잡한 JDBC 코드를 간소화할 수 있다.
    2. 자동 구성: Spring Boot의 자동 구성 기능은 개발자가 데이터베이스 연결에 필요한 대부분의 구성을 자동으로 처리한다.
    3. 효율적인 예외 처리: Spring의 **DataAccessException**을 통해 JDBC에서 발생하는 예외를 Spring의 일관된 예외 체계로 변환

2. JDBC

  • JDBC 드라이버란?: JDBC(Java Database Connectivity)는 자바 애플리케이션에서 데이터베이스에 접근할 수 있도록 하는 API JDBC 드라이버는 이 API를 구현하여, 자바 애플리케이션과 특정 데이터베이스 간의 연결을 가능하게 합니다.
  • JDBC 드라이버 타입: JDBC 드라이버는 네 가지 유형(Type 1, 2, 3, 4)이 있으며, 각각의 특징과 사용 환경에 따라 선택할 수 있다. Type 4 드라이버(순수 자바 드라이버)가 가장 일반적으로 사용된다.
  • JDBC 실습
    • DriverManager 를 통해서 Connection(연결) 을 생성하여 쿼리를 요청할 수 있는 상태를 만들어주고
    • Statement(상태) 를 생성하여 쿼리를 요청하고
    • ResultSet(결과셋) 을 생성해 쿼리 결과를 받아온다.

 

Statement는 다음과 같은 동작 방식을 가진다.

구문 분석 -> 치환 -> 실행 -> 인출

  • statement는  executeQuery() 나 executeUpdate() 를 실행하는 시점에 파라미터로 SQL문을 전달하는데, 이 때 전달되는 SQL 문은 완성된 형태로 한눈에 무슨 SQL 문인지 파악하기 쉽다.
  • 하지만, Statement 는 SQL문을 수행하는 과정에서 구문 분석을 수행하기 때문에 Prepared Statement에 비해 효율성이 떨어진다 .

 

그러면 PreparedStatement는 무엇인가?  PreparedStatement는 Statement를 상속하고 있는 Interface

실제 statement 재사용할 수 있다. parse 과정 생략 하하고 진행 가능하다. 계속해서 반복해서 실행이 가능하다.

 - PreparedStatement는 내부적으로 Statement의 4단계 과정 중 첫 번째 parse 과정의 결과를 캐싱하고, 나머지 3가지 단계만 거쳐서 SQL문이 실행될 수 있게 한다.

즉, PreparedStatement를 사용하면 구문 분석(parse)의 결과를 캐싱해서 과정을 생략할 수 있으므로 성능이 향상

 

queryForObject는 Spring의 JdbcTemplate에서 단일 행(single row)의 값을 조회할 때 사용하는 메서드야.
SQL 쿼리를 실행하고, 결과를 하나의 객체로 매핑해 반환한다.

String sql = "SELECT name FROM users WHERE id = ?";
String name = jdbcTemplate.queryForObject(sql, String.class, 1);
System.out.println(name);

 


 

 OWASP TOP 10 - SQL Injection (보안 - 매우 중요)

SQL Injection이란 - 악의적인 SQL 코드를 입력하여 데이터베이스를 조작하는 공격 기법

  •  공격자가 입력 필드나 URL 파라미터를 통해 직접 SQL 쿼리를 조작해서 데이터를 탈취하거나 수정, 삭제할 수 있다.

PreparedStatement가 변수 문자열 쿼리(?)를 집어넣어 해킹하는 SQL Injection 도 방어할 수 있다.