본문 바로가기

Spring DB

(13)
[Spring DB] @Transactional – 트랜잭션 전파 (Propagation) 스프링 트랜잭션의 핵심은 @Transactional을 통한 AOP 기반의 선언적 트랜잭션 관리다.하지만 여러 트랜잭션이 복잡하게 얽힌 상황, 예를 들어 트랜잭션이 진행 중인 메서드 안에서 새로운 트랜잭션이 필요한 다른 메서드를 호출하는 경우에는 어떻게 동작해야 할까? 이때 필요한 개념이 바로 트랜잭션 전파다. 🧩 트랜잭션 전파란 무엇인가? 트랜잭션 전파(Propagation)란, 트랜잭션의 경계에서 이미 진행 중인 트랜잭션이 있을 때 또는 없을 때, 새로운 트랜잭션 메서드를 어떻게 동작시킬지 결정하는 규칙이다.쉽게 말해, 하나의 트랜잭션 작업(예: 주문 처리) 중에 다른 트랜잭션 작업(예: 로그 기록)을 호출했을 때,이 두 트랜잭션을 하나의 큰 트랜잭션으로 묶을 것인지, 아니면 별개의 트랜잭션으로 처리..
[Spring DB] @Transactional – 주요 옵션 @Transactional은 단순히 "트랜잭션을 걸어준다"는 의미 이상으로, 여러 속성(옵션)을 통해 트랜잭션의 전파, 격리, 롤백 동작 등을 정교하게 제어할 수 있다.public @interface Transactional { // 사용할 트랜잭션 매니저 지정 String value() default ""; // transactionManager 옵션과 동일 // 트랜잭션 전파 수준 지정 Propagation propagation() default Propagation.REQUIRED; // 트랜잭션 격리 수준 지정 Isolation isolation() default Isolation.DEFAULT; // 트랜잭션 수행 제한 시간 지정 ..
[Spring DB] 스프링 트랜잭션 @Transactional 사용 시 주의점 🧩 스프링 트랜잭션의 핵심: 추상화와 AOP 트랜잭션 추상화 (PlatformTransactionManager)각각의 데이터 접근 기술(JDBC, JPA 등)은 트랜잭션을 다루는 코드가 다르다.스프링은 PlatformTransactionManager라는 인터페이스를 통해 트랜잭션 기능을 추상화한다.또한 각각의 데이터 접근 기술마다 PlatformTransactionManager 인터페이스를 구현한 클래스도 제공한다.스프링 부트는 현재 사용 중인 데이터 접근 기술을 자동으로 인식하여, 그에 맞는 구현체를 스프링 빈으로 등록해 준다.따라서 개발자는 이 인터페이스에만 의존하면 된다.선언적 트랜잭션 관리 (@Transactional과 AOP)트랜잭션 매니저를 직접 사용하여 트랜잭션을 다룰 수도 있지만, 비즈니..
[Spring DB] Querydsl ❌ 동적 쿼리와 문자열 쿼리의 한계 JdbcTemplate, MyBatis, JPA(JPQL)와 같은 기존 데이터 접근 기술들은 다음과 같은 공통적인 약점을 가지고 있다.동적 쿼리 작성의 어려움:검색 조건이 다양하게 조합되는 동적 쿼리를 작성하기가 매우 복잡하다.자바 코드에서 if 문으로 SQL 문자열을 조립하거나, XML에서 복잡한 태그를 사용해야 한다.문자열 기반 쿼리의 한계:SQL이나 JPQL은 결국 문자열이다.따라서 쿼리에 오타가 있어도 컴파일 시점에는 오류를 잡을 수 없고, 애플리케이션이 실행된 후에야 런타임 오류가 발생한다. Querydsl은 바로 이 두 가지 문제를 해결하기 위해 등장한 쿼리 빌더 라이브러리다. 🧩 Querydsl: 쿼리를 Java 코드로, Type-Safe하게 Queryd..
[Spring DB] 스프링 데이터 JPA (Spring Data JPA) 🧩 스프링 데이터 JPA의 등장: 반복의 종말 이전의 순수 JPA 리포지토리는 JdbcTemplate이나 MyBatis에 비해 많은 발전을 이루었지만,여전히 개발자는 각 엔티티마다 em.persist(), em.find() 등 기본적인 CRUD 코드를 반복적으로 작성해야 한다. 스프링 데이터 JPA는 이러한 반복적인 리포지토리 구현을 제거하기 위해 등장한, JPA를 더욱 편리하게 사용하도록 도와주는 기술이다.따라서 개발자는 더 이상 리포지토리의 구현 클래스를 작성할 필요가 없다. 🧩 스프링 데이터 JPA의 핵심 기능 1. 공통 인터페이스 (JpaRepository)save(), findById(), findAll(), delete() 등 대부분의 DB에 대한 공통 메서드를 모아 JpaRepositor..
[Spring DB] JPA (Java Persistence API) 🧩 ORM과 JPA: 왜 SQL에서 객체로 패러다임이 전환되었나? JdbcTemplate이나 MyBatis와 같은 SQL Mapper 기술은 JDBC의 반복 작업을 줄여주었지만,여전히 개발자가 SQL을 직접 작성해야 하는 한계가 있다. 이는 애플리케이션의 객체 모델과 데이터베이스의 관계형 모델 사이에 불일치가 발생하며,개발자는 객체를 SQL로, SQL 결과를 다시 객체로 변환하는 반복적이고 지루한 작업을 계속해야 한다.이러한 SQL 중심 개발의 문제점을 해결하기 위해 ORM(Object-Relational Mapping) 기술이 등장했다.ORM은 이름 그대로 애플리케이션의 객체와 관계형 데이터베이스의 테이블을 자동으로 매핑해주는 기술이다.JPA(Java Persistence API)는 이러한 ORM 기..
[Spring DB] MyBatis 🧩 MyBatis: SQL 중심의 데이터 접근 기술 MyBatis는 JdbcTemplate과 같이 SQL을 직접 다루는 SQL Mapper 기술이다.하지만 JdbcTemplate보다 더 많은 편의 기능, 특히 동적 쿼리 작성과 SQL의 분리 측면에서 강력한 장점을 가진다. JdbcTemplate vs MyBatisSQL 작성:JdbcTemplate: SQL을 자바 코드 내에서 문자열로 작성해야 하므로, 여러 줄의 복잡한 SQL을 다루기 불편하다.MyBatis: SQL을 별도의 XML 파일에 작성하므로, SQL 자체에만 집중할 수 있고 가독성이 높다.동적 쿼리 작성:JdbcTemplate: 자바 코드에서 수많은 if 문과 문자열을 조립해야 하므로, 복잡하고 오류가 발생하기 쉽다.MyBatis: 동적 쿼리..
[Spring DB] JdbcTemplate 🧩 JdbcTemplate: JDBC의 반복 작업을 대신 처리하는 템플릿 순수 JDBC는 커넥션을 열고 닫는 과정, 예외 처리 등 개발자가 직접 처리해야 할 반복적인 코드가 너무 많다는 단점이 있다.스프링의 JdbcTemplate은 템플릿 콜백 패턴을 사용하여 JDBC 프로그래밍의 반복적인 작업을 대신 처리해주는 클래스다. JdbcTemplate이 대신 처리해주는 작업들:커넥션 획득 및 종료Statement 준비 및 실행결과 조회를 위한 반복문 처리 트랜잭션 처리를 위한 커넥션 동기화SQLException 발생 시 스프링 예외 변환기 실행👉 이 덕분에 개발자는 SQL 작성과 결과 매핑이라는 핵심 작업에 더 집중할 수 있다. JdbcTemplate의 자세한 사용법은 스프링의 공식 메뉴얼을 참고하자. ?..
[Spring DB] 스프링의 예외 추상화 (DataAccessException), 예외 변환기 (SQLExceptionTranslator) 🚨 체크 예외의 딜레마: 의존 관계 문제 체크 예외는 개발자가 예외를 누락하지 않도록 해주는 훌륭한 안전장치이지만, 계층형 아키텍처에서는 의존 관계 문제를 유발할 수 있다. 예를 들어, 리포지토리 계층에서 JDBC를 사용하면 SQLException이라는 체크 예외가 발생할 수 있다.따라서 해당 예외를 발생시킬 수 있는 리포지토리 메서드는 throws SQLException을 선언해야 한다.하지만 이를 호출하는 서비스 계층은 해당 예외를 처리할 수 없으므로, 자신도 throws SQLException을 선언하여 던져야 한다.결과적으로 서비스 계층이 특정 데이터 접근 기술에 종속되어 버린다. (java.sql.SQLException)// 서비스 계층public void save(Member member) ..
[Spring DB] 스프링의 트랜잭션 추상화 – 트랜잭션 매니저, 동기화 매니저, 트랜잭션 템플릿, @Transactional 🧩 순수한 서비스 계층의 중요성과 문제점 애플리케이션을 설계할 때 일반적으로는 역할에 따라 세 가지 계층으로 나눈다.프레젠테이션 계층 (Controller)역할: UI 처리, 웹 요청 검증 및 응답사용 기술: 서블릿, 스프링 MVC서비스 계층 (Service) 역할: 비즈니스 로직 처리사용 기술: 특정 기술에 의존하지 않은 순수 자바 코드데이터 접근 계층 (Repository)역할: 데이터베이스 접근사용 기술: JDBC, JPA, File, Redis ⚠️ 이 구조에서 가장 중요한 것은 서비스 계층의 순수성을 유지하는 것이다.즉, 서비스 계층은 특정 기술(예: JDBC, JPA)에 종속되지 않고 순수 자바 코드로 작성되어,데이터 저장 기술이 바뀌거나 UI가 변경되어도 비즈니스 로직은 영향을 받지 않아야..
[Spring DB] 애플리케이션에 트랜잭션 적용 – 세션, 락, 자동 커밋, 커넥션 동기화 🧩 데이터베이스 세션(Session)과 락(Lock) 클라이언트가 데이터베이스 서버와 커넥션을 맺으면, 데이터베이스 서버는 내부에 해당 커넥션만을 위한 세션(Session)을 만든다.앞으로 해당 커넥션을 통한 모든 요청(트랜잭션 시작, SQL 실행, 커밋, 롤백 등)은 이 세션을 통해 이루어진다.사용자 → 클라이언트 (WAS, MySQL 워크벤치 등) → { 커넥션 } → 데이터베이스 서버 (세션)사용자가 클라이언트를 통해 SQL을 전달하면, 해당 커넥션에 연결된 세션이 실행한다.커넥션은 오로지 하나의 세션과 연결된다. (커넥션이 10개면 세션도 10개)세션 안에서 트랜잭션을 시작하고, SQL을 실행하고, 커밋 또는 롤백을 하고, 트랜잭션을 종료한다.클라이언트가 커넥션을 닫으면, 데이터베이스..
[Spring DB] 커넥션 풀, DataSource 애플리케이션이 데이터베이스와 통신하려면 먼저 연결 통로인 커넥션(Connection)을 획득해야 한다.하지만 사용자의 모든 요청에 대해 매번 새로운 커넥션을 생성하는 방식은 비효율적이며, 서비스 성능에 심각한 영향을 미칠 수 있다.이를 해결하기 위해 등장한 기술이 바로 커넥션 풀과 DataSource다. 🧩 커넥션 풀: 미리 만들어두고 재사용하는 커넥션들 데이터베이스 커넥션을 새로 만드는 과정은 생각보다 복잡하고 비용이 많이 든다. 애플리케이션 로직 (커넥션 요청) ↓ ↑ (커넥션 생성 후 반환) DB 드라이버 (TCP/IP 연결, 인증 정보 전달) ↓ ↑ (세션 생성 완료 응답) ..
[Spring DB] JDBC (Java Database Connectivity) 🧩 JDBC의 등장 배경: 표준의 필요성 애플리케이션 서버가 데이터베이스와 연동하기 위해서는 일반적으로 다음 3단계를 거친다.커넥션 연결: 데이터베이스에 접속한다.SQL 전달: 애플리케이션이 필요한 SQL을 데이터베이스에 보낸다.결과 응답: 데이터베이스는 SQL 실행 결과를 애플리케이션에 돌려준다.과거에는 이 3단계를 수행하는 방법이 데이터베이스마다 모두 달랐다. 이로 인해 다음과 같은 문제가 발생했다.❌ 데이터베이스 변경의 어려움:데이터베이스를 변경하면, 데이터베이스와 연동하는 애플리케이션의 코드 전체를 새로 작성해야 한다.❌ 높은 학습 비용:개발자는 각각의 데이터베이스에 맞는 접속 및 데이터 처리 방식을 모두 새로 배워야 한다. 이러한 비효율을 해결하기 위해, 자바는 데이터베이스 접근을 위한 표준 ..