Spring/강의

[📕 기초 Spring] 6-6. Java와 Database

가지코딩 2025. 5. 6. 20:31

📕 목차

  1. JDBC(Java Database Connectivity)
  2. JDBC의 한계
  3. Persistence Framework

1. JDBC(Java Database Connectivity)

JDBC (Java Database Connectivity)

  • Java 언어를 사용하여 DB와 상호 작용하기 위한 자바 표준 인터페이스
  • JDBC를 사용하면 SQL 쿼리를 실행하고, 결과를 처리하며, 데이터베이스와 연결된 상태에서 트랜잭션을 관리할 수 있다.

 

JDBC의 주요 구성 요소

  • 표준 API:
    • 다양한 관계형 데이터베이스 시스템(RDBMS)과 호환되며, 일관된 방식으로 데이터베이스와 상호작용할 수 있다.
    • ex. Database 종류가 바뀌어도 쿼리문이 실행된다. MySQL → ORACLE
  • 데이터베이스 연결:
    • JDBC를 통해 애플리케이션과 데이터베이스를 연결하고, 연결을 유지하며, 쿼리를 실행할 수 있다.
  • SQL 쿼리 실행:
    • SQL 명령어를 사용해 데이터베이스와 상호작용할 수 있다.
  • PreparedStatement 지원:
    • SQL 쿼리 실행 시, 매개변수를 안전하게 처리할 수 있는 PreparedStatement를 제공하여 성능을 개선하고 SQL Injection 공격을 방어한다.
  • 결과 집합 처리 (ResultSet):
    • 데이터베이스에서 반환된 결과 집합을 처리하여 Java 객체로 변환하거나, 필요한 데이터를 추출할 수 있다.
  • 트랜잭션 관리:
    • 데이터베이스 트랜잭션을 관리하고, 시작, 커밋, 롤백 등의 작업을 수행할 수 있다.

 

 

* Statement VS Prepared Statement

  • Java에서 데이터베이스에 SQL 쿼리를 실행하기 위한 인터페이스
항목 Statement PreparedStatement
SQL 구성 방식 문자열로 직접 쿼리 작성 미리 컴파일된 쿼리에 파라미터만 바인딩
성능 매번 파싱 및 컴파일 필요 한 번 컴파일 후 재사용 가능 (성능 우수)
보안 SQL Injection에 취약 SQL Injection 방지 가능
가독성 및 유지보수성 변수 삽입 시 문자열 연결 필요 ?로 파라미터 지정, 코드 간결
데이터 타입 처리 직접 문자열로 변환해야 함 setInt, setString 등 타입 안전한 메서드 제공
용도 단순하거나 동적 쿼리에 적합 반복 실행, 보안이 중요한 쿼리에 적합

 

 

* SQL Injection

  • 악의적인 사용자가 애플리케이션에서 입력 데이터를 이용하여 SQL 쿼리를 조작하고 데이터베이스에 무단 접근하거나 데이터를 변조하는 공격
  • 해결 방법
    • 클라이언트에게 에러 메세지 노출을 차단한다.
    • 입력값을 검증(Validation)한다.
    • Prepared Statements를 사용한다.

2. JDBC의 한계

JDBC의 한계

  • 복잡한 자원 관리
    • Connection, Statement, ResultSet 등을 일일이 열고 닫아야 하며, 예외 발생 시 자원 누수 가능성이 있다.
  • SQL과 비즈니스 로직 혼재
    • 자바 코드에 SQL이 직접 포함되어 가독성이 떨어지고 유지보수가 어렵다.
  • DB 종속성
    • SQL 문법이나 기능이 DBMS마다 다르기 때문에 DB 변경 시 수정이 많이 필요할 수 있다.
  • 반복적인 코드
    • CRUD 같은 기본 작업에도 많은 코드가 중복된다.
  • 객체 매핑 기능 부족
    • SQL 결과를 객체로 직접 매핑하지 않기 때문에 수동으로 처리해야 한다.

→ 결국, 생산성 저하, 유지보수성 악화, 버그 발생 가능성 증가 문제가 나타남.

→  Persistence Framework 등장


3. Persistence Framework

Persistence Framework

  • 데이터를 영구적으로 저장(Persistence)하기 위한 작업을 자동화·추상화하여 쉽게 처리할 수 있도록 도와주는 프레임워크
  • 모든 Persistence Framework는 내부적으로 JDBC API를 이용한다.
  • preparedStatement를 기본적으로 사용한다.
  • 크게 SQL Mapper, ORM 나눌 수 있다.

 

Persistence Framework의 역할

  • SQL 실행 자동화 및 관리
  • DB 연결 및 자원 관리 자동화
  • SQL 결과 → 객체 매핑 자동화
  • 트랜잭션 처리 간소화
  • SQL과 비즈니스 로직 분리

 

SQL Mapper vs ORM (Object-Relational Mapping)

특징 SQL Mapper ORM
기능 SQL 쿼리를 매핑하여 실행 객체와 데이터베이스 테이블 간의 자동 매핑
사용 예시 MyBatis, Spring JDBC Template Hibernate, JPA (Java Persistence API)
SQL 처리 개발자가 직접 SQL 쿼리 작성 쿼리가 자동으로 생성되거나, 객체로 변환된 후 처리
유연성 고도로 유연하고 복잡한 쿼리 작성 가능 자동 매핑과 추상화로 복잡한 쿼리는 어려울 수 있음
성능 쿼리 최적화에 더 많은 제어권을 가짐 자동 쿼리 생성으로 성능 최적화가 어려울 수 있음
학습 곡선 상대적으로 적음 학습 곡선이 다소 가파를 수 있음
데이터베이스 의존성 데이터베이스와의 결합도가 높음 데이터베이스와 독립적으로 객체 중심의 설계 가능

 

SQL Mapper는 SQL을 직접 다루면서 유연성과 제어를 제공하는 반면,

ORM은 객체 중심으로 데이터베이스와의 연동을 추상화하여 자동화하는 방식이다.

 

각 방식은 프로젝트의 요구사항과 개발자의 선호도에 따라 적합하게 선택되어야 한다.