GDG on Campus Backend-Spring 스터디 WIL
Week 06 - 스프링 DAO와 JDBC 템플릿 및 트랜잭션 관리
실제로 데이터베이스에 접근하는 객체
서비스와 데이터베이스를 연결하는 역할을 하며, 실제로 DB에 접근하여 데이터 CRUD 작업(삽입, 삭제, 조회, 수정)을 수행한다.
Chcked, Unchocked Exception
Checked exception: RuntimeException의 하위 클래스가 아니면서 Exception 클래스의 하위 클래스들. 반드시 에러 처리를 해야 한다.
Unchecked exception: RuntimeException의 하위 클래스들. 실행 중에(runtime) 발생할 수 있는 예외를 의미. 에러 처리를 강제하지 않는다.
템플릿 메서드 패턴
메소드의 구조를 정의하고, 일부 단계를 하위 클래스에서 구현하도록 하는 디자인 패턴. 이를 통해 메소드의 구조 변경 없이 특정 단계를 재정의할 수 있다. 이는 반복적인 코드를 효과적으로 추상화하고 재사용성을 높이는데 도움이 된다.
spring-jdbc
spring-tx
spring-tx
가 spring-jdbc
에 포함.mysql-connector-java
추가)
- 의존성 추가
- DataSource 설정
데이터베이스 연결 정보를 포함한DataSource
를 구성한다.- JdbcTemplate 생성
DataSource를 이용해JdbcTemplate
객체를 생성한다.
DataSource
DataSource
빈 정의DataSource
빈을 정의한다. 이는 데이터베이스 연결 정보를 포함한다.DataAccessException
으로 변환한다. 이는 예외 처리를 일관되게 만든다.객체 지향 데이터 모델링 및 영속성 관리를 제공하는 표준 API. 복잡한 SQL 쿼리 작성을 자동화하고 객체지향적 프로그래밍 방식을 지원한다.
데이터베이스와 직접 통신하는 Java API. SQL 쿼리를 직접 작성하고 실행해야 하며, 개발자가 데이터베이스 관련 코드를 직접 관리해야 한다.
트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질.
트랜잭션의 모든 연산이 성공하거나 모두 실패해야 한다. 이는 데이터의 일관성을 유지한다.
트랜잭션 전후로 데이터베이스가 일관된 상태를 유지해야 한다. 이는 데이터 무결성을 보장한다.
동시에 실행되는 트랜잭션들이 서로 영향을 주지 않아야 한다. 이는 동시성 문제를 방지한다.
성공적으로 완료된 트랜잭션의 결과는 영구적으로 반영되어야 한다. 이는 데이터의 안정성을 보장한다.
트랜잭션은 여러 데이터베이스 작업을 하나의 논리적 단위로 묶어 데이터의 일관성을 보장한다.
문제 발생 시 롤백을 통해 데이터 무결성을 유지하여 시스템의 안정성을 높인다.
여러 사용자의 동시 접근을 관리하여 데이터의 정확성과 일관성을 보장한다.
1. 트랜잭션 관리자 설정
DataSourceTransactionManager
빈 정의. 이는 JDBC 기반 트랜잭션을 관리한다.
2. @EnableTransactionManagement
설정 클래스에 어노테이션 추가하여 선언전 트랜잭션 관리 활성화
3. @Transactional
트랜잭션이 필요한 메서드나 클래스에 @Transactional`을 붙여 해당 범위에 트랜잭션을 적용한다.
어떤 트랜잭션이 동작 중인 과정에서 다른 트랜잭션을 실행할 경우 어떻게 처리하는가에 대한 개념
전파 속성 | |
---|---|
REQUIRED | 기존 트랜잭션이 있으면 참여하고, 없으면 새로 생성. 가장 흔히 사용되는 기본 설정. |
REQUIRES_NEW | 항상 새로운 트랜잭션 시작. 기존 트랜잭션은 일시중단됨. |
NESTED | 기존 트랜잭션 내에서 중첩 트랜잭션 실행. 부분적 롤백 가능. |
SUPPORT | 트랜잭션이 있으면 참여하고, 없어도 비트랜잭션으로 실행. |
@Transactional
의 propagation 속성으로 트랜잭션 전파 방식을 지정한다.
트랜잭션 내에서 발생한 예외를 적절히 처리한다. RuntimeException은 기본적으로 롤백을 유발한다.
rollbackFor
, noRollbackFor
속성으로 롤백 규칙을 세밀하게 조절할 수 있다.
CREATE
연산UPDATE()
메서드 사용update()
메서드로 INSERT쿼리를 실행하여 데이터를 삽입할 수 있다.?
플레이스홀더를 사용하여 악의적인 SQL Injection을 방지할 수 있다.READ
연산queryForObject()
RowMapper
를 통해 결과를 객체로 매핑한다.query()
UPDATE
연산update()
메서드update()
메서드를 사용한다.batchUpdate()
메서드로 여러 레코드를 한번에 업데이트할 수 있다. 대량 데이터 처리 시 성능을 향상시킨다.DELETE
연산update()
사용update()
메서드를 실행한다. 영향받은 행의 수를 반환받아 삭제 여부를 확인할 수 있다.DataAccessException
을 catch하여 삭제 중 발생할 수 있는 오류를 처리한다.