🗂️ Persistence Framework란?
- Java 애플리케이션에서 DB와 쉽게 연동할 수 있도록 도와주는 데이터 영속성 프레임워크
→ 목적: 데이터를 영구적으로 저장(Persistence)하고 관리하는 작업을 단순화
→ 핵심: JDBC의 복잡하고 중복된 코드 제거 + 자원 자동 관리 + 객체 ↔ 데이터 매핑
🧱 JDBC의 한계점
| 문제점 | 설명 |
|---|---|
| 🔁 반복 코드 | Connection, Statement, ResultSet 등 반복 작성 |
| 🧨 예외 처리 | SQLException은 Checked 예외 → 개발자가 직접 처리 |
| 🔓 자원 누수 | close() 누락 시 → 서버 과부하 |
| 📝 수동 SQL | 모든 쿼리를 직접 작성해야 함 (CRUD 반복) |
| 📦 객체 매핑 어려움 | SQL 결과 → Java 객체 수동 매핑 필요 |
→ PreparedStatement를 사용해도 여전히 낮은 추상화 수준
🚀 Persistence Framework의 등장
| 구분 | 특징 | 예시 |
|---|---|---|
| SQL Mapper | 직접 SQL을 작성하고, 결과를 객체에 매핑 | JDBC Template, MyBatis |
| ORM | 객체 자체를 DB에 매핑 | JPA, Hibernate (후속 학습 예정) |
→ 모든 Persistence Framework는 내부적으로 JDBC + PreparedStatement 사용
🔧 SQL Mapper란?
- 직접 작성한 SQL 문의 실행 결과와 객체(Object)의 필드를 Mapping하여 데이터 객체화
1. Spring JDBC Template
☑️ JDBC Template 장점
| 기능 | 설명 |
|---|---|
| 자동 연결 관리 | DB 설정만 해 주면 Connection 자동 처리 |
| 예외 처리 자동 | Checked 예외 감싸기 |
| 자원 누수 방지 | close() 자동 호출 |
| 객체 매핑 간편 | RowMapper로 Java 객체에 자동 변환 |
| 배치 지원 | 반복 쿼리 처리에 강함 (통계 등 활용) |
🗒️ 예시 코드
String query = "SELECT * FROM MEMBER WHERE id = ?";
return jdbcTemplate.query(query, (rs, rowNum) -> {
Member member = new Member();
member.setId(rs.getLong("id"));
member.setName(rs.getString("name"));
return member;
});
2. MyBatis
☑️ MyBatis 장점
| 항목 | 설명 |
|---|---|
| SQL 분리 | 쿼리를 XML로 따로 관리 |
| 객체 매핑 | Java 객체 ↔ DB 테이블 매핑 자동 |
| 동적 쿼리 | if, where, foreach 등 조건별 분기 |
| 캐싱 | 쿼리 결과 캐싱으로 성능 향상 |
| 설정 간단 | 적은 설정으로 빠르게 사용 가능 |
📁 Mapper 구조
// Java 인터페이스
public interface UserMapper {
User getUserById(Long id);
}
<!-- XML Mapper -->
<mapper namespace="com.example.UserMapper">
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
</mapper>
→ 쿼리는 XML에, Java는 메서드만 작성 → 관심사 분리 완벽
⚠️ SQL Mapper의 한계점
| 문제 | 설명 |
|---|---|
| 수동 SQL 작성 | 모든 CRUD SQL을 여전히 직접 작성 |
| DB 종속성 | DBMS별 문법 차이 존재 (함수/쿼리 문법 등) |
| 중복 코드 | 테이블마다 DAO + SQL 계속 작성 |
| 변경 어려움 | 테이블 구조 변경 시 여러 코드에 영향 |
| 객체 지향 단절 | 객체 간 관계 표현이 어려움 (상속, 포함 등 불일치) |
🔄 관계형 DB vs 객체 지향의 패러다임 불일치
🔥 불일치 사례
// 1. 객체 안의 객체
public class Member {
// 필드들..
private Team team;
} -> ERD?
// 2. 상속 구조
public class Member extends Person {
// 필드들..
} -> ERD?
// 3. extends, implements
public class Member extends Person implements Workable {
// 필드들..
} -> ERD?
🧩 해결책 → ORM의 등장
| SQL Mapper | ORM |
|---|---|
| SQL 중심 | 객체 중심 |
| SQL 직접 작성 | 쿼리 없이 객체로 조작 |
| 관계 명시적 관리 | 관계 자동 추론 & 관리 |
📌 전체 흐름 요약
[기본] JDBC → [개선] SQL Mapper (JDBC Template / MyBatis) → [진화] ORM (JPA, Hibernate)
공통 사항