geeone 스터디 블로그

[Spring] GDG 6주차 WIL : 스프링 DAO와 JDBC 템플릿 및 트랜잭션 관리 본문

Spring

[Spring] GDG 6주차 WIL : 스프링 DAO와 JDBC 템플릿 및 트랜잭션 관리

alisongeeone 2024. 11. 23. 15:07

스프링 세션 6주차 내용 복습

1.  DAO란?

데이터 접근 객체

 

DAO는 데이터베이스 작업을 추상화하고 캡슐화합니다. 이는 데이터 소스 접근 과 비즈니스 로직을 분리합니다

재사용성

 

DAO 패턴은 코드 재사용을 도와줍니다. 다양한 데이터 소스에 대해 일관된 인 터페이스를 제공합니다.

 

유지보수성

 

 

데이터 접근 로직이 한 곳에 집중되어 있어 유지보수가 용이합니다. 변경 사항 을 쉽게 적용할 수 있습니다.

 

 

2. 스프링 DAO의 필요성

코드 간소화, 예외 처리 개선, 테스트 용이성

 

 

 

3. JDBC 템플릿 사용법

1. 의존성 추가 : Maven이나 Gradle에 spring-jdbc 의존성을 추가합니다. 

2. DataSource 설정 : 데이터베이스 연결 정보를 포함한 DataSource를 구성합니다.

3. JdbcTemplate 생성 :  DataSource를 이용해 JdbcTemplate 객체를 생성합니다.

 

4. JDBC 사용 시 문제점

1. 코드 중복 : 연결, 명령문 생성, 결과 처리 등의 코드가 반복되기 때문에 코드의 가독성을 떨 어뜨립니다.

2. 예외 처리 : 복잡성 JDBC의 checked 예외는 처리가 번거롭습니다. 이는 코드를 복잡하게 만듭니다. 

3. 자원 관리 부담 : Connection, Statement, ResultSet 등의 자원을 수동으로 관리해야 합니다. 이는 메모리 낭비의 위험이 있습니다

 

5. 트랜잭션의 개념

원자성 (Atomicity)

 

트랜잭션의 모든 연산이 성공하거나 모두 실패해야 합니다. 이는 데이터의 일관성을 유 지합니다.

 

일관성 (Consistency)

 

트랜잭션 전후로 데이터베이스가 일관된 상태를 유지하여 데이터 무결성을 보장합니 다.

 

 

격리성 (Isolation)

 

동시에 실행되는 트랜잭션들이 서로 영향을 주지 않게 함으로써 동시성 문제를 방지합 니다

 

 

지속성 (Durability)

 

성공적으로 완료된 트랜잭션의 결과는 영구적으로 반영되어야 하므로 데이터의 안정성 을 보장합니다.

 

 

 

6. 트랜잭션 전파란?

어떤 트랜잭션이 동작중인 과정에서 다른 트랜잭션을 실행할 경우 어떻게 처리하는가에 대한 개념

 

 

 

스프링 세션 6주차 과제 

transactionConfig 작성

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManagerFactory;

@Configuration
@EnableTransactionManagement
public class TransactionConfig {

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager();
    }
}

 

 

의존성 추가

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.4'
	id 'io.spring.dependency-management' version '1.1.6'
}

group = 'hello'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-aop'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework:spring-tx'
	implementation 'org.springframework:spring-jdbc'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}