BackEnd/Database 14

스프링 트랜잭션 전파

스프링에서 트랜잭션을 사용중일때 추가로 트랜잭션을 수행하는 경우 어떻게 동작할지를 결정하는 것을 트랜잭션 전파(Propagation)이라고 한다. 트랜잭션  전파에 대한 개념을 알기 전에 외부 트랜잭션과 내부 트랜잭션에 대한 개념을 알아야 한다.  외부 트랜잭션이 수행중이고 아직 끝나지 않았는데 트랜잭션이 추가로 수행되면 이 트랜잭션을 내부 트랜잭션이라고 한다.내부 트랜잭션은 외부에 트랜잭션이 수행되고 있는 도중에 호출되기 때문에 마치 내부에 있는 것 처럼 보여 내부 트랜잭션이라 한다. 스프링에서는 외부 트랜잭션과 내부 트랜잭션을 아래 그림과 같이 하나의 트랜잭션으로 묶어서 만들어준다.   이러한 개념을 바탕으로 스프링은 논리 트랜잭션과 물리 트랜잭션이라는 개념을 사용한다.  이러한 개념을 도입했을때 지..

BackEnd/Database 2025.02.14

Spring 트랜잭션[@Transactional]

스프링에서 트랜잭션을 관리할 때 @Transactional이 거의 필수적으로 사용된다. 따라서 @Transactional에 대해 정확히 알고 사용하는 것이 매우 중요하다! @Transaction은 사용하면 핵심 비즈니스 로직과 공통기능 (로깅, 트랜잭션, 보안 등)을 분리하여 코드 재사용성과 유지보수성을 높이는 AOP (Aspect-Oriented Programming, 관점 지향 프로그래밍)를 활용하여 트랜잭션을 자동으로 관리해주는 선언적 트랜잭션 관리 방법이다. @Servicepublic class OrderService { private final EntityManager entityManager; public OrderService(EntityManager entityManager) {..

BackEnd/Database 2025.02.12

QueryDSL

QueryDSL 이란 하이버네이트 쿼리 언어의 쿼리를 타입에 안전하게 생성 및 관리해주는 프레임워크이다. QueryDSL 장점기존의 MyBatis, JPQL 등의 문자열 형태로 쿼리문을 작성했을때는 쿼리문의 오류를 발견하는게 힘들지만 QueryDSL을 사용하면 자바 코드로 쿼리를 작성할 수 있어서 컴파일 오류를 통해 잘못된 쿼리가 실행되는 것을 방지할 수 있다.동적 쿼리를 매우 깔끔하게 사용할 수 있다.  QueryDSL 설정  스프링 부트 2.X 설정// Querydsl 추가 implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor "com.querydsl:querydsl-apt:${dependencyManage..

BackEnd/Database 2025.02.10

Spring Data JPA

스프링 데이터 JPA란 JPA를 편리하게 사용할 수 있도록 도와주는 라이브러리 이다.스프링 JPA의 주요 특징인터페이스( JpaRepository )상속을 통한 기본적 CRUD 지원, 구현 클래스 자동 생성 Spring Data JPA에서 프록시 기술을 사용하여 구현 클래스를 자동으로 생성해주므로개발자는 인터페이스만 생성하고 의존성을 주입받아 편하게 사용하면 된다.  쿼리 메서드 기능 : 스프링 데이터 JPA가 메서드 이름을 분석하여 필요한 JPQL을 자동 생성해주어 복잡한 쿼리문을 생략할 수 있다.단,  아무 이름이나 사용하는 것은 안되고 규칙이 따로 존재한다.  조회: find…By, read…By, query…By, get…By예) findHelloBy처럼 …에 식별하기 위한 내용(설명)이 들어가도..

BackEnd/Database 2025.02.10

MyBatis

MyBatis는 Java에서 SQL을 보다 쉽게 다룰 수 있도록 도와주는 ORM 프레임워크이다. MyBatis는 기존의 JDBC보다 간편하게 데이터베이스와 연동할 수 있도록 SQL 매핑을 지원하며, XML 또는 애노테이션을 사용해 SQL을 작성할 수 있다. MyBatis의 장단점 장점동적 쿼리를 편리하게 작성할 수 있다.커넥션,트랜잭션과 관련된 기능을 MyBatis 스프링 연동 모듈이 자동으로 설정해준다.단점설정이 다소 복잡할 수 있다. MyBatis 사용  1. ItemMapper 생성 ItemMapper는 마이바티스 매핑 XML을 호출해주는 매퍼 인터페이스이다. SQL을 XML로 작성하면 @Mapper가 있는 인터페이스에 SQL을 자동으로 매핑시켜준다.package hello.itemservice.r..

BackEnd/Database 2025.02.08

DB Test[@Transactional, 임베디드 모드 DB]

테스트에서의 @Transactional 테스트를 할때 테스트 후 데이터가 다시 삭제 되어야 할때가 있다. 이럴때 사용할 수 있는게 @Transactional 이다. 원래 @Transactional은 로직이 정상 수행되면 커밋되어 데이터베이스에 변경사항을 저장하지만, 테스트에서 사용될 경우 모든 로직이 트랜잭션 안에서 수행되고 테스트가 끝나면 롤백을 수행하여 테스트에서 생성되거나 변경된 데이터를 롤백시킨다.  package hello.itemservice.domain;import java.util.List;import static org.assertj.core.api.Assertions.assertThat;@Transactional@SpringBootTestclass ItemRepositoryTest { ..

BackEnd/Database 2025.02.07

JdbcTemplate

실무에서 가장 간단하고 실용적인 방법으로 SQL을 사용하려면 JdbcTemplate를 사용하면 된다.  기본 사용법 단건 조회(queryForObject)int rowCount = jdbcTemplate.queryForObject("select count(*) from t_actor", Integer.class); 단건 조회 - 숫자 조회, 파라미터 바인딩 int countOfActorsNamedJoe = jdbcTemplate.queryForObject( "select count(*) from t_actor where first_name = ?", Integer.class, "Joe"); 단건 조회 - 문자 조회 String lastName = jdbcTemplate.queryForObject( "se..

BackEnd/Database 2025.02.07

JDBC를 이용한 반복문제 해결 - JdbcTemplate

리포지토리에서 JDBC를 사용하면 서비스계층의 순수함을 유지시키기 위해 많은 코드들이 반복되었다.커넥션 조회, 커넥션 동기화PreparedStatement 생성및 파라미터 바인딩쿼리 실행결과 바인딩예외 발생시 스프링 예외 변환기 실행리소스 종료하지만 스프링은 JDBC의 이러한 반복 문제를 해결하기 위해 JdbcTemplate이라는 템플릿을 제공한다. package hello.jdbc.repository;import hello.jdbc.domain.Member;import hello.jdbc.repository.ex.MyDbException;import lombok.extern.slf4j.Slf4j;import org.springframework.jdbc.datasource.DataSourceUtils;i..

BackEnd/Database 2025.02.04

스프링 예외 추상화

스프링은  데이터 접근과 관련된 다양한 예외를 추상화하여 제공한다.  예외의 최고 상위는 org.springframework.dao.DataAccessException 이고 그 밑은 NonTransient예외와 Transient예외로 나뉜다. NonTransient 예외 = 일시적이지 않은 오류(SQL 문법 오류, 데이터 베이스 제약조건 위배 ...)Transient 예외 =  SQL을 다시 시도했을때 성공할 가능성이 있는 예외 스프링 예외 변환기 스프링은 데이터베이스에서 발생하는 오류 코드를 스프링이 정의한 예외로 자동으로 변환해주는 변환기를 제공한다. package hello.jdbc.exception.translator;import lombok.extern.slf4j.Slf4j;import org...

BackEnd/Database 2025.02.04

TransactionTemplate

//트랜잭션 시작TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { //비즈니스 로직bizLogic(fromId, toId, money); transactionManager.commit(status); //성공시 커밋} catch (Exception e) { transactionManager.rollback(status); //실패시 롤백throw new IllegalStateException(e); } 위 코드는 보면 비즈니스 로직이 성공하면 commit을 하고 실패하면 rollback을 한다. 이러한 비즈니스 로직이 여러개라면 커밋과 롤백 코드를 각각의 비즈..

BackEnd/Database 2025.02.01