특강!
1. Java와 Database
1) JDBC(Java DataBase Connectivity)
자바 언어를 사용하여 DB와 상호 작용하기 위한 자바 표준 API(응용 프로그래밍 인터페이스) JDBC는 데이터베이스 관리 시스템(DBMS)과 통신하여 데이터를 삽입(C), 검색(R) , 수정(U) 및 삭제(D)할 수 있게 해주는 기술
Java 진영의 Database 연결 표준 인터페이스(JDBC)

JDBC의 주요 특징
- 표준 API
- 대부분의 RDBMS (관계형 데이터베이스 관리 시스템)에 대한 드라이버가 제공된다.
이로써 여러 종류의 DB 대해 일관된 방식으로 상호 작용할 수 있다.
ex) Database 종류가 바뀌어도 쿼리문이 실행되도록.
- 데터베이스 연결
- SQL 쿼리 실행
- Prepared Statement
- 결과 집합 처리
- 데이터베이스로부터 반환된 결과 집합을 처리할 수 있다.
이를 통해 데이터를 조회하고 결과를 자바 객체로 매핑할 수 있다.
- 트랜잭션 관리
- JDBC를 사용하여 데이터베이스 트랜잭션을 시작, 커밋 또는 롤백하는 등의
트랜잭션 관리 작업을 수행할 수 있다.
1) Statement
- DB와 연결되어 있는 Connection 객체를 통해 SQL문을
Database에 전달하여 실행하고, 결과를 반환받는 객체
- SQL 쿼리는 실행 전에 문자열 형태로 전달되고, 실행 시점에 데이터베이스에 직접 파싱되고 실행된다.
- 매번 실행할 때마다 SQL 문을 다시 파싱하므로 성능에 영향을 미칠 수 있고, 보안 취약점을 가질 수 있다.
2) Prepared Statement
- SQL문을 Complie 단계에서 ? 를 사용하여 preCompile 하여 미리 준비해놓고
Query문을 파라미터 바인딩 후 실행하고 결과를 반환받는다.
미리 준비해놓았다(Pre)! 가 핵심
- SQL 쿼리를 미리 컴파일하여 데이터베이스에 전송할 때 값만 바뀌는 형태로 전달
- 쿼리가 한 번 컴파일되면 여러 번 실행할 수 있으며, 성능이 향상되고 보안 측면에서 더 안전
- 동적인 입력값을 placeholder(?)로 대체한다.
파라미터 바인딩을 통해 직접적으로 사용자 입력을 쿼리에 삽입하지 않는다.
- 이스케이핑 : Escape 말그대로 탈출, 입력값이 자동으로 쿼리에 안전하게 이스케이핑된다.
이스케이핑은 입력 데이터에서 잠재적인 SQL 쿼리 문자열을 무력화한다.
2. 웹 보안(SQL Injection, XSS)
1) SQL Injection
- 악의적인 사용자가 애플리케이션에서 입력 데이터를 이용하여
SQL 쿼리를 조작하고 데이터베이스에 무단 접근하거나 데이터를 변조하는 공격
SQL Injection 종류
- Error Based SQL Injection
- Database에 고의적으로 오류를 발생시켜 에러 출력을 통해 DB 구조를 파악하는 방법.
- 해결방법 : 클라이언트에게 에러 메세지 노출을 차단한다, 입력값을 Validation한다.
Prepared Statements를 사용한다.
- Union Based SQL Injection
- 전제조건: 컬럼의 개수와 데이터 형식이 같아야 한다.
- DB의 UNION 연산자를 사용하여 쿼리 결과값의 조합을 통해 정보를 조회한다.
- Blind Based SQL Injection
- Stored Procedure SQL Injection
- Time Based SQL Injection
2) XSS
3. JDBC의 한계와 발전
- 간단한 SQL을 실행하는 경우에도 중복된 코드가 너무 많았다.
- DB에 따라 일관성 없는 정보를 가진 채로 Checked Exception(SQL Exception) 처리를 한다.
- Connection과 같은 공유 자원을 제대로 반환하지 않으면 한정된 시스템 자원(CPU, Memory)에 의해 문제가 발생한다.
- SQL Query를 일일히 작성하여야 한다.
1) Persistence Framework
- JDBC 처럼 복잡함이나 번거로움 없이
간단한 작업만으로 Database와 연동되는 시스템을 개발하게 되었다.
이것을 Persistence Framework 라고 한다.
2) JDBC, SQL Mapper, ORM의 공통점
- 영속성(Persistence)
데이터를 생성한 프로그램의 실행이 종료되더라도
사라지지 않는 데이터의 특성, 영구히 저장
4. SQL Mapper
- 직접 작성한 SQL 문의 실행 결과와 객체(Object)의 필드를 Mapping하여
데이터를 객체화한다.
1) Spring JDBC Template
- Spring Framework에서 제공하는 JDBC 작업을 단순화하고 개선한 유틸리티 클래스
JDBC Template의 장점
- 간편한 데이터베이스 연결 → 손수 적었던 연결 코드들을 yml, properties
- PreparedStatement와 CallableStatement를 처리한다.
- 예외 처리와 리소스 관리 - DB Connection을 자동으로 처리하여 리소스 누수 방지
- 결과 집합 처리 - 데이터를 자바 객체로 변환할 수 있도록 돕는다.
- 배치 처리 작업을 지원한다. - Spring Batch → 매일 동일한 시간에 수행되는 쿼리
2) Mybatis
- 반복적인 JDBC 프로그래밍을 단순화 시켜줌, SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리하여 관리되도록 한다. SQL과 Java Code의 분리가 핵심
Query를 JAVA에서 XML로
- 복잡한 JDBC 코드가 사라짐
- ResultSet과 같이 결과값을 맵핑하는 객체가 없다.
- 설정이 간단
- 관심사를 분리
- SQL을 Java의 메소드에 매핑해준다.
MyBatis 장점
- 자동으로 Connection 관리를 해주면서 JDBC 사용할 때의 중복 작업 대부분을 없애준다.
- DB 결과 집합을 자바 객체로 매핑할 수 있다.
- 복잡한 쿼리나 다이나믹하게(동적쿼리) 변경되는 쿼리 작성이 쉽다.
- 관심사 분리 - DAO로부터 SQL문을 분리하여 코드의 간결성 및 유지보수성이 향상된다.
- 쿼리 결과를 캐싱하여 성능을 향상시킬 수 있다.
Mybatis는 동적 쿼리를 지원한다.
동적 쿼리(Dynamic SQL)란?
상황에 따라 분기처리(IF)를 통해 쿼리를 동적으로 만들어주는것.
SQL Mapper의 한계
-
SQL을 직접 다룬다.
-
특정 DB에 종속적으로 사용하기 쉽다.
(DB마다 Query문이 조금씩 다름, 함수도 다름)
-
테이블마다 비슷한 CRUD SQL = DAO 개발이 반복된다. → 코드 중복
-
테이블 필드가 변경될 시 이와 관련된 모든 DAO의 SQL문, 객체의 필드 등을 수정해야 한다.
코드상으로 SQL과 JDBC API를 분리했지만 논리적으로 강한 의존성을 가지고 있다.
-
객체와의 관계는 사라지고 DB에 대한 처리에 집중하게 된다.
→ SQL 의존적인 개발
-
ORM(Object Relational Mapping)
- 객체와 관계형 DB를 매핑한다.
SQL Query가 아닌 메서드로 데이터 조작
ex) SELECT * FROM USER;→ user.findAll();
ORM의 장점과 단점
장점
- 패러다임 불일치 문제 해결 - 객체지향 언어가 가진 장점을 활용 가능
- 생산성 - 반복적인 CRUD SQL을 개발자가 직접 작성하지 않아도 된다
- 데이터 접근(DB 종속성) 추상화 - DB마다 조금씩 다른 타입, SQL Query 문법을 손쉽게 해결한다.
ex) MySQL, ORACLE 바뀌어도 코드는 일치하기 때문에 상관없음.
- 유지보수성 - 필드 추가, 삭제 시 관련된 SQL 쿼리를 직접 수정하지 않고 Entity만 수정하면 된다.
- SQL Mapper나 JDBC와 다르게 컴파일 단계에 쿼리에 대한 에러를 알 수 있다.
단점
- 복잡한 쿼리 사용이 아주 어렵다.
→ JPQL을 지원한다.
→ QueryDSL 을 함께 사용한다.
6. JPA
- JPA는 JAVA ORM에 대한 API 표준 명세이다.
인터페이스로 구성되어 있으며 사용하려면 ORM 프레임워크를 사용하여야 한다.

JPA에는 HIBERNATE, EclipseLink, DataNucleus라는 구현체가 있다.
여기서 가장 대표적인 프레임워크가 하이버네이트