[Spring] Java와 Database (2)

이연우·2025년 7월 24일

TIL

목록 보기
40/100

🗂️ Persistence Framework란?

  • Java 애플리케이션에서 DB와 쉽게 연동할 수 있도록 도와주는 데이터 영속성 프레임워크
    목적: 데이터를 영구적으로 저장(Persistence)하고 관리하는 작업을 단순화
    핵심: JDBC의 복잡하고 중복된 코드 제거 + 자원 자동 관리 + 객체 ↔ 데이터 매핑

🧱 JDBC의 한계점

문제점설명
🔁 반복 코드Connection, Statement, ResultSet 등 반복 작성
🧨 예외 처리SQLException은 Checked 예외 → 개발자가 직접 처리
🔓 자원 누수close() 누락 시 → 서버 과부하
📝 수동 SQL모든 쿼리를 직접 작성해야 함 (CRUD 반복)
📦 객체 매핑 어려움SQL 결과 → Java 객체 수동 매핑 필요

PreparedStatement를 사용해도 여전히 낮은 추상화 수준

🚀 Persistence Framework의 등장

  • JDBC의 한계를 극복하고, 객체 지향과 관계형 DB의 연결을 쉽게 해 주는 도구들 등장
구분특징예시
SQL Mapper직접 SQL을 작성하고, 결과를 객체에 매핑JDBC Template, MyBatis
ORM객체 자체를 DB에 매핑JPA, Hibernate (후속 학습 예정)

→ 모든 Persistence Framework는 내부적으로 JDBC + PreparedStatement 사용


🔧 SQL Mapper란?

  • 직접 작성한 SQL 문의 실행 결과와 객체(Object)의 필드를 Mapping하여 데이터 객체화

1. Spring JDBC Template

  • Spring이 제공하는 JDBC 간편화 도구
    → Connection 관리, 예외 처리, 객체 매핑을 자동으로 해 줌

☑️ 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

  • SQL을 XML로 분리해서 관리하는 SQL 중심 매퍼
    Java와 SQL을 분리관심사 분리(Cross-cutting concern) 가능

☑️ 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?
  • ERD로는 표현하기 어려운 관계 구조
  • DB로 저장하거나 조회 시 매핑 코드가 복잡해짐

🧩 해결책 → ORM의 등장

SQL MapperORM
SQL 중심객체 중심
SQL 직접 작성쿼리 없이 객체로 조작
관계 명시적 관리관계 자동 추론 & 관리

📌 전체 흐름 요약

[기본] JDBC → [개선] SQL Mapper (JDBC Template / MyBatis) → [진화] ORM (JPA, Hibernate)

공통 사항

  • 내부적으로 JDBC API 사용
  • PreparedStatement 기반
  • DB 자원(연결 등)을 자동 관리

0개의 댓글