📕 목차
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은 객체 중심으로 데이터베이스와의 연동을 추상화하여 자동화하는 방식이다.
각 방식은 프로젝트의 요구사항과 개발자의 선호도에 따라 적합하게 선택되어야 한다.
'Spring > 강의' 카테고리의 다른 글
[📗 스프링 입문] 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 (0) | 2025.05.07 |
---|---|
[📕 기초 Spring] 6-7. 메모장 프로젝트 - ver4 (데이터베이스 접근 기술 적용) (0) | 2025.05.07 |
[📕 기초 Spring] 6-5. SQL 실습 (0) | 2025.05.06 |
[📕 기초 Spring] 6-4. SQL (Structured Query Language) (0) | 2025.05.06 |
[📕 기초 Spring] 6-3. 데이터베이스 (Database) (0) | 2025.05.06 |